tocco-admin 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +3 -0
- package/dist/chunk-138.e40f0f1b9e1382b6f288.js +2 -0
- package/dist/chunk-138.e40f0f1b9e1382b6f288.js.map +1 -0
- package/dist/{chunk-346.865b1decda71d260e2ea.js → chunk-346.e7daab5c51f0238b0f25.js} +2 -2
- package/dist/chunk-346.e7daab5c51f0238b0f25.js.map +1 -0
- package/dist/chunk-404.332eb626037a95299984.js +2 -0
- package/dist/chunk-404.332eb626037a95299984.js.map +1 -0
- package/dist/chunk-617.5aae1e4a3b29455133e1.js +7 -0
- package/dist/chunk-617.5aae1e4a3b29455133e1.js.map +1 -0
- package/dist/{chunk-817.89303ab89e733524067b.js → chunk-817.100135298c4c57dd74ad.js} +2 -2
- package/dist/{chunk-817.89303ab89e733524067b.js.map → chunk-817.100135298c4c57dd74ad.js.map} +1 -1
- package/dist/chunk-actions.5ecf528cfddb90328544.js +2 -0
- package/dist/chunk-actions.5ecf528cfddb90328544.js.map +1 -0
- package/dist/chunk-code-editor.2d183d3e3e5215d0335a.js +7 -0
- package/dist/chunk-code-editor.2d183d3e3e5215d0335a.js.map +1 -0
- package/dist/chunk-docs-actions.5864a3fd6c74308050f7.js +2 -0
- package/dist/chunk-docs-actions.5864a3fd6c74308050f7.js.map +1 -0
- package/dist/chunk-vendor-icons.c86d0348d86763bb6fa3.js +1 -0
- package/dist/chunk-vendor-libphonenumber-js.6c24244e4bcd727f64d5.js +1 -0
- package/dist/{chunk-vendor-quill.1789cce485c0fe1c2550.js → chunk-vendor-quill.7aa7af04be47f0314d6e.js} +2 -2
- package/dist/index.js +17 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-138.1dac2102dca00a6ecddc.js +0 -2
- package/dist/chunk-138.1dac2102dca00a6ecddc.js.map +0 -1
- package/dist/chunk-346.865b1decda71d260e2ea.js.map +0 -1
- package/dist/chunk-404.285ccaafc0543180391a.js +0 -2
- package/dist/chunk-404.285ccaafc0543180391a.js.map +0 -1
- package/dist/chunk-697.b94de7e4e9e81ca9b3be.js +0 -7
- package/dist/chunk-697.b94de7e4e9e81ca9b3be.js.map +0 -1
- package/dist/chunk-actions.636f80a1ff8d8305eca6.js +0 -2
- package/dist/chunk-actions.636f80a1ff8d8305eca6.js.map +0 -1
- package/dist/chunk-code-editor.ffe5b3bddeb0f646482a.js +0 -7
- package/dist/chunk-code-editor.ffe5b3bddeb0f646482a.js.map +0 -1
- package/dist/chunk-docs-actions.3bcbf1e5418f40e73dae.js +0 -2
- package/dist/chunk-docs-actions.3bcbf1e5418f40e73dae.js.map +0 -1
- package/dist/chunk-vendor-icons.276a1de8671288ce5747.js +0 -1
- package/dist/chunk-vendor-libphonenumber-js.3b24c3803f4a1418116b.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack:///./packages/admin/src/components/ErrorView/ErrorView.js","webpack:///./packages/sso-login/src/utils/providers.js","webpack:///./packages/sso-login/src/modules/sagas.js","webpack:///./packages/sso-login/src/modules/actions.js","webpack:///./packages/sso-login/src/modules/reducer.js","webpack:///./packages/sso-login/src/modules/index.js","webpack:///./packages/sso-login/src/utils/loginWindow.js","webpack:///./packages/sso-login/src/utils/popUp.js","webpack:///./packages/sso-login/src/components/ProviderButton/StyledProviderButton.js","webpack:///./packages/sso-login/src/components/ProviderButton/ProviderButton.js","webpack:///./packages/sso-login/src/components/LoginBox/LoginBox.js","webpack:///./packages/sso-login/src/components/LoginBox/index.js","webpack:///./packages/sso-login/src/containers/LoginBoxContainer.js","webpack:///./packages/sso-login/src/main.js","webpack:///./packages/admin/src/components/Login/StyledComponents.js","webpack:///./packages/admin/src/components/Login/Login.js","webpack:///./packages/admin/src/components/Login/LoginContainer.js","webpack:///./packages/tocco-ui/src/BurgerButton/BurgerButton.js","webpack:///./packages/admin/src/components/MenuTree/StyledComponents.js","webpack:///./packages/admin/src/components/MenuTree/MenuItem.js","webpack:///./packages/admin/src/utils/navigationUtils.js","webpack:///./packages/admin/src/components/MenuTree/MenuTree.js","webpack:///./packages/admin/src/components/MenuTree/index.js","webpack:///./packages/admin/src/components/Navigation/StyledComponents.js","webpack:///./packages/admin/src/components/Navigation/menuType/StyledComponents.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuEntry.js","webpack:///./packages/admin/src/modules/preferences/selectors.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuEntryContainer.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuChildrenWrapper.js","webpack:///./packages/admin/src/components/Navigation/menuType/MenuChildrenWrapperContainer.js","webpack:///./packages/admin/src/components/Navigation/menuType/EntityExplorerEntry.js","webpack:///./packages/admin/src/components/Navigation/menuType/ActionEntry.js","webpack:///./packages/admin/src/components/Navigation/Navigation.js","webpack:///./packages/admin/src/components/Navigation/NavigationContainer.js","webpack:///./packages/admin/src/components/Navigation/index.js","webpack:///./packages/dashboard/src/modules/dashboard/actions.js","webpack:///./packages/dashboard/src/components/Dashboard/StyledComponents.js","webpack:///./packages/dashboard/src/utils/dropTypes.js","webpack:///./packages/dashboard/src/utils/infoBoxTypes.js","webpack:///./packages/dashboard/src/utils/dashboardUtils.js","webpack:///./packages/dashboard/src/components/Menu/StyledComponents.js","webpack:///./packages/dashboard/src/components/Menu/Menu.js","webpack:///./packages/dashboard/src/components/Menu/MenuContainer.js","webpack:///./packages/dashboard/src/utils/constants.js","webpack:///./packages/dashboard/src/components/InfoBox/StyledComponents.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/StyledComponents.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/InfoBoxHtmlFieldContent.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/InfoBoxSearchFilterContent.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContent/InfoBoxSearchFilterContentContainer.js","webpack:///./packages/dashboard/src/components/InfoBox/typeContentProvider.js","webpack:///./packages/dashboard/src/components/InfoBox/InfoBoxContent.js","webpack:///./packages/dashboard/src/components/InfoBox/InfoBox.js","webpack:///./packages/dashboard/src/components/Dashboard/DashboardInfoBox.js","webpack:///./packages/dashboard/src/components/InfoBox/DropPreview.js","webpack:///./packages/dashboard/src/components/Dashboard/DashboardColumn.js","webpack:///./packages/dashboard/src/components/Dashboard/Dashboard.js","webpack:///./packages/dashboard/src/components/Dashboard/DashboardContainer.js","webpack:///./packages/dashboard/src/modules/dashboard/reducer.js","webpack:///./packages/dashboard/src/modules/dashboard/index.js","webpack:///./packages/dashboard/src/components/InfoBoxSettings/StyledComponents.js","webpack:///./packages/dashboard/src/components/InfoBoxSettings/InfoBoxSettings.js","webpack:///./packages/dashboard/src/utils/positionUtils.js","webpack:///./packages/dashboard/src/modules/dashboard/sagas.js","webpack:///./packages/dashboard/src/modules/reducers.js","webpack:///./packages/dashboard/src/main.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/StyledComponents.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/Dashboard.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/DashboardContainer.js","webpack:///./packages/tocco-util/src/route/input.js","webpack:///./packages/tocco-util/src/route/route.js","webpack:///./packages/tocco-util/src/route/Router.js","webpack:///./packages/tocco-util/src/route/index.js","webpack:///./packages/tocco-util/src/route/asyncRoute.js","webpack:///./packages/admin/src/routes/entities/index.js","webpack:///./packages/admin/src/routes/docs/index.js","webpack:///./packages/admin/src/routes/settings/components/Settings/Settings.js","webpack:///./packages/admin/src/routes/settings/components/Settings/index.js","webpack:///./packages/tocco-ui/src/Button/StyledRouterLinkButton.js","webpack:///./packages/tocco-ui/src/Button/RouterLinkButton.js","webpack:///./packages/admin/src/components/Header/StyledComponents.js","webpack:///./packages/admin/src/components/Header/NotificationCenterRedDot.js","webpack:///./packages/admin/src/components/Header/NotificationCenterRedDotContainer.js","webpack:///./packages/admin/src/components/Header/NotificationCenterButton.js","webpack:///./packages/admin/src/components/AboutTocco/StyledComponents.js","webpack:///./packages/admin/src/components/AboutTocco/AboutTocco.js","webpack:///./packages/admin/src/components/AboutTocco/AboutToccoContainer.js","webpack:///./packages/admin/src/components/Header/Header.js","webpack:///./packages/admin/src/components/Header/HeaderContainer.js","webpack:///./packages/admin/src/components/Admin/StyledComponents.js","webpack:///./packages/admin/src/components/Admin/Admin.js","webpack:///./packages/admin/src/components/Admin/AdminContainer.js","webpack:///./packages/admin/src/components/LoginGuard/LoginGuard.js","webpack:///./packages/admin/src/components/LoginGuard/LoginGuardContainer.js","webpack:///./packages/admin/src/routes/entities/utils/navigationStrategy.js","webpack:///./packages/admin/src/utils/routing.js","webpack:///./packages/entity-list/src/util/searchFormTypes.js","webpack:///./packages/entity-list/src/util/selectionStyles.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/actions.js","webpack:///./packages/login/src/modules/passwordRequest/actions.js","webpack:///./packages/login/src/modules/login/actions.js","webpack:///./packages/login/src/types/Pages.js","webpack:///./packages/login/src/components/StyledLoginForm.js","webpack:///./packages/login/src/components/LoginForm/LoginForm.js","webpack:///./packages/login/src/components/LoginForm/index.js","webpack:///./packages/login/src/modules/actions.js","webpack:///./packages/login/src/containers/LoginFormContainer.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordInput.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordInput.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordUpdateDialog.js","webpack:///./packages/login/src/components/passwordUpdate/ValidationRules/ValidationRules.js","webpack:///./packages/login/src/components/passwordUpdate/ValidationRules/index.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/messages.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/FailureMessage.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/index.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordUpdateDialog.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/index.js","webpack:///./packages/login/src/modules/passwordUpdate/actions.js","webpack:///./packages/login/src/modules/passwordUpdate/password/actions.js","webpack:///./packages/login/src/containers/PasswordUpdateDialogContainer.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/actions.js","webpack:///./packages/login/src/components/PasswordRequest/PasswordRequest.js","webpack:///./packages/login/src/components/PasswordRequest/index.js","webpack:///./packages/login/src/containers/PasswordRequestContainer.js","webpack:///./packages/login/src/components/TwoStepLoginForm/StyledTwoStepLoginForm.js","webpack:///./packages/login/src/components/TwoStepLoginForm/TwoStepLoginForm.js","webpack:///./packages/login/src/components/TwoStepLoginForm/index.js","webpack:///./packages/login/src/modules/twoStepLogin/actions.js","webpack:///./packages/login/src/containers/TwoStepLoginContainer.js","webpack:///./packages/login/src/components/TwoFactorConnectorForm/TwoFactorConnectorForm.js","webpack:///./packages/login/src/components/TwoFactorConnectorForm/index.js","webpack:///./packages/login/src/containers/TwoFactorConnectorContainer.js","webpack:///./packages/login/src/components/Login/Login.js","webpack:///./packages/login/src/components/Login/index.js","webpack:///./packages/login/src/containers/LoginContainer.js","webpack:///./packages/login/src/modules/passwordUpdate/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/password/utils.js","webpack:///./packages/login/src/modules/passwordUpdate/password/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/password/index.js","webpack:///./packages/login/src/modules/passwordUpdate/password/validate.js","webpack:///./packages/login/src/modules/loginForm/actions.js","webpack:///./packages/login/src/modules/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/password/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/index.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/index.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/reducers.js","webpack:///./packages/login/src/modules/login/reducer.js","webpack:///./packages/login/src/modules/login/index.js","webpack:///./packages/login/src/modules/loginForm/reducer.js","webpack:///./packages/login/src/modules/loginForm/index.js","webpack:///./packages/login/src/modules/twoStepLogin/sagas.js","webpack:///./packages/login/src/modules/twoStepLogin/reducer.js","webpack:///./packages/login/src/modules/twoStepLogin/index.js","webpack:///./packages/login/src/modules/passwordRequest/sagas.js","webpack:///./packages/login/src/modules/passwordRequest/reducer.js","webpack:///./packages/login/src/modules/passwordRequest/index.js","webpack:///./packages/login/src/modules/reducers.js","webpack:///./packages/login/src/main.js","webpack:///./packages/tocco-ui/src/AdminLink/linkStyle.js","webpack:///./packages/tocco-ui/src/AdminLink/StyledLink.js","webpack:///./packages/tocco-ui/src/Breadcrumbs/StyledBreadcrumbs.js","webpack:///./packages/tocco-ui/src/Breadcrumbs/Breadcrumbs.js","webpack:///./packages/tocco-ui/src/DatePicker/GlobalDatePickerStyles.js","webpack:///./packages/tocco-ui/src/GlobalStyles/GlobalStyles.js","webpack:///./packages/tocco-ui/src/QRCode/QRCode.js","webpack:///./packages/tocco-util/src/queryString/queryString.js","webpack:///./packages/tocco-util/src/queryString/index.js","webpack:///./packages/tocco-util/src/validation/validation.js","webpack:///./packages/tocco-util/src/validation/index.js","webpack:///./packages/tocco-util/src/viewPersistor/viewPersistor.js","webpack:///./packages/tocco-util/src/viewPersistor/index.js","webpack:///./packages/two-factor-connector/src/modules/actions.js","webpack:///./packages/two-factor-connector/src/modules/sagas.js","webpack:///./packages/two-factor-connector/src/modules/reducer.js","webpack:///./packages/two-factor-connector/src/modules/index.js","webpack:///./packages/two-factor-connector/src/components/GlobalStyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Start/Start.js","webpack:///./packages/two-factor-connector/src/components/Start/StartContainer.js","webpack:///./packages/two-factor-connector/src/components/Start/index.js","webpack:///./packages/two-factor-connector/src/components/Secret/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Secret/Secret.js","webpack:///./packages/two-factor-connector/src/components/Secret/SecretContainer.js","webpack:///./packages/two-factor-connector/src/components/Secret/index.js","webpack:///./packages/two-factor-connector/src/components/Verification/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Verification/Verification.js","webpack:///./packages/two-factor-connector/src/components/Verification/VerificationContainer.js","webpack:///./packages/two-factor-connector/src/components/Verification/index.js","webpack:///./packages/two-factor-connector/src/components/Result/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Result/Result.js","webpack:///./packages/two-factor-connector/src/components/Result/ResultContainer.js","webpack:///./packages/two-factor-connector/src/components/Result/index.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnector.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnectorContainer.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/index.js","webpack:///./packages/two-factor-connector/src/main.js","webpack:///./packages/admin/src/assets/tocco-circle.svg","webpack:///./packages/admin/src/assets/tocco_red.svg","webpack:///./packages/admin/src/assets/tocco_white.svg"],"names":["StyledErrorView","styled","scale","StyledIconWrapper","theme","icon","title","message","transformProviderEntities","response","data","map","provider","_reduce","paths","result","value","key","loadProviders","loginCompleted","mainSagas","intlSelector","state","intl","select","query","conditions","locale","active","call","rest","method","entities","put","type","payload","providers","cache","externalEvents","all","takeLatest","ACTION_HANDLERS","reducerUtil","initialState","ssoLogin","action","handler","sagas","rootSaga","openLoginWindow","loginEndpoint","baseUrl","env","encodedWindowUrl","encodeURIComponent","window","location","href","url","unique_id","popUp","open","label","height","width","features","left","screen","top","resizable","scrollbars","status","join","getPopUpFeatures","ssoPopUpCallback","close","StyledButton","props","declareInteractionColors","generateInteractionColors","bg","primaryColor","fg","secondaryColor","_get","StyledProviderButton","button_primary_color","button_secondary_color","onClick","button_icon","position","button_label","StyledButtonContainer","LoginBox","prevProps","prevState","snapshot","this","autoLogin","length","autoLoginProvider","find","entity","idx","React","mapActionCreators","connect","input","ssoLoginEndpoint","EXTERNAL_EVENTS","LoginBoxContainer","initApp","id","events","publicPath","content","store","appFactory","reducers","actions","textResourceModules","SsoLoginApp","packageName","component","propTypes","PropTypes","GlobalBodyStyle","createGlobalStyle","StyledLogin","ToccoLogo","StyledHeadingLogin","StyledH1","StyledSpanLogin","StyledSpan","StyledLoginWrapper","StyledSloganImg","StyledMobileSloganImg","StyledSsoMsg","StyledSsoError","breakWords","src","ToccoSlogan","alt","ssoAvailable","loginSuccessful","checkSsoAvailable","useState","showError","setShowError","showRegistrationText","setShowRegistrationText","Cookies","useEffect","successful","registration","expires","SsoLoginPart","loginSuccess","timeout","showTitle","session","injectIntl","Login","isOpen","size","color","lineProps","stroke","vectorEffect","strokeWidth","initial","animate","transition","ease","duration","LazyMotion","then","res","m","viewBox","overflow","preserveAspectRatio","aria-label","formatMessage","x1","x2","y1","y2","variants","closed","rotate","translateY","opened","opacity","StyledMenuEntry","declareFont","level","childrenCount","StyledMenuEntryWrapper","MenuItem","item","menuTreePath","typeMapping","mappedType","menuType","Component","ChildrenWrapperComponent","childrenWrapperComponent","MenuItems","children","child","name","data-cy","getMenuPreferencesKey","preferencesPrefix","getCompleteMenuPreferences","items","collapse","reduce","acc","hasChildren","MenuTree","searchFilter","requireSearch","prepareMenuTree","isParentMatching","includeInTree","matchingAttribute","getMatchingAttribute","filterAttributes","attr","toLowerCase","includes","undefined","itemMatching","Boolean","filter","index","secondary","secondaryLight","StyledNav","StyledSearchBox","StyledTabsContainer","StyledActiveTabLabel","fontSize","fontWeight","StyledNavIconButton","Ball","narrow","css","StyledSearchBoxWrapper","StyledMenuWrapper","StyledScrollbar","StyledMenuButtonsWrapper","StyledMenuButton","StyledMenuLink","Link","StyledIconLink","StyledMenuLinkWrapper","StyledTogglerIconWrapper","StyledMenuIconWrapper","StyledMenuChildrenWrapper","canCollapse","saveUserPreferences","toggleMenuEntryCollapsed","menuIsOpenPrefrencesSelector","preferences","userPreferences","MenuEntry","MenuChildrenWrapper","entityNameDisplay","data-quick-navigation","to","target","rel","menuTabs","MODULES","COMPLETE","SETTINGS","SYSTEM","createMenuTypeMap","hasFilterApplied","EntityExplorerEntry","ActionEntry","modulesMenuTree","settingsMenuTree","systemMenuTree","completeMenuTree","menuOpen","activeMenuTab","setActiveMenuTab","inputEl","useRef","navigationEl","setFilter","showMenu","msg","menuTabsConfig","modulesTypeMap","useMemo","settingsTypeMap","systemTypeMap","completeTypeMap","current","focus","MenuTabs","Object","keys","menuTab","onMouseDown","e","preventDefault","ref","onKeyDown","focusableElements","currentIdx","querySelectorAll","findIndex","el","document","activeElement","isEqualNode","SearchBox","minInputLength","onSearch","placeholder","navigation","Navigation","setDashboard","infoBoxes","StyledDashboardWrapper","StyledColumnWrapper","StyledColumn","StyledInfoBoxWrapper","StyledResizeHandle","shadeColor","isReszing","Column","InfoBox","InfoBoxRenderTypes","sortInfoBoxes","boxes","sort","a","b","col","row","reindex","sortedBoxes","box","nextIndex","insertDraggedAtDropped","draggingId","dragOverId","dragOverColumn","draggingBox","moveBoxHere","dragAndDrop","displayInfoBoxSettings","resetInfoBoxSettings","BallMenu","buttonProps","Menu","colorizeBorder","StyledDroppedPreview","StyledInfoBoxContentWrapper","scrollable","text","FormattedValue","DetailLinkRelative","entityKey","entityModel","StyledLink","navigationStrategy","emitAction","searchFilterUniqueId","entityName","scope","limit","formName","searchFilters","showActions","onRowClick","openDetail","searchFormType","searchFormPosition","selectionStyle","sortable","disableSelectionController","showLink","actionEmitter","InfoBoxSearchFilterContent","htmlfield","InfoBoxHtmlFieldContent","searchfilter","InfoBoxSearchFilterContentContainer","InfoBoxContent","consoleLogger","Typography","infoBox","isResizing","startResize","onDragStart","onDragEnter","onDragOver","onDrop","draggable","resizeState","dndState","makeDndEvents","currentlyDragOver","resizingElement","DropTypes","storedInfoBoxes","saveInfoBoxHeight","saveInfoBoxPositions","setInfoBoxes","columns","Array","onInfoBoxHeightChanged","useCallback","finalHeight","c","onInfoBoxHeightChanging","resize","querySelector","resizingEvents","currentlyDragging","dragOverType","updatedInfoBoxes","appendDraggedAsLastItemToDropped","moveDraggedToDropped","dndEvents","dropPosition","DashboardColumns","column","isOverItself","draggingPreviewBox","renderBoxes","folded","showPreviewHere","getRenderInfoBoxesForColumn","dashboard","Dashboard","StyledButtonWrapper","StyledUl","StyledLabel","StyledCheckbox","initialInfoBoxes","onOk","checked","onChange","for","Button","look","isUnpositionedInfoBox","distributeInfoBoxes","unpositionedInfoBoxes","positionedInfoBoxes","numberOfBoxesPerCol","minCol","min","parseInt","numberOfBoxes","Number","MAX_VALUE","getColumnWithMinAmountOfInfoBoxes","prepareInfoBoxes","split","Math","max","mapPositionToColAndRow","loadDashboard","saveInfoBoxSettings","saveInfoBoxPreferences","dashboardSelector","takeEvery","options","body","infoboxes","channel","answerChannel","notification","take","dashboardReducer","dashboardSagas","DashboardContainer","handleNotifications","DashboardApp","event","StyledWrapper","StyledBreadcrumbs","match","history","Breadcrumbs","currentView","display","pathPrefix","loadedComponents","importRouteDependencies","getComponent","Promise","resolve","imported","route","forEach","saga","sagaUtil","inputDispatches","inputDispatch","actionCreator","mandatory","defaultValue","logger","prototype","hasOwnProperty","dispatch","dispatchInput","container","setComponent","mounted","ignoredAttributes","areEqual","nextProps","diff","js","clean","_omitBy","_omit","v","entries","memo","ReactReduxContext","useStore","buttonStyle","aria","ink","iconOnly","design","StyledBackgroundCover","StyledHeader","StyledConfig","StyledBackgroundLogo","runEnv","colors","primary","StyledPopper","StyledNotificationBellWrapper","StyledBall","StyledRedDot","AdminLink","unreadNotificationKeys","innerRef","center","NotificationCenterRedDot","popperModifiers","offset","padding","visible","setVisibility","referenceElement","popperElement","redDotElement","handleMouseDown","contains","addEventListener","removeEventListener","usePopper","modifiers","styles","attributes","NotificationCenterRedDotContainer","ReactDOM","style","popper","StyledFormattedMessageWrapper","StyledBlockWrapper","StyledLogo","niceVersion","niceRevision","dangerouslySetInnerHTML","__html","neutral","serverSettings","AboutTocco","StyledBallMenuWrapper","username","currentBusinessUnit","businessUnits","loadBusinessUnits","changeBusinessUnit","doLogout","openModalComponent","removeModalComponent","info","ButtonMenu","onOpen","bU","disabled","success","onSuccess","replace","Header","calcViewportHeight","vh","documentElement","clientHeight","setProperty","StyledContent","StyledMenu","SlideMenu","burgerMenuStyles","bmBurgerButton","outline","zIndex","bmBurgerBarsHover","background","bmMenuWrap","minWidth","bmMenu","bmMorphShape","fill","bmItemList","bmItem","bmOverlay","GlobalStyles","exact","from","path","DashboardRoute","EntitiesRoute","Settings","DocsRoute","ErrorView","withTheme","initializeNavigation","setMenuOpen","baseRoute","confirm","loadPrincipal","loadSettingsAndPreferences","adminAllowed","setHistory","initializeHistory","browserHistory","createBrowserHistory","basename","getUserConfirmation","confirmCallback","LoadMask","required","onStateChange","customCrossIcon","customBurgerIcon","paper","pageWrapId","outerContainerId","viewPersistor","render","login","Admin","Helmet","defer","doSessionCheck","loggedIn","loadingText","LoginGuard","relation","DetailLink","ListLink","entityKeys","queryString","pathname","search","ListOrDetailLink","navigateToCreateRelative","relationName","push","entityBaseUrl","goBack","navigateToActionRelative","definition","selection","queryStringUtil","actionProperties","properties","appId","inNewTab","createHref","amount","normalizedUrl","i","substring","lastIndexOf","searchFormTypes","NONE","SIMPLE","BASIC","ADMIN","searchFormTypePropTypes","values","selectionStyles","SINGLE","MULTI","MULTI_EXPLICIT","selectionStylePropType","setShowOldPasswordField","showOldPasswordField","setForcedUpdate","forcedUpdate","setUsernameOrPk","usernameOrPk","setPasswordRequest","passwordRequest","changePage","page","setUsername","setPassword","password","Pages","StyledLoginFormInput","StyledInputCss","StyledLoginFormInputWrapper","StyledEditableWrapperCss","StyledLoginButton","StyledTransparentButton","StyledLoginFormWrapper","StyledButtonGroup","captchaKey","loginPending","recaptchaActivated","autoFill","setAutoFill","recaptchaRef","handleSubmit","recaptchaToken","executeAsync","reset","handleAutoFill","animationName","passwordFocus","usernameFocus","onSubmit","StatedValue","hasValue","autoFocus","onAnimationStart","onFocus","SignalList","condition","negative","badge","sitekey","hl","pending","captchaToken","loginForm","LoginForm","StyledPasswordInput","StyledPasswordInputWrapper","getSignal","valid","immutable","readOnly","signal","rules","rule","errors","error","messages","INVALID_CREDENTIALS","UNEXPECTED_ERROR","errorCode","StyledValidationRulesWrapper","fetchValidationRules","initialized","savePassword","updateNewPassword","updateNewPasswordRepeat","updateOldPassword","validationRules","isSubmittable","newPasswordRepeat","newPassword","passwordUpdatePending","oldPasswordReadOnly","newPasswordReadOnly","oldPassword","newPasswordRepeatReadOnly","newPasswordValidationErrors","StyledPasswordUpdateDialog","tabIndex","passwordUpdateFailed","passwordUpdateErrorCode","rulesNeutral","UPDATE_OLD_PASSWORD","UPDATE_NEW_PASSWORD","SAVE_PASSWORD","VALIDATE","setNewPasswordValidationErrors","savePasswordFailure","validationMessages","passwordUpdate","dialog","PasswordUpdateDialog","requestPassword","setState","bind","handleUsernameChange","PasswordRequest","StyledTwoStepLogin","StyledEditableValue","twoStepLogin","userCode","setUserCode","formEl","useLayoutEffect","EditableValue","format","allowLeadingZeros","toString","TwoStepLoginForm","secret","forced","TwoFactorConnectorForm","GlobalRecaptchaBadgeStyle","TwoFactorConnectorContainer","initialize","currentPage","PasswordRequestContainer","TwoStepLoginContainer","LoginFormContainer","resizeWatcher","validationMessagesToErrorMap","ruleName","validateCharacterRule","regex","specificCharsCount","VALIDATORS","params","validator","setMessage","setPending","doLoginRequest","doSessionRequest","handleTwoStepLoginResponse","handleTwoStepActivationResponse","handlePasswordUpdateResponse","handleBlockResponse","handleFailedResponse","handleSuccessfulLogin","loginSaga","checkSessionSaga","loadSettings","textResourceSelector","loginSelector","doRequest","request","json","getOptions","headers","Headers","k","twoFactorResponse","loginData","CAPTCHA","TWOSTEPLOGIN","RESET_PASSWORD_REQUIRED","LOGIN_BLOCKED","TWOSTEPLOGIN_ACTIVATION","settings","storePassword","remoteValidate","validate","getData","getLoginData","formChanged","validationRulesSelector","inputSelector","usernameOrPkSelector","passwordSelector","standaloneSelector","standalone","acceptedStatusCodes","resp","ok","exception","queryParams","localValidate","object","constructor","singleTransferReducer","attributeName","val","loadValidationRules","resource","validationResponse","passwordSagas","validationRulesSagas","twoStepSaga","args","fork","moduleSagas","requestPasswordSaga","passwordRequestSaga","textResourcesState","combineReducers","passwordUpdateReducers","passwordRequestSagas","twoStepLoginSagas","passwordUpdateSagas","initLoginApp","customTheme","LoginContainer","loginReducers","errorLogging","initPasswordUpdateApp","LoginApp","setLocale","EXTERNAL_EVENTS_PASSWORD_UPDATE","PasswordUpdateApp","linkStyle","backgroundColor","StyledBreadcrumbsLink","StyledBreadcrumbsTitle","breadcrumbsInfo","breadcrumbs","slice","breadcrumb","reverse","getTitle","breadcrumbsItem","Comp","prev","curr","defaultProps","regular","baseSpace","GlobalDatePickerStyles","renderAs","hasJsonStructure","str","parsed","JSON","parse","err","fromQueryString","obj","_mapValues","toQueryString","stringifiedValues","_isObject","stringify","getFirstElement","getErrorCompact","entityValidatorErrors","persistedViews","persistViewInfo","viewInfoSelector","clearPersistedViews","persistedView","INITIALIZE","SET_SECRET","GO_TO_START","GO_TO_SECRET","setTwoFactorActive","twoFactorActive","setSecret","setUserName","goToStart","setSetupSuccessful","setupSuccessful","requestSecret","activateTwoFactorWithoutSession","activateTwoFactor","verifyCode","loadPrincipal2FAInfo","getUsername","fireResize","usernameSelector","twoFactorConnector","secretSelector","principalsResponse","totpUri","uri","sendRequest","code","codeVerifyResponse","where","principals","Error","twoFactorKey","inputUsername","setStage","stage","Start","StyledQRCodeWrapper","StyledParagraph","goToSecretVerification","QRCode","Secret","stopPropagation","Verification","StyledMessageWrapper","isSuccessful","StyledTextWrapper","Result","stages","renderContent","TwoFactorConnector","TwoFactorConnectorApp","module","exports"],"mappings":"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","file":"chunk-138.e40f0f1b9e1382b6f288.js","sourcesContent":["import React from 'react'\nimport {Icon, scale, theme, Typography} from 'tocco-ui'\nimport styled from 'styled-components'\nimport PropTypes from 'prop-types'\n\nconst StyledErrorView = styled.div`\n width: 50vw;\n max-width: 650px;\n padding: ${scale.space(1)};\n text-align: center;\n margin: 20vh auto auto;\n\n h1 {\n margin: 0 auto;\n }\n`\n\nconst StyledIconWrapper = styled.span`\n color: ${theme.color('signal.danger.text')};\n font-size: ${scale.font(13.4)};\n`\n\nconst ErrorView = ({title, message}) => {\n return <StyledErrorView>\n <StyledIconWrapper>\n <Icon icon=\"times\"/>\n </StyledIconWrapper>\n <Typography.H1>\n {title}\n </Typography.H1>\n <Typography.Span>{message}</Typography.Span>\n </StyledErrorView>\n}\n\nErrorView.propTypes = {\n title: PropTypes.element.isRequired,\n message: PropTypes.element.isRequired\n}\n\nexport default ErrorView\n","import _reduce from 'lodash/reduce'\n\nexport const transformProviderEntities = response =>\n response.data.map(provider => _reduce(provider.paths, (result, value, key) => {\n return {...result, [key]: value.value}\n }, {})\n )\n","import {externalEvents, rest} from 'tocco-app-extensions'\nimport {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {cache, intl} from 'tocco-util'\n\nimport {transformProviderEntities} from '../utils/providers'\nimport * as actions from './actions'\n\nconst entityName = 'Openid_provider'\n\nexport const intlSelector = state => state.intl\n\nexport function* loadProviders() {\n const intl = yield select(intlSelector)\n\n const query = {\n paths: ['unique_id', 'label', 'button_primary_color', 'button_secondary_color', 'button_icon', 'button_label'],\n conditions: {locale: intl.locale, active: true}\n }\n\n const entities = yield call(rest.fetchEntities, entityName, query, {method: 'GET'}, transformProviderEntities)\n yield put(actions.setProviders(entities))\n}\n\nexport function* loginCompleted({payload: {result}}) {\n const localChanged = yield call(intl.hasUserLocaleChanged)\n if (localChanged) {\n yield call(cache.clearAll)\n } else {\n yield call(cache.clearShortTerm)\n }\n yield put(externalEvents.fireExternalEvent('loginCompleted', result))\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.LOAD_PROVIDERS, loadProviders),\n takeLatest(actions.LOGIN_COMPLETED, loginCompleted)\n ])\n}\n","export const LOAD_PROVIDERS = 'root/LOAD_PROVIDERS'\nexport const SET_PROVIDERS = 'root/SET_PROVIDERS'\nexport const LOGIN_COMPLETED = 'root/LOGIN_COMPLETED'\n\nexport const loadProviders = () => ({\n type: LOAD_PROVIDERS\n})\n\nexport const setProviders = providers => ({\n type: SET_PROVIDERS,\n payload: {\n providers\n }\n})\n\nexport const loginCompleted = result => ({\n type: LOGIN_COMPLETED,\n payload: {\n result\n }\n})\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_PROVIDERS]: reducerUtil.singleTransferReducer('providers')\n}\n\nconst initialState = {\n providers: []\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import rootSaga from './sagas'\nimport ssoLogin from './reducer'\n\nexport default {\n ssoLogin\n}\n\nexport const sagas = [rootSaga]\n","import {env} from 'tocco-util'\n\nimport {getPopUpFeatures} from './popUp'\n\nexport const openLoginWindow = (loginEndpoint, loginCompleted, provider) => {\n const baseUrl = __DEV__ ? '' : env.getBackendUrl()\n const encodedWindowUrl = encodeURIComponent(window.location.href)\n const url = `${baseUrl}${loginEndpoint}?provider=${provider.unique_id}&sourceUri=${encodedWindowUrl}`\n\n const popUp = window.open(url, provider.label, getPopUpFeatures(650, 500))\n\n window.ssoPopUpCallback = result => {\n popUp.close()\n loginCompleted(result)\n }\n}\n","import _reduce from 'lodash/reduce'\n\nexport const getPopUpFeatures = (height = 200, width = 200) => {\n const features = {\n height,\n width,\n left: (window.screen.width / 2) - (width / 2),\n top: (window.screen.height / 2) - (height / 2),\n resizable: 1,\n scrollbars: 1,\n status: 1\n }\n\n return _reduce(features, (result, value, key) => [...result, `${key}=${value}`], [])\n .join(',')\n}\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\nimport {StyledButton, theme, scale, generateInteractionColors, declareInteractionColors} from 'tocco-ui'\n\nexport default styled(StyledButton)`\n && {\n margin-right: 0;\n flex: 1;\n font-size: ${scale.font(1.3)};\n justify-content: center;\n border-radius: ${theme.radii('large')};\n ${props => declareInteractionColors(\n generateInteractionColors(props, {\n bg: props.primaryColor,\n fg: props.secondaryColor || `${_get(props.theme, 'colors.paper')}, ${_get(props.theme, 'colors.text')}`\n }))}\n span {\n margin-left: .5em;\n padding: .9rem 0;\n }\n }\n`\n","import React from 'react'\nimport {Icon} from 'tocco-ui'\nimport PropTypes from 'prop-types'\n\nimport {openLoginWindow} from '../../utils/loginWindow'\nimport StyledProviderButton from './StyledProviderButton'\n\nconst ProviderButton = ({provider, loginCompleted, loginEndpoint}) => {\n const clickHandler = () => {\n openLoginWindow(loginEndpoint, loginCompleted, provider)\n }\n\n return (\n <StyledProviderButton\n primaryColor={provider.button_primary_color}\n secondaryColor={provider.button_secondary_color}\n onClick={clickHandler}\n >\n {provider.button_icon && <Icon position=\"prepend\" icon={provider.button_icon}/>}\n <span>{provider.button_label}</span>\n </StyledProviderButton>\n )\n}\n\nProviderButton.propTypes = {\n provider: PropTypes.shape({\n button_primary_color: PropTypes.string,\n button_secondary_color: PropTypes.string,\n button_icon: PropTypes.string,\n button_label: PropTypes.string\n }),\n loginEndpoint: PropTypes.string.isRequired,\n loginCompleted: PropTypes.func.isRequired\n}\n\nexport default ProviderButton\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport {openLoginWindow} from '../../utils/loginWindow'\nimport ProviderButton from '../ProviderButton/ProviderButton'\n\nconst StyledButtonContainer = styled.div`\n width: 100%;\n margin-top: 3rem;\n display: grid;\n grid-gap: 1rem;\n grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));\n\n @media (max-width: 1024px) {\n margin-top: 1.5rem;\n }\n`\n\nclass LoginBox extends React.Component {\n constructor(props) {\n super(props)\n props.loadProviders()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.autoLogin && prevProps.providers.length === 0 && this.props.providers.length > 0) {\n const autoLoginProvider = this.props.providers.find(entity => entity.unique_id === this.props.autoLogin)\n if (autoLoginProvider) {\n openLoginWindow(this.props.loginEndpoint, this.props.loginCompleted, autoLoginProvider)\n }\n }\n }\n\n render() {\n return <StyledButtonContainer>\n {\n this.props.providers\n .map((provider, idx) => (\n <ProviderButton\n key={idx}\n provider={provider}\n loginEndpoint={this.props.loginEndpoint}\n loginCompleted={this.props.loginCompleted}\n />\n ))\n }\n </StyledButtonContainer>\n }\n}\n\nLoginBox.propTypes = {\n loginEndpoint: PropTypes.string,\n loginCompleted: PropTypes.func.isRequired,\n loadProviders: PropTypes.func.isRequired,\n providers: PropTypes.array,\n autoLogin: PropTypes.string\n}\n\nexport default LoginBox\n","import LoginBox from './LoginBox'\n\nexport default LoginBox\n","import {connect} from 'react-redux'\n\nimport LoginBox from '../components/LoginBox'\nimport * as actions from '../modules/actions'\n\nconst mapActionCreators = {\n loadProviders: actions.loadProviders,\n loginCompleted: actions.loginCompleted\n}\n\nconst mapStateToProps = state => {\n return {\n providers: state.ssoLogin.providers,\n loginEndpoint: state.input.ssoLoginEndpoint,\n autoLogin: state.input.autoLogin\n }\n}\n\nexport default connect(mapStateToProps, mapActionCreators)(LoginBox)\n","import React from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, cache, externalEvents} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules'\nimport LoginBoxContainer from './containers/LoginBoxContainer'\n\nconst packageName = 'sso-login'\n\nconst EXTERNAL_EVENTS = [\n 'loginCompleted'\n]\n\nconst initApp = (id, input, events, publicPath) => {\n const content = <LoginBoxContainer/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n cache.addToStore(store)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp(packageName, input)\n\n if (module.hot) {\n module.hot.accept('./modules/index', () => {\n const reducers = require('./modules').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst SsoLoginApp = props => {\n const {component} = appFactory.useApp({initApp, props, packageName, externalEvents: EXTERNAL_EVENTS})\n return component\n}\n\nSsoLoginApp.propTypes = {\n ssoLoginEndpoint: PropTypes.string.isRequired,\n locale: PropTypes.string,\n autoLogin: PropTypes.bool\n}\n\nexport default SsoLoginApp\n","import styled, {createGlobalStyle} from 'styled-components'\nimport {scale, StyledH1, StyledSpan, theme} from 'tocco-ui'\n\nimport ToccoLogo from '../../assets/tocco-circle.svg'\n\n// Overwrite index.html overflow which is hidden\nexport const GlobalBodyStyle = createGlobalStyle`\n @media (max-width: 1024px) {\n body {\n overflow: auto !important;\n }\n }\n`\n\nexport const StyledLogin = styled.div`\n height: 100vh;\n width: 100vw;\n background-image: url(${ToccoLogo});\n background-repeat: no-repeat;\n background-size: 61vw;\n background-position-y: -25vw;\n background-position-x: -41vw;\n\n .tocco-sso-login {\n display: flex;\n justify-content: space-between;\n margin-bottom: 1.8rem;\n }\n\n @media (max-width: 1024px) {\n background-size: 2000px;\n background-position: 50% -1850px;\n }\n\n @media (max-width: 425px) {\n background-position: 50% -1890px;\n }\n`\n\nexport const StyledHeadingLogin = styled(StyledH1)`\n && {\n font-size: ${scale.font(11)};\n }\n`\nexport const StyledSpanLogin = styled(StyledSpan)`\n && {\n text-align: center;\n font-size: ${scale.font(1.3)};\n display: inline-block;\n width: 100%;\n margin: 1rem 0 1.8rem;\n }\n`\n\nexport const StyledLoginWrapper = styled.div`\n max-width: 410px;\n margin: 6% 5% 0 28%;\n\n && {\n .tocco-login * {\n font-size: ${scale.font(1.3)};\n }\n\n @media (max-width: 1024px) {\n margin: 14rem auto 0;\n padding-left: 2rem;\n padding-right: 2rem;\n }\n\n @media (max-width: 425px) {\n margin-top: 12rem;\n }\n }\n`\n\nexport const StyledSloganImg = styled.img`\n transform: rotate(270deg);\n position: relative;\n top: 12.5vw;\n left: -8%;\n width: 25vw;\n\n @media (max-width: 1024px) {\n display: none;\n }\n`\n\nexport const StyledMobileSloganImg = styled.img`\n display: none;\n max-width: 400px;\n width: 95%;\n height: auto;\n position: relative;\n margin: auto;\n top: 45px;\n\n @media (max-width: 1024px) {\n display: block;\n }\n\n @media (max-width: 425px) {\n max-width: 280px;\n }\n`\n\nexport const StyledSsoMsg = styled(StyledSpan)`\n && {\n display: inline-block;\n text-align: center;\n font-weight: ${theme.fontWeight('bold')};\n width: 100%;\n color: ${theme.color('signal.info.text')};\n }\n`\n\nexport const StyledSsoError = styled(StyledSsoMsg)`\n && {\n color: ${theme.color('signal.danger.text')};\n }\n`\n","import React, {useState, useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport ToccoLogin from 'tocco-login/src/main'\nimport SsoLogin from 'tocco-sso-login/src/main'\nimport {FormattedMessage} from 'react-intl'\nimport Cookies from 'js-cookie'\n\nimport ToccoSlogan from '../../assets/tocco_white.svg'\nimport {\n StyledSsoMsg,\n StyledSsoError,\n StyledSpanLogin,\n StyledLogin,\n StyledMobileSloganImg,\n StyledSloganImg,\n StyledLoginWrapper,\n StyledHeadingLogin,\n GlobalBodyStyle\n} from './StyledComponents'\n\nconst Login = ({ssoAvailable, loginSuccessful, checkSsoAvailable}) => {\n const [showError, setShowError] = useState(false)\n const [showRegistrationText, setShowRegistrationText] = useState(false)\n const autoLogin = Cookies.get('sso-autologin')\n\n useEffect(() => {\n checkSsoAvailable()\n }, [])\n\n const loginSuccess = ({timeout}) => {\n loginSuccessful(timeout)\n }\n\n const ssoLoginCompleted = ({successful, provider, registration}) => {\n if (successful) {\n Cookies.set('sso-autologin', provider, {expires: 365})\n loginSuccessful(30)\n } else if (!successful && registration) {\n setShowRegistrationText(true)\n } else {\n setShowError(true)\n }\n }\n\n const SsoLoginPart = () => (\n <>\n <SsoLogin\n ssoLoginEndpoint=\"/sso\"\n loginCompleted={ssoLoginCompleted}\n autoLogin={autoLogin}\n />\n {showRegistrationText\n && <StyledSsoMsg breakWords={true}><FormattedMessage id=\"client.sso-login.registration\"/></StyledSsoMsg>\n }\n {showError\n && <StyledSsoError breakWords={true}><FormattedMessage id=\"client.sso-login.error\"/></StyledSsoError>\n }\n <StyledSpanLogin><FormattedMessage id=\"client.admin.loginChoice\"/></StyledSpanLogin>\n </>\n )\n\n return (\n <>\n <GlobalBodyStyle/>\n <StyledLogin>\n <StyledMobileSloganImg src={ToccoSlogan} alt=\"Tocco Slogan\" height=\"42.3\" width=\"460\"/>\n <StyledSloganImg src={ToccoSlogan} alt=\"Tocco Slogan\" height=\"42.3\" width=\"460\"/>\n <StyledLoginWrapper>\n <StyledHeadingLogin><FormattedMessage id=\"client.admin.welcomeTitle\"/></StyledHeadingLogin>\n {ssoAvailable && <SsoLoginPart/>}\n <ToccoLogin\n loginSuccess={loginSuccess}\n showTitle={false}\n />\n </StyledLoginWrapper>\n </StyledLogin>\n </>\n\n )\n}\n\nLogin.propTypes = {\n ssoAvailable: PropTypes.bool,\n loginSuccessful: PropTypes.func.isRequired,\n checkSsoAvailable: PropTypes.func.isRequired\n}\n\nexport default Login\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Login from './Login'\nimport {loginSuccessful, checkSsoAvailable} from '../../modules/session/actions'\n\nconst mapActionCreators = {\n loginSuccessful,\n checkSsoAvailable\n}\n\nconst mapStateToProps = (state, props) => ({\n ssoAvailable: state.session.ssoAvailable\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Login))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {m, LazyMotion} from 'framer-motion'\nimport {injectIntl} from 'react-intl'\n\n/**\n * Animated Burger Menu Button\n */\nconst BurgerButton = ({isOpen, size = '20', color, intl}) => {\n const msg = id => intl.formatMessage({id})\n const variant = isOpen ? 'opened' : 'closed'\n const top = {\n closed: {\n rotate: 0,\n translateY: 0\n },\n opened: {\n rotate: 45,\n translateY: 2\n }\n }\n const center = {\n closed: {\n opacity: 1\n },\n opened: {\n opacity: 0\n }\n }\n const bottom = {\n closed: {\n rotate: 0,\n translateY: 0\n },\n opened: {\n rotate: -45,\n translateY: -2\n }\n }\n const lineProps = {\n stroke: color,\n vectorEffect: 'non-scaling-stroke',\n strokeWidth: 2,\n initial: 'closed',\n animate: variant,\n transition: {ease: 'easeOut', duration: 0.4}\n }\n\n const loadFeatures = () =>\n import('./framerMotionFeatures.js').then(res => res.default)\n\n return (\n <LazyMotion features={loadFeatures}>\n <m.svg\n viewBox=\"0 0 6 6\"\n overflow=\"visible\"\n preserveAspectRatio=\"none\"\n width={size}\n height={size}\n aria-label={msg('client.component.burgerButton.Label')}\n >\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"1\"\n y2=\"1\"\n variants={top}\n {...lineProps}\n />\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"3\"\n y2=\"3\"\n variants={center}\n {...lineProps}\n transition={{ease: 'easeOut', duration: 0.1}}\n />\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"5\"\n y2=\"5\"\n variants={bottom}\n {...lineProps}\n />\n </m.svg>\n </LazyMotion>\n )\n}\n\nBurgerButton.propTypes = {\n /**\n * Specify width and height.\n */\n size: PropTypes.string,\n /**\n * Color\n */\n color: PropTypes.string,\n /**\n * Specify width and height.\n */\n isOpen: PropTypes.bool,\n intl: PropTypes.object.isRequired\n}\n\nexport default injectIntl(BurgerButton)\n","import styled from 'styled-components'\nimport {declareFont, scale, theme} from 'tocco-ui'\n\nexport const StyledMenuEntry = styled.div`\n ${declareFont()}\n position: relative;\n\n && {\n padding-left: calc(${({level}) => level} * ${scale.space(0.75)});\n line-height: ${theme.lineHeight('light')};\n }\n ${({childrenCount}) => childrenCount === 0 && 'margin-bottom: 0 !important'}\n`\n\nexport const StyledMenuEntryWrapper = styled.div`\n margin-bottom: ${scale.space(0.6)};\n margin-top: ${scale.space(0.6)};\n\n > div {\n margin-bottom: ${scale.space(0.5)};\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuEntry} from './StyledComponents'\n\nconst MenuItem = ({\n item,\n menuTreePath = '',\n typeMapping\n}) => {\n const mappedType = typeMapping[item.menuType]\n if (!mappedType) {\n return null\n }\n\n const Component = mappedType.component\n const ChildrenWrapperComponent = mappedType.childrenWrapperComponent\n const MenuItems = item.children?.map(child => (<MenuItem\n key={child.name}\n item={child}\n typeMapping={typeMapping}\n menuTreePath={`${menuTreePath}.${child.name}`}\n />))\n\n return (\n <StyledMenuEntry {...item} childrenCount={item.children?.length || 0} data-cy={`admin-menuitem-${item.name}`}>\n <Component item={item} menuTreePath={menuTreePath} {...mappedType.props}/>\n {MenuItems?.length > 0 && (\n <ChildrenWrapperComponent item={item} menuTreePath={menuTreePath} {...mappedType.props}>\n {MenuItems}\n </ChildrenWrapperComponent>)}\n </StyledMenuEntry>\n )\n}\n\nMenuItem.propTypes = {\n item: PropTypes.shape({\n name: PropTypes.string,\n menuType: PropTypes.string,\n children: PropTypes.array,\n level: PropTypes.number\n }).isRequired,\n menuTreePath: PropTypes.string,\n typeMapping: PropTypes.objectOf(\n PropTypes.shape({\n component: PropTypes.elementType.isRequired,\n childrenWrapperComponent: PropTypes.elementType.isRequired,\n filterAttribute: PropTypes.arrayOf(PropTypes.string),\n props: PropTypes.object\n })\n )\n}\n\nexport default MenuItem\n","\nexport const getMenuPreferencesKey = (preferencesPrefix, menuTreePath) =>\n `admintree${preferencesPrefix ? `.${preferencesPrefix}` : ''}.${menuTreePath}.collapsed`\n\n/**\n * Gets flat preferences object for complete menu tree\n * @param {array} items - menu tree items\n * @param {string} preferencesPrefix - prefix for admintree preferences\n * @param {boolean} collapse\n * @returns {object} - flat prefrences object\n */\nexport const getCompleteMenuPreferences = (items, preferencesPrefix, collapse) => {\n if (!items || items.length === 0) {\n return {}\n }\n\n const preferences = items\n .reduce((acc, item) => {\n const {name} = item\n\n const hasChildren = item.children && item.children.length > 0\n const children = getCompleteMenuPreferences(item.children || [],\n `${preferencesPrefix}${preferencesPrefix ? `.${name}` : name}`, collapse)\n\n const key = getMenuPreferencesKey(preferencesPrefix, name)\n return {\n ...acc,\n ...children,\n ...(hasChildren ? {[key]: collapse} : {})\n }\n }, {})\n return preferences\n}\n\n/**\n * Preparing the actual visible menu tree:\n * - Applying the `searchFilter` and removing items which are not matching\n * - When a parent is matching all children get included\n * - When a parent has at least one matching child the parent gets included\n * - Add `level` field on each item\n * - Add `matchingAttribute` field on each item\n * - This includes the name of the field that is matching with the `searchFilter`\n *\n * @param {array} items - available items\n * @param {string} searchFilter - user search input\n * @param {object} typeMapping - menu entry type map configuration\n * @param {number} level - current level of tree (Default: 0)\n * @param {boolean} isParentMatching - true when parent item is matching (Default: false)\n * @returns {array} items - actual visible items for complete menu tree\n */\nexport const prepareMenuTree = (items, searchFilter, typeMapping, level = 0, isParentMatching = false) => {\n const includeInTree = item => !searchFilter\n || item.matchingAttribute\n || item.children?.length > 0\n || isParentMatching\n\n const getMatchingAttribute = (item, filterAttributes) => searchFilter\n ? filterAttributes.find(attr =>\n item[attr] && item[attr].toLowerCase().includes(searchFilter?.toLowerCase())\n )\n : undefined\n\n return items\n .map(item => {\n const mappedType = typeMapping[item.menuType] || {}\n const {filterAttributes = []} = mappedType\n const matchingAttribute = getMatchingAttribute(item, filterAttributes)\n\n const itemMatching = Boolean(matchingAttribute)\n\n const children = prepareMenuTree(item.children || [], searchFilter, typeMapping, level + 1, itemMatching)\n\n return {\n ...item,\n matchingAttribute,\n children,\n level\n }\n })\n .filter(includeInTree)\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuEntryWrapper} from './StyledComponents'\nimport MenuItem from './MenuItem'\nimport {prepareMenuTree} from '../../utils/navigationUtils'\n\nconst MenuTree = ({\n items,\n searchFilter,\n typeMapping,\n requireSearch\n}) => {\n if (requireSearch && !searchFilter) {\n return null\n }\n\n if (!items || items.length === 0) {\n return null\n }\n\n const actualItems = prepareMenuTree(items, searchFilter, typeMapping)\n\n const MenuItems = actualItems.map((item, index) => (\n <MenuItem\n key={index}\n item={item}\n typeMapping={typeMapping}\n menuTreePath={item.name}\n />\n ))\n\n return (\n <StyledMenuEntryWrapper>\n {MenuItems}\n </StyledMenuEntryWrapper>\n )\n}\n\nMenuTree.propTypes = {\n items: PropTypes.array,\n searchFilter: PropTypes.string,\n typeMapping: PropTypes.objectOf(\n PropTypes.shape({\n component: PropTypes.elementType.isRequired,\n childrenWrapperComponent: PropTypes.elementType.isRequired,\n filterAttribute: PropTypes.arrayOf(PropTypes.string),\n props: PropTypes.object\n })\n ),\n requireSearch: PropTypes.bool\n}\n\nexport default React.memo(MenuTree)\n","import MenuTree from './MenuTree'\n\nexport default MenuTree\n","import styled, {css} from 'styled-components'\nimport {theme, StyledScrollbar, scale, StyledSearchBox, Ball, declareFont} from 'tocco-ui'\n\nconst secondary = theme.color('secondary')\nconst secondaryLight = theme.color('secondaryLight')\n\nexport const StyledNav = styled.nav`\n height: 100%;\n display: flex;\n flex-direction: column;\n\n ${StyledSearchBox} {\n margin: ${scale.space(0.2)} ${scale.space(1.25)} ${scale.space(0.5)} ${scale.space(0.5)};\n }\n`\n\nexport const StyledMenuEntry = styled.span`\n display: inline-block;\n color: ${theme.color('text')};\n font-weight: ${theme.fontWeight('bold')};\n margin-bottom: ${scale.space(-1.2)};\n margin-top: ${scale.space(-1.2)};\n`\n\nexport const StyledTabsContainer = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: ${scale.space(-0.37)};\n padding: 0 ${scale.space(0.6)};\n border-bottom: 3px solid ${theme.color('backgroundBody')};\n\n &:focus {\n background-color: transparent;\n }\n`\n\nexport const StyledActiveTabLabel = styled.div`\n ${declareFont({\n fontSize: scale.font(2.9),\n fontWeight: theme.fontWeight('bold'),\n color: theme.color('secondary')\n })}\n flex-grow: 1;\n`\n\nexport const StyledNavIconButton = styled(Ball)`\n overflow: hidden;\n flex: ${({narrow}) => narrow ? 0.2 : 1};\n justify-content: center;\n border-radius: 0;\n margin: ${scale.space(-0.7)};\n border-top: 5px solid ${({active}) => active ? secondary : 'transparent'};\n font-weight: ${theme.fontWeight('bold')};\n font-size: ${scale.font(3)};\n padding-top: ${scale.space(-1.1)};\n padding-bottom: cal(${scale.space(-1.1)} - 5px); /* subtract border-top width of 5px */\n ${({active}) => active\n && css`color: ${secondary};`\n };\n\n &:hover {\n border-color: ${({active}) => active ? secondary : secondaryLight};\n background-color: transparent;\n color: ${({active}) => active ? secondary : secondaryLight};\n }\n\n &:focus {\n background-color: transparent;\n }\n\n & > * {\n display: inline-block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`\n\nexport const StyledSearchBoxWrapper = styled.div`\n height: 50px;\n padding-bottom: ${scale.space(-0.5)};\n`\n\nexport const StyledMenuWrapper = styled.div`\n height: 100%;\n overflow: auto;\n padding: ${scale.space(0.6)} ${scale.space(0.6)} 0 ${scale.space(0.6)};\n ${StyledScrollbar}\n`\n\nexport const StyledMenuButtonsWrapper = styled.div`\n position: absolute;\n display: flex;\n justify-content: flex-end;\n width: calc(100% - 2 * ${scale.space(0.6)}); // subtract StyledMenuWrapper padding\n padding: 0;\n`\n\nexport const StyledMenuButton = styled(Ball)`\n font-size: ${scale.font(0)};\n justify-content: center;\n border-radius: 0;\n padding: 0;\n\n &:hover,\n &:focus {\n background-color: transparent;\n color: ${secondaryLight};\n }\n`\n","import styled from 'styled-components'\nimport {Link} from 'react-router-dom'\nimport {theme, scale} from 'tocco-ui'\n\nconst secondaryLight = theme.color('secondaryLight')\n\nexport const StyledMenuLink = styled(Link)`\n color: ${theme.color('text')};\n text-decoration: none;\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n\n &:focus {\n outline: none;\n font-weight: ${theme.fontWeight('bold')};\n color: ${secondaryLight};\n }\n\n &.active {\n text-decoration: underline;\n }\n`\n\nexport const StyledIconLink = styled(Link)`\n opacity: 0;\n color: ${theme.color('text')};\n text-decoration: none;\n position: relative;\n margin-left: ${scale.space(-1)};\n\n &:hover,\n &:focus {\n color: ${theme.color('secondaryLight')};\n }\n\n &:focus {\n opacity: 1;\n outline: none;\n }\n`\n\nexport const StyledMenuLinkWrapper = styled.span`\n display: inline-block;\n padding-top: ${scale.space(-2)};\n padding-bottom: ${scale.space(-2)};\n\n &:hover ${StyledIconLink} {\n opacity: 1;\n }\n`\n\nexport const StyledTogglerIconWrapper = styled.span`\n display: none;\n margin-left: ${scale.space(-1)};\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n`\n\nexport const StyledMenuEntry = styled.span`\n color: ${theme.color('text')};\n font-weight: ${theme.fontWeight('bold')};\n margin-bottom: ${scale.space(-1.2)};\n margin-top: ${scale.space(-1.2)};\n display: flex;\n\n &:hover {\n ${({onClick}) => onClick ? 'cursor: pointer;' : 'cursor: auto;'}\n\n ${StyledTogglerIconWrapper} {\n display: block;\n }\n }\n`\n\nexport const StyledMenuIconWrapper = styled.span`\n margin-right: ${scale.space(-1.2)};\n`\n\nexport const StyledMenuChildrenWrapper = styled.div`\n display: ${({isOpen}) => isOpen ? 'block' : 'none'};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledMenuEntry, StyledMenuIconWrapper, StyledTogglerIconWrapper} from './StyledComponents'\nimport {getMenuPreferencesKey} from '../../../utils/navigationUtils'\n\nconst MenuEntry = props => {\n const {\n item,\n isOpen,\n canCollapse,\n preferencesPrefix,\n menuTreePath,\n saveUserPreferences\n } = props\n const {\n icon,\n label\n } = item\n\n const toggleMenuEntryCollapsed = () =>\n saveUserPreferences({[getMenuPreferencesKey(preferencesPrefix, menuTreePath)]: isOpen})\n\n return (\n <StyledMenuEntry\n {...(canCollapse ? {onClick: toggleMenuEntryCollapsed} : {})}\n >\n <span>\n {icon && <StyledMenuIconWrapper><Icon icon={icon}/></StyledMenuIconWrapper>}\n {label}\n </span>\n {canCollapse && (\n <StyledTogglerIconWrapper>\n <Icon\n icon={isOpen ? 'chevron-up' : 'chevron-down'}\n onClick={toggleMenuEntryCollapsed}\n />\n </StyledTogglerIconWrapper>)}\n </StyledMenuEntry>\n )\n}\n\nMenuEntry.propTypes = {\n item: PropTypes.shape({\n icon: PropTypes.string,\n label: PropTypes.string,\n name: PropTypes.string\n }).isRequired,\n canCollapse: PropTypes.bool.isRequired,\n saveUserPreferences: PropTypes.func.isRequired,\n menuTreePath: PropTypes.string.isRequired,\n isOpen: PropTypes.bool,\n preferencesPrefix: PropTypes.string\n}\n\nexport default MenuEntry\n","import _get from 'lodash/get'\n\nimport {getMenuPreferencesKey} from '../../utils/navigationUtils'\n\nexport const menuIsOpenPrefrencesSelector = (state, {canCollapse, preferencesPrefix, menuTreePath}) => canCollapse\n ? !_get(state.preferences.userPreferences, getMenuPreferencesKey(preferencesPrefix, menuTreePath), true)\n : undefined\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport MenuEntry from './MenuEntry'\nimport {saveUserPreferences} from '../../../modules/preferences/actions'\nimport {menuIsOpenPrefrencesSelector} from '../../../modules/preferences/selectors'\n\nconst mapActionCreators = {\n saveUserPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n isOpen: menuIsOpenPrefrencesSelector(state, props)\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(MenuEntry))\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuChildrenWrapper} from './StyledComponents'\n\nconst MenuChildrenWrapper = ({isOpen, canCollapse, children}) => (\n <StyledMenuChildrenWrapper\n isOpen={!canCollapse || isOpen}\n >\n {(!canCollapse || isOpen) && children}\n </StyledMenuChildrenWrapper>\n)\n\nMenuChildrenWrapper.propTypes = {\n menuTreePath: PropTypes.string.isRequired,\n canCollapse: PropTypes.bool.isRequired,\n children: PropTypes.any,\n isOpen: PropTypes.bool\n}\n\nexport default MenuChildrenWrapper\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport MenuChildrenWrapper from './MenuChildrenWrapper'\nimport {menuIsOpenPrefrencesSelector} from '../../../modules/preferences/selectors'\n\nconst mapStateToProps = (state, props) => ({\n isOpen: menuIsOpenPrefrencesSelector(state, props)\n})\n\nexport default connect(mapStateToProps)(injectIntl(MenuChildrenWrapper))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledIconLink, StyledMenuLink, StyledMenuLinkWrapper} from './StyledComponents'\n\nconst EntityExplorerEntry = ({\n onClick,\n item\n}) => {\n const entityNameDisplay = item.matchingAttribute === 'entity' ? <> ({item.entity})</> : ''\n\n return (\n <StyledMenuLinkWrapper>\n <StyledMenuLink data-quick-navigation={true} onClick={onClick} to={`/e/${item.entity}`}>\n {item.label}{entityNameDisplay}\n </StyledMenuLink>\n <StyledIconLink to={`/e/${item.entity}`} target=\"_blank\" rel=\"noreferrer\">\n <Icon icon=\"external-link\"/>\n </StyledIconLink>\n </StyledMenuLinkWrapper>\n )\n}\n\nEntityExplorerEntry.propTypes = {\n item: PropTypes.shape({\n entity: PropTypes.string,\n label: PropTypes.string,\n matchingAttribute: PropTypes.string\n }),\n onClick: PropTypes.func\n}\n\nexport default EntityExplorerEntry\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledIconLink, StyledMenuLink, StyledMenuLinkWrapper} from './StyledComponents'\n\nconst ActionEntry = ({\n onClick,\n item\n}) => (\n <StyledMenuLinkWrapper>\n <StyledMenuLink\n data-quick-navigation={true}\n onClick={onClick}\n to={`/e/action/${item.name}`}>\n {item.label}\n </StyledMenuLink>\n <StyledIconLink to={`/e/action/${item.name}`} target=\"_blank\" rel=\"noreferrer\">\n <Icon icon=\"external-link\"/>\n </StyledIconLink>\n </StyledMenuLinkWrapper>\n)\n\nActionEntry.propTypes = {\n item: PropTypes.shape({\n name: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired\n }).isRequired,\n onClick: PropTypes.func\n}\n\nexport default ActionEntry\n","import React, {useRef, useState, useEffect, useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport {SearchBox} from 'tocco-ui'\n\nimport MenuTree from '../MenuTree'\nimport {\n StyledTabsContainer,\n StyledNav,\n StyledMenuWrapper,\n StyledSearchBoxWrapper,\n StyledMenuButtonsWrapper,\n StyledMenuButton,\n StyledNavIconButton,\n StyledActiveTabLabel\n} from './StyledComponents'\nimport {ActionEntry, EntityExplorerEntry, MenuEntry, MenuChildrenWrapper} from './menuType'\nimport {getCompleteMenuPreferences} from '../../utils/navigationUtils'\n\nconst menuTabs = {\n MODULES: 'modules',\n COMPLETE: 'complete',\n SETTINGS: 'settings',\n SYSTEM: 'system'\n}\n\nconst createMenuTypeMap = ({\n onClick,\n hasFilterApplied,\n preferencesPrefix\n}) => {\n const usePreferences = typeof preferencesPrefix !== 'undefined'\n const canCollapse = !hasFilterApplied && usePreferences\n\n return {\n 'menu': {\n component: MenuEntry,\n childrenWrapperComponent: MenuChildrenWrapper,\n filterAttributes: ['label'],\n props: {\n preferencesPrefix,\n canCollapse\n }\n },\n 'entity-explorer': {\n component: EntityExplorerEntry,\n childrenWrapperComponent: MenuChildrenWrapper,\n props: {\n onClick,\n preferencesPrefix,\n canCollapse\n },\n filterAttributes: ['label', 'entity']\n },\n 'action': {\n component: ActionEntry,\n childrenWrapperComponent: MenuChildrenWrapper,\n props: {\n onClick,\n preferencesPrefix,\n canCollapse\n },\n filterAttributes: ['label']\n }\n }\n}\n\nconst Navigation = ({\n modulesMenuTree,\n settingsMenuTree,\n systemMenuTree,\n completeMenuTree,\n menuOpen,\n onClick,\n activeMenuTab,\n setActiveMenuTab,\n intl,\n saveUserPreferences\n}) => {\n const inputEl = useRef(null)\n const navigationEl = useRef(null)\n const [filter, setFilter] = useState('')\n const hasFilterApplied = Boolean(filter)\n const showMenu = !hasFilterApplied && [menuTabs.MODULES, menuTabs.SETTINGS].includes(activeMenuTab)\n\n const msg = id => intl.formatMessage({id})\n\n const menuTabsConfig = {\n [menuTabs.MODULES]: {\n items: modulesMenuTree,\n preferencesPrefix: '',\n label: msg('client.admin.navigation.modules'),\n icon: 'cube'\n },\n [menuTabs.COMPLETE]: {\n items: completeMenuTree,\n label: msg('client.admin.navigation.complete'),\n icon: 'chart-network'\n },\n [menuTabs.SETTINGS]: {\n items: settingsMenuTree,\n preferencesPrefix: 'settings',\n label: msg('client.admin.navigation.settings'),\n icon: 'cog'\n },\n [menuTabs.SYSTEM]: {\n items: systemMenuTree,\n label: msg('client.admin.navigation.system'),\n icon: 'laptop-code'\n }\n }\n\n const modulesTypeMap = useMemo(() =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied,\n preferencesPrefix: menuTabsConfig[menuTabs.MODULES].preferencesPrefix\n }), [onClick, hasFilterApplied])\n const settingsTypeMap = useMemo(() =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied,\n preferencesPrefix: menuTabsConfig[menuTabs.SETTINGS].preferencesPrefix\n }), [onClick, hasFilterApplied])\n const systemTypeMap = useMemo(() =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied\n }), [onClick, hasFilterApplied])\n const completeTypeMap = useMemo(() =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied\n }), [onClick, hasFilterApplied])\n\n useEffect(() => {\n if (menuOpen) {\n if (!activeMenuTab) {\n setActiveMenuTab(menuTabs.MODULES)\n }\n inputEl.current.select()\n }\n }, [menuOpen])\n\n useEffect(() => {\n if (menuOpen) {\n if (inputEl.current) {\n inputEl.current.focus()\n }\n }\n }, [activeMenuTab, menuOpen])\n\n const handleCursorNavigation = key => {\n const focusableElements = navigationEl.current.querySelectorAll('a[data-quick-navigation=\"true\"], input')\n const currentIdx = [...focusableElements].findIndex(el => document.activeElement.isEqualNode(el))\n\n if (currentIdx > -1) {\n const indexDiff = key === 'ArrowDown' ? 1 : focusableElements.length - 1\n const targetIdx = (currentIdx + indexDiff) % focusableElements.length\n focusableElements[targetIdx].focus()\n }\n }\n\n const onKeyDown = e => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n handleCursorNavigation(e.key)\n }\n }\n\n const handleExpandAll = () => {\n const {\n items,\n preferencesPrefix\n } = menuTabsConfig[activeMenuTab] || {}\n if (items && typeof preferencesPrefix !== 'undefined') {\n const preferences = getCompleteMenuPreferences(items, preferencesPrefix, false)\n saveUserPreferences(preferences)\n }\n }\n\n const handleCollapseAll = () => {\n const {\n items,\n preferencesPrefix\n } = menuTabsConfig[activeMenuTab] || {}\n if (items && typeof preferencesPrefix !== 'undefined') {\n const preferences = getCompleteMenuPreferences(items, preferencesPrefix, true)\n saveUserPreferences(preferences)\n }\n }\n\n const changeMenuTab = tab => {\n setActiveMenuTab(tab)\n }\n\n const MenuTabs = Object.keys(menuTabs).map(key => {\n const menuTab = menuTabs[key]\n return (\n <StyledNavIconButton\n key={key}\n active={activeMenuTab === menuTab}\n onMouseDown={e => {\n changeMenuTab(menuTab)\n\n /**\n * Prevent floating label on search input jumping\n * up and down while switching between menu tabs.\n * This prevents loosing the focus when \"clicking\"\n * on the menu tab button.\n */\n e.preventDefault()\n }}\n title={menuTabsConfig[menuTab].label}\n icon={menuTabsConfig[menuTab].icon}\n />\n )\n })\n\n return (\n <StyledNav ref={navigationEl} onKeyDown={onKeyDown} data-cy=\"admin-nav\">\n <StyledTabsContainer>\n <StyledActiveTabLabel>{menuTabsConfig[activeMenuTab]?.label}</StyledActiveTabLabel>\n <div>\n {MenuTabs}\n </div>\n </StyledTabsContainer>\n <StyledSearchBoxWrapper>\n <SearchBox\n minInputLength={2}\n onSearch={setFilter}\n ref={inputEl}\n placeholder={msg('client.admin.navigation.searchBoxPlaceHolder')}\n aria-label={msg('client.admin.navigation.searchBoxPlaceHolder')}\n />\n </StyledSearchBoxWrapper>\n <StyledMenuWrapper>\n {showMenu && <StyledMenuButtonsWrapper>\n <StyledMenuButton\n icon=\"chevron-double-down\"\n type=\"button\"\n onClick={handleExpandAll}\n title={msg('client.admin.navigation.expandAll')}\n />\n <StyledMenuButton\n icon=\"chevron-double-up\"\n type=\"button\"\n onClick={handleCollapseAll}\n title={msg('client.admin.navigation.collapseAll')}\n />\n </StyledMenuButtonsWrapper>}\n\n {activeMenuTab === menuTabs.MODULES\n && <MenuTree items={modulesMenuTree} searchFilter={filter} typeMapping={modulesTypeMap}/>}\n {activeMenuTab === menuTabs.SETTINGS\n && <MenuTree items={settingsMenuTree} searchFilter={filter} typeMapping={settingsTypeMap}/>}\n {activeMenuTab === menuTabs.SYSTEM\n && <MenuTree items={systemMenuTree} searchFilter={filter} typeMapping={systemTypeMap}/>}\n {activeMenuTab === menuTabs.COMPLETE\n && <MenuTree items={completeMenuTree} searchFilter={filter}\n typeMapping={completeTypeMap} requireSearch={true}/>}\n </StyledMenuWrapper>\n </StyledNav>\n )\n}\n\nNavigation.propTypes = {\n intl: PropTypes.object.isRequired,\n activeMenuTab: PropTypes.string.isRequired,\n settingsMenuTree: PropTypes.array,\n modulesMenuTree: PropTypes.array,\n systemMenuTree: PropTypes.array,\n completeMenuTree: PropTypes.array,\n onClick: PropTypes.func,\n setActiveMenuTab: PropTypes.func,\n saveUserPreferences: PropTypes.func,\n menuOpen: PropTypes.bool\n}\n\nexport default Navigation\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Navigation from './Navigation'\nimport {saveUserPreferences} from '../../modules/preferences/actions'\nimport {setActiveMenuTab} from '../../modules/navigation/actions'\nconst mapActionCreators = {\n setActiveMenuTab,\n saveUserPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n settingsMenuTree: state.navigation.settingsMenuTree,\n modulesMenuTree: state.navigation.modulesMenuTree,\n systemMenuTree: state.navigation.systemMenuTree,\n completeMenuTree: state.navigation.completeMenuTree,\n menuOpen: state.navigation.menuOpen,\n activeMenuTab: state.navigation.activeMenuTab\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Navigation))\n","import NavigationContainer from './NavigationContainer'\n\nexport default NavigationContainer\n","export const LOAD_DASHBOARD = 'dashboard/LOAD_DASHBOARD'\nexport const SET_DASHBOARD = 'dashboard/SET_DASHBOARD'\nexport const SAVE_INFOBOX_POSITIONS = 'dashboard/SAVE_INFOBOX_POSITIONS'\nexport const SAVE_INFOBOX_HEIGHT = 'dashboard/SAVE_INFOBOX_HEIGHT'\nexport const DISPLAY_INFOBOX_SETTINGS_MODAL = 'dashboard/DISPLAY_INFOBOX_SETTINGS_MODAL'\nexport const RESET_INFOBOX_SETTINGS = 'dashboard/RESET_INFOBOX_SETTINGS'\n\nexport const loadDashboard = () => ({\n type: LOAD_DASHBOARD\n})\n\nexport const setDashboard = infoBoxes => ({\n type: SET_DASHBOARD,\n payload: {\n infoBoxes\n }\n})\n\nexport const saveInfoBoxPositions = infoBoxes => ({\n type: SAVE_INFOBOX_POSITIONS,\n payload: {\n infoBoxes\n }\n})\n\nexport const saveInfoBoxHeight = (id, height) => ({\n type: SAVE_INFOBOX_HEIGHT,\n payload: {\n id,\n height\n }\n})\n\nexport const displayInfoBoxSettings = () => ({\n type: DISPLAY_INFOBOX_SETTINGS_MODAL\n})\n\nexport const resetInfoBoxSettings = () => ({\n type: RESET_INFOBOX_SETTINGS\n})\n","import styled from 'styled-components'\nimport {scale, StyledScrollbar, shadeColor, theme} from 'tocco-ui'\nimport _get from 'lodash/get'\n\nexport const StyledDashboardWrapper = styled.div`\n width: 100%;\n height: 100%;\n background: ${theme.color('paper')};\n padding: ${scale.space(-0.5)};\n overflow: auto;\n ${StyledScrollbar}\n box-sizing: border-box;\n`\n\nexport const StyledColumnWrapper = styled.div`\n display: flex;\n flex-wrap: nowrap;\n`\n\nexport const StyledColumn = styled.div`\n width: 50%;\n display: flex;\n flex-wrap: wrap;\n align-content: flex-start;\n position: relative;\n`\n\nexport const StyledInfoBoxWrapper = styled.div`\n position: relative;\n width: 100%;\n margin: ${scale.space(-0.5)};\n`\n\nexport const StyledResizeHandle = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2;\n background: ${({theme}) => shadeColor(_get(theme, 'colors.paper'), 3)};\n opacity: ${({isReszing}) => isReszing ? 1 : 0};\n height: 3px;\n cursor: row-resize;\n`\n","\nconst DropTypes = {\n Column: 'Column',\n InfoBox: 'InfoBox'\n}\n\nexport default DropTypes\n","\nexport const InfoBoxRenderTypes = {\n InfoBox: 'InfoBox',\n DropPreview: 'DropPreview'\n}\n","import {flow, curry} from 'lodash'\nimport {dragAndDrop} from 'tocco-util'\n\nimport DropTypes from './dropTypes'\nimport {InfoBoxRenderTypes} from './infoBoxTypes'\n\nexport const sortInfoBoxes = boxes => boxes.sort((a, b) => {\n if (a.col === b.col) {\n return a.row - b.row\n }\n return a.col - b.col\n})\n\nconst reindex = curry(sortedBoxes => {\n return sortedBoxes\n .reduce(({index, boxes}, box) => {\n const nextIndex = typeof index[box.col] === 'number' ? index[box.col] + 1 : 0\n const acc = {\n boxes: [\n ...boxes,\n {...box, row: nextIndex}\n ],\n index: {\n ...index,\n [box.col]: nextIndex\n }\n }\n return acc\n }, {index: {}, boxes: []}).boxes\n})\n\nconst insertDraggedAtDropped = curry((draggingId, dragOverId, position, sortedBoxes) => {\n const dragOverColumn = sortedBoxes.find(b => b.id === dragOverId)?.col\n const draggingBox = sortedBoxes.find(b => b.id === draggingId)\n return reindex(sortedBoxes\n .reduce((boxes, box) => {\n const moveBoxHere = box.id === dragOverId\n const isDraggingBox = box.id === draggingId\n if (isDraggingBox) {\n // filter out dragging box from the old place\n return boxes\n }\n\n return [\n ...boxes,\n ...(position === dragAndDrop.DropPosition.Top && moveBoxHere\n ? [{...draggingBox, col: dragOverColumn, row: -1}]\n : []),\n box,\n ...(position === dragAndDrop.DropPosition.Bottom && moveBoxHere\n ? [{...draggingBox, col: dragOverColumn, row: -1}]\n : [])\n ]\n }, [])\n )\n})\n\nexport const moveDraggedToDropped = (draggingId, dragOverId, position, boxes) => flow([\n sortInfoBoxes,\n insertDraggedAtDropped(draggingId, dragOverId, position)])(boxes)\n\nexport const appendDraggedAsLastItemToDropped = (draggingId, dragOverId, boxes) => {\n const draggingBox = boxes.find(b => b.id === draggingId)\n return reindex([\n ...sortInfoBoxes(boxes).filter(({id}) => id !== draggingId),\n {...draggingBox, col: dragOverId, row: -1}\n ])\n}\n\nexport const getRenderInfoBoxesForColumn = (draggingId, currentlyDragOver, position, column, boxes) => {\n const {type: dragOverType, id: dragOverId} = currentlyDragOver || {}\n const isOverItself = dragOverId === draggingId && dragOverType === DropTypes.InfoBox\n const draggingBox = boxes.find(b => b.id === draggingId)\n const draggingPreviewBox = {...draggingBox, type: InfoBoxRenderTypes.DropPreview}\n\n let renderBoxes = boxes\n .filter(({folded, col, id}) => !folded\n && col === column\n && ((typeof dragOverId !== 'undefined' && !isOverItself)\n ? id !== draggingId\n : true))\n .map(box => ({...box, type: InfoBoxRenderTypes.InfoBox}))\n .reduce((acc, key) => {\n const showPreviewHere = key.id === dragOverId && dragOverType === DropTypes.InfoBox && !isOverItself\n return [\n ...acc,\n ...(position === dragAndDrop.DropPosition.Top && showPreviewHere\n ? [draggingPreviewBox]\n : []),\n (key.id === draggingId && isOverItself) ? {...key, type: InfoBoxRenderTypes.DropPreview} : key,\n ...(position === dragAndDrop.DropPosition.Bottom && showPreviewHere\n ? [draggingPreviewBox]\n : [])\n ]\n }, [])\n \n if (dragOverType === DropTypes.Column && dragOverId === column) {\n renderBoxes = [...renderBoxes, draggingPreviewBox]\n }\n\n return renderBoxes\n}\n","import styled from 'styled-components'\n\nexport const StyledMenuWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {BallMenu, MenuItem} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledMenuWrapper} from './StyledComponents'\n\nconst Menu = ({displayInfoBoxSettings, resetInfoBoxSettings}) => (\n <StyledMenuWrapper>\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem onClick={displayInfoBoxSettings}>\n <FormattedMessage id=\"client.dashboard.preferences.show\"/>\n </MenuItem>\n <MenuItem onClick={resetInfoBoxSettings}>\n <FormattedMessage id=\"client.dashboard.preferences.reset\"/>\n </MenuItem>\n </BallMenu>\n </StyledMenuWrapper>\n)\n\nMenu.propTypes = {\n displayInfoBoxSettings: PropTypes.func.isRequired,\n resetInfoBoxSettings: PropTypes.func.isRequired\n}\n\nexport default Menu\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Menu from './Menu'\nimport {displayInfoBoxSettings, resetInfoBoxSettings} from '../../modules/dashboard/actions'\n\nconst mapActionCreators = {\n displayInfoBoxSettings,\n resetInfoBoxSettings\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(Menu))\n","export const NUMBER_OF_COLUMNS = 2\n","import styled from 'styled-components'\nimport {colorizeBorder, scale, theme} from 'tocco-ui'\n\nconst minHeight = '50px'\n\nexport const StyledInfoBoxWrapper = styled.div`\n box-sizing: border-box;\n border: 1px solid ${colorizeBorder.shade1};\n height: ${({height}) => height ? `${height}px` : 'auto'};\n min-height: ${minHeight};\n padding: ${scale.space(-0.5)};\n background: ${theme.color('paper')};\n overflow: hidden;\n display: flex;\n flex-direction: column;\n\n /**\n * Workaround:\n * so that ghost-image on drag and drop is taken correctly\n * when having an absolute position element inside the InfoBox (e.g. entity-list)\n */\n position: relative;\n z-index: 1;\n`\n\nexport const StyledDroppedPreview = styled.div`\n border: 2px dashed ${theme.color('primary')};\n box-sizing: border-box;\n height: ${({height}) => `${height}px`};\n min-height: ${minHeight};\n width: 100%;\n padding: ${scale.space(-0.5)};\n margin: ${scale.space(-0.5)};\n background: ${theme.color('paper')};\n`\n","import styled from 'styled-components'\nimport {StyledScrollbar} from 'tocco-ui'\n\nexport const StyledInfoBoxContentWrapper = styled.div`\n flex: 1;\n ${({scrollable}) => scrollable && 'overflow: auto;'}\n ${StyledScrollbar}\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedValue} from 'tocco-ui'\n\nimport {StyledInfoBoxContentWrapper} from './StyledComponents'\n\nconst InfoBoxHtmlFieldContent = ({content}) => {\n const {text} = content\n return (\n <StyledInfoBoxContentWrapper scrollable>\n <FormattedValue type=\"html\" value={text}/>\n </StyledInfoBoxContentWrapper>\n )\n}\n\nInfoBoxHtmlFieldContent.propTypes = {\n content: PropTypes.object.isRequired\n}\n\nexport default InfoBoxHtmlFieldContent\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport EntityListApp from 'tocco-entity-list/src/main'\nimport {AdminLink as StyledLink} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {StyledInfoBoxContentWrapper} from './StyledComponents'\n\nconst DetailLinkRelativeWithoutIntl = ({entityKey, entityModel, children, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledLink\n aria-label={msg('client.component.navigationStrategy.detailLinkRelative')}\n to={`/e/${entityModel}/${entityKey}`}>\n {children}\n </StyledLink>\n )\n}\n\nconst DetailLinkRelative = injectIntl(DetailLinkRelativeWithoutIntl)\n\nDetailLinkRelativeWithoutIntl.propTypes = {\n entityKey: PropTypes.string.isRequired,\n entityModel: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nconst InfoBoxSearchFilterContent = ({id, content, navigationStrategy, emitAction}) => {\n const {searchFilterUniqueId, entityName, scope, limit} = content\n\n const handleRowClick = ({id}) => {\n navigationStrategy.openDetail(entityName, id, false)\n }\n\n return <StyledInfoBoxContentWrapper>\n <EntityListApp\n id={id}\n limit={limit}\n entityName={entityName}\n formName={entityName}\n searchFilters={[searchFilterUniqueId]}\n scope={scope}\n showActions={false}\n onRowClick={handleRowClick}\n searchFormType=\"simple\"\n searchFormPosition=\"top\"\n selectionStyle=\"none\"\n sortable\n disableSelectionController\n emitAction={emitAction}\n navigationStrategy={{...navigationStrategy, DetailLinkRelative}}\n showLink={true}\n />\n </StyledInfoBoxContentWrapper>\n}\n\nInfoBoxSearchFilterContent.propTypes = {\n id: PropTypes.string.isRequired,\n content: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.object\n}\n\nexport default InfoBoxSearchFilterContent\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport InfoBoxSearchFilterContent from './InfoBoxSearchFilterContent'\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nconst mapStateToProps = state => ({\n navigationStrategy: state.input.navigationStrategy\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(InfoBoxSearchFilterContent))\n","import React from 'react'\nimport {consoleLogger} from 'tocco-util'\n\nimport InfoBoxHtmlFieldContent from './typeContent/InfoBoxHtmlFieldContent'\nimport InfoBoxSearchFilterContentContainer from './typeContent/InfoBoxSearchFilterContentContainer'\n\nexport default (type, id, content) => {\n if (map[type]) {\n return React.createElement(map[type], {id, content})\n }\n\n consoleLogger.logError('No Content mapper defined for type', type, id)\n return <div/>\n}\n\nexport const map = {\n htmlfield: InfoBoxHtmlFieldContent,\n searchfilter: InfoBoxSearchFilterContentContainer\n}\n","import PropTypes from 'prop-types'\n\nimport provider from './typeContentProvider'\n\nconst InfoBoxContent = ({id, content}) => {\n if (!content) {\n return null\n }\n\n const {type} = content\n return provider(type, id, content)\n}\n\nInfoBoxContent.propTypes = {\n id: PropTypes.string.isRequired,\n content: PropTypes.object.isRequired\n}\n\nexport default InfoBoxContent\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography} from 'tocco-ui'\n\nimport {StyledInfoBoxWrapper} from './StyledComponents'\nimport InfoBoxContent from './InfoBoxContent'\n\nconst InfoBox = ({id, label, height, content, ...props}) => (\n <StyledInfoBoxWrapper {...props} height={height}>\n <Typography.H3>{label}</Typography.H3>\n <InfoBoxContent id={id} content={content}/>\n </StyledInfoBoxWrapper>\n)\n\nInfoBox.propTypes = {\n id: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n height: PropTypes.number.isRequired,\n content: PropTypes.object.isRequired\n}\n\nexport default InfoBox\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledInfoBoxWrapper, StyledResizeHandle} from './StyledComponents'\nimport InfoBox from '../InfoBox/InfoBox'\n\nconst DashboardInfoBox = ({\n infoBox,\n isResizing,\n startResize,\n onDragStart,\n onDragEnter,\n onDragOver,\n onDrop\n}) => {\n const {id, type, label, height, content} = infoBox\n return (\n <StyledInfoBoxWrapper key={`${type}-${id}`} id={`infobox-${id}`}>\n <InfoBox\n id={id}\n label={label}\n height={height}\n content={content}\n draggable\n onDragStart={onDragStart}\n onDragEnter={onDragEnter}\n onDragOver={onDragOver}\n onDrop={onDrop}\n />\n <StyledResizeHandle\n onMouseDown={startResize}\n isReszing={isResizing}\n />\n </StyledInfoBoxWrapper>\n )\n}\n\nDashboardInfoBox.propTypes = {\n infoBox: PropTypes.object.isRequired,\n isResizing: PropTypes.bool.isRequired,\n startResize: PropTypes.func.isRequired,\n onDragStart: PropTypes.func,\n onDragEnter: PropTypes.func,\n onDragOver: PropTypes.func,\n onDrop: PropTypes.func\n}\n\nexport default DashboardInfoBox\n","import React from 'react'\n\nimport {StyledDroppedPreview} from './StyledComponents'\n\nconst DropPreview = props => <StyledDroppedPreview {...props}/>\n\nexport default DropPreview\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledColumn} from './StyledComponents'\nimport DashboardInfoBox from './DashboardInfoBox'\nimport {InfoBoxRenderTypes} from '../../utils/infoBoxTypes'\nimport DropPreview from '../InfoBox/DropPreview'\nimport DropTypes from '../../utils/dropTypes'\n\nconst DashboardColumn = ({\n onDragEnter,\n onDragOver,\n onDrop,\n infoBoxes,\n resizeState,\n startResize,\n dndState,\n makeDndEvents\n}) => {\n const {currentlyDragOver} = dndState\n const {isResizing, resizingElement} = resizeState\n\n return (\n <StyledColumn\n onDragEnter={onDragEnter}\n onDragOver={onDragOver}\n onDrop={onDrop}\n >\n {infoBoxes.map(infoBox => {\n const {id, height, type} = infoBox\n if (type === InfoBoxRenderTypes.DropPreview) {\n return <DropPreview\n key={`${type}-${id}`}\n height={height}\n {...makeDndEvents(currentlyDragOver)}\n />\n }\n \n return <DashboardInfoBox\n key={`${type}-${id}`}\n id={`infobox-${id}`}\n infoBox={infoBox}\n isResizing={isResizing && resizingElement === id}\n {...makeDndEvents({type: DropTypes.InfoBox, id})}\n startResize={startResize(id)}\n />\n })}\n </StyledColumn>\n )\n}\n\nDashboardColumn.propTypes = {\n infoBoxes: PropTypes.array.isRequired,\n onDragEnter: PropTypes.func,\n onDragOver: PropTypes.func,\n onDrop: PropTypes.func,\n resizeState: PropTypes.object.isRequired,\n dndState: PropTypes.object.isRequired,\n makeDndEvents: PropTypes.func.isRequired,\n startResize: PropTypes.func.isRequired\n}\n\nexport default DashboardColumn\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {dragAndDrop, resize} from 'tocco-util'\n\nimport {\n StyledDashboardWrapper,\n StyledColumnWrapper\n} from './StyledComponents'\nimport DropTypes from '../../utils/dropTypes'\nimport {\n appendDraggedAsLastItemToDropped,\n getRenderInfoBoxesForColumn,\n moveDraggedToDropped\n} from '../../utils/dashboardUtils'\nimport Menu from '../Menu/MenuContainer'\nimport {NUMBER_OF_COLUMNS} from '../../utils/constants'\nimport DashboardColumn from './DashboardColumn'\n\nconst Dashboard = ({\n infoBoxes: storedInfoBoxes,\n saveInfoBoxHeight,\n saveInfoBoxPositions\n}) => {\n // save infoBoxes in local state to show drag and drop and resize immediately to the user\n const [infoBoxes, setInfoBoxes] = useState(storedInfoBoxes)\n useEffect(() => {\n setInfoBoxes(storedInfoBoxes)\n }, [storedInfoBoxes])\n\n const columns = [...Array(NUMBER_OF_COLUMNS).keys()]\n\n const ref = useRef(null)\n const selector = id => ref.current.querySelector(`#infobox-${id}`)\n const onInfoBoxHeightChanged = useCallback(id => {\n const finalHeight = infoBoxes.find(c => c.id === id)?.height\n saveInfoBoxHeight(id, finalHeight)\n }, [infoBoxes])\n\n const onInfoBoxHeightChanging = useCallback((id, {height}) => {\n setInfoBoxes(infoBoxes => [...infoBoxes.map(c => c.id === id\n ? {\n ...c,\n height\n }\n : c)])\n }, [])\n\n const {\n startResize,\n resizingEvents,\n resizeState\n } = resize.useResize(selector, onInfoBoxHeightChanging, onInfoBoxHeightChanged)\n\n const changeInfoBoxPosition = (currentlyDragging, currentlyDragOver, position) => {\n const {id: draggingId} = currentlyDragging\n const {\n type: dragOverType,\n id: dragOverId\n } = currentlyDragOver\n if (dragOverType === DropTypes.Column) {\n const updatedInfoBoxes = appendDraggedAsLastItemToDropped(draggingId, dragOverId, infoBoxes)\n setInfoBoxes(updatedInfoBoxes)\n saveInfoBoxPositions(updatedInfoBoxes)\n } else if (draggingId !== dragOverId) {\n const updatedInfoBoxes = moveDraggedToDropped(draggingId, dragOverId, position, infoBoxes)\n setInfoBoxes(updatedInfoBoxes)\n saveInfoBoxPositions(updatedInfoBoxes)\n }\n }\n const {\n dndEvents,\n dndState\n } = dragAndDrop.useDnD(changeInfoBoxPosition, infoBoxes)\n const {\n currentlyDragOver,\n currentlyDragging,\n dropPosition\n } = dndState\n\n const {id: draggingId} = currentlyDragging || {}\n const DashboardColumns = columns.map(column => {\n const {\n onDragEnter,\n onDragOver,\n onDrop\n } = dndEvents({\n type: DropTypes.Column,\n id: column\n })\n const boxes = getRenderInfoBoxesForColumn(draggingId, currentlyDragOver, dropPosition, column, infoBoxes)\n\n return <DashboardColumn\n key={column}\n onDragEnter={onDragEnter}\n onDragOver={onDragOver}\n onDrop={onDrop}\n infoBoxes={boxes}\n resizeState={resizeState}\n startResize={startResize}\n dndState={dndState}\n makeDndEvents={dndEvents}\n />\n })\n\n return (\n <StyledDashboardWrapper ref={ref} {...resizingEvents}>\n <Menu/>\n <StyledColumnWrapper>\n {DashboardColumns}\n </StyledColumnWrapper>\n </StyledDashboardWrapper>\n )\n}\n\nDashboard.propTypes = {\n infoBoxes: PropTypes.array.isRequired,\n saveInfoBoxPositions: PropTypes.func.isRequired,\n saveInfoBoxHeight: PropTypes.func.isRequired\n}\n\nexport default Dashboard\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {saveInfoBoxHeight, saveInfoBoxPositions} from '../../modules/dashboard/actions'\nimport Dashboard from './Dashboard'\n\nconst mapActionCreators = {\n saveInfoBoxPositions,\n saveInfoBoxHeight\n}\n\nconst mapStateToProps = state => ({\n infoBoxes: state.dashboard.infoBoxes\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Dashboard))\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_DASHBOARD]: reducerUtil.singleTransferReducer('infoBoxes')\n}\n\nconst initialState = {\n infoBoxes: []\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import styled from 'styled-components'\nimport {scale, StyledButton, theme, StyledLabel} from 'tocco-ui'\n\nexport const StyledButtonWrapper = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n\nexport const StyledUl = styled.ul`\n list-style-type: none;\n margin-top: ${scale.space(-0.5)};\n padding-left: ${scale.space(-0.5)};\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n\n ${StyledLabel} {\n padding: 0;\n }\n`\n\nexport const StyledCheckbox = styled.input`\n vertical-align: top;\n margin-right: ${scale.space(-1)};\n\n &:hover {\n cursor: pointer;\n }\n`\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper, StyledCheckbox, StyledUl} from './StyledComponents'\n\nconst InfoBoxSettings = ({initialInfoBoxes, onOk}) => {\n const [infoBoxes, setInfoBoxes] = useState(initialInfoBoxes || [])\n \n const toggle = id => {\n setInfoBoxes(boxes => boxes.reduce((acc, box) => [\n ...acc,\n {...box, folded: box.id === id ? !box.folded : box.folded}\n ], []))\n }\n\n return (\n <div>\n <StyledUl>{infoBoxes.map(box => (\n <Typography.Li key={box.id}>\n <StyledCheckbox\n type=\"checkbox\"\n checked={!box.folded}\n onChange={() => toggle(box.id)}\n id={box.id}\n />\n <Typography.Label for={box.id}>{box.label}</Typography.Label>\n </Typography.Li>))}\n </StyledUl>\n <StyledButtonWrapper>\n <Button type=\"button\" onClick={() => onOk(infoBoxes)} look=\"raised\">\n <FormattedMessage id=\"client.common.ok\"/>\n </Button>\n </StyledButtonWrapper>\n </div>\n )\n}\n\nInfoBoxSettings.propTypes = {\n initialInfoBoxes: PropTypes.array,\n onOk: PropTypes.func\n}\n\nexport default InfoBoxSettings\n","import {NUMBER_OF_COLUMNS} from './constants'\nimport {sortInfoBoxes} from './dashboardUtils'\n\n/**\n * Maps posititon string to col and row object with both 0-based index\n *\n * @param position {String}: has the format \"column:row\" with column 1-based and row 0-based index\n */\nexport const mapPositionToColAndRow = position => {\n if (!position) {\n return {col: 0, row: 0}\n }\n \n const split = position.split(':')\n const col = parseInt(split[0], 10) - 1\n const row = parseInt(split[1], 10)\n return {col: Math.max(0, col), row}\n}\n\n/**\n * Maps row and col to posititon string with format \"column:row\"\n *\n * @param row {number}\n * @param col {number}\n */\nexport const mapColAndRowToPosition = (col, row) => `${col + 1}:${row}`\n\nconst isUnpositionedInfoBox = box => box.position === null\n\nconst getColumnWithMinAmountOfInfoBoxes = infoBoxes => {\n const columns = [...Array(NUMBER_OF_COLUMNS).keys()]\n\n const numberOfBoxesPerCol = columns.reduce((acc, col) => ({\n ...acc,\n [col]: infoBoxes.filter(b => b.col === col).length\n }), {})\n\n const minCol = Object.keys(numberOfBoxesPerCol).reduce(\n (min, key) => {\n const col = parseInt(key, 10)\n return numberOfBoxesPerCol[col] < min.numberOfBoxes ? {col, numberOfBoxes: numberOfBoxesPerCol[col]} : min\n },\n {col: -1, numberOfBoxes: Number.MAX_VALUE})\n \n return minCol.col === -1 ? {col: 0, numberOfBoxes: 0} : minCol\n}\n\nconst distributeInfoBoxes = infoBoxes => {\n const unpositionedInfoBoxes = infoBoxes.filter(isUnpositionedInfoBox)\n const positionedInfoBoxes = infoBoxes.filter(box => !isUnpositionedInfoBox(box))\n return unpositionedInfoBoxes\n .reduce((acc, box) => {\n const {col, numberOfBoxes} = getColumnWithMinAmountOfInfoBoxes(acc)\n return [\n ...acc,\n {...box, col, row: numberOfBoxes}\n ]\n }, positionedInfoBoxes)\n}\n\n/**\n * Sorts and distributes infoBoxes from the backend response to be usable in the client.\n * @param infoBoxes\n * @returns sorted infoBoxes with `col` and `row` fields\n */\nexport const prepareInfoBoxes = infoBoxes => sortInfoBoxes(distributeInfoBoxes(infoBoxes\n .map(box => ({...box, ...mapPositionToColAndRow(box.position)}))))\n","import React from 'react'\nimport {put, call, all, take, takeLatest, takeEvery, select} from 'redux-saga/effects'\nimport {rest, notification} from 'tocco-app-extensions'\nimport {channel} from 'redux-saga'\n\nimport * as actions from './actions'\nimport InfoBoxSettings from '../../components/InfoBoxSettings/InfoBoxSettings'\nimport {mapColAndRowToPosition, prepareInfoBoxes} from '../../utils/positionUtils'\n\nexport const dashboardSelector = state => state.dashboard\n\nexport default function* sagas() {\n yield all([\n call(loadDashboard),\n takeLatest(actions.LOAD_DASHBOARD, loadDashboard),\n takeLatest(actions.SAVE_INFOBOX_POSITIONS, saveInfoBoxPositions),\n takeLatest(actions.SAVE_INFOBOX_HEIGHT, saveInfoBoxHeight),\n takeEvery(actions.DISPLAY_INFOBOX_SETTINGS_MODAL, displayInfoBoxSettings),\n takeEvery(actions.RESET_INFOBOX_SETTINGS, resetInfoBoxSettings)\n ])\n}\n\nexport function* loadDashboard() {\n const options = {\n method: 'GET'\n }\n const response = yield call(rest.requestSaga, 'client/dashboard', options)\n const infoBoxes = response.body.infoboxes\n yield put(actions.setDashboard(prepareInfoBoxes(infoBoxes)))\n return infoBoxes\n}\n\nexport function* saveInfoBoxPositions({payload: {infoBoxes}}) {\n const updatedInfoBoxes = infoBoxes.map(box => ({...box, position: mapColAndRowToPosition(box.col, box.row)}))\n const preferences = updatedInfoBoxes.reduce((acc, box) => ({\n ...acc,\n [`${box.id}:POSITION`]: box.position\n }), {})\n yield call(saveInfoBoxPreferences, preferences)\n \n yield put(actions.setDashboard(updatedInfoBoxes))\n return updatedInfoBoxes\n}\n\nexport function* saveInfoBoxHeight({payload: {id, height}}) {\n const {infoBoxes} = yield select(dashboardSelector)\n const updatedInfoBoxes = infoBoxes.map(box => ({...box, height: box.id === id ? height : box.height}))\n const preferences = {\n [`${id}:HEIGHT`]: height\n }\n yield call(saveInfoBoxPreferences, preferences)\n \n yield put(actions.setDashboard(updatedInfoBoxes))\n return updatedInfoBoxes\n}\n\nexport function* displayInfoBoxSettings() {\n const {infoBoxes} = yield select(dashboardSelector)\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'dashboard-infobox-settings',\n 'client.dashboard.preferences.show.title',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <InfoBoxSettings initialInfoBoxes={infoBoxes} onOk={onOk}/>\n },\n true\n ))\n\n yield call(saveInfoBoxSettings, answerChannel)\n}\n\nfunction* saveInfoBoxSettings(answerChannel) {\n const infoBoxes = yield take(answerChannel)\n\n const preferences = infoBoxes.reduce((acc, box) => ({\n ...acc,\n [`${box.id}:STATUS`]: box.folded ? 'folded' : 'open'\n }), {})\n yield call(saveInfoBoxPreferences, preferences)\n\n yield put(actions.setDashboard(infoBoxes))\n return infoBoxes\n}\n\nexport function* resetInfoBoxSettings() {\n yield all([\n call(rest.deleteUserPreferences, '*:HEIGHT'),\n call(rest.deleteUserPreferences, '*:POSITION'),\n call(rest.deleteUserPreferences, '*:STATUS')\n ])\n yield call(loadDashboard)\n}\n\nfunction* saveInfoBoxPreferences(preferences) {\n yield call(rest.savePreferences, preferences, '/nice2/ui/settings/infoboxes')\n}\n","import dashboardReducer, {sagas as dashboardSagas} from './dashboard'\n\nexport default {\n dashboard: dashboardReducer\n}\n\nexport const sagas = [\n dashboardSagas\n]\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, notification, actionEmitter} from 'tocco-app-extensions'\n\nimport DashboardContainer from './components/Dashboard/DashboardContainer'\nimport reducers, {sagas} from './modules/reducers'\n\nconst packageName = 'dashboard'\n\nconst EXTERNAL_EVENTS = [\n 'emitAction'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <DashboardContainer/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n actionEmitter.addToStore(store, events.emitAction)\n const handleNotifications = !events.emitAction\n notification.addToStore(store, handleNotifications)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', 'entity-list', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n }\n\n const app = initApp(packageName, input)\n\n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst DashboardApp = props => {\n const {component} = appFactory.useApp({initApp, props, packageName, externalEvents: EXTERNAL_EVENTS})\n return component\n}\n\nDashboardApp.propTypes = {\n navigationStrategy: PropTypes.object,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {})\n}\n\nexport default DashboardApp\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport const StyledWrapper = styled.div`\n display: grid;\n grid-template-rows: auto 1fr;\n grid-template-areas:\n 'breadcrumbs'\n 'content';\n height: 100%;\n width: 100%;\n`\n\nexport const StyledBreadcrumbs = styled.div`\n grid-area: breadcrumbs;\n`\n\nexport const StyledDashboardWrapper = styled.div`\n width: 100%;\n height: 100%;\n background-color: ${theme.color('backgroundBody')};\n display: flex;\n justify-content: flex-end;\n align-items: flex-end;\n grid-area: content;\n\n @media (max-width: 568px) {\n justify-content: center;\n align-items: center;\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport DashboardApp from 'tocco-dashboard/src/main'\nimport {Breadcrumbs} from 'tocco-ui'\n\nimport {StyledDashboardWrapper, StyledWrapper, StyledBreadcrumbs} from './StyledComponents'\nimport navigationStrategy from '../../../entities/utils/navigationStrategy'\n\nconst Dashboard = ({match, history, emitAction, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledWrapper>\n <StyledBreadcrumbs>\n <Breadcrumbs\n currentView={{display: msg('client.admin.dashboard'), title: 'Tocco'}}\n pathPrefix=\"/dashboard\"\n />\n </StyledBreadcrumbs>\n <StyledDashboardWrapper>\n <DashboardApp\n emitAction={emitAction}\n navigationStrategy={navigationStrategy(history, match)}\n />\n </StyledDashboardWrapper>\n </StyledWrapper>\n )\n}\n\nDashboard.propTypes = {\n intl: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n history: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired\n}\n\nexport default React.memo(Dashboard, () => true)\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport Dashboard from './Dashboard'\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(Dashboard))\n","import consoleLogger from '../consoleLogger'\n\nexport const dispatchInput = (store,\n input,\n {key, actionCreator, mandatory = false, defaultValue},\n logger = consoleLogger.logError) => {\n if (Object.prototype.hasOwnProperty.call(input, key) || defaultValue) {\n const action = actionCreator(input[key] || defaultValue)\n store.dispatch(action)\n } else if (mandatory === true) {\n logger(`EntityBrowser: Mandatory field '${key}' not set in input`)\n }\n}\n","import React from 'react'\n\nimport reducerUtil from '../reducer'\nimport sagaUtil from '../saga'\nimport asyncRoute from './asyncRoute'\nimport {dispatchInput} from './input'\n\nconst loadedComponents = {}\n\nexport const loadRoute = (store, input, importRouteDependencies, key) => props => {\n if (key && loadedComponents[key]) {\n const Component = loadedComponents[key]\n return <Component {...props}/>\n }\n\n const Component = asyncRoute(() =>\n new Promise(resolve => {\n importRouteDependencies().then(imported => {\n const route = imported.default\n\n if (route.reducers) {\n reducerUtil.injectReducers(store, route.reducers)\n }\n\n if (route.sagas) {\n route.sagas.forEach(saga => {\n sagaUtil.injectSaga(store, saga)\n })\n }\n\n if (route.inputDispatches) {\n route.inputDispatches.forEach(inputDispatch => {\n dispatchInput(\n store,\n input,\n inputDispatch\n )\n })\n }\n\n resolve(route.container)\n })\n })\n )\n\n if (key) {\n loadedComponents[key] = Component\n }\n\n return <Component {...props}/>\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Router as ReactRouter} from 'react-router'\n\nimport RouteWithSubRoutes from './RouteWithSubRoutes'\n\nconst Router = ({history, routes}) => (\n <ReactRouter history={history}>\n <React.Fragment>\n {routes.map((route, i) => (\n <RouteWithSubRoutes key={i} {...route}/>\n ))}\n </React.Fragment>\n </ReactRouter>\n)\n\nRouter.propTypes = {\n routes: PropTypes.array.isRequired,\n history: PropTypes.object\n}\n\nexport default Router\n","import {loadRoute} from './route'\nimport Router from './Router'\nimport RouteWithSubRoutes from './RouteWithSubRoutes'\n\nexport default {\n loadRoute,\n Router,\n RouteWithSubRoutes\n}\n","import React, {useEffect, useRef, useState} from 'react'\n\nexport default function asyncRoute(getComponent) {\n return props => {\n const [Component, setComponent] = useState(null)\n const mounted = useRef(true)\n\n useEffect(() => {\n getComponent().then(result => mounted.current ? setComponent(() => result) : null)\n return () => {\n mounted.current = false\n }\n }, [])\n\n if (Component !== null) {\n return <Component {...props}/>\n }\n\n return null\n }\n}\n","import {route, js} from 'tocco-util'\nimport React, {memo} from 'react'\nimport {ReactReduxContext} from 'react-redux'\nimport _omit from 'lodash/omit'\nimport _omitBy from 'lodash/omitBy'\n\nconst ignoredAttributes = ['location.key', 'location.search', 'location.hash']\n\nfunction areEqual(prevProps, nextProps) {\n const diff = js.difference(prevProps, nextProps)\n const clean = _omitBy(_omit(diff, ignoredAttributes), v => Object.keys(v).length === 0)\n return Object.entries(clean).length === 0\n}\n\nexport default memo(\n props => (\n <ReactReduxContext.Consumer>\n {({store}) => {\n const Component = route.loadRoute(store, {}, () => (import('./route')))\n return <Component {...props}/>\n }}\n </ReactReduxContext.Consumer>\n ),\n areEqual\n)\n","import {route} from 'tocco-util'\nimport React, {useMemo} from 'react'\nimport {useStore} from 'react-redux'\n\nconst Route = props => {\n const store = useStore()\n const Component = useMemo(() => {\n return route.loadRoute(store, {}, () => (import('./route')), 'docs')\n }, [])\n return <Component {...props}/>\n}\n\nexport default Route\n","import React from 'react'\nimport {Typography} from 'tocco-ui'\n\nconst Settings = props => <Typography.H2>Settings</Typography.H2>\n\nSettings.propTypes = {\n}\n\nexport default Settings\n","import Settings from './Settings'\n\nexport default Settings\n","import {Link} from 'react-router-dom'\nimport styled from 'styled-components'\n\nimport {buttonStyle} from './buttonStyle'\n\nconst StyledRouterLinkButton = styled(Link)`\n text-decoration: none;\n ${buttonStyle}\n`\n\nexport default StyledRouterLinkButton\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport Icon from '../Icon'\nimport {design} from '../utilStyles'\nimport StyledRouterLinkButton from './StyledRouterLinkButton'\n\nconst RouterLinkButton = React.forwardRef((props, ref) => {\n const {aria, icon, ink, label, iconOnly, children} = props\n return (\n <StyledRouterLinkButton\n ref={ref}\n {...aria}\n {...props}\n ink={ink || design.ink.BASE}\n data-cy={props['data-cy']}\n title={label}\n >\n {icon && <Icon\n icon={icon}\n />}\n {!iconOnly && label ? <span>{label}</span> : children || '\\u200B' }\n </StyledRouterLinkButton>\n )\n})\n\nRouterLinkButton.propTypes = {\n /**\n * A flat object of ARIA keys and values.\n */\n 'aria': PropTypes.object,\n /**\n * Instead of using label prop it is possible to pass a child\n * (e.g. <LinkButton><FormattedMessage id=\"client.message\"/></LinkButton>). This is not useful for\n * styled tags since buttons design is controlled by props ink and look and immutable.\n */\n 'children': PropTypes.node,\n /**\n * If true, button occupies less space. It should only used for crowded areas like tables and only if necessary.\n */\n 'dense': PropTypes.bool,\n /**\n * Display an icon alongside button label. It is possible to omit label text if an icon is chosen.\n * See Icon component for more information.\n */\n 'icon': PropTypes.string,\n /**\n * Prepend icon or append icon to label. Default value is 'prepend'.\n * Possible values: append|prepend\n */\n 'iconPosition': PropTypes.oneOf([design.position.APPEND, design.position.PREPEND]),\n /**\n * Specify color palette. Default value is 'base'.\n */\n 'ink': design.inkPropTypes,\n /**\n * Describe button action concise. Default is ''.\n */\n 'label': PropTypes.node,\n /**\n * Look of button. Default value is 'flat'.\n */\n 'look': PropTypes.oneOf([\n design.look.BALL,\n design.look.FLAT,\n design.look.RAISED\n ]),\n /**\n * Describe button action in detail to instruct users. It is shown as popover on mouse over.\n */\n 'title': PropTypes.string,\n /**\n * Tabindex indicates if the button can be focused and if/where it participates\n * in sequential keyboard navigation.\n */\n 'tabIndex': PropTypes.number,\n /**\n * cypress selector string\n */\n 'data-cy': PropTypes.string,\n /**\n * If true, leaves the background of the button transparent and does not add any hove effect.\n */\n 'withoutBackground': PropTypes.bool,\n /**\n * If true, renders only the icon and minimal space around it\n */\n 'iconOnly': PropTypes.bool\n}\n\nexport default RouterLinkButton\n","import styled from 'styled-components'\nimport {AdminLink, Ball, scale, theme} from 'tocco-ui'\n\nimport ToccoLogo from '../../assets/tocco-circle.svg'\n\n// intermediate div to add a white background below StyledBackgroundLogo\nexport const StyledBackgroundCover = styled.div`\n position: absolute;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n height: 40px;\n width: 100%;\n background-color: ${theme.color('paper')};\n`\nexport const StyledHeader = styled.div`\n grid-area: header;\n display: flex;\n height: 40px;\n padding-right: 10px;\n padding-left: 40px;\n position: relative;\n z-index: 3; // higher than StyledBackgroundCover to enable button interactions\n`\n\nexport const StyledConfig = styled.div`\n flex: 1;\n z-index: 2;\n display: flex;\n justify-content: flex-end;\n padding: 7px;\n`\nexport const StyledBackgroundLogo = styled.div`\n position: absolute;\n z-index: 3; // higher than StyledBackgroundCover to prevent coverage\n height: 40px;\n width: 100%;\n background-color: ${({runEnv, theme}) => runEnv === 'PRODUCTION' ? theme.colors.primary : theme.colors.secondary};\n mask-image: url(${ToccoLogo});\n mask-repeat: no-repeat;\n mask-position: -300px -900px;\n`\n\nexport const StyledPopper = styled.div`\n width: 350px;\n z-index: 1001; // higher than bm-overlay\n box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n`\n\nexport const StyledNotificationBellWrapper = styled.span`\n position: relative;\n`\n\nexport const StyledBall = styled(Ball)`\n margin-left: ${scale.space(-0.5)};\n`\n\nexport const StyledRedDot = styled.span`\n width: 7px;\n height: 7px;\n position: absolute;\n top: 3px;\n left: 21.5px;\n background-color: ${theme.color('secondaryLight')};\n border-radius: 50%;\n display: inline-block;\n`\nexport const StyledHeaderLink = styled(AdminLink)`\n display: inline-block;\n padding: ${scale.space(-2.1)} ${scale.space(0)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledRedDot} from './StyledComponents'\n\nconst NotificationCenterRedDot = ({\n unreadNotificationKeys,\n onClick,\n innerRef\n}) => unreadNotificationKeys.length > 0\n && <StyledRedDot onClick={onClick} ref={innerRef}/>\n\nNotificationCenterRedDot.propTypes = {\n unreadNotificationKeys: PropTypes.arrayOf(PropTypes.string),\n onClick: PropTypes.func.isRequired,\n innerRef: PropTypes.shape({current: PropTypes.any})\n}\n\nexport default NotificationCenterRedDot\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport NotificationCenterRedDot from './NotificationCenterRedDot'\n\nconst mapStateToProps = state => ({\n unreadNotificationKeys: state.notification.center.unreadNotificationKeys\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(NotificationCenterRedDot))\n","import React, {useState, useEffect, useRef} from 'react'\nimport ReactDOM from 'react-dom'\nimport {usePopper} from 'react-popper'\nimport {notification} from 'tocco-app-extensions'\n\nimport navigationStrategy from './../../routes/entities/utils/navigationStrategy'\nimport NotificationCenterRedDotContainer from './NotificationCenterRedDotContainer'\nimport {StyledNotificationBellWrapper, StyledBall, StyledPopper} from './StyledComponents'\n\nconst popperModifiers = [\n {\n name: 'offset',\n options: {\n offset: [0, 3]\n }\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 35\n }\n }\n]\n\nconst NotificationCenterButton = () => {\n const [visible, setVisibility] = useState(false)\n\n const referenceElement = useRef(null)\n const popperElement = useRef(null)\n const redDotElement = useRef(null)\n\n const handleMouseDown = e => {\n if (popperElement.current && !popperElement.current.contains(e.target)\n && referenceElement.current && !referenceElement.current.contains(e.target)\n && redDotElement.current && !redDotElement.current.contains(e.target)) {\n setVisibility(false)\n }\n }\n\n useEffect(() => {\n document.addEventListener('mousedown', handleMouseDown)\n return () => {\n document.removeEventListener('mousedown', handleMouseDown)\n }\n }, [referenceElement, popperElement])\n\n const {styles, attributes} = usePopper(referenceElement.current, popperElement.current, {modifiers: popperModifiers})\n\n return <>\n <StyledNotificationBellWrapper title=\"notifications\">\n <StyledBall onClick={() => setVisibility(!visible)} icon=\"bell\" ref={referenceElement}/>\n <span ref={redDotElement}><NotificationCenterRedDotContainer onClick={() => setVisibility(!visible)}/></span>\n </StyledNotificationBellWrapper>\n {ReactDOM.createPortal(\n <StyledPopper\n ref={popperElement}\n style={styles.popper}\n {...attributes.popper}\n >\n {visible && <notification.NotificationCenter navigationStrategy={navigationStrategy()}/>}\n </StyledPopper>,\n document.body\n )}\n </>\n}\n\nexport default NotificationCenterButton\n","import styled from 'styled-components'\nimport {scale} from 'tocco-ui'\n\nexport const StyledFormattedMessageWrapper = styled.div`\n font-size: ${scale.font(-1.5)};\n margin-top: ${scale.space(0.5)};\n`\n\nexport const StyledBlockWrapper = styled.div`\n margin-top: ${scale.space(0.5)};\n`\n\nexport const StyledLogo = styled.img`\n margin-top: ${scale.space(1)};\n width: 80%;\n height: auto;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography, Link} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport ToccoLogo from '../../assets/tocco_red.svg'\nimport {StyledLogo, StyledBlockWrapper, StyledFormattedMessageWrapper} from './StyledComponents'\n\nconst AboutTocco = ({niceVersion, niceRevision, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <Typography.Span>\n <StyledLogo src={ToccoLogo} height=\"53.34\" width=\"580\" alt=\"tocco-logo\"/>\n <div dangerouslySetInnerHTML={{__html: msg('client.admin.tocco.address')}}/>\n <Typography.P>\n <Link\n href={msg('client.admin.tocco.homepage')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.homepage\"/>\n </Link><br/>\n <Link\n href={'mailto:' + msg('client.admin.tocco.email')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.email\"/>\n </Link><br/>\n <Link\n href={'tel:' + msg('client.admin.tocco.phone')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.phone\"/>\n </Link>\n </Typography.P>\n <StyledBlockWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.admin.about.versionLabel\"/>: {niceVersion}<br/>\n <FormattedMessage id=\"client.admin.about.revisionLabel\"/>: {niceRevision}\n </Typography.P>\n </StyledBlockWrapper>\n <StyledFormattedMessageWrapper>\n <FormattedMessage id=\"client.admin.copyright\"/>\n </StyledFormattedMessageWrapper>\n </Typography.Span>\n )\n}\n\nAboutTocco.propTypes = {\n intl: PropTypes.object,\n niceVersion: PropTypes.string,\n niceRevision: PropTypes.string\n}\n\nexport default AboutTocco\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport AboutTocco from './AboutTocco'\n\nconst mapStateToProps = state => ({\n niceVersion: state.preferences.serverSettings.niceVersion,\n niceRevision: state.preferences.serverSettings.niceRevision\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(AboutTocco))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {MenuItem, ButtonMenu, BallMenu, StyledBall, scale, RouterLinkButton} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport styled from 'styled-components'\nimport {PasswordUpdateApp} from 'tocco-login/src/main'\nimport TwoFactorConnectorApp from 'tocco-two-factor-connector/src/main'\n\nimport NotificationCenterButton from './NotificationCenterButton'\nimport {\n StyledBackgroundCover,\n StyledHeader,\n StyledConfig,\n StyledBackgroundLogo\n} from './StyledComponents'\nimport AboutTocco from '../AboutTocco'\n\nconst StyledBallMenuWrapper = styled.span`\n display: flex;\n margin-top: 2px;\n\n ${StyledBall} {\n font-size: ${scale.font(1)};\n }\n`\n\nconst Header = ({\n username,\n currentBusinessUnit,\n businessUnits,\n loadBusinessUnits,\n changeBusinessUnit,\n doLogout,\n runEnv,\n niceVersion,\n openModalComponent,\n removeModalComponent,\n info,\n intl\n}) => {\n const handleBusinessUnitOpen = () => {\n if (businessUnits.length === 0) {\n loadBusinessUnits()\n }\n }\n\n const openPasswordUpdate = () => {\n openModalComponent(\n 'passwordUpdateModal',\n 'client.login.passwordUpdate.title',\n null,\n () => <PasswordUpdateApp username={username} success={() => {\n removeModalComponent('passwordUpdateModal')\n info('success', 'client.login.passwordUpdate.success')\n }}/>\n , true\n )\n }\n\n const openTwoFactorConnector = () => {\n openModalComponent(\n 'passwordUpdateModal',\n 'client.actions.two-factor-connector.title',\n null,\n () => <TwoFactorConnectorApp\n onSuccess={() => {\n removeModalComponent('passwordUpdateModal')\n }}\n />,\n true)\n }\n\n const msg = id => intl.formatMessage({id})\n\n return <>\n <StyledBackgroundLogo runEnv={runEnv}/>\n <StyledBackgroundCover/>\n <StyledHeader>\n <StyledConfig>\n <RouterLinkButton to=\"/dashboard/reload\"><FormattedMessage id=\"client.admin.dashboard\"/></RouterLinkButton>\n <ButtonMenu label={currentBusinessUnit.label} onOpen={handleBusinessUnitOpen}>\n {\n businessUnits.map(bU =>\n <MenuItem\n key={`buMenu-${bU.id}`}\n disabled={bU.id === currentBusinessUnit.id}\n onClick={() => {\n changeBusinessUnit(bU.id)\n }}\n >\n {bU.label}\n </MenuItem>\n )\n }\n </ButtonMenu>\n <ButtonMenu label={username}>\n <MenuItem onClick={openPasswordUpdate}><FormattedMessage id=\"client.admin.menu.passwordUpdate\"/></MenuItem>\n <MenuItem onClick={openTwoFactorConnector}>\n <FormattedMessage id=\"client.admin.menu.twoFactorConnector\"/>\n </MenuItem>\n <MenuItem onClick={doLogout}><FormattedMessage id=\"client.admin.menu.logout\"/></MenuItem>\n </ButtonMenu>\n <StyledBallMenuWrapper>\n <BallMenu buttonProps={{\n icon: 'question-circle',\n title: msg('client.admin.header.help')\n }}>\n {niceVersion && <MenuItem onClick={() => {\n window.open(\n `https://${niceVersion.replace('.', '')}.docs.tocco.ch/de/`,\n '_blank'\n )\n }}>\n <FormattedMessage id=\"client.admin.menu.doc\"/>\n </MenuItem>}\n <MenuItem onClick={() => {\n window.open(\n '/nice2/swagger',\n '_blank'\n )\n }}>\n <FormattedMessage id=\"client.admin.menu.restDoc\"/>\n </MenuItem>\n <MenuItem onClick={() => {\n openModalComponent('about', null, null, () => <AboutTocco/>, true)\n }}>\n <FormattedMessage id=\"client.admin.menu.aboutToccoTitle\"/>\n </MenuItem>\n </BallMenu>\n <NotificationCenterButton/>\n </StyledBallMenuWrapper>\n </StyledConfig>\n </StyledHeader>\n </>\n}\n\nconst bUPropType = PropTypes.shape({\n id: PropTypes.string,\n label: PropTypes.string\n})\n\nHeader.propTypes = {\n username: PropTypes.string,\n currentBusinessUnit: bUPropType,\n businessUnits: PropTypes.arrayOf(bUPropType),\n doLogout: PropTypes.func.isRequired,\n changeBusinessUnit: PropTypes.func.isRequired,\n loadBusinessUnits: PropTypes.func.isRequired,\n runEnv: PropTypes.string,\n niceVersion: PropTypes.string,\n openModalComponent: PropTypes.func.isRequired,\n removeModalComponent: PropTypes.func.isRequired,\n info: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nexport default Header\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification} from 'tocco-app-extensions'\n\nimport {doLogout, loadBusinessUnits, changeBusinessUnit} from '../../modules/session/actions'\nimport Header from './Header'\n\nconst mapActionCreators = {\n doLogout,\n loadBusinessUnits,\n changeBusinessUnit,\n openModalComponent: notification.modal,\n removeModalComponent: notification.removeModal,\n info: notification.toaster\n}\n\nconst mapStateToProps = (state, props) => ({\n username: state.session.username,\n currentBusinessUnit: state.session.currentBusinessUnit,\n businessUnits: state.session.businessUnits,\n runEnv: state.preferences.serverSettings.runEnv,\n niceVersion: state.preferences.serverSettings.niceVersion\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Header))\n","import styled from 'styled-components'\nimport SlideMenu from 'react-burger-menu/lib/menus/slide'\nimport {theme} from 'tocco-ui'\n\nconst calcViewportHeight = () => {\n const vh = document.documentElement.clientHeight * 0.01\n document.documentElement.style.setProperty('--vh', `${vh}px`)\n}\n\ncalcViewportHeight()\n\nwindow.addEventListener('resize', () => calcViewportHeight())\nwindow.addEventListener('orientationchange', () => calcViewportHeight())\n\nexport const StyledWrapper = styled.div`\n display: grid;\n grid-template:\n 'header header' auto\n 'menu content' 1fr / auto 1fr;\n background-color: ${theme.color('paper')};\n height: calc(var(--vh, 1vh) * 100);\n\n .bm-burger-button button:focus {\n outline: 0;\n }\n`\n\nexport const StyledContent = styled.div`\n grid-area: content;\n background-color: ${theme.color('backgroundBody')};\n overflow: hidden;\n display: flex;\n`\nexport const StyledMenu = styled(SlideMenu)`\n grid-area: menu;\n`\n\nexport const burgerMenuStyles = {\n bmBurgerButton: {\n position: 'absolute',\n outline: '0',\n width: '24px',\n height: '24px',\n left: '17px',\n top: '10px',\n // Default z-index of button is 1000 which is higher than the mask of the legacy action modal windows (not good).\n // It seems like it doesn't need to be higher than 3, therefore we set it to 3.\n zIndex: 3\n },\n bmBurgerBarsHover: {\n background: '#a90000'\n },\n bmMenuWrap: {\n position: 'fixed',\n height: '100%',\n width: '16%',\n minWidth: '350px'\n },\n bmMenu: {\n background: '#fff',\n padding: '0 0 3rem 0',\n fontSize: '1.15em',\n overflow: 'hidden'\n },\n bmMorphShape: {\n fill: '#373a47'\n },\n bmItemList: {\n color: '#b8b7ad',\n height: '100%'\n },\n bmItem: {\n display: 'inline-block'\n },\n bmOverlay: {\n background: 'rgba(0, 0, 0, 0.3)'\n }\n}\n","import React, {useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Redirect, Route, Router, Switch} from 'react-router-dom'\nimport {createBrowserHistory} from 'history'\nimport {BurgerButton, GlobalStyles, LoadMask} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport {withTheme} from 'styled-components'\nimport {notification} from 'tocco-app-extensions'\nimport {viewPersistor} from 'tocco-util'\n\nimport navigationStrategy from './../../routes/entities/utils/navigationStrategy'\nimport Navigation from '../Navigation'\nimport DashboardRoute from '../../routes/dashboard'\nimport EntitiesRoute from '../../routes/entities'\nimport DocsRoute from '../../routes/docs'\nimport Settings from '../../routes/settings'\nimport Header from '../Header'\nimport ErrorView from '../ErrorView'\nimport {burgerMenuStyles, StyledContent, StyledMenu, StyledWrapper} from './StyledComponents'\n\nconst Admin = ({\n initializeNavigation,\n setMenuOpen,\n menuOpen,\n baseRoute,\n confirm,\n loadPrincipal,\n loadSettingsAndPreferences,\n theme,\n adminAllowed\n}) => {\n const [history, setHistory] = useState(null)\n\n useEffect(() => {\n initializeHistory()\n initializeNavigation()\n loadPrincipal()\n loadSettingsAndPreferences()\n }, [])\n\n const initializeHistory = () => {\n const browserHistory = createBrowserHistory({\n ...baseRoute && {basename: baseRoute},\n getUserConfirmation: (message, confirmCallback) => {\n confirm(\n '',\n message,\n <FormattedMessage id=\"client.common.ok\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n () => confirmCallback(true),\n () => confirmCallback(false)\n )\n }\n })\n setHistory(browserHistory)\n }\n\n const isMenuOpen = state => {\n if (state.isOpen !== menuOpen) {\n setMenuOpen(state.isOpen)\n }\n }\n\n return <LoadMask required={[history !== null]}>\n <Router history={history || {}}>\n <GlobalStyles/>\n <notification.Notifications navigationStrategy={navigationStrategy()}/>\n <StyledWrapper id=\"outer-container\">\n <Header/>\n {adminAllowed && <StyledMenu\n isOpen={menuOpen}\n onStateChange={isMenuOpen}\n customCrossIcon={false}\n customBurgerIcon={<BurgerButton isOpen={menuOpen} size=\"20\" color={theme.colors.paper}/>}\n styles={burgerMenuStyles}\n pageWrapId={'page-wrap'}\n outerContainerId={'outer-container'}>\n <Navigation onClick={() => {\n setMenuOpen(false)\n viewPersistor.clearPersistedViews()\n }}/>\n </StyledMenu>}\n {\n adminAllowed && <StyledContent id=\"page-wrap\">\n <Switch>\n <Route exact path=\"/\"\n render={({match}) => <Redirect to={`${match.url.replace(/\\/$/, '')}/dashboard`}/>}/>\n <Redirect exact from=\"/dashboard/reload\" to=\"/dashboard\"/>\n <Route exact={true} path=\"/dashboard\" component={DashboardRoute}/>\n <Route path=\"/e\" component={EntitiesRoute}/>\n <Route path=\"/s\" component={Settings}/>\n <Route path=\"/docs\" component={DocsRoute}/>\n <Route render={({match}) => <Redirect to={`${match.url.replace(/\\/$/, '')}/dashboard`}/>}/>\n </Switch>\n </StyledContent>\n }\n {\n adminAllowed === false && <StyledContent id=\"page-wrap\">\n <ErrorView title={<FormattedMessage id={'client.admin.error.no_roles.title'}/>}\n message={<FormattedMessage id={'client.admin.error.no_roles.message'}/>}/>\n </StyledContent>\n }\n </StyledWrapper>\n </Router>\n </LoadMask>\n}\n\nAdmin.propTypes = {\n baseRoute: PropTypes.string,\n loggedIn: PropTypes.bool,\n menuOpen: PropTypes.bool,\n loadPrincipal: PropTypes.func.isRequired,\n setMenuOpen: PropTypes.func.isRequired,\n confirm: PropTypes.func.isRequired,\n initializeNavigation: PropTypes.func.isRequired,\n loadSettingsAndPreferences: PropTypes.func.isRequired,\n theme: PropTypes.object.isRequired,\n adminAllowed: PropTypes.bool.isRequired\n}\n\nexport default withTheme(Admin)\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification} from 'tocco-app-extensions'\n\nimport {loadPrincipal} from '../../modules/session/actions'\nimport {initializeNavigation, setMenuOpen} from '../../modules/navigation/actions'\nimport {loadSettingsAndPreferences} from '../../modules/preferences/actions'\nimport Admin from './Admin'\n\nconst mapActionCreators = {\n loadPrincipal,\n confirm: notification.confirm,\n initializeNavigation,\n setMenuOpen,\n loadSettingsAndPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n baseRoute: state.input.baseRoute,\n menuOpen: state.navigation.menuOpen,\n adminAllowed: state.login.adminAllowed\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Admin))\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {LoadMask} from 'tocco-ui'\nimport {Helmet} from 'react-helmet'\n\nimport Login from '../../components/Login'\nimport Admin from '../Admin'\n\nconst LoginGuard = ({doSessionCheck, loggedIn}) => {\n useEffect(() => {\n doSessionCheck()\n }, [])\n\n return (\n <div>\n <Helmet defer={false}>\n <title>Tocco</title>\n </Helmet>\n <LoadMask required={[loggedIn !== undefined]} loadingText=\"Logging in...\">\n <div>\n {!loggedIn ? <Login/> : <Admin/>}\n </div>\n </LoadMask>\n </div>\n )\n}\n\nLoginGuard.propTypes = {\n loggedIn: PropTypes.bool,\n doSessionCheck: PropTypes.func.isRequired\n}\n\nexport default LoginGuard\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification, login} from 'tocco-app-extensions'\n\nimport LoginGuard from './LoginGuard'\n\nconst mapActionCreators = {\n doSessionCheck: login.doSessionCheck,\n confirm: notification.confirm\n}\n\nconst mapStateToProps = (state, props) => ({\n loggedIn: state.login.loggedIn\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(LoginGuard))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {queryString as queryStringUtil} from 'tocco-util'\nimport {AdminLink as StyledLink} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {goBack} from '../../../utils/routing'\n\nconst DetailLinkRelativeWithoutIntl = ({\n entityKey,\n entityModel,\n children,\n relation,\n intl\n}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledLink\n aria-label={msg('client.component.navigationStrategy.detailLinkRelative')}\n to={`${relation ? relation + '/' : ''}${entityKey}`}>\n {children}\n </StyledLink>\n )\n}\n\nconst DetailLinkRelative = injectIntl(DetailLinkRelativeWithoutIntl)\n\nexport const DetailLink = ({\n entityName,\n entityKey,\n children\n}) => (\n <StyledLink\n to={`/e/${entityName}/${entityKey}`}\n target=\"_blank\"\n >\n {children}\n </StyledLink>\n)\n\nexport const ListLink = ({\n entityName,\n entityKeys,\n children\n}) => {\n const queryString = entityKeys?.length && 'tql=KEYS(' + entityKeys.join(',') + ')'\n\n return (\n <StyledLink\n to={{\n pathname: `/e/${entityName}/list`,\n search: `?${queryString}`\n }}\n target=\"_blank\"\n >\n {children}\n </StyledLink>\n )\n}\n\nListLink.propTypes = {\n entityName: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired,\n entityKeys: PropTypes.arrayOf(PropTypes.string)\n}\n\nexport const ListOrDetailLink = ({\n entityName,\n entityKeys,\n children\n}) => {\n if (entityKeys?.length === 1) {\n return (\n <DetailLink entityName={entityName} entityKey={entityKeys[0]}>\n {children}\n </DetailLink>\n )\n }\n return (\n <ListLink entityName={entityName} entityKeys={entityKeys}>\n {children}\n </ListLink>\n )\n}\n\nListOrDetailLink.propTypes = {\n entityName: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired,\n entityKeys: PropTypes.arrayOf(PropTypes.string)\n}\n\nexport default (history, match) => {\n const navigateToCreateRelative = (relationName, state) => {\n if (relationName) {\n history.push({\n pathname: `${match.url}/${relationName}/create`,\n state\n })\n } else {\n const entityBaseUrl = goBack(match.url)\n\n history.push({\n pathname: entityBaseUrl + '/create',\n state\n })\n }\n }\n\n const navigateToActionRelative = (definition, selection) => {\n const entityBaseUrl = goBack(match.url)\n const search = queryStringUtil.toQueryString({\n selection,\n actionProperties: definition.properties\n })\n history.push({\n pathname: entityBaseUrl + '/action/' + definition.appId,\n state: {\n definition,\n selection\n },\n search\n })\n }\n\n const openDetail = (entityName, key, inNewTab = true) => {\n const pathname = `/e/${entityName}/${key}`\n if (inNewTab) {\n const url = history.createHref({pathname})\n window.open(url, '_blank')\n } else {\n history.push({\n pathname\n })\n }\n }\n\n return {\n DetailLink,\n ListLink,\n ListOrDetailLink,\n DetailLinkRelative,\n navigateToCreateRelative,\n navigateToActionRelative,\n openDetail\n }\n}\n\nDetailLinkRelativeWithoutIntl.propTypes = {\n entityKey: PropTypes.string.isRequired,\n entityModel: PropTypes.string.isRequired,\n children: PropTypes.element.isRequired,\n relation: PropTypes.string,\n intl: PropTypes.object.isRequired\n}\n\nDetailLink.propTypes = {\n entityName: PropTypes.string.isRequired,\n entityKey: PropTypes.string.isRequired,\n children: PropTypes.any.isRequired\n}\n","export const goBack = (url, amount = 1) => {\n let normalizedUrl = url.replace(/\\/$/, '')\n\n for (let i = 0; i < amount; i++) {\n normalizedUrl = normalizedUrl.substring(0, normalizedUrl.lastIndexOf('/'))\n }\n\n return normalizedUrl\n}\n","import PropTypes from 'prop-types'\nconst searchFormTypes = {\n NONE: 'none',\n SIMPLE: 'simple',\n BASIC: 'basic',\n ADMIN: 'admin'\n}\n\nexport const searchFormTypePropTypes = PropTypes.oneOf(Object.values(searchFormTypes))\n\nexport default searchFormTypes\n","import PropTypes from 'prop-types'\n\nconst selectionStyles = {\n SINGLE: 'single',\n MULTI: 'multi',\n MULTI_EXPLICIT: 'multi_explicit',\n NONE: 'none'\n}\n\nconst selectionStylePropType = PropTypes.oneOf(Object.keys(selectionStyles).map(key => selectionStyles[key]))\n\nexport {\n selectionStyles as default,\n selectionStylePropType\n}\n","export const SET_SHOW_OLD_PASSWORD = 'PasswordUpdateDialog/SET_SHOW_OLD_PASSWORD'\nexport const SET_STANDALONE = 'PasswordUpdateDialog/SET_STANDALONE'\nexport const SET_FORCED_UPDATE = 'PasswordUpdateDialog/SET_FORCED_UPDATE'\nexport const SET_USERNAME_OR_PK = 'PasswordUpdateDialog/SET_USERNAME_OR_PK'\n\nexport const setShowOldPasswordField = showOldPasswordField => ({\n type: SET_SHOW_OLD_PASSWORD,\n payload: {\n showOldPasswordField\n }\n})\n\nexport const setForcedUpdate = forcedUpdate => ({\n type: SET_FORCED_UPDATE,\n payload: {\n forcedUpdate\n }\n})\n\nexport const setStandalone = standalone => ({\n type: SET_STANDALONE,\n payload: {\n standalone\n }\n})\n\nexport const setUsernameOrPk = usernameOrPk => ({\n type: SET_USERNAME_OR_PK,\n payload: {\n usernameOrPk\n }\n})\n","export const REQUEST_PASSWORD = 'Login/REQUEST_PASSWORD'\nexport const PASSWORD_REQUEST = 'Login/PASSWORD_REQUEST'\nexport const SET_USERNAME = 'Login/SET_USERNAME'\n\nexport const requestPassword = username => ({\n type: REQUEST_PASSWORD,\n payload: {\n username\n }\n})\n\nexport const setPasswordRequest = passwordRequest => ({\n type: PASSWORD_REQUEST,\n payload: {\n passwordRequest\n }\n})\n\nexport const setUsername = username => ({\n type: SET_USERNAME,\n payload: {\n username\n }\n})\n","export const CHANGE_PAGE = 'Login/CHANGE_PAGE'\nexport const SET_USERNAME = 'Login/SET_USERNAME'\nexport const SET_PASSWORD = 'Login/SET_PASSWORD'\nexport const SET_CAPTCHA_KEY = 'login/SET_CAPTCHA_KEY'\n\nexport const changePage = page => ({\n type: CHANGE_PAGE,\n payload: {\n page\n }\n})\n\nexport const setUsername = username => ({\n type: SET_USERNAME,\n payload: {\n username\n }\n})\n\nexport const setPassword = password => ({\n type: SET_PASSWORD,\n payload: {\n password\n }\n})\n\nexport const setCaptchaKey = captchaKey => ({\n type: SET_CAPTCHA_KEY,\n payload: {\n captchaKey\n }\n})\n","export const Pages = {\n LOGIN_FORM: 'LOGIN_FORM',\n PASSWORD_REQUEST: 'PASSWORD_REQUEST',\n TWOSTEPLOGIN: 'TWOSTEPLOGIN',\n PASSWORD_UPDATE: 'PASSWORD_UPDATE',\n TWOSTEPLOGIN_ACTIVATION: 'TWOSTEPLOGIN_ACTIVATION'\n}\n","import styled from 'styled-components'\nimport {\n StyledInputCss,\n StyledEditableWrapperCss,\n Button,\n StyledButton,\n StyledButtonGroup,\n theme,\n scale\n} from 'tocco-ui'\n\nexport const StyledLoginFormInput = styled.input`\n /* stylelint-disable-next-line block-no-empty */\n @keyframes onAutoFillStart {\n from {}\n }\n\n && {\n transition: background-color 50000s, color 50000s, filter 50000s;\n\n &:-webkit-autofill {\n animation-duration: 50000s;\n animation-name: onAutoFillStart;\n }\n padding-top: .7rem;\n padding-bottom: .7rem;\n }\n ${StyledInputCss}\n`\n\nexport const StyledLoginFormInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n\nexport const StyledLoginButton = styled(Button)`\n &&& {\n font-size: ${scale.font(1.3)};\n border-radius: ${theme.radii('large')};\n display: flex;\n justify-content: center;\n padding: 1.25rem 0;\n width: 100%;\n margin-top: 20px;\n margin-bottom: 10px;\n\n &:not(:last-child) {\n margin-right: 0;\n }\n }\n`\n\nexport const StyledTransparentButton = styled(Button)`\n &&& {\n margin-right: 0;\n background-color: transparent;\n color: ${theme.color('primary')};\n padding: 1.25rem 0;\n width: 100%;\n justify-content: center;\n\n &:hover {\n background-color: transparent;\n }\n }\n`\n\nexport const StyledLoginFormWrapper = styled.div`\n ${StyledButtonGroup} {\n margin-top: 1.8rem;\n width: auto;\n flex-direction: column;\n\n ${StyledButton} {\n flex-grow: 1;\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useEffect, useState, useRef} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n SignalList,\n StatedValue,\n Typography\n} from 'tocco-ui'\nimport ReCAPTCHA from 'react-google-recaptcha'\n\nimport {\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton,\n StyledLoginButton\n} from '../StyledLoginForm'\nimport {Pages} from '../../types/Pages'\n\nconst LoginForm = ({\n captchaKey,\n changePage,\n intl,\n login,\n loginPending,\n message,\n password,\n recaptchaActivated,\n setPassword,\n setUsername,\n showTitle,\n username\n}) => {\n const [autoFill, setAutoFill] = useState(false)\n const recaptchaRef = useRef()\n\n const msg = id => intl.formatMessage({id})\n\n useEffect(() => {\n if (recaptchaActivated) {\n handleSubmit()\n }\n }, [recaptchaActivated])\n\n const handleSubmit = async e => {\n if (e) {\n e.preventDefault()\n }\n\n let recaptchaToken = null\n if (recaptchaActivated) {\n recaptchaToken = await recaptchaRef.current.executeAsync()\n recaptchaRef.current.reset()\n }\n\n login(username, password, recaptchaToken)\n }\n\n const handleUsernameChange = e => {\n setUsername(e.target.value)\n setAutoFill(false)\n }\n\n const handlePasswordChange = e => {\n setPassword(e.target.value)\n setAutoFill(false)\n }\n\n const handleAutoFill = e => {\n if (e.animationName === 'onAutoFillStart') {\n setAutoFill(true)\n }\n }\n\n const passwordFocus = !!username\n const usernameFocus = !passwordFocus\n\n return <StyledLoginFormWrapper>\n {showTitle\n && <React.Fragment>\n <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>\n <Typography.P><FormattedMessage id=\"client.login.form.introduction\"/></Typography.P>\n </React.Fragment>}\n <form onSubmit={handleSubmit}>\n <StatedValue\n hasValue={!!username || autoFill}\n id=\"login-username\"\n label={msg('client.login.form.userPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n autoFocus={usernameFocus}\n name=\"user\"\n data-cy=\"login-form_user-input\"\n onChange={handleUsernameChange}\n required\n type=\"text\"\n value={username}\n onAnimationStart={handleAutoFill}\n onFocus={e => e.target.select()}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n <StatedValue\n hasValue={!!password || autoFill}\n id=\"login-password\"\n label={msg('client.login.form.passwordPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n autoFocus={passwordFocus}\n name=\"password\"\n data-cy=\"login-form_password-input\"\n onChange={handlePasswordChange}\n required\n type=\"password\"\n value={password}\n onAnimationStart={handleAutoFill}\n onFocus={e => e.target.select()}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n {\n message && message.text\n && <SignalList.List>\n <SignalList.Item\n condition={message.negative ? 'danger' : 'base'}\n label={message.text}\n />\n </SignalList.List>\n }\n {captchaKey && recaptchaActivated && <ReCAPTCHA\n ref={recaptchaRef}\n badge=\"bottomright\"\n size=\"invisible\"\n sitekey={captchaKey}\n hl={intl.locale}\n />}\n <StyledLoginButton\n disabled={!autoFill && (loginPending || username === '' || password === '')}\n ink=\"primary\"\n look=\"raised\"\n label={msg('client.login.form.button')}\n pending={loginPending}\n type=\"submit\"\n data-cy=\"login-form_login-button\"\n />\n <StyledTransparentButton\n label={msg('client.login.form.forgotLink')}\n onClick={() => changePage(Pages.PASSWORD_REQUEST)}\n data-cy=\"login-form_request-button\"\n />\n </form>\n </StyledLoginFormWrapper>\n}\n\nLoginForm.propTypes = {\n captchaKey: PropTypes.string,\n changePage: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n login: PropTypes.func.isRequired,\n loginPending: PropTypes.bool.isRequired,\n message: PropTypes.shape({\n negative: PropTypes.bool,\n text: PropTypes.string\n }),\n password: PropTypes.string,\n recaptchaActivated: PropTypes.bool,\n setPassword: PropTypes.func.isRequired,\n setUsername: PropTypes.func.isRequired,\n showTitle: PropTypes.bool,\n username: PropTypes.string\n}\n\nexport default LoginForm\n","import LoginForm from './LoginForm'\n\nexport default LoginForm\n","export const INITIALIZE = 'login/INITIALIZE'\nexport const INITIALIZED = 'Login/INITIALIZED'\nexport const LOGIN = 'Login/LOGIN'\n\nexport const initialized = () => ({\n type: INITIALIZED\n})\n\nexport const login = (username, password, captchaToken) => ({\n type: LOGIN,\n payload: {\n username,\n password,\n captchaToken\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport LoginForm from '../components/LoginForm'\nimport {changePage, setUsername, setPassword} from '../modules/login/actions'\nimport {login} from '../modules/actions'\n\nconst mapActionCreators = {\n changePage,\n setUsername,\n setPassword,\n login\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n message: state.loginForm.message,\n loginPending: state.loginForm.loginPending,\n captchaKey: state.login.captchaKey,\n recaptchaActivated: state.loginForm.recaptchaActivated\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(LoginForm))\n","import styled from 'styled-components'\nimport {\n StyledInputCss,\n StyledEditableWrapperCss\n} from 'tocco-ui'\n\nexport const StyledPasswordInput = styled.input.attrs(props => ({\n type: 'password'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport const StyledPasswordInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {design, StatedValue} from 'tocco-ui'\n\nimport {StyledPasswordInput, StyledPasswordInputWrapper} from './StyledPasswordInput'\n\nconst PasswordInput = props => {\n const getSignal = props.value\n ? props.valid === undefined\n ? null\n : props.valid\n ? design.condition.SUCCESS\n : design.condition.DANGER\n : null\n\n return (\n <StatedValue\n hasValue={!!props.value}\n id={`${props.name}-input`}\n immutable={props.readOnly === true}\n label={props.label}\n signal={getSignal}\n >\n <StyledPasswordInputWrapper immutable={props.readOnly === true}>\n <StyledPasswordInput\n id={`${props.name}-input`}\n value={props.value}\n onChange={e => props.onChange(e.target.value)}\n disabled={props.readOnly === true}\n immutable={props.readOnly === true}\n onKeyDown={props.onKeyDown}\n autoFocus={props.autoFocus}\n />\n </StyledPasswordInputWrapper>\n </StatedValue>\n )\n}\n\nPasswordInput.propTypes = {\n name: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n value: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n readOnly: PropTypes.bool,\n onKeyDown: PropTypes.func,\n autoFocus: PropTypes.bool,\n valid: PropTypes.bool\n}\n\nexport default PasswordInput\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui'\n\nexport default styled.div`\n ${StyledButton} {\n width: 100%;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {design, SignalList} from 'tocco-ui'\n\nconst ValidationRules = props => (\n <SignalList.List>\n {props.rules.map((rule, index) => {\n let condition = null\n\n let message = rule.message\n\n if (props.errors) {\n const error = props.errors[rule.name]\n if (error === true) {\n condition = design.condition.DANGER\n } else if (typeof error === 'string') {\n condition = design.condition.DANGER\n message = error\n } else {\n condition = design.condition.SUCCESS\n }\n }\n\n return (\n <SignalList.Item\n condition={condition}\n key={index}\n label={message}\n />\n )\n })}\n </SignalList.List>\n)\n\nValidationRules.propTypes = {\n errors: PropTypes.object,\n rules: PropTypes.array.isRequired,\n rulesNeutral: PropTypes.bool\n}\n\nexport default ValidationRules\n","import ValidationRules from './ValidationRules'\n\nexport default ValidationRules\n","export const DEFAULT = 'client.login.passwordUpdate.failure'\n\nexport const messages = {\n INVALID_CREDENTIALS: 'client.login.passwordUpdate.invalidCredentials',\n UNEXPECTED_ERROR: 'client.login.passwordUpdate.unexpectedError'\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {design, SignalList} from 'tocco-ui'\n\nimport {messages, DEFAULT as DEFAULT_MESSAGE} from './messages'\n\nfunction getMessage(errorCode) {\n return messages[errorCode] || DEFAULT_MESSAGE\n}\n\nconst FailureMessage = props => (\n <SignalList.List>\n <SignalList.Item condition={design.condition.DANGER}>\n <FormattedMessage id={getMessage(props.errorCode)}/>\n </SignalList.Item>\n </SignalList.List>\n)\n\nFailureMessage.propTypes = {\n errorCode: PropTypes.string\n}\n\nexport default FailureMessage\n","import FailureMessage from './FailureMessage'\n\nexport default FailureMessage\n","import PropTypes from 'prop-types'\nimport React, {useRef, useEffect} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {LoadMask, SignalList, Typography} from 'tocco-ui'\nimport styled from 'styled-components'\nimport ReCAPTCHA from 'react-google-recaptcha'\n\nimport PasswordInput from './PasswordInput'\nimport StyledPasswordUpdateDialog from './StyledPasswordUpdateDialog'\nimport ValidationRules from '../ValidationRules'\nimport FailureMessage from '../FailureMessage'\nimport {StyledLoginButton} from '../../StyledLoginForm'\n\nconst StyledValidationRulesWrapper = styled.div`\n margin: 1rem;\n`\n\nconst PasswordUpdateDialog = ({\n captchaKey,\n fetchValidationRules,\n forcedUpdate,\n initialized,\n intl,\n password,\n savePassword,\n showOldPasswordField,\n showTitle,\n updateNewPassword,\n updateNewPasswordRepeat,\n updateOldPassword,\n validationRules\n}) => {\n const recaptchaRef = useRef()\n\n useEffect(() => {\n fetchValidationRules()\n }, [])\n\n useEffect(() => {\n if (validationRules) {\n initialized()\n }\n }, [validationRules])\n\n const handleSubmit = async e => {\n e.preventDefault()\n\n if (isSubmittable() === true) {\n const recaptchaToken = await recaptchaRef.current.executeAsync()\n recaptchaRef.current.reset()\n savePassword(recaptchaToken)\n }\n }\n\n const isSubmittable = () => {\n if (!password.newPasswordRepeat) {\n return false\n }\n if (password.newPassword !== password.newPasswordRepeat) {\n return false\n }\n if (password.passwordUpdatePending) {\n return false\n }\n return true\n }\n\n const msg = id => intl.formatMessage({id})\n\n if (!validationRules) {\n return <LoadMask/>\n }\n\n const oldPasswordReadOnly = password.passwordUpdatePending\n const newPasswordReadOnly = (!password.oldPassword && showOldPasswordField)\n || password.passwordUpdatePending\n const newPasswordRepeatReadOnly = !password.newPassword\n || password.passwordUpdatePending\n || (password.newPasswordValidationErrors && Object.keys(password.newPasswordValidationErrors).length > 0)\n\n return <StyledPasswordUpdateDialog>\n {showTitle\n && <Typography.H5><FormattedMessage id=\"client.login.passwordUpdate.title\"/></Typography.H5>}\n {forcedUpdate\n && <Typography.P><FormattedMessage id=\"client.login.passwordUpdate.introduction\"/></Typography.P>}\n <form onSubmit={handleSubmit}>\n {showOldPasswordField === true\n && <PasswordInput\n tabIndex={1}\n label={msg('client.login.passwordUpdate.oldPassword')}\n name=\"oldPassword\"\n value={password.oldPassword}\n onChange={updateOldPassword}\n readOnly={oldPasswordReadOnly}\n autoFocus\n {...(password.passwordUpdateFailed && password.passwordUpdateErrorCode === 'INVALID_CREDENTIALS'\n && {valid: false})\n }\n />}\n <PasswordInput\n tabIndex={2}\n label={msg('client.login.passwordUpdate.newPassword')}\n name=\"newPassword\"\n value={password.newPassword}\n onChange={updateNewPassword}\n readOnly={newPasswordReadOnly}\n autoFocus={showOldPasswordField !== true}\n valid={!newPasswordRepeatReadOnly}\n />\n <StyledValidationRulesWrapper>\n <ValidationRules\n rules={validationRules}\n errors={password.newPasswordValidationErrors}\n rulesNeutral={!password.newPassword}\n />\n </StyledValidationRulesWrapper>\n <PasswordInput\n tabIndex={3}\n label={msg('client.login.passwordUpdate.newPasswordRepeat')}\n name=\"newPasswordRepeat\"\n value={password.newPasswordRepeat}\n onChange={updateNewPasswordRepeat}\n readOnly={newPasswordRepeatReadOnly}\n valid={isSubmittable()}\n />\n\n {\n password.newPasswordRepeat\n && password.newPassword !== password.newPasswordRepeat\n && <SignalList.List>\n <SignalList.Item condition=\"danger\" label={<FormattedMessage id=\"client.login.passwordUpdate.noMatch\"/>}/>\n </SignalList.List>\n }\n\n {password.passwordUpdateFailed === true && <FailureMessage errorCode={password.passwordUpdateErrorCode}/>}\n <StyledLoginButton\n pending={password.passwordUpdatePending}\n disabled={isSubmittable() === false}\n ink=\"primary\"\n label={msg('client.login.passwordUpdate.saveButton')}\n look=\"raised\"\n type=\"submit\"\n />\n {captchaKey && <ReCAPTCHA\n ref={recaptchaRef}\n badge=\"bottomright\"\n size=\"invisible\"\n sitekey={captchaKey}\n hl={intl.locale}\n />}\n </form>\n </StyledPasswordUpdateDialog>\n}\n\nPasswordUpdateDialog.propTypes = {\n captchaKey: PropTypes.string,\n fetchValidationRules: PropTypes.func.isRequired,\n forcedUpdate: PropTypes.bool,\n initialized: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n password: PropTypes.shape({\n newPassword: PropTypes.string.isRequired,\n newPasswordRepeat: PropTypes.string.isRequired,\n newPasswordValidationErrors: PropTypes.object,\n oldPassword: PropTypes.string.isRequired,\n passwordUpdateErrorCode: PropTypes.string,\n passwordUpdateFailed: PropTypes.bool,\n passwordUpdatePending: PropTypes.bool.isRequired\n }).isRequired,\n savePassword: PropTypes.func.isRequired,\n showOldPasswordField: PropTypes.bool,\n showTitle: PropTypes.bool,\n updateNewPassword: PropTypes.func.isRequired,\n updateNewPasswordRepeat: PropTypes.func.isRequired,\n updateOldPassword: PropTypes.func.isRequired,\n validationRules: PropTypes.array\n}\n\nexport default PasswordUpdateDialog\n","import PasswordUpdateDialog from './PasswordUpdateDialog'\n\nexport default PasswordUpdateDialog\n","export const INITIALIZED = 'INITIALIZED'\n\nexport const initialized = () => ({\n type: INITIALIZED\n})\n","export const UPDATE_OLD_PASSWORD = 'PasswordUpdateDialog/UPDATE_OLD_PASSWORD'\nexport const UPDATE_NEW_PASSWORD = 'PasswordUpdateDialog/UPDATE_NEW_PASSWORD'\nexport const SET_NEW_PASSWORD = 'PasswordUpdateDialog/SET_NEW_PASSWORD'\nexport const SET_NEW_PASSWORD_VALIDATION_ERRORS = 'PasswordUpdateDialog/SET_NEW_PASSWORD_VALIDATION_ERRORS'\nexport const UPDATE_NEW_PASSWORD_REPEAT = 'PasswordUpdateDialog/UPDATE_NEW_PASSWORD_REPEAT'\nexport const SAVE_PASSWORD = 'PasswordUpdateDialog/SAVE_PASSWORD'\nexport const SAVE_PASSWORD_SUCCESS = 'PasswordUpdateDialog/SAVE_PASSWORD_SUCCESS'\nexport const SAVE_PASSWORD_FAILURE = 'PasswordUpdateDialog/SAVE_PASSWORD_FAILURE'\nexport const VALIDATE = 'PasswordUpdateDialog/VALIDATE'\nexport const RESET_PASSWORD_UPDATED_FAILED = 'PasswordUpdateDialog/RESET_PASSWORD_UPDATED_FAILED'\n\nexport const updateOldPassword = oldPassword => ({\n type: UPDATE_OLD_PASSWORD,\n payload: {\n oldPassword\n }\n})\n\nexport const updateNewPassword = newPassword => ({\n type: UPDATE_NEW_PASSWORD,\n payload: {\n newPassword\n }\n})\n\nexport const setNewPassword = newPassword => ({\n type: SET_NEW_PASSWORD,\n payload: {\n newPassword\n }\n})\n\nexport const setNewPasswordValidationErrors = errors => ({\n type: SET_NEW_PASSWORD_VALIDATION_ERRORS,\n payload: {\n errors\n }\n})\n\nexport const updateNewPasswordRepeat = newPasswordRepeat => ({\n type: UPDATE_NEW_PASSWORD_REPEAT,\n payload: {\n newPasswordRepeat\n }\n})\n\nexport const savePassword = captchaToken => ({\n type: SAVE_PASSWORD,\n payload: {\n captchaToken\n }\n})\n\nexport const savePasswordSuccess = () => ({\n type: SAVE_PASSWORD_SUCCESS\n})\n\nexport const savePasswordFailure = (errorCode, validationMessages) => ({\n type: SAVE_PASSWORD_FAILURE,\n payload: {\n errorCode,\n validationMessages\n }\n})\n\nexport const validate = () => ({\n type: VALIDATE\n})\n\nexport const resetPasswordUpdateFailed = () => ({\n type: RESET_PASSWORD_UPDATED_FAILED\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport PasswordUpdateDialog from '../components/passwordUpdate/PasswordUpdateDialog'\nimport {initialized} from '../modules/passwordUpdate/actions'\nimport {\n updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword\n} from '../modules/passwordUpdate/password'\nimport {fetchValidationRules} from '../modules/passwordUpdate/validationRules'\n\nconst mapActionCreators = {\n updateOldPassword,\n updateNewPassword,\n updateNewPasswordRepeat,\n fetchValidationRules,\n savePassword,\n initialized\n}\n\nconst mapStateToProps = state => ({\n password: state.passwordUpdate.password,\n validationRules: state.passwordUpdate.validationRules,\n showOldPasswordField: state.passwordUpdate.dialog.showOldPasswordField,\n forcedUpdate: state.passwordUpdate.dialog.forcedUpdate,\n captchaKey: state.login.captchaKey\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(PasswordUpdateDialog))\n","export const FETCH_VALIDATION_RULES = 'PasswordUpdateDialog/FETCH_VALIDATION_RULES'\nexport const SET_VALIDATION_RULES = 'PasswordUpdateDialog/SET_VALIDATION_RULES'\n\nexport const fetchValidationRules = () => ({\n type: FETCH_VALIDATION_RULES\n})\n\nexport const setValidationRules = rules => ({\n type: SET_VALIDATION_RULES,\n payload: {\n rules\n }\n})\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n StatedValue,\n Typography\n} from 'tocco-ui'\n\nimport {\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton,\n StyledLoginButton\n} from '../StyledLoginForm'\nimport {Pages} from '../../types/Pages'\n\nexport class PasswordRequest extends React.Component {\n constructor(props) {\n super(props)\n this.state = {\n username: this.props.username || ''\n }\n }\n\n handleSubmit(e) {\n e.preventDefault()\n this.props.requestPassword(this.state.username)\n }\n\n handleUsernameChange(e) {\n this.setState({\n username: e.target.value\n })\n }\n\n render() {\n return (\n <StyledLoginFormWrapper>\n {this.props.showTitle\n && <Typography.H5><FormattedMessage id=\"client.login.passwordRequest.title\"/></Typography.H5>}\n <Typography.P><FormattedMessage id=\"client.login.passwordRequest.introduction\"/></Typography.P>\n <form onSubmit={this.handleSubmit.bind(this)}>\n <StatedValue\n hasValue={!!this.state.username}\n id=\"login-username\"\n label={this.msg('client.login.form.userPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n name=\"user\"\n onChange={this.handleUsernameChange.bind(this)}\n required\n type=\"text\"\n value={this.state.username}\n data-cy=\"password-request_input\"\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n <StyledLoginButton\n look=\"raised\"\n disabled={!this.state.username || this.props.pending}\n ink=\"primary\"\n label={this.msg('client.login.passwordRequest.button')}\n pending={this.props.pending}\n type=\"submit\"\n data-cy=\"password-request_submit-button\"\n />\n <StyledTransparentButton\n disabled={this.props.pending}\n label={this.msg('client.login.passwordRequest.abortButton')}\n name=\"abort\"\n onClick={() => this.props.changePage(Pages.LOGIN_FORM)}\n data-cy=\"password-request_abort-button\"\n />\n </form>\n </StyledLoginFormWrapper>\n )\n }\n\n msg(id) {\n return this.props.intl.formatMessage({\n id\n })\n }\n}\n\nPasswordRequest.propTypes = {\n intl: PropTypes.object.isRequired,\n changePage: PropTypes.func.isRequired,\n requestPassword: PropTypes.func.isRequired,\n showTitle: PropTypes.bool,\n pending: PropTypes.bool,\n username: PropTypes.string\n}\n","import {PasswordRequest} from './PasswordRequest'\n\nexport default PasswordRequest\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport PasswordRequest from '../components/PasswordRequest'\nimport {changePage} from '../modules/login/actions'\nimport {requestPassword} from '../modules/passwordRequest/actions'\n\nconst mapActionCreators = {\n changePage,\n requestPassword\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n pending: state.loginForm.loginPending\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(PasswordRequest))\n","import styled from 'styled-components'\nimport {StyledButton, StyledInputCss, StyledEditableValue} from 'tocco-ui'\n\nexport const StyledTwoStepLogin = styled.div`\n ${StyledButton} {\n width: 100%;\n }\n\n ${StyledEditableValue} {\n ${StyledInputCss}\n padding-top: .7rem;\n padding-bottom: .7rem;\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useLayoutEffect, useRef} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n StatedValue,\n Typography,\n EditableValue\n} from 'tocco-ui'\n\nimport {\n StyledTwoStepLogin\n} from './StyledTwoStepLoginForm'\nimport {StyledLoginButton, StyledLoginFormInputWrapper} from '../StyledLoginForm'\n\nconst TwoStepLoginForm = ({username, password, showTitle, loginPending, twoStepLogin, intl}) => {\n const [userCode, setUserCode] = useState(null)\n const formEl = useRef()\n\n useLayoutEffect(() => {\n const firstInput = formEl.current.querySelector('input')\n firstInput.focus()\n }, [])\n\n const handleSubmit = e => {\n e.preventDefault()\n twoStepLogin(username, password, userCode)\n }\n\n const msg = id => intl.formatMessage({id})\n return <StyledTwoStepLogin>\n {showTitle && <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>}\n <form onSubmit={handleSubmit} ref={formEl}>\n <Typography.P><FormattedMessage id=\"client.login.twoStepLogin.introduction\"/></Typography.P>\n <StatedValue\n hasValue={!!userCode}\n id=\"twoFactorCode-label\"\n label={msg('client.login.twoStepLogin.codePlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <EditableValue\n type=\"integer\"\n value={userCode}\n events={{onChange: setUserCode}}\n options={{format: '### ###', allowLeadingZeros: true}}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n <StyledLoginButton\n disabled={!userCode || userCode.toString().length < 6 || loginPending}\n ink=\"primary\"\n label={msg('client.login.form.button')}\n look=\"raised\"\n name=\"submit\"\n pending={loginPending}\n type=\"submit\"\n />\n </form>\n </StyledTwoStepLogin>\n}\n\nTwoStepLoginForm.propTypes = {\n intl: PropTypes.object.isRequired,\n twoStepLogin: PropTypes.func.isRequired,\n username: PropTypes.string.isRequired,\n password: PropTypes.string.isRequired,\n showTitle: PropTypes.bool,\n loginPending: PropTypes.bool\n}\n\nexport default TwoStepLoginForm\n","import TwoStepLoginForm from './TwoStepLoginForm'\n\nexport default TwoStepLoginForm\n","export const TWOSTEPLOGIN = 'Login/TWOSTEPLOGIN'\nexport const SET_SECRET = 'Login/SET_SECRET'\n\nexport const twoStepLogin = (username, password, userCode) => ({\n type: TWOSTEPLOGIN,\n payload: {\n username,\n password,\n userCode\n }\n})\n\nexport const setSecret = secret => ({\n type: SET_SECRET,\n payload: {\n secret\n }\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport TwoStepLoginForm from '../components/TwoStepLoginForm'\nimport {twoStepLogin} from '../modules/twoStepLogin/actions'\n\nconst mapActionCreators = {\n twoStepLogin\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n loginPending: state.loginForm.loginPending\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(TwoStepLoginForm))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n Typography\n} from 'tocco-ui'\nimport TwoFactorConnectorApp from 'tocco-two-factor-connector/src/main'\n\nimport {Pages} from '../../types/Pages'\n\nconst TwoFactorConnectorForm = ({username, password, secret, showTitle, changePage}) => {\n return <div>\n {showTitle && <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>}\n <TwoFactorConnectorApp\n username={username}\n password={password}\n secret={secret}\n forced={true}\n onSuccess={() => {\n changePage(Pages.LOGIN_FORM)\n }}\n />\n </div>\n}\n\nTwoFactorConnectorForm.propTypes = {\n username: PropTypes.string.isRequired,\n password: PropTypes.string.isRequired,\n secret: PropTypes.shape({\n text: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }).isRequired,\n showTitle: PropTypes.bool,\n changePage: PropTypes.func.isRequired\n}\n\nexport default TwoFactorConnectorForm\n","import TwoFactorConnectorForm from './TwoFactorConnectorForm'\n\nexport default TwoFactorConnectorForm\n","import {connect} from 'react-redux'\n\nimport TwoFactorConnectorForm from '../components/TwoFactorConnectorForm'\nimport {changePage} from '../modules/login/actions'\n\nconst mapActionCreators = {\n changePage\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n secret: state.twoStepLogin.secret\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(TwoFactorConnectorForm)\n","import PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {createGlobalStyle} from 'styled-components'\n\nimport {Pages} from '../../types/Pages'\nimport LoginFormContainer from '../../containers/LoginFormContainer'\nimport PasswordUpdateContainer from '../../containers/PasswordUpdateDialogContainer'\nimport PasswordRequestContainer from '../../containers/PasswordRequestContainer'\nimport TwoStepLoginContainer from '../../containers/TwoStepLoginContainer'\nimport TwoFactorConnectorContainer from '../../containers/TwoFactorConnectorContainer'\n\nconst GlobalRecaptchaBadgeStyle = createGlobalStyle`\n .grecaptcha-badge {\n z-index: 9999999;\n opacity: .8;\n }\n`\n\nconst Login = props => {\n useEffect(() => {\n props.initialize()\n }, [])\n\n return <>\n <GlobalRecaptchaBadgeStyle/>\n {(() => {\n switch (props.currentPage) {\n case Pages.PASSWORD_UPDATE:\n return <PasswordUpdateContainer showTitle={props.showTitle}/>\n case Pages.PASSWORD_REQUEST:\n return <PasswordRequestContainer showTitle={props.showTitle}/>\n case Pages.TWOSTEPLOGIN:\n return <TwoStepLoginContainer showTitle={props.showTitle}/>\n case Pages.TWOSTEPLOGIN_ACTIVATION:\n return <TwoFactorConnectorContainer/>\n default:\n return <LoginFormContainer showTitle={props.showTitle}/>\n }\n })()}\n </>\n}\n\nLogin.propTypes = {\n initialize: PropTypes.func.isRequired,\n currentPage: PropTypes.string,\n showTitle: PropTypes.bool\n}\n\nexport default Login\n","import Login from './Login'\n\nexport default Login\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Login from '../components/Login'\nimport {initialize} from '../modules/actions'\n\nconst mapActionCreators = {\n initialize\n}\n\nconst mapStateToProps = (state, props) => ({\n currentPage: props.currentPage || state.login.currentPage,\n showTitle: props.showTitle\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Login))\n","import {externalEvents} from 'tocco-app-extensions'\nimport {put, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nexport function* resizeWatcher() {\n yield put(externalEvents.fireExternalEvent('resize'))\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZED, resizeWatcher)\n ])\n}\n","export function isEmptyObject(object) {\n // http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object\n return Object.keys(object).length === 0 && object.constructor === Object\n}\n\nexport function validationMessagesToErrorMap(messages) {\n const errors = {}\n messages.forEach(message => {\n errors[message.ruleName] = message.message\n })\n return errors\n}\n","import * as actions from './actions'\nimport {validationMessagesToErrorMap} from './utils'\n\nconst initialState = {\n oldPassword: '',\n newPassword: '',\n newPasswordRepeat: '',\n newPasswordValidationErrors: null,\n passwordUpdatePending: false,\n passwordUpdateFailed: false,\n passwordUpdateErrorCode: null\n}\n\nconst updateOldPassword = (state, {payload}) => ({\n ...state,\n oldPassword: payload.oldPassword\n})\n\nconst setNewPassword = (state, {payload}) => ({\n ...state,\n newPassword: payload.newPassword\n})\n\nconst setNewPasswordValidationErrors = (state, {payload}) => ({\n ...state,\n newPasswordValidationErrors: payload.errors\n})\n\nconst updateNewPasswordRepeat = (state, {payload}) => ({\n ...state,\n newPasswordRepeat: payload.newPasswordRepeat\n})\n\nconst savePassword = state => ({\n ...state,\n passwordUpdatePending: true,\n passwordUpdateFailed: false\n})\n\nconst savePasswordSuccess = state => (\n initialState\n)\n\nconst savePasswordFailure = (state, {payload}) => {\n if (payload.validationMessages) {\n const errors = validationMessagesToErrorMap(payload.validationMessages)\n return {\n ...state,\n passwordUpdatePending: false,\n newPasswordValidationErrors: errors\n }\n } else {\n return {\n ...state,\n passwordUpdatePending: false,\n passwordUpdateFailed: true,\n passwordUpdateErrorCode: payload.errorCode\n }\n }\n}\n\nconst resetPasswordUpdateFailed = (state, {payload}) => ({\n ...state,\n passwordUpdateFailed: false\n})\n\nconst ACTION_HANDLERS = {\n [actions.UPDATE_OLD_PASSWORD]: updateOldPassword,\n [actions.SET_NEW_PASSWORD]: setNewPassword,\n [actions.SET_NEW_PASSWORD_VALIDATION_ERRORS]: setNewPasswordValidationErrors,\n [actions.UPDATE_NEW_PASSWORD_REPEAT]: updateNewPasswordRepeat,\n [actions.SAVE_PASSWORD]: savePassword,\n [actions.SAVE_PASSWORD_SUCCESS]: savePasswordSuccess,\n [actions.SAVE_PASSWORD_FAILURE]: savePasswordFailure,\n [actions.RESET_PASSWORD_UPDATED_FAILED]: resetPasswordUpdateFailed\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword} from './actions'\nimport sagas from './sagas'\nimport reducer from './reducer'\n\nexport {updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword}\n\nexport {sagas}\n\nexport default reducer\n","export const RULE_PASSWORD_NOT_CHANGED = 'PASSWORD_NOT_CHANGED'\nexport const RULE_LENGTH = 'LENGTH'\nexport const RULE_CHARACTER_INSUFFICIENT_LOWERCASE = 'CHARACTER_INSUFFICIENT_LOWERCASE'\nexport const RULE_CHARACTER_INSUFFICIENT_UPPERCASE = 'CHARACTER_INSUFFICIENT_UPPERCASE'\nexport const RULE_CHARACTER_INSUFFICIENT_DIGIT = 'CHARACTER_INSUFFICIENT_DIGIT'\n\nfunction validateCharacterRule(password, regex, min, max) {\n if (typeof password !== 'string') {\n return false\n }\n\n const initialLength = password.length\n const lengthWithoutSpecificChars = password.replace(regex, '').length\n const specificCharsCount = initialLength - lengthWithoutSpecificChars\n\n return (min === undefined || min === null || specificCharsCount >= min)\n && (max === undefined || max === null || specificCharsCount <= max)\n}\n\nconst VALIDATORS = {\n [RULE_PASSWORD_NOT_CHANGED]: (newPassword, oldPassword) =>\n typeof newPassword === 'string' && typeof oldPassword === 'string' && newPassword !== oldPassword,\n [RULE_LENGTH]: (newPassword, oldPassword, rule) =>\n typeof newPassword === 'string'\n && (rule.params.min === undefined || rule.params.min === null || newPassword.length >= rule.params.min)\n && (rule.params.max === undefined || rule.params.max === null || newPassword.length <= rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_LOWERCASE]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[a-z]/g, rule.params.min, rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_UPPERCASE]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[A-Z]/g, rule.params.min, rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_DIGIT]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[0-9]/g, rule.params.min, rule.params.max)\n}\n\nfunction validate(newPassword, oldPassword, validationRules) {\n const errors = {}\n\n if (validationRules) {\n validationRules.forEach(rule => {\n const validator = VALIDATORS[rule.name]\n if (validator) {\n const valid = validator(newPassword, oldPassword, rule)\n if (valid !== true) {\n errors[rule.name] = true\n }\n }\n })\n }\n\n return errors\n}\n\nexport default validate\n","export const SET_MESSAGE = 'Login/SET_MESSAGE'\nexport const SET_PENDING = 'Login/SET_PENDING'\nexport const ACTIVATE_RECAPTCHA = 'loginForm/ACTIVATE_RECAPTCHA'\r\n\nexport const setMessage = (text, negative = false) => ({\n type: SET_MESSAGE,\n payload: {\n text,\n negative\n }\n})\n\nexport const setPending = (pending = false) => ({\n type: SET_PENDING,\n payload: {\n pending\n }\n})\n\nexport const activateRecaptcha = () => ({\n type: ACTIVATE_RECAPTCHA\n})\n","import {consoleLogger, request, cache, intl} from 'tocco-util'\nimport {externalEvents, rest} from 'tocco-app-extensions'\nimport {takeLatest, put, select, call, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport * as loginActions from './login/actions'\nimport {setMessage, setPending, activateRecaptcha} from './loginForm/actions'\nimport {updateOldPassword} from './passwordUpdate/password/actions'\nimport {setUsernameOrPk, setForcedUpdate} from './passwordUpdate/dialog/actions'\nimport {changePage, setPassword} from './login/actions'\nimport {setSecret} from './twoStepLogin/actions'\nimport {Pages} from '../types/Pages'\n\nexport const DEFAULT_TIMEOUT = 30\n\nexport const textResourceSelector = (state, key) => state.intl.messages[key] || key\nexport const loginSelector = state => state.login\n\nexport function doRequest(url, options) {\n return new Promise(resolve => {\n request.executeRequest(url, options)\n .then(request.extractBody)\n .then(json => resolve(json))\n .catch(e => {\n consoleLogger.logError('Failed to execute request', e)\n resolve({success: false})\n })\n })\n}\n\nexport function* doLoginRequest(data) {\n return yield call(doRequest, 'login', getOptions(data))\n}\n\nexport function* doSessionRequest() {\n return yield call(doRequest, 'session', {method: 'POST'})\n}\n\nfunction getOptions(data = {}) {\n return {\n method: 'POST',\n headers: new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'\n }),\n body: Object.keys(data)\n .filter(k => !!data[k])\n .sort()\n .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&')\n }\n}\n\nexport function* handleTwoStepLoginResponse() {\n yield put(changePage(Pages.TWOSTEPLOGIN))\n}\n\nexport function* handleTwoStepActivationResponse(response) {\n const twoFactorResponse = response[Pages.TWOSTEPLOGIN_ACTIVATION]\n yield put(setSecret(twoFactorResponse))\n yield put(changePage(Pages.TWOSTEPLOGIN_ACTIVATION))\n}\n\nexport function* handlePasswordUpdateResponse() {\n const login = yield select(loginSelector)\n yield put(updateOldPassword(login.password))\n yield put(setUsernameOrPk(login.username))\n yield put(setForcedUpdate(true))\n yield put(changePage(Pages.PASSWORD_UPDATE))\n}\n\nexport function* handleBlockResponse() {\n const text = yield select(textResourceSelector, 'client.login.form.blocked')\n yield put(setMessage(text, true))\n}\n\nexport function* handleFailedResponse() {\n const text = yield select(textResourceSelector, 'client.login.form.failed')\n yield put(setMessage(text, true))\n}\n\nexport function* handleSuccessfulLogin(response) {\n const localChanged = yield call(intl.hasUserLocaleChanged)\n if (localChanged) {\n yield call(cache.clearAll)\n } else {\n yield call(cache.clearShortTerm)\n }\n yield put(setPassword(''))\n const timeout = response.timeout || DEFAULT_TIMEOUT\n yield put(externalEvents.fireExternalEvent('loginSuccess', {timeout}))\n}\n\nexport function* loginSaga({payload}) {\n const {username, password, captchaToken, userCode} = payload\n const loginData = {\n username,\n password,\n ...(captchaToken && {captchaToken}),\n ...(userCode && {userCode})\n }\n yield put(setPending(true))\n\n const response = yield call(doLoginRequest, loginData)\n if (response.success) {\n yield call(handleSuccessfulLogin, response)\n } else {\n yield put(changePage(Pages.LOGIN_FORM)) // in order to display possible error message\n if (response.CAPTCHA) {\n yield put(activateRecaptcha())\n } else if (response.TWOSTEPLOGIN) {\n yield call(handleTwoStepLoginResponse, response)\n } else if (response.RESET_PASSWORD_REQUIRED) {\n yield call(handlePasswordUpdateResponse)\n } else if (response.LOGIN_BLOCKED) {\n yield call(handleBlockResponse)\n } else if (response.TWOSTEPLOGIN_ACTIVATION) {\n yield call(handleTwoStepActivationResponse, response)\n } else {\n yield call(handleFailedResponse)\n }\n yield put(setPending(false))\n }\n}\n\nexport function* checkSessionSaga() {\n const response = yield call(doSessionRequest)\n\n if (response.success) {\n yield call(handleSuccessfulLogin, response)\n }\n}\n\nexport function* loadSettings() {\n const settings = yield call(rest.fetchServerSettings)\n yield put(loginActions.setCaptchaKey(settings.captchaKey))\n}\n\nexport function* initialize() {\n yield call(checkSessionSaga)\n yield call(loadSettings)\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.LOGIN, loginSaga),\n takeLatest(actions.INITIALIZE, initialize)\n ])\n}\n","import {externalEvents, rest} from 'tocco-app-extensions'\nimport {takeLatest, call, select, put, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport localValidate from './validate'\nimport {isEmptyObject, validationMessagesToErrorMap} from './utils'\nimport {loginSaga} from '../../sagas'\nimport {setPassword} from '../../login/actions'\n\nexport const validationRulesSelector = state => state.passwordUpdate.validationRules\nexport const inputSelector = state => state.input\nexport const usernameOrPkSelector = state => state.passwordUpdate.dialog.usernameOrPk\nexport const passwordSelector = state => state.passwordUpdate.password\nexport const standaloneSelector = state => state.passwordUpdate.dialog.standalone\nexport const intlSelector = state => state.intl\n\nexport function* storePassword(usernameOrPk, data, captchaToken) {\n const options = {\n method: 'POST',\n acceptedStatusCodes: [400],\n body: {\n ...data,\n captchaToken\n }\n }\n\n try {\n const resp = yield call(rest.requestSaga, `principals/${usernameOrPk}/password-update`, options)\n return resp.ok ? {error: null} : {error: resp.body}\n } catch (exception) {\n return {error: {errorCode: 'UNEXPECTED_ERROR', exception}}\n }\n}\n\nexport function* remoteValidate(usernameOrPk, data) {\n const {locale} = yield select(intlSelector)\n\n const options = {\n method: 'POST',\n body: data,\n queryParams: {locale}\n }\n\n try {\n const resp = yield call(rest.requestSaga, `principals/${usernameOrPk}/password-validation`, options)\n return resp.body\n } catch (exception) {\n // validation request failed for some reason. we ignore that.\n // (validation takes place on actual update request again)\n return {valid: true, exception}\n }\n}\n\nexport function* updateNewPassword(action) {\n yield put(actions.setNewPassword(action.payload.newPassword))\n yield put(actions.validate())\n}\n\nexport function* validate() {\n const validationRules = yield select(validationRulesSelector)\n const password = yield select(passwordSelector)\n\n const errors = localValidate(password.newPassword, password.oldPassword, validationRules)\n\n if (!isEmptyObject(errors)) {\n yield put(actions.setNewPasswordValidationErrors(errors))\n } else {\n const usernameOrPk = yield select(usernameOrPkSelector)\n const data = yield call(getData)\n const result = yield call(remoteValidate, usernameOrPk, data)\n if (result.valid === true) {\n yield put(actions.setNewPasswordValidationErrors({}))\n } else {\n const errors = validationMessagesToErrorMap(result.validationMessages)\n yield put(actions.setNewPasswordValidationErrors(errors))\n }\n }\n}\n\nexport function* savePassword({payload: {captchaToken}}) {\n const usernameOrPk = yield select(usernameOrPkSelector)\n const data = yield call(getData)\n const result = yield call(storePassword, usernameOrPk, data, captchaToken)\n\n if (result.error) {\n if (result.error.valid === false) {\n yield put(actions.savePasswordFailure(null, result.error.validationMessages))\n } else {\n yield put(actions.savePasswordFailure(result.error.errorCode))\n }\n } else {\n const standalone = yield select(standaloneSelector)\n if (standalone) {\n yield put(externalEvents.fireExternalEvent('success', {\n newPassword: data.newPassword\n }))\n } else {\n const loginData = yield call(getLoginData)\n yield put(setPassword(loginData.payload.password))\n yield call(loginSaga, loginData)\n }\n\n yield put(actions.savePasswordSuccess())\n }\n}\n\nexport function* getData() {\n const input = yield select(inputSelector)\n const password = yield select(passwordSelector)\n\n return {\n oldPassword: input.oldPassword ? input.oldPassword : password.oldPassword,\n newPassword: password.newPassword\n }\n}\n\nexport function* getLoginData() {\n const password = yield select(passwordSelector)\n const usernameOrPk = yield select(usernameOrPkSelector)\n\n return {\n payload: {\n username: usernameOrPk,\n password: password.newPasswordRepeat\n }\n }\n}\n\nexport function* formChanged() {\n yield put(actions.resetPasswordUpdateFailed())\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.UPDATE_NEW_PASSWORD, updateNewPassword),\n takeLatest(actions.VALIDATE, validate),\n takeLatest(actions.SAVE_PASSWORD, savePassword),\n takeLatest(actions.UPDATE_NEW_PASSWORD, formChanged),\n takeLatest(actions.UPDATE_OLD_PASSWORD, formChanged),\n takeLatest(actions.UPDATE_NEW_PASSWORD_REPEAT, formChanged)\n ])\n}\n","import * as actions from './actions'\n\nconst initialState = {\n showOldPasswordField: true,\n forcedUpdate: false,\n standalone: true,\n usernameOrPk: ''\n}\n\nconst singleTransferReducer = attributeName => {\n return (state, {payload}) => {\n const val = payload[attributeName]\n return {\n ...state,\n [attributeName]: val\n }\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_SHOW_OLD_PASSWORD]: singleTransferReducer('showOldPasswordField'),\n [actions.SET_FORCED_UPDATE]: singleTransferReducer('forcedUpdate'),\n [actions.SET_STANDALONE]: singleTransferReducer('standalone'),\n [actions.SET_USERNAME_OR_PK]: singleTransferReducer('usernameOrPk')\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_VALIDATION_RULES]: (state, action) => action.payload.rules\n}\n\nconst initialState = null\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fetchValidationRules} from './actions'\nimport sagas from './sagas'\nimport reducer from './reducer'\n\nexport {fetchValidationRules}\n\nexport {sagas}\n\nexport default reducer\n","import {rest} from 'tocco-app-extensions'\nimport {takeLatest, call, put, select, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nexport const usernameOrPkSelector = state => state.passwordUpdate.dialog.usernameOrPk\nexport const intlSelector = state => state.intl\n\nexport function* loadValidationRules(usernameOrPk, locale = '') {\n const resource = `principals/${usernameOrPk}/password-rules`\n\n const validationResponse = yield call(rest.requestSaga, resource, {queryParams: {locale}})\n return validationResponse.body\n}\n\nexport function* fetchValidationRules() {\n const usernameOrPk = yield select(usernameOrPkSelector)\n const {locale} = yield select(intlSelector)\n\n const response = yield call(loadValidationRules, usernameOrPk, locale)\n yield put(actions.setValidationRules(response.rules))\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.FETCH_VALIDATION_RULES, fetchValidationRules)\n ])\n}\n","import mainSagas from './sagas'\nimport password, {sagas as passwordSagas} from './password'\nimport dialog from './dialog'\nimport validationRules, {sagas as validationRulesSagas} from './validationRules'\n\nexport default {\n dialog,\n password,\n validationRules\n}\n\nexport const sagas = [\n mainSagas,\n passwordSagas,\n validationRulesSagas\n]\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\nimport {Pages} from './../../types/Pages'\n\nconst changePage = (state, {payload}) => {\n const {page} = payload\n return {\n ...state,\n currentPage: page\n }\n}\n\nconst setUsername = (state, {payload}) => {\n const {username} = payload\n return {\n ...state,\n username\n }\n}\n\nconst setPassword = (state, {payload}) => {\n const {password} = payload\n return {\n ...state,\n password\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.CHANGE_PAGE]: changePage,\n [actions.SET_USERNAME]: setUsername,\n [actions.SET_PASSWORD]: setPassword,\n [actions.SET_CAPTCHA_KEY]: reducerUtil.singleTransferReducer('captchaKey')\n}\n\nconst initialState = {\n currentPage: Pages.LOGIN_FORM,\n username: '',\n password: '',\n captchaKey: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import {SET_MESSAGE, SET_PENDING, ACTIVATE_RECAPTCHA} from './actions'\n\nconst setMessage = (state, {payload}) => {\n const {text, negative} = payload\n return {\n ...state,\n message: {\n text,\n negative\n }\n }\n}\n\nconst setPending = (state, {payload}) => ({\n ...state,\n loginPending: payload.pending\n})\n\nconst activateRecaptcha = state => ({\n ...state,\n recaptchaActivated: true\n})\n\nconst ACTION_HANDLERS = {\n [SET_MESSAGE]: setMessage,\n [SET_PENDING]: setPending,\n [ACTIVATE_RECAPTCHA]: activateRecaptcha\n}\n\nconst initialState = {\n message: {},\n loginPending: false,\n recaptchaActivated: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import {takeLatest, call, put, all} from 'redux-saga/effects'\n\nimport {loginSaga} from '../sagas'\nimport {setPending} from '../loginForm/actions'\nimport * as actions from './actions'\n\nexport function* twoStepSaga(args) {\n yield put(setPending(true))\n yield call(loginSaga, args)\n}\n\nexport default function* rootSaga() {\n yield all([\n takeLatest(actions.TWOSTEPLOGIN, twoStepSaga)\n ])\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_SECRET]: reducerUtil.singleTransferReducer('secret')\n}\n\nconst initialState = {\n secret: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport moduleSagas from './sagas'\nimport reducer from './reducer'\n\nexport function* sagas() {\n yield all([\n fork(moduleSagas)\n ])\n}\n\nexport default reducer\n","import {rest} from 'tocco-app-extensions'\nimport {put, call, select, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport {changePage, setUsername} from '../login/actions'\nimport {setMessage, setPending} from '../loginForm/actions'\nimport {Pages} from '../../types/Pages'\n\nexport const textResourceSelector = state => state.intl.messages\n\nexport function* requestPasswordSaga({payload}) {\n yield put(setPending(true))\n yield call(rest.requestSaga, `principals/${payload.username}/password-reset`, {method: 'POST'})\n yield put(setUsername(payload.username))\n const textResourcesState = yield select(textResourceSelector)\n yield put(setMessage(textResourcesState['client.login.from.passwordRequested']))\n yield put(changePage(Pages.LOGIN_FORM))\n yield put(setPending(false))\n}\n\nexport function* passwordRequestSaga({payload}) {\n if (payload.passwordRequest === true) {\n yield put(changePage(Pages.PASSWORD_REQUEST))\n }\n}\n\nexport default function* saga() {\n yield all([\n takeLatest(actions.REQUEST_PASSWORD, requestPasswordSaga),\n takeLatest(actions.PASSWORD_REQUEST, passwordRequestSaga)\n ])\n}\n","import * as actions from './actions'\n\nconst setUsername = (state, {payload}) => {\n const {username} = payload\n return {\n ...state,\n username\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_USERNAME]: setUsername\n}\n\nconst initialState = {\n username: ''\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport moduleSagas from './sagas'\nimport reducer from './reducer'\n\nexport function* sagas() {\n yield all([\n fork(moduleSagas)\n ])\n}\n\nexport default reducer\n","import {combineReducers} from 'redux'\n\nimport passwordUpdateReducers, {sagas as passwordUpdateSagas} from './passwordUpdate/reducers'\nimport login from './login'\nimport loginForm from './loginForm'\nimport twoStepLogin, {sagas as twoStepLoginSagas} from './twoStepLogin'\nimport mainSagas from './sagas'\nimport passwordRequest, {sagas as passwordRequestSagas} from './passwordRequest'\n\nexport default {\n login,\n loginForm,\n passwordRequest,\n passwordUpdate: combineReducers(passwordUpdateReducers),\n twoStepLogin\n}\n\nexport const sagas = [\n mainSagas,\n passwordRequestSagas,\n twoStepLoginSagas,\n ...passwordUpdateSagas\n]\n","import React from 'react'\nimport {consoleLogger, reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, cache, errorLogging, externalEvents} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport * as passwordUpdate from './modules/passwordUpdate/dialog/actions'\nimport * as passwordRequest from './modules/passwordRequest/actions'\nimport * as login from './modules/login/actions'\nimport LoginContainer from './containers/LoginContainer'\nimport loginReducers, {sagas} from './modules/reducers'\n\nconst packageName = 'login'\n\nconst EXTERNAL_EVENTS = [\n 'loginSuccess',\n 'resize'\n]\n\nconst initLoginApp = (id, input, events, publicPath, customTheme) => {\n const actions = [\n passwordUpdate.setShowOldPasswordField(false),\n passwordUpdate.setStandalone(false),\n passwordRequest.setPasswordRequest(!!input.passwordRequest),\n login.setUsername(input.username || '')\n ]\n\n const showTitle = !!input.showTitle\n const content = <LoginContainer showTitle={showTitle}/>\n\n const store = appFactory.createStore(loginReducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n cache.addToStore(store)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n }\n )\n}\n\nconst initPasswordUpdateApp = (id, input, events, publicPath, customTheme) => {\n const showTitle = !!input.showTitle\n const forcedUpdate = !!input.forcedUpdate\n\n const content = <LoginContainer currentPage=\"PASSWORD_UPDATE\" showTitle={showTitle}/>\n\n if (typeof input.username !== 'string' || input.username.length === 0) {\n consoleLogger.logError('Mandatory input \"username\" is not set on password-update')\n return\n }\n\n const actions = [\n passwordUpdate.setUsernameOrPk(input.username),\n passwordUpdate.setForcedUpdate(forcedUpdate)\n ]\n\n if (typeof input.showOldPasswordField === 'boolean') {\n actions.push(passwordUpdate.setShowOldPasswordField(input.showOldPasswordField))\n }\n\n const store = appFactory.createStore(loginReducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n\n return appFactory.createApp(\n `${packageName}.passwordUpdate`,\n content,\n store,\n {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initLoginApp)\n appFactory.registerAppInRegistry('password-update', initPasswordUpdateApp)\n\n if (__DEV__) {\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n }\n\n const app = initLoginApp('id', require('./dev/login_input.json'))\n // uncomment to develop passwordUpdate App\n // const app = initPasswordUpdateApp('id', require('./dev/password_update_input.json'))\n\n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst LoginApp = props => {\n const {component} = appFactory.useApp({\n initApp: initLoginApp,\n props,\n packageName: 'id',\n externalEvents: EXTERNAL_EVENTS\n })\n return component\n}\n\nLoginApp.propTypes = {\n showTitle: PropTypes.bool,\n locale: PropTypes.string,\n passwordRequest: PropTypes.bool,\n username: PropTypes.string,\n setLocale: PropTypes.func,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {})\n}\n\nexport default LoginApp\n\nconst EXTERNAL_EVENTS_PASSWORD_UPDATE = [\n 'success',\n 'resize'\n]\n\nexport const PasswordUpdateApp = props => {\n const {component} = appFactory.useApp({\n initApp: initPasswordUpdateApp,\n props,\n packageName: 'password-update',\n externalEvents: EXTERNAL_EVENTS_PASSWORD_UPDATE\n })\n return component\n}\n\nPasswordUpdateApp.propTypes = {\n username: PropTypes.string,\n showTitle: PropTypes.bool,\n showOldPasswordField: PropTypes.bool,\n oldPassword: PropTypes.string,\n ...EXTERNAL_EVENTS_PASSWORD_UPDATE.reduce((propTypes, event) => ({...propTypes, [event]: PropTypes.func}), {})\n}\n","import {css} from 'styled-components'\n\nimport {declareFont, theme} from '../utilStyles'\n\nexport const linkStyle = css`\n ${declareFont()}\n color: ${theme.color('text')};\n\n * {\n color: ${theme.color('text')};\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n\n &:hover,\n &:hover *,\n &:focus,\n &:focus * {\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n\n &:active,\n &:active * {\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n`\n","import {Link} from 'react-router-dom'\nimport styled from 'styled-components'\n\nimport {linkStyle} from './linkStyle'\n\nexport default styled(Link)`\n ${linkStyle}\n`\n","/* stylelint-disable no-descending-specificity */\nimport styled from 'styled-components'\n\nimport {AdminLink as StyledLink} from '../AdminLink'\nimport {theme} from '../utilStyles'\n\nexport const StyledBreadcrumbs = styled.div`\n background-color: ${props => props.backgroundColor || theme.color('backgroundBreadcrumbs')(props)};\n width: 100%;\n padding: .8rem 1.7rem;\n position: relative;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n\n span:nth-child(even) {\n margin-left: .9rem;\n margin-right: .9rem;\n }\n`\n\nexport const StyledBreadcrumbsLink = styled(StyledLink)`\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n\n & * {\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n margin-right: .5rem;\n }\n\n &:hover,\n &:hover * {\n color: ${theme.color('secondaryLight')};\n }\n\n &:focus,\n &:active,\n &:focus *,\n &:active * {\n color: ${theme.color('primary')};\n }\n`\n\n// noinspection Stylelint\nexport const StyledBreadcrumbsTitle = styled.span`\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n\n & * {\n font-weight: ${theme.fontWeight('bold')};\n text-decoration: none;\n color: ${({active}) => active && theme.color('primary')};\n margin-right: .5rem;\n }\n\n &:active * {\n color: ${theme.color('primary')};\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Helmet} from 'react-helmet'\n\nimport Icon from '../Icon'\nimport Typography from '../Typography'\nimport {\n StyledBreadcrumbs,\n StyledBreadcrumbsLink,\n StyledBreadcrumbsTitle\n} from './StyledBreadcrumbs'\n\nconst getTitle = breadcrumbsInfo =>\n breadcrumbsInfo\n .slice(breadcrumbsInfo.length - 2)\n .map(breadcrumb => breadcrumb.title || breadcrumb.display)\n .reverse()\n .join(' - ')\n\nconst Breadcrumbs = ({pathPrefix, breadcrumbsInfo, currentView, backgroundColor, onClick}) => {\n const breadcrumbs = [\n ...(breadcrumbsInfo || []),\n ...(currentView ? [currentView] : [])\n ]\n\n if (breadcrumbs.length === 0) {\n return null\n }\n\n const handleClick = breadcrumbsItem => () => {\n if (onClick) {\n onClick(breadcrumbsItem)\n }\n }\n\n return <StyledBreadcrumbs backgroundColor={backgroundColor}>\n <Helmet defer={false}>\n <title>{getTitle(breadcrumbs)}</title>\n </Helmet>\n <div> {\n breadcrumbs.map((b, idx) => {\n const display = b.display || ''\n const Comp = idx === breadcrumbs.length - 1 ? StyledBreadcrumbsTitle : StyledBreadcrumbsLink\n return <Typography.Span key={`breadcrumbItem-${idx}`}>\n <Comp\n neutral\n {...(idx === breadcrumbs.length - 1 && {active: 'true'})}\n {...(typeof b.path !== 'undefined' ? {to: `${pathPrefix}/${b.path}`} : {})}\n onClick={handleClick(b)}\n >\n {b.type === 'list' && <Icon icon=\"list\"/>}\n {b.type === 'error' && <Icon icon=\"exclamation-circle\"/>}\n {display}\n </Comp>\n </Typography.Span>\n })\n .reduce((prev, curr, idx) =>\n [prev,\n <Typography.Span key={'icon' + idx}> <Icon icon=\"chevron-right\"/> </Typography.Span>,\n curr]\n )}\n </div>\n </StyledBreadcrumbs>\n}\n\nBreadcrumbs.defaultProps = {\n pathPrefix: ''\n}\n\nBreadcrumbs.propTypes = {\n pathPrefix: PropTypes.string,\n match: PropTypes.object,\n breadcrumbsInfo: PropTypes.arrayOf(\n PropTypes.shape({\n display: PropTypes.string,\n title: PropTypes.string,\n path: PropTypes.string,\n type: PropTypes.string\n })\n ),\n currentView: PropTypes.shape({\n display: PropTypes.string,\n title: PropTypes.string\n }),\n backgroundColor: PropTypes.string,\n onClick: PropTypes.func\n}\n\nexport default Breadcrumbs\n","import {createGlobalStyle} from 'styled-components'\n\nimport {theme, declareFont, scale} from '../utilStyles'\n\nconst calendarWidth = 270\nconst secondaryLight = theme.color('secondaryLight')\nconst secondary = theme.color('secondary')\nconst paper = theme.color('paper')\nconst regular = theme.fontWeight('regular')\nconst baseSpace = scale.space(-2)\n\nexport const GlobalDatePickerStyles = createGlobalStyle`\n .flatpickr-calendar {\n && {\n ${declareFont()}\n width: ${calendarWidth}px;\n border: 1px solid ${secondaryLight};\n border-radius: 0;\n }\n\n &.open {\n z-index: 999999 !important; // higher than StyledModalHolder\n }\n\n &.arrowTop:before,\n &.arrowTop:after {\n border-bottom-color: ${secondaryLight} !important;\n }\n\n &.arrowBottom:before,\n &.arrowBottom:after {\n border-top-color: ${secondaryLight} !important;\n }\n\n .flatpickr-rContainer {\n width: 100%;\n }\n\n .dayContainer {\n padding-top: ${baseSpace};\n padding-right: ${baseSpace};\n padding-bottom: ${baseSpace};\n width: ${calendarWidth}px;\n min-width: ${calendarWidth}px;\n max-width: ${calendarWidth}px;\n }\n\n .numInput.cur-year,\n .flatpickr-current-month span.cur-month{\n font-weight: ${regular};\n }\n\n .flatpickr-current-month .numInputWrapper {\n span.arrowUp:after {\n border-bottom-color: ${paper};\n }\n\n span.arrowDown:after {\n border-top-color: ${paper};\n }\n }\n\n .flatpickr-weekday {\n font-size: ${scale.font(-2)};\n font-weight: ${regular};\n }\n\n .flatpickr-days {\n width: ${calendarWidth}px;\n }\n\n .flatpickr-day.today {\n border-color: ${secondary};\n font-weight: ${theme.fontWeight('bold')};\n }\n\n .flatpickr-day {\n max-width: 34px;\n height: 34px;\n line-height: 34px;\n margin-bottom: ${baseSpace};\n font-weight: ${regular};\n }\n\n .flatpickr-months .flatpickr-month {\n border-radius: 0;\n }\n\n .flatpickr-months .flatpickr-month,\n .flatpickr-weekdays,\n .flatpickr-weekday {\n background-color: ${secondaryLight};\n color: ${paper};\n }\n\n .flatpickr-day.selected,\n .flatpickr-day.startRange,\n .flatpickr-day.endRange,\n .flatpickr-day.selected.inRange,\n .flatpickr-day.startRange.inRange,\n .flatpickr-day.endRange.inRange,\n .flatpickr-day.selected:focus,\n .flatpickr-day.startRange:focus,\n .flatpickr-day.endRange:focus,\n .flatpickr-day.selected:hover,\n .flatpickr-day.startRange:hover,\n .flatpickr-day.endRange:hover,\n .flatpickr-day.selected.prevMonthDay,\n .flatpickr-day.startRange.prevMonthDay,\n .flatpickr-day.endRange.prevMonthDay,\n .flatpickr-day.selected.nextMonthDay,\n .flatpickr-day.startRange.nextMonthDay,\n .flatpickr-day.endRange.nextMonthDay,\n .flatpickr-day.today:hover,\n .flatpickr-day.today:focus {\n background-color: ${secondary};\n border-color: ${secondary};\n }\n\n .flatpickr-day.inRange,\n .flatpickr-day.prevMonthDay.inRange,\n .flatpickr-day.nextMonthDay.inRange,\n .flatpickr-day.today.inRange,\n .flatpickr-day.prevMonthDay.today.inRange,\n .flatpickr-day.nextMonthDay.today.inRange,\n .flatpickr-day:hover,\n .flatpickr-day.prevMonthDay:hover,\n .flatpickr-day.nextMonthDay:hover,\n .flatpickr-day:focus,\n .flatpickr-day.prevMonthDay:focus,\n .flatpickr-day.nextMonthDay:focus {\n background-color: ${secondaryLight};\n border-color: ${secondaryLight};\n color: ${paper};\n }\n\n .flatpickr-months .flatpickr-prev-month,\n .flatpickr-months .flatpickr-next-month {\n color: ${paper};\n fill: ${paper};\n\n &:hover svg {\n color: ${secondary};\n fill: ${secondary};\n }\n }\n }\n`\n","import React from 'react'\n\nimport {GlobalDatePickerStyles} from '../DatePicker'\n\nconst GlobalStyles = () => {\n return <>\n <GlobalDatePickerStyles/>\n </>\n}\n\nexport default GlobalStyles\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport QRCodeC from 'qrcode.react'\n\n/**\n * Use to display a string as QR-Code Image.\n */\nconst QRCode = ({value}) => <QRCodeC value={value} renderAs=\"svg\"/>\n\nQRCode.propTypes = {\n /**\n * Value that will be shown as qr-code. e.g. an Url.\n */\n value: PropTypes.string\n}\n\nexport default QRCode\n","import queryStringUtil from 'query-string'\nimport _isObject from 'lodash/isObject'\nimport _mapValues from 'lodash/mapValues'\n\n/**\n * Build query string from params map object.\n *\n * Note: object values will be JSON-stringified\n *\n * @param obj The params map.\n * @returns the params map as query string.\n */\nexport const toQueryString = obj => {\n const stringifiedValues = _mapValues(obj, value => _isObject(value) ? JSON.stringify(value) : value)\n return queryStringUtil.stringify(stringifiedValues)\n}\n\n/**\n * Get params map object from query string.\n *\n * Note: param values that represent a JSON string will be parsed and returned as object.\n *\n * @param queryString The query string to parse.\n * @returns the query string as parsed object.\n */\nexport const fromQueryString = queryString => {\n const obj = queryStringUtil.parse(queryString)\n return _mapValues(obj, value => hasJsonStructure(value) ? JSON.parse(value) : value)\n}\n\nexport const hasJsonStructure = str => {\n if (typeof str !== 'string') {\n return false\n }\n try {\n const parsed = JSON.parse(str)\n const type = Object.prototype.toString.call(parsed)\n return type === '[object Object]'\n } catch (err) {\n return false\n }\n}\n","import {fromQueryString, toQueryString} from './queryString'\nexport default {\n fromQueryString,\n toQueryString\n}\n","/**\n * extracts the first error message of a validation failed response object\n */\nexport const getErrorCompact = errors => {\n for (const error of errors) {\n if (error.entityValidatorErrors) {\n return getFirstElement(error.entityValidatorErrors)[0]\n }\n\n if (error.paths) {\n return getFirstElement(getFirstElement(error.paths))[0]\n }\n }\n\n return null\n}\n\nconst getFirstElement = obj => Object.keys(obj).length >= 1 ? obj[Object.keys(obj)[0]] : undefined\n","import {getErrorCompact} from './validation'\n\nexport default {getErrorCompact}\n","\nimport _get from 'lodash/get'\n\nlet persistedViews = {}\n\nexport const viewInfoSelector = location =>\n _get(persistedViews, [location, 'info'], {})\n\nexport const persistViewInfo = (location, info, level = 0) => {\n persistedViews = {\n ...persistedViews,\n [location]: {\n level,\n info: {...(_get(persistedViews, [location, 'info'], {})), ...info}\n }\n }\n}\n\nexport const clearPersistedViews = (level = 0) => {\n persistedViews = {\n ...(Object.keys(persistedViews).reduce((acc, key) => {\n const persistedView = persistedViews[key]\n return {...acc, ...(persistedView.level < level && {[key]: persistedView})}\n }, {}))\n }\n}\n","import {viewInfoSelector, persistViewInfo, clearPersistedViews} from './viewPersistor'\n\nexport default {persistViewInfo, viewInfoSelector, clearPersistedViews}\n","export const CONNECT_LOGIN = 'two-factor-connector/CONNECT_LOGIN'\nexport const INITIALIZE = 'two-factor-connector/INITIALIZE'\nexport const SET_TWO_STEP_ACTIVE = 'two-factor-connector/SET_TWO_STEP_ACTIVE'\nexport const SET_SECRET = 'two-factor-connector/SET_SECRET'\nexport const SET_USER_NAME = 'two-factor-connector/SET_USER_NAME'\nexport const REQUEST_SECRET = 'two-factor-connector/REQUEST_SECRET'\nexport const GO_TO_SECRET_VERIFICATION = 'two-factor-connector/GO_TO_SECRET_VERIFICATION'\nexport const GO_TO_START = 'two-factor-connector/GO_TO_START'\nexport const GO_TO_SECRET = 'two-factor-connector/GO_TO_SECRET'\nexport const VERIFY_CODE = 'two-factor-connector/VERIFY_CODE'\nexport const SUCCESS = 'root/SUCCESS'\nexport const SET_SETUP_SUCCESSFUL = 'root/SET_SETUP_SUCCESSFUL'\nexport const GO_TO_RESULT = 'root/GO_TO_RESULT'\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setTwoFactorActive = twoFactorActive => ({\n type: SET_TWO_STEP_ACTIVE,\n payload: {\n twoFactorActive\n }\n})\n\nexport const setSecret = secret => ({\n type: SET_SECRET,\n payload: {\n secret\n }\n})\n\nexport const setUserName = username => ({\n type: SET_USER_NAME,\n payload: {\n username\n }\n})\n\nexport const requestSecret = () => ({\n type: REQUEST_SECRET\n})\n\nexport const goToSecretVerification = () => ({\n type: GO_TO_SECRET_VERIFICATION\n})\n\nexport const goToStart = () => ({\n type: GO_TO_START\n})\n\nexport const goToSecret = () => ({\n type: GO_TO_SECRET\n})\n\nexport const verifyCode = userCode => ({\n type: VERIFY_CODE,\n payload: {\n userCode\n }\n})\n\nexport const success = () => ({\n type: SUCCESS\n})\n\nexport const setSetupSuccessful = setupSuccessful => ({\n type: SET_SETUP_SUCCESSFUL,\n payload: {\n setupSuccessful\n }\n})\n\nexport const goToResult = () => ({\n type: GO_TO_RESULT\n})\n","import {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {rest, externalEvents} from 'tocco-app-extensions'\nimport {request} from 'tocco-util'\nimport _get from 'lodash/get'\n\nimport * as actions from './actions'\n\nconst twoFactorField = 'relTwo_step_login_status'\nconst twoFactorActiveState = '1'\n\nexport const usernameSelector = state => state.twoFactorConnector.username\nexport const secretSelector = state => state.twoFactorConnector.secret\nexport const inputSelector = state => state.input\n\nexport function* requestSecret() {\n const {secret: inputSecret} = yield select(inputSelector)\n if (!inputSecret) {\n const username = yield select(usernameSelector)\n const principalsResponse = yield call(rest.requestSaga, `principals/${username}/two-factor`, {method: 'GET'})\n const {secret, totpUri} = principalsResponse.body\n yield put(actions.setSecret({secret, uri: totpUri}))\n }\n yield put(actions.goToSecret())\n}\n\nexport function sendRequest(url, options) {\n return request.executeRequest(url, options).then(request.extractBody)\n}\n\n/* the regular two-factor endpoint can only be accessed while logged in to secure against anonymous activation of\n two-factor validation on arbitrary accounts, so without a session we send a request to the login servlet which uses\n the forced two-factor authenticator to validate login data and activate the two-factor login */\nfunction* activateTwoFactorWithoutSession(secret, userCode, username, password) {\n const data = {\n secret,\n userCode,\n username,\n password\n }\n\n const response = yield call(sendRequest, 'login',\n {\n method: 'POST',\n headers: new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'\n }),\n body: Object.keys(data)\n .filter(k => !!data[k])\n .sort()\n .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&')\n })\n\n yield put(actions.setSetupSuccessful(_get(response, 'body.TWOSTEPLOGIN_ACTIVATION.success', false)))\n}\n\nfunction* activateTwoFactor(username, secret, code) {\n const codeVerifyResponse = yield call(rest.requestSaga, `principals/${username}/two-factor`,\n {\n method: 'POST',\n body: {\n secret,\n code\n },\n acceptedStatusCodes: [400]\n })\n\n yield put(actions.setSetupSuccessful(codeVerifyResponse.status === 204))\n}\n\nexport function* verifyCode({payload: {userCode}}) {\n const username = yield select(usernameSelector)\n const {secret} = yield select(secretSelector)\n const {password, forced} = yield select(inputSelector)\n\n if (forced) {\n yield call(activateTwoFactorWithoutSession, secret, userCode, username, password)\n } else {\n yield call(activateTwoFactor, username, secret, userCode)\n }\n yield put(actions.goToResult())\n}\n\nexport function* initialize() {\n yield call(loadPrincipal2FAInfo)\n const {secret} = yield select(inputSelector)\n if (secret) {\n yield put(actions.setSecret(secret))\n }\n yield put(actions.goToStart())\n}\n\nexport function* success() {\n yield put(externalEvents.fireExternalEvent('onSuccess'))\n}\n\nexport function* loadPrincipal2FAInfo() {\n const username = yield call(getUsername)\n yield put(actions.setUserName(username))\n const where = `username === \"${username}\"`\n const principals = yield call(rest.fetchEntities, 'Principal', {where, paths: [twoFactorField]})\n\n if (principals.length > 1) {\n throw new Error(`More than one user found for username ${username}`)\n }\n\n const twoFactorKey = _get(principals, `[0].paths.${twoFactorField}.value.key`)\n const twoFactorActive = twoFactorKey === twoFactorActiveState\n\n yield put(actions.setTwoFactorActive(twoFactorActive))\n}\n\nfunction* getUsername() {\n const {username: inputUsername} = yield select(inputSelector)\n if (inputUsername) {\n return inputUsername\n } else {\n const principalsResponse = yield call(rest.requestSaga, 'principals')\n return principalsResponse.body.username\n }\n}\n\nexport function* fireResize() {\n yield put(externalEvents.fireExternalEvent('onResize'))\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.REQUEST_SECRET, requestSecret),\n takeLatest(actions.VERIFY_CODE, verifyCode),\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(actions.SUCCESS, success),\n takeLatest(actions.GO_TO_START, fireResize),\n takeLatest(actions.GO_TO_SECRET, fireResize),\n takeLatest(actions.GO_TO_SECRET_VERIFICATION, fireResize),\n takeLatest(actions.GO_TO_RESULT, fireResize)\n ])\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst setStage = stage => state => ({\n ...state,\n stage\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_TWO_STEP_ACTIVE]: reducerUtil.singleTransferReducer('twoFactorActive'),\n [actions.SET_SECRET]: reducerUtil.singleTransferReducer('secret'),\n [actions.SET_USER_NAME]: reducerUtil.singleTransferReducer('username'),\n [actions.SET_SETUP_SUCCESSFUL]: reducerUtil.singleTransferReducer('setupSuccessful'),\n [actions.GO_TO_START]: setStage(0),\n [actions.GO_TO_SECRET]: setStage(1),\n [actions.GO_TO_SECRET_VERIFICATION]: setStage(2),\n [actions.GO_TO_RESULT]: setStage(3)\n}\n\nconst initialState = {\n stage: null,\n twoFactorActive: null,\n secret: null,\n username: null,\n setupSuccessful: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import rootSaga from './sagas'\nimport twoFactorConnector from './reducer'\n\nexport default {\n twoFactorConnector\n}\n\nexport const sagas = [rootSaga]\n","import styled from 'styled-components'\nimport {scale, StyledButton} from 'tocco-ui'\n\nexport const StyledButtonWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n margin-top: ${scale.space(0.5)};\n\n > ${StyledButton} {\n margin-right: 0;\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\n\nconst Start = ({twoFactorActive, forced, requestSecret, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <>\n <Typography.P>\n {\n twoFactorActive\n ? <FormattedMessage id=\"client.two-factor-connector.overwriteInfo\"/>\n : forced\n ? <span dangerouslySetInnerHTML={{__html: msg('client.two-factor-connector.forcedInfo')}}/>\n : <span dangerouslySetInnerHTML={{__html: msg('client.two-factor-connector.info')}}/>\n }\n </Typography.P>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.nextButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={requestSecret}\n />\n </StyledButtonWrapper>\n </>\n )\n}\n\nStart.propTypes = {\n intl: PropTypes.object.isRequired,\n requestSecret: PropTypes.func.isRequired,\n twoFactorActive: PropTypes.bool,\n forced: PropTypes.bool\n}\n\nexport default Start\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {initialize, requestSecret} from '../../modules/actions'\nimport Start from './Start'\n\nconst mapActionCreators = {\n initialize,\n requestSecret\n}\n\nconst mapStateToProps = state => ({\n twoFactorActive: state.twoFactorConnector.twoFactorActive,\n secret: state.twoFactorConnector.secret,\n forced: state.input.forced\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Start))\n","import Start from './StartContainer'\n\nexport default Start\n","import styled from 'styled-components'\nimport {scale} from 'tocco-ui'\n\nexport const StyledQRCodeWrapper = styled.div`\n display: flex;\n justify-content: center;\n margin: ${scale.space(1.2)} ${scale.space(1)} ${scale.space(1.5)} ${scale.space(1)};\n`\n\nexport const StyledParagraph = styled.div`\n display: flex;\n justify-content: center;\n margin-top: ${scale.space(-1)};\n margin-bottom: ${scale.space(-0.9)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {QRCode, Typography, Button} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledQRCodeWrapper, StyledParagraph} from './StyledComponents'\n\nconst Secret = ({secret, goToSecretVerification}) => {\n return <>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.qrCodeInfo\"/>\n </Typography.P>\n <StyledQRCodeWrapper>\n <QRCode value={secret.uri}/>\n </StyledQRCodeWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.secretInfo\"/>\n </Typography.P>\n <StyledParagraph>\n <Typography.B>{secret.secret}</Typography.B>\n </StyledParagraph>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.backupInfo\"/>\n </Typography.P>\n <StyledButtonWrapper>\n <Button\n ink=\"primary\"\n look=\"raised\"\n onClick={goToSecretVerification}\n >\n <FormattedMessage id=\"client.two-factor-connector.nextButton\"/>\n </Button>\n </StyledButtonWrapper>\n </>\n}\n\nSecret.propTypes = {\n secret: PropTypes.shape({\n secret: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }).isRequired,\n goToSecretVerification: PropTypes.func.isRequired\n}\n\nexport default Secret\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Secret from './Secret'\nimport {goToSecretVerification} from '../../modules/actions'\n\nconst mapActionCreators = {\n goToSecretVerification\n}\n\nconst mapStateToProps = state => ({\n secret: state.twoFactorConnector.secret\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Secret))\n","import Secret from './SecretContainer'\n\nexport default Secret\n","import styled from 'styled-components'\nimport {StyledEditableWrapperCss} from 'tocco-ui'\n\nexport const StyledLoginFormInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, EditableValue, StatedValue, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledLoginFormInputWrapper} from './StyledComponents'\n\nconst Verification = ({verifyCode, intl}) => {\n const [userCode, setUserCode] = useState(null)\n const msg = id => intl.formatMessage({id})\n const handleVerifyClick = () => verifyCode(userCode)\n\n return <>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.verificationText\"/>\n </Typography.P>\n <form onSubmit={e => {\n e.preventDefault()\n e.stopPropagation()\n if (userCode && userCode.toString().length >= 6) {\n handleVerifyClick()\n }\n }}>\n <StatedValue\n hasValue={!!userCode}\n id=\"verification-input\"\n label={msg('client.two-factor-connector.verificationInputLabel')}\n >\n <StyledLoginFormInputWrapper>\n <EditableValue\n type=\"integer\"\n value={userCode}\n events={{onChange: setUserCode}}\n options={{format: '### ###', allowLeadingZeros: true}}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n type=\"submit\"\n disabled={!userCode || userCode.toString().length < 6}\n />\n </StyledButtonWrapper>\n </form>\n </>\n}\n\nVerification.propTypes = {\n intl: PropTypes.object.isRequired,\n verifyCode: PropTypes.func.isRequired\n}\n\nexport default Verification\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Verification from './Verification'\nimport {verifyCode} from '../../modules/actions'\n\nconst mapActionCreators = {\n verifyCode\n}\n\nconst mapStateToProps = (state, props) => ({\n\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Verification))\n","import Verification from './VerificationContainer'\n\nexport default Verification\n","import styled from 'styled-components'\nimport {scale, theme} from 'tocco-ui'\n\nexport const StyledMessageWrapper = styled.div`\n display: grid;\n grid-template-columns: 9% 1fr;\n grid-column-gap: ${scale.space(-0.5)};\n`\n\nexport const StyledIconWrapper = styled.span`\n display: flex;\n align-items: center;\n color: ${({isSuccessful}) => isSuccessful ? theme.color('signal.success.text') : theme.color('signal.danger.text')};\n font-size: ${scale.font(10)};\n\n > * {\n max-width: 100%;\n }\n`\n\nexport const StyledTextWrapper = styled.div`\n display: flex;\n align-items: center;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography, Icon} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledMessageWrapper, StyledIconWrapper, StyledTextWrapper} from './StyledComponents'\n\nconst Result = ({success, goToStart, setupSuccessful, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n if (setupSuccessful) {\n return (\n <>\n <StyledMessageWrapper>\n <StyledIconWrapper isSuccessful={true}>\n <Icon icon={'check'}/>\n </StyledIconWrapper>\n <StyledTextWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.successfulText\"/>\n </Typography.P>\n </StyledTextWrapper>\n </StyledMessageWrapper>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={success}\n />\n </StyledButtonWrapper>\n </>\n )\n }\n\n return (\n <>\n <StyledMessageWrapper>\n <StyledIconWrapper isSuccessful={false}>\n <Icon icon={'times'}/>\n </StyledIconWrapper>\n <StyledTextWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.errorText\"/>\n </Typography.P>\n </StyledTextWrapper>\n </StyledMessageWrapper>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={goToStart}\n />\n </StyledButtonWrapper>\n </>\n )\n}\n\nResult.propTypes = {\n intl: PropTypes.object.isRequired,\n success: PropTypes.func.isRequired,\n goToStart: PropTypes.func.isRequired,\n setupSuccessful: PropTypes.bool\n}\n\nexport default Result\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {success, goToStart} from '../../modules/actions'\nimport Result from './Result'\n\nconst mapActionCreators = {\n success,\n goToStart\n}\n\nconst mapStateToProps = state => ({\n setupSuccessful: state.twoFactorConnector.setupSuccessful\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Result))\n","import Result from './ResultContainer'\n\nexport default Result\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {LoadMask} from 'tocco-ui'\nimport {notification} from 'tocco-app-extensions'\n\nimport Start from '../Start'\nimport Secret from '../Secret'\nimport Verification from '../Verification'\nimport Result from '../Result'\n\nconst stages = {\n Start: 0,\n Secret: 1,\n Verification: 2,\n Result: 3\n}\n\nconst TwoFactorConnector = ({initialize, stage}) => {\n useEffect(() => {\n initialize()\n }, [])\n\n const renderContent = () => {\n switch (stage) {\n case stages.Start:\n return <Start/>\n case stages.Secret:\n return <Secret/>\n case stages.Verification:\n return <Verification/>\n case stages.Result:\n return <Result/>\n default:\n return <LoadMask/>\n }\n }\n\n return (\n <>\n <notification.Notifications/>\n {renderContent()}\n </>\n )\n}\n\nTwoFactorConnector.propTypes = {\n stage: PropTypes.number,\n initialize: PropTypes.func.isRequired,\n twoFactorActive: PropTypes.bool,\n secret: PropTypes.shape({\n secret: PropTypes.string,\n uri: PropTypes.string\n })\n}\n\nexport default TwoFactorConnector\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {initialize} from '../../modules/actions'\nimport TwoFactorConnector from './TwoFactorConnector'\n\nconst mapActionCreators = {\n initialize\n}\n\nconst mapStateToProps = state => ({\n stage: state.twoFactorConnector.stage\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(TwoFactorConnector))\n","import TwoFactorConnector from './TwoFactorConnectorContainer'\n\nexport default TwoFactorConnector\n","import React from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, cache, errorLogging, externalEvents, notification} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules'\nimport TwoFactorConnector from './components/TwoFactorConnector'\n\nconst packageName = 'two-factor-connector'\n\nconst initApp = (id, input, events, publicPath) => {\n const content = <TwoFactorConnector/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n\n notification.addToStore(store, true)\n errorLogging.addToStore(store, true, ['console', 'remote', 'notification'])\n externalEvents.addToStore(store, events)\n cache.addToStore(store)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp(packageName, input)\n\n if (module.hot) {\n module.hot.accept('./modules/reducer', () => {\n const reducers = require('./modules/reducer').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst EXTERNAL_EVENTS = [\n 'onSuccess',\n 'onCancel',\n 'onResize'\n]\n\nconst TwoFactorConnectorApp = props => {\n const {component} = appFactory.useApp({initApp, props, packageName, externalEvents: EXTERNAL_EVENTS})\n return component\n}\n\nTwoFactorConnectorApp.propTypes = {\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => ({...propTypes, [event]: PropTypes.func}), {}),\n username: PropTypes.string,\n password: PropTypes.string,\n secret: PropTypes.shape({\n secret: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }),\n forced: PropTypes.bool\n}\n\nexport default TwoFactorConnectorApp\n","module.exports = __webpack_public_path__ + \"imgs/tocco-circle.25b8cb1141417ffc7763e9309b5a36ec.svg\";","module.exports = __webpack_public_path__ + \"imgs/tocco_red.6ab51a129d1195d204cd84e69da2f044.svg\";","module.exports = __webpack_public_path__ + \"imgs/tocco_white.8f9290d80aa3635828f36920cf13aa11.svg\";"],"sourceRoot":""}
|