tocco-admin 1.0.21 → 1.0.24

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.
Files changed (71) hide show
  1. package/changelog.md +21 -0
  2. package/dist/03371bf1d5cbb1eab58e3a0130d1e9c2.js +1 -1
  3. package/dist/0794fa2b9c882c72fa7d586069b61055.js +1 -1
  4. package/dist/0b923a43967ff893ec63b92dc4f19017.js +1 -1
  5. package/dist/11dc77ef2ea3a04834945a52f7de2072.js +1 -1
  6. package/dist/18cfa6de2de3832aa10439fbf963217a.js +1 -1
  7. package/dist/27ccb71fa24357a0919a861351d5b82d.js +1 -1
  8. package/dist/2b2fe1a34cdf81c656a47e493ca9d658.js +1 -1
  9. package/dist/3dcc18a5dee46b57ad7f85c0bee86802.js +1 -1
  10. package/dist/42b4ce6de00994aa6bf7db7ff2f931a8.js +1 -1
  11. package/dist/4860a6a7c59b9ed5c779f7201dc1f591.js +1 -1
  12. package/dist/55892adefebc0d53993fb108151ed150.js +1 -1
  13. package/dist/5a67fdd5293af0a35defd2574c05cd04.js +1 -1
  14. package/dist/63b15fb6fc8f897b22a4bf72b7e8452a.js +1 -1
  15. package/dist/6bb61adbbc13088ee1c32d88b5c7e754.js +1 -1
  16. package/dist/80a171b7595d1161735e23dec8efddd6.js +1 -1
  17. package/dist/964646d64dd3196a9c27fe302511414a.js +1 -1
  18. package/dist/97e72973d750ecb3bc2e75b75bf63c5b.js +1 -1
  19. package/dist/a98ead014d010899b35ee25c7c225542.js +1 -1
  20. package/dist/b7b7be8216519adf62d75f123f9c6423.js +1 -1
  21. package/dist/b8197742452dd2e77090dde34cb2dc4d.js +1 -1
  22. package/dist/c45445ab45defa960329c6f8e6224e57.js +1 -1
  23. package/dist/chunk-143.4cfd9642b3a86921b58a.js +2 -0
  24. package/dist/chunk-143.4cfd9642b3a86921b58a.js.map +1 -0
  25. package/dist/chunk-383.66a8a5f88f50a32b5def.js +2 -0
  26. package/dist/chunk-383.66a8a5f88f50a32b5def.js.map +1 -0
  27. package/dist/chunk-545.22a8c78eeb1a3939306b.js +2 -0
  28. package/dist/chunk-545.22a8c78eeb1a3939306b.js.map +1 -0
  29. package/dist/chunk-598.1ee78c40032bc1cf4888.js +7 -0
  30. package/dist/chunk-598.1ee78c40032bc1cf4888.js.map +1 -0
  31. package/dist/chunk-611.ecff1d503a54a024cbdd.js +14 -0
  32. package/dist/chunk-611.ecff1d503a54a024cbdd.js.map +1 -0
  33. package/dist/chunk-682.0a029e68653b98693fb2.js +10 -0
  34. package/dist/chunk-682.0a029e68653b98693fb2.js.map +1 -0
  35. package/dist/{chunk-82.fe992385267f6eb716e8.js → chunk-701.44da972f972b420781dc.js} +4 -3
  36. package/dist/chunk-701.44da972f972b420781dc.js.map +1 -0
  37. package/dist/chunk-813.68f180e56bbc2c131c34.js +46 -0
  38. package/dist/chunk-813.68f180e56bbc2c131c34.js.map +1 -0
  39. package/dist/chunk-846.ee749a524f47e3ed648b.js +2 -0
  40. package/dist/chunk-846.ee749a524f47e3ed648b.js.map +1 -0
  41. package/dist/chunk-949.8f8d94d20670c1398a90.js +2 -0
  42. package/dist/chunk-949.8f8d94d20670c1398a90.js.map +1 -0
  43. package/dist/chunk-actions.3f17557b9d8e63131321.js +2 -0
  44. package/dist/chunk-actions.3f17557b9d8e63131321.js.map +1 -0
  45. package/dist/chunk-code-editor.164a6a298ee50f68767b.js +2 -0
  46. package/dist/chunk-code-editor.164a6a298ee50f68767b.js.map +1 -0
  47. package/dist/chunk-vendor-fontawesome.e4d10ee02dd0e55d08da.js +7 -0
  48. package/dist/chunk-vendor-icons.cce3ad8fe21a6de3d0b4.js +1 -0
  49. package/dist/{chunk-vendor-libphonenumber-js.58c7063367df4c40d4fd.js → chunk-vendor-libphonenumber-js.e3530f647ee55c59de91.js} +1 -1
  50. package/dist/chunk-vendor-quill.ddf2e2c68559be7ed070.js +21 -0
  51. package/dist/e0e32c3798e8895695ce5b372a0c989f.js +1 -1
  52. package/dist/ee694c1bcbdc9439e50f816c39fd1023.js +1 -1
  53. package/dist/fd40b62490e412d27bc67e660aacae19.js +1 -1
  54. package/dist/index.js +11 -10
  55. package/dist/index.js.map +1 -0
  56. package/jest.config.js +4 -4
  57. package/package.json +4 -3
  58. package/dist/chunk-229.2ea952f1867a78801d4b.js +0 -1
  59. package/dist/chunk-314.fd36699dbd136490aa1f.js +0 -1
  60. package/dist/chunk-333.6e7bb6ee20346be796e1.js +0 -1
  61. package/dist/chunk-335.7cef6cf94cd9ea8910eb.js +0 -1
  62. package/dist/chunk-342.8f3c7176df159e2a140e.js +0 -6
  63. package/dist/chunk-404.34b136a50b9cf1357c4f.js +0 -1
  64. package/dist/chunk-413.8f9875231f3ea3dc91b3.js +0 -45
  65. package/dist/chunk-51.ff992f4a4488d7d44357.js +0 -9
  66. package/dist/chunk-696.4246384f89ce1ee8933f.js +0 -13
  67. package/dist/chunk-actions.66c72d85dd44315566fe.js +0 -1
  68. package/dist/chunk-code-editor.64a44ea8d4fed4580847.js +0 -1
  69. package/dist/chunk-vendor-fontawesome.7d3f7dd081d6f37ee4c9.js +0 -7
  70. package/dist/chunk-vendor-icons.c1cc12e8f9e141eb191b.js +0 -1
  71. package/dist/chunk-vendor-quill.4404add78e687c1422ce.js +0 -21
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["webpack:///./packages/actions/two-factor-connector/src/modules/actions.js","webpack:///./packages/actions/two-factor-connector/src/components/GlobalStyledComponents.js","webpack:///./packages/actions/two-factor-connector/src/components/Result/StyledComponents.js","webpack:///./packages/actions/two-factor-connector/src/components/Result/Result.js","webpack:///./packages/actions/two-factor-connector/src/components/Result/ResultContainer.js","webpack:///./packages/actions/two-factor-connector/src/components/Result/index.js","webpack:///./packages/actions/two-factor-connector/src/components/Secret/StyledComponents.js","webpack:///./packages/actions/two-factor-connector/src/components/Secret/Secret.js","webpack:///./packages/actions/two-factor-connector/src/components/Secret/SecretContainer.js","webpack:///./packages/actions/two-factor-connector/src/components/Secret/index.js","webpack:///./packages/actions/two-factor-connector/src/components/Start/Start.js","webpack:///./packages/actions/two-factor-connector/src/components/Start/StartContainer.js","webpack:///./packages/actions/two-factor-connector/src/components/Start/index.js","webpack:///./packages/actions/two-factor-connector/src/components/Verification/StyledComponents.js","webpack:///./packages/actions/two-factor-connector/src/components/Verification/Verification.js","webpack:///./packages/actions/two-factor-connector/src/components/Verification/VerificationContainer.js","webpack:///./packages/actions/two-factor-connector/src/components/Verification/index.js","webpack:///./packages/actions/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnector.js","webpack:///./packages/actions/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnectorContainer.js","webpack:///./packages/actions/two-factor-connector/src/components/TwoFactorConnector/index.js","webpack:///./packages/actions/two-factor-connector/src/modules/reducer.js","webpack:///./packages/actions/two-factor-connector/src/modules/sagas.js","webpack:///./packages/actions/two-factor-connector/src/modules/index.js","webpack:///./packages/actions/two-factor-connector/src/main.js","webpack:///./packages/apps/admin/src/components/ErrorView/ErrorView.js","webpack:///./packages/widgets/login/src/LoginApp.js","webpack:///./packages/widgets/login/src/main.js","webpack:///./packages/apps/admin/src/assets/tocco_white.svg","webpack:///./packages/apps/admin/src/assets/tocco-circle.svg","webpack:///./packages/apps/admin/src/components/Login/StyledComponents.js","webpack:///./packages/apps/admin/src/components/Login/Login.js","webpack:///./packages/apps/admin/src/components/Login/LoginContainer.js","webpack:///./packages/core/tocco-ui/src/BurgerButton/StyledComponents.js","webpack:///./packages/core/tocco-ui/src/BurgerButton/BurgerButton.js","webpack:///./packages/core/dashboard/src/modules/dashboard/actions.js","webpack:///./packages/core/dashboard/src/utils/dropTypes.js","webpack:///./packages/core/dashboard/src/utils/infoBoxTypes.js","webpack:///./packages/core/dashboard/src/utils/dashboardUtils.js","webpack:///./packages/core/dashboard/src/components/Menu/StyledComponents.js","webpack:///./packages/core/dashboard/src/components/Menu/Menu.js","webpack:///./packages/core/dashboard/src/components/Menu/MenuContainer.js","webpack:///./packages/core/dashboard/src/components/InfoBox/StyledComponents.js","webpack:///./packages/core/dashboard/src/components/InfoBox/DropPreview.js","webpack:///./packages/core/dashboard/src/components/InfoBox/typeContent/StyledComponents.js","webpack:///./packages/core/dashboard/src/components/InfoBox/typeContent/InfoBoxHtmlFieldContent.js","webpack:///./packages/core/dashboard/src/components/InfoBox/typeContent/InfoBoxSearchFilterContent.js","webpack:///./packages/core/dashboard/src/components/InfoBox/typeContent/InfoBoxSearchFilterContentContainer.js","webpack:///./packages/core/dashboard/src/components/InfoBox/typeContentProvider.js","webpack:///./packages/core/dashboard/src/components/InfoBox/InfoBoxContent.js","webpack:///./packages/core/dashboard/src/components/InfoBox/InfoBox.js","webpack:///./packages/core/dashboard/src/components/Dashboard/StyledComponents.js","webpack:///./packages/core/dashboard/src/components/Dashboard/DashboardInfoBox.js","webpack:///./packages/core/dashboard/src/components/Dashboard/DashboardColumn.js","webpack:///./packages/core/dashboard/src/components/Dashboard/Dashboard.js","webpack:///./packages/core/dashboard/src/utils/constants.js","webpack:///./packages/core/dashboard/src/components/Dashboard/DashboardContainer.js","webpack:///./packages/core/dashboard/src/modules/dashboard/reducer.js","webpack:///./packages/core/dashboard/src/modules/dashboard/index.js","webpack:///./packages/core/dashboard/src/components/InfoBoxSettings/StyledComponents.js","webpack:///./packages/core/dashboard/src/components/InfoBoxSettings/InfoBoxSettings.js","webpack:///./packages/core/dashboard/src/utils/positionUtils.js","webpack:///./packages/core/dashboard/src/modules/dashboard/sagas.js","webpack:///./packages/core/dashboard/src/modules/reducers.js","webpack:///./packages/core/dashboard/src/main.js","webpack:///./packages/apps/admin/src/routes/dashboard/components/Dashboard/StyledComponents.js","webpack:///./packages/apps/admin/src/routes/dashboard/components/Dashboard/Dashboard.js","webpack:///./packages/apps/admin/src/routes/dashboard/components/Dashboard/DashboardContainer.js","webpack:///./packages/apps/admin/src/routes/docs/index.js","webpack:///./packages/apps/admin/src/routes/entities/index.js","webpack:///./packages/apps/admin/src/routes/settings/components/Settings/Settings.js","webpack:///./packages/apps/admin/src/routes/settings/components/Settings/index.js","webpack:///./packages/core/tocco-ui/src/Button/StyledRouterLinkButton.js","webpack:///./packages/core/tocco-ui/src/Button/RouterLinkButton.js","webpack:///./packages/apps/admin/src/assets/tocco_red.svg","webpack:///./packages/apps/admin/src/components/AboutTocco/StyledComponents.js","webpack:///./packages/apps/admin/src/components/AboutTocco/AboutTocco.js","webpack:///./packages/apps/admin/src/components/AboutTocco/AboutToccoContainer.js","webpack:///./packages/apps/admin/src/components/Header/StyledComponents.js","webpack:///./packages/apps/admin/src/components/Header/NotificationCenterRedDot.js","webpack:///./packages/apps/admin/src/components/Header/NotificationCenterRedDotContainer.js","webpack:///./packages/apps/admin/src/components/Header/NotificationCenterButton.js","webpack:///./packages/apps/admin/src/components/Header/Header.js","webpack:///./packages/apps/admin/src/utils/docsUtils.js","webpack:///./packages/apps/admin/src/components/Header/HeaderContainer.js","webpack:///./packages/apps/admin/src/components/MenuTree/StyledComponents.js","webpack:///./packages/apps/admin/src/components/MenuTree/MenuItem.js","webpack:///./packages/apps/admin/src/components/MenuTree/MenuTree.js","webpack:///./packages/apps/admin/src/components/MenuTree/index.js","webpack:///./packages/apps/admin/src/modules/preferences/selectors.js","webpack:///./packages/apps/admin/src/components/Navigation/menuType/StyledComponents.js","webpack:///./packages/apps/admin/src/components/Navigation/menuType/MenuEntry.js","webpack:///./packages/apps/admin/src/components/Navigation/menuType/MenuEntryContainer.js","webpack:///./packages/apps/admin/src/components/Navigation/menuType/MenuChildrenWrapper.js","webpack:///./packages/apps/admin/src/components/Navigation/menuType/MenuChildrenWrapperContainer.js","webpack:///./packages/apps/admin/src/components/Navigation/menuType/EntityExplorerEntry.js","webpack:///./packages/apps/admin/src/components/Navigation/menuType/ActionEntry.js","webpack:///./packages/apps/admin/src/components/Navigation/StyledComponents.js","webpack:///./packages/apps/admin/src/components/Navigation/Navigation.js","webpack:///./packages/apps/admin/src/components/Navigation/NavigationContainer.js","webpack:///./packages/apps/admin/src/components/Navigation/index.js","webpack:///./packages/apps/admin/src/components/Admin/StyledComponents.js","webpack:///./packages/apps/admin/src/components/Admin/Admin.js","webpack:///./packages/apps/admin/src/components/Admin/AdminContainer.js","webpack:///./packages/apps/admin/src/components/LoginGuard/LoginGuard.js","webpack:///./packages/apps/admin/src/components/LoginGuard/LoginGuardContainer.js","webpack:///./packages/apps/admin/src/routes/entities/utils/navigationStrategy.js","webpack:///./packages/apps/admin/src/utils/routing.js","webpack:///./packages/core/tocco-ui/src/QRCode/QRCode.js","webpack:///./packages/core/tocco-util/src/queryString/queryString.js","webpack:///./packages/core/tocco-util/src/queryString/index.js","webpack:///./packages/widgets/login/src/PasswordUpdateApp.js","webpack:///./packages/widgets/login/src/components/StyledLoginForm.js","webpack:///./packages/widgets/login/src/components/LoginForm/LoginForm.js","webpack:///./packages/widgets/login/src/components/LoginForm/index.js","webpack:///./packages/widgets/login/src/containers/LoginFormContainer.js","webpack:///./packages/widgets/login/src/components/PasswordRequest/index.js","webpack:///./packages/widgets/login/src/components/PasswordRequest/PasswordRequest.js","webpack:///./packages/widgets/login/src/containers/PasswordRequestContainer.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/FailureMessage/messages.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/FailureMessage/FailureMessage.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/FailureMessage/index.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/ValidationRules/ValidationRules.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/ValidationRules/index.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordInput.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordInput.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordUpdateDialog.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordUpdateDialog.js","webpack:///./packages/widgets/login/src/components/passwordUpdate/PasswordUpdateDialog/index.js","webpack:///./packages/widgets/login/src/containers/PasswordUpdateDialogContainer.js","webpack:///./packages/widgets/login/src/components/TwoFactorConnectorForm/TwoFactorConnectorForm.js","webpack:///./packages/widgets/login/src/components/TwoFactorConnectorForm/index.js","webpack:///./packages/widgets/login/src/containers/TwoFactorConnectorContainer.js","webpack:///./packages/widgets/login/src/components/TwoStepLoginForm/StyledTwoStepLoginForm.js","webpack:///./packages/widgets/login/src/components/TwoStepLoginForm/TwoStepLoginForm.js","webpack:///./packages/widgets/login/src/components/TwoStepLoginForm/index.js","webpack:///./packages/widgets/login/src/containers/TwoStepLoginContainer.js","webpack:///./packages/widgets/login/src/components/Login/Login.js","webpack:///./packages/widgets/login/src/components/Login/index.js","webpack:///./packages/widgets/login/src/containers/LoginContainer.js","webpack:///./packages/widgets/login/src/modules/actions.js","webpack:///./packages/widgets/login/src/modules/login/actions.js","webpack:///./packages/widgets/login/src/modules/passwordRequest/actions.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/actions.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/dialog/actions.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/password/actions.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/validationRules/actions.js","webpack:///./packages/widgets/login/src/modules/login/reducer.js","webpack:///./packages/widgets/login/src/modules/login/index.js","webpack:///./packages/widgets/login/src/modules/loginForm/actions.js","webpack:///./packages/widgets/login/src/modules/loginForm/reducer.js","webpack:///./packages/widgets/login/src/modules/loginForm/index.js","webpack:///./packages/widgets/login/src/modules/passwordRequest/reducer.js","webpack:///./packages/widgets/login/src/modules/passwordRequest/sagas.js","webpack:///./packages/widgets/login/src/modules/passwordRequest/index.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/dialog/reducer.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/dialog/index.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/password/utils.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/password/reducer.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/password/index.js","webpack:///./packages/widgets/login/src/modules/sagas.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/password/validate.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/password/sagas.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/sagas.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/validationRules/reducer.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/validationRules/index.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/validationRules/sagas.js","webpack:///./packages/widgets/login/src/modules/passwordUpdate/reducers.js","webpack:///./packages/widgets/login/src/modules/twoStepLogin/reducer.js","webpack:///./packages/widgets/login/src/modules/twoStepLogin/sagas.js","webpack:///./packages/widgets/login/src/modules/twoStepLogin/index.js","webpack:///./packages/widgets/login/src/modules/reducers.js","webpack:///./packages/widgets/login/src/modules/twoStepLogin/actions.js","webpack:///./packages/widgets/login/src/types/Pages.js","webpack:///./packages/widgets/sso-login/src/utils/loginWindow.js","webpack:///./packages/widgets/sso-login/src/utils/popUp.js","webpack:///./packages/widgets/sso-login/src/components/ProviderButton/StyledProviderButton.js","webpack:///./packages/widgets/sso-login/src/components/ProviderButton/ProviderButton.js","webpack:///./packages/widgets/sso-login/src/components/LoginBox/LoginBox.js","webpack:///./packages/widgets/sso-login/src/components/LoginBox/index.js","webpack:///./packages/widgets/sso-login/src/modules/actions.js","webpack:///./packages/widgets/sso-login/src/containers/LoginBoxContainer.js","webpack:///./packages/widgets/sso-login/src/modules/reducer.js","webpack:///./packages/widgets/sso-login/src/utils/providers.js","webpack:///./packages/widgets/sso-login/src/modules/sagas.js","webpack:///./packages/widgets/sso-login/src/modules/index.js","webpack:///./packages/widgets/sso-login/src/main.js"],"names":["INITIALIZE","SET_TWO_STEP_ACTIVE","SET_SECRET","SET_USER_NAME","REQUEST_SECRET","GO_TO_SECRET_VERIFICATION","GO_TO_START","GO_TO_SECRET","VERIFY_CODE","SUCCESS","SET_SETUP_SUCCESSFUL","GO_TO_RESULT","initialize","type","setTwoFactorActive","twoFactorActive","payload","setSecret","secret","setUserName","username","goToStart","setSetupSuccessful","setupSuccessful","StyledButtonWrapper","styled","scale","StyledButton","StyledMessageWrapper","StyledIconWrapper","isSuccessful","theme","StyledTextWrapper","success","intl","msg","id","formatMessage","icon","Typography","Button","label","ink","look","onClick","mapActionCreators","connect","state","twoFactorConnector","injectIntl","Result","StyledQRCodeWrapper","StyledParagraph","goToSecretVerification","QRCode","value","uri","Secret","forced","requestSecret","dangerouslySetInnerHTML","__html","input","Start","StyledLoginFormInputWrapper","StyledEditableWrapperCss","verifyCode","useState","userCode","setUserCode","onSubmit","e","preventDefault","stopPropagation","toString","length","StatedValue","hasValue","EditableValue","events","onChange","options","format","allowLeadingZeros","disabled","props","Verification","stages","stage","useEffect","notification","LoadMask","renderContent","TwoFactorConnector","setStage","ACTION_HANDLERS","actions","reducerUtil","initialState","activateTwoFactorWithoutSession","activateTwoFactor","loadPrincipal2FAInfo","getUsername","fireResize","mainSagas","twoFactorField","usernameSelector","secretSelector","inputSelector","select","call","rest","method","principalsResponse","body","totpUri","put","sendRequest","url","request","then","password","data","headers","Headers","Object","keys","filter","k","sort","map","encodeURIComponent","join","response","_get","code","acceptedStatusCodes","codeVerifyResponse","status","externalEvents","where","paths","principals","Error","twoFactorKey","inputUsername","all","takeLatest","action","handler","sagas","rootSaga","packageName","initApp","publicPath","content","store","appFactory","reducers","errorLogging","cache","textResourceModules","EXTERNAL_EVENTS","TwoFactorConnectorApp","component","propTypes","reduce","event","PropTypes","StyledErrorView","title","message","initLoginApp","customTheme","passwordUpdate","passwordRequest","login","showTitle","LoginContainer","loginReducers","backendUrl","env","LoginApp","locale","setLocale","GlobalBodyStyle","createGlobalStyle","StyledLogin","ToccoLogo","StyledHeadingLogin","StyledH1","StyledSpanLogin","StyledSpan","StyledLoginWrapper","StyledSloganImg","StyledMobileSloganImg","StyledSsoMsg","StyledSsoError","ssoAvailable","loginSuccessful","checkSsoAvailable","showError","setShowError","showRegistrationText","setShowRegistrationText","autoLogin","Cookies","ssoLoginCompleted","successful","provider","registration","expires","SsoLoginPart","ssoLoginEndpoint","loginCompleted","breakWords","src","ToccoSlogan","alt","height","width","loginSuccess","timeout","session","Login","StyledBurgerButton","isOpen","css","LOAD_DASHBOARD","SET_DASHBOARD","SAVE_INFOBOX_POSITIONS","SAVE_INFOBOX_HEIGHT","DISPLAY_INFOBOX_SETTINGS_MODAL","RESET_INFOBOX_SETTINGS","setDashboard","infoBoxes","Column","InfoBox","InfoBoxRenderTypes","sortInfoBoxes","boxes","a","b","col","row","reindex","sortedBoxes","box","index","nextIndex","insertDraggedAtDropped","draggingId","dragOverId","position","dragOverColumn","find","draggingBox","moveBoxHere","dragAndDrop","StyledMenuWrapper","displayInfoBoxSettings","resetInfoBoxSettings","BallMenu","buttonProps","MenuItem","Menu","minHeight","StyledInfoBoxWrapper","colorizeBorder","StyledDroppedPreview","StyledInfoBoxContentWrapper","scrollable","StyledScrollbar","text","FormattedValue","DetailLinkRelative","entityKey","entityModel","children","StyledLink","to","navigationStrategy","emitAction","searchFilterUniqueId","entityName","scope","limit","formName","searchFilters","showActions","onRowClick","openDetail","searchFormType","searchFormPosition","selectionStyle","sortable","disableSelectionController","showLink","scrollBehaviour","tableMinHeight","actionEmitter","InfoBoxSearchFilterContent","htmlfield","InfoBoxHtmlFieldContent","searchfilter","InfoBoxSearchFilterContentContainer","InfoBoxContent","React","consoleLogger","StyledDashboardWrapper","StyledColumnWrapper","StyledColumn","StyledResizeHandle","shadeColor","isReszing","infoBox","isResizing","startResize","onDragStart","onDragEnter","onDragOver","onDrop","key","draggable","onMouseDown","resizeState","dndState","makeDndEvents","currentlyDragOver","resizingElement","InfoBoxes","DropTypes","storedInfoBoxes","saveInfoBoxHeight","saveInfoBoxPositions","infoBoxesLoaded","setInfoBoxes","columns","Array","ref","useRef","selector","useCallback","current","querySelector","onInfoBoxHeightChanged","finalHeight","c","onInfoBoxHeightChanging","resize","resizingEvents","currentlyDragging","dragOverType","updatedInfoBoxes","appendDraggedAsLastItemToDropped","moveDraggedToDropped","dndEvents","dropPosition","DashboardColumns","column","isOverItself","draggingPreviewBox","renderBoxes","folded","acc","showPreviewHere","getRenderInfoBoxesForColumn","required","dashboard","Dashboard","undefined","StyledUl","StyledLabel","StyledCheckbox","initialInfoBoxes","onOk","InfoBoxesList","checked","for","isUnpositionedInfoBox","distributeInfoBoxes","unpositionedInfoBoxes","positionedInfoBoxes","numberOfBoxesPerCol","minCol","min","parseInt","numberOfBoxes","Number","MAX_VALUE","getColumnWithMinAmountOfInfoBoxes","prepareInfoBoxes","split","Math","max","mapPositionToColAndRow","loadDashboard","saveInfoBoxSettings","saveInfoBoxPreferences","dashboardSelector","takeEvery","infoboxes","preferences","channel","answerChannel","close","take","dashboardReducer","dashboardSagas","DashboardContainer","handleNotifications","DashboardApp","StyledWrapper","StyledBreadcrumbs","match","history","Breadcrumbs","currentView","display","pathPrefix","useStore","Component","useMemo","route","ignoredAttributes","areEqual","prevProps","nextProps","diff","js","clean","_omitBy","_omit","v","entries","memo","ReactReduxContext","Link","buttonStyle","aria","iconOnly","design","StyledFormattedMessageWrapper","StyledBlockWrapper","StyledLogo","niceVersion","niceRevision","json","require","href","neutral","target","version","serverSettings","AboutTocco","StyledBackgroundCover","StyledHeader","StyledConfig","StyledBackgroundLogo","runEnv","colors","primary","secondary","StyledPopper","StyledNotificationBellWrapper","StyledBall","Ball","StyledRedDot","AdminLink","unreadNotificationKeys","innerRef","center","NotificationCenterRedDot","popperModifiers","name","offset","padding","visible","setVisibility","referenceElement","popperElement","redDotElement","handleMouseDown","contains","document","addEventListener","removeEventListener","usePopper","modifiers","styles","attributes","NotificationCenterRedDotContainer","ReactDOM","style","popper","StyledBallMenuWrapper","currentBusinessUnit","businessUnits","loadBusinessUnits","changeBusinessUnit","doLogout","openModalComponent","removeModalComponent","info","setMenuOpen","ButtonMenu","onOpen","bU","PasswordUpdateApp","onSuccess","window","open","subdomain","d","padStart","getDocsUrl","Header","StyledMenuEntry","declareFont","level","childrenCount","StyledMenuEntryWrapper","StyledExtendedSearchTitle","item","menuTreePath","typeMapping","mappedType","menuType","ChildrenWrapperComponent","childrenWrapperComponent","MenuItems","child","MenuTree","items","extendedSearchItems","searchFilter","requireSearch","actualItems","prepareMenuTree","actualExtendedSearchItems","ExtendedSearchMenuItems","showExtendedSearch","hasExtendedSearchResult","menuIsOpenPrefrencesSelector","canCollapse","preferencesPrefix","userPreferences","getMenuPreferencesKey","secondaryLight","StyledMenuLink","StyledIconLink","StyledMenuLinkWrapper","StyledTogglerIconWrapper","StyledMenuIconWrapper","StyledMenuChildrenWrapper","saveUserPreferences","toggleMenuEntryCollapsed","MenuEntry","MenuChildrenWrapper","entityNameDisplay","matchingAttribute","entity","rel","StyledNav","StyledSearchBox","StyledTabsContainer","StyledActiveTabLabel","fontSize","fontWeight","color","StyledNavIconButton","narrow","active","StyledSearchBoxWrapper","StyledMenuButtonsWrapper","StyledMenuButton","createMenuTypeMap","hasFilterApplied","menu","filterAttributes","EntityExplorerEntry","ActionEntry","modulesMenuTree","settingsMenuTree","systemMenuTree","completeMenuTree","menuOpen","activeMenuTab","setActiveMenuTab","inputEl","navigationEl","setFilter","Boolean","showMenu","menuTabs","includes","menuTabsConfig","modulesTypeMap","settingsTypeMap","systemTypeMap","completeTypeMap","setTimeout","focus","MenuTabs","menuTab","onKeyDown","focusableElements","currentIdx","querySelectorAll","findIndex","el","activeElement","isEqualNode","SearchBox","minInputLength","onSearch","placeholder","getCompleteMenuPreferences","navigation","Navigation","calcViewportHeight","vh","innerHeight","documentElement","setProperty","StyledContent","StyledMenu","SlideMenu","burgerMenuStyles","bmBurgerButton","outline","left","top","zIndex","bmMenuWrap","minWidth","bmMenu","background","overflow","bmItemList","bmItem","bmOverlay","withTheme","initializeNavigation","baseRoute","confirm","loadPrincipal","loadSettingsAndPreferences","adminAllowed","setHistory","initializeHistory","browserHistory","createBrowserHistory","basename","getUserConfirmation","confirmCallback","adminAllowedContent","onStateChange","customCrossIcon","customBurgerIcon","viewPersistor","exact","path","render","replace","from","DashboardRoute","EntitiesRoute","Settings","DocsRoute","adminForbiddenContent","ErrorView","GlobalStyles","Admin","doSessionCheck","loggedIn","Helmet","defer","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","renderAs","hasJsonStructure","str","parsed","JSON","parse","prototype","err","fromQueryString","obj","_mapValues","toQueryString","stringifiedValues","_isObject","stringify","EXTERNAL_EVENTS_PASSWORD_UPDATE","initPasswordUpdateApp","forcedUpdate","currentPage","showOldPasswordField","oldPassword","StyledLoginFormInput","StyledInputCss","StyledLoginButton","StyledTransparentButton","StyledLoginFormWrapper","StyledButtonGroup","captchaKey","changePage","loginPending","recaptchaActivated","setPassword","setUsername","autoFill","setAutoFill","recaptchaRef","prevRecaptchaActivated","react","handleSubmit","recaptchaToken","executeAsync","reset","handleAutoFill","animationName","passwordFocus","usernameFocus","autoFocus","onAnimationStart","onFocus","SignalList","condition","negative","badge","size","sitekey","hl","pending","Pages","loginForm","LoginForm","requestPassword","userName","PasswordRequest","messages","INVALID_CREDENTIALS","UNEXPECTED_ERROR","errorCode","rules","rule","errors","error","StyledPasswordInput","StyledPasswordInputWrapper","getSignal","valid","immutable","readOnly","signal","StyledValidationRulesWrapper","fetchValidationRules","initialized","savePassword","updateNewPassword","updateNewPasswordRepeat","updateOldPassword","validationRules","isSubmittable","newPasswordRepeat","newPassword","passwordUpdatePending","oldPasswordReadOnly","newPasswordReadOnly","newPasswordRepeatReadOnly","newPasswordValidationErrors","StyledPasswordUpdateDialog","tabIndex","passwordUpdateFailed","passwordUpdateErrorCode","rulesNeutral","dialog","PasswordUpdateDialog","twoStepLogin","TwoFactorConnectorForm","StyledTwoStepLogin","StyledEditableValue","formEl","useLayoutEffect","TwoStepLoginForm","GlobalRecaptchaBadgeStyle","PasswordRequestContainer","TwoStepLoginContainer","TwoFactorConnectorContainer","LoginFormContainer","LOGIN","captchaToken","CHANGE_PAGE","SET_USERNAME","SET_PASSWORD","SET_CAPTCHA_KEY","page","setCaptchaKey","REQUEST_PASSWORD","PASSWORD_REQUEST","setPasswordRequest","INITIALIZED","SET_SHOW_OLD_PASSWORD","SET_STANDALONE","SET_FORCED_UPDATE","SET_USERNAME_OR_PK","setShowOldPasswordField","setForcedUpdate","setStandalone","standalone","setUsernameOrPk","usernameOrPk","UPDATE_OLD_PASSWORD","UPDATE_NEW_PASSWORD","SET_NEW_PASSWORD","SET_NEW_PASSWORD_VALIDATION_ERRORS","UPDATE_NEW_PASSWORD_REPEAT","SAVE_PASSWORD","SAVE_PASSWORD_SUCCESS","SAVE_PASSWORD_FAILURE","VALIDATE","RESET_PASSWORD_UPDATED_FAILED","setNewPassword","setNewPasswordValidationErrors","savePasswordSuccess","savePasswordFailure","validationMessages","validate","resetPasswordUpdateFailed","FETCH_VALIDATION_RULES","SET_VALIDATION_RULES","setValidationRules","SET_MESSAGE","SET_PENDING","ACTIVATE_RECAPTCHA","setMessage","setPending","requestPasswordSaga","passwordRequestSaga","saga","textResourceSelector","textResourcesState","fork","moduleSagas","singleTransferReducer","attributeName","val","validationMessagesToErrorMap","forEach","ruleName","doLoginRequest","doSessionRequest","handleTwoStepLoginResponse","handleTwoStepActivationResponse","handlePasswordUpdateResponse","handleBlockResponse","handleFailedResponse","handleSuccessfulLogin","loginSaga","checkSessionSaga","loadSettings","loginSelector","doRequest","Promise","resolve","getOptions","twoFactorResponse","loginData","CAPTCHA","TWOSTEPLOGIN","RESET_PASSWORD_REQUIRED","LOGIN_BLOCKED","TWOSTEPLOGIN_ACTIVATION","settings","loginActions","validateCharacterRule","regex","specificCharsCount","VALIDATORS","params","validator","storePassword","remoteValidate","getData","getLoginData","formChanged","validationRulesSelector","usernameOrPkSelector","passwordSelector","standaloneSelector","intlSelector","resp","ok","exception","queryParams","localValidate","object","constructor","result","resizeWatcher","loadValidationRules","resource","validationResponse","passwordSagas","validationRulesSagas","twoStepSaga","args","combineReducers","passwordUpdateReducers","passwordRequestSagas","twoStepLoginSagas","passwordUpdateSagas","LOGIN_FORM","PASSWORD_UPDATE","openLoginWindow","loginEndpoint","baseUrl","encodedWindowUrl","location","unique_id","popUp","features","screen","resizable","scrollbars","_reduce","getPopUpFeatures","ssoPopUpCallback","declareInteractionColors","generateInteractionColors","bg","primaryColor","fg","secondaryColor","StyledProviderButton","button_primary_color","button_secondary_color","button_icon","button_label","StyledButtonContainer","LoginBox","loadProviders","prevState","snapshot","this","providers","autoLoginProvider","idx","LOAD_PROVIDERS","SET_PROVIDERS","LOGIN_COMPLETED","ssoLogin","transformProviderEntities","query","conditions","entities","LoginBoxContainer","SsoLoginApp"],"mappings":"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","file":"chunk-143.4cfd9642b3a86921b58a.js","sourcesContent":["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 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 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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {Button, Typography, Icon} from 'tocco-ui'\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 label={msg('client.two-factor-connector.okButton')} ink=\"primary\" look=\"raised\" onClick={success} />\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 label={msg('client.two-factor-connector.okButton')} ink=\"primary\" look=\"raised\" onClick={goToStart} />\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {QRCode, Typography, Button} from 'tocco-ui'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledQRCodeWrapper, StyledParagraph} from './StyledComponents'\n\nconst Secret = ({secret, goToSecretVerification}) => {\n return (\n <>\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 ink=\"primary\" look=\"raised\" onClick={goToSecretVerification}>\n <FormattedMessage id=\"client.two-factor-connector.nextButton\" />\n </Button>\n </StyledButtonWrapper>\n </>\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {goToSecretVerification} from '../../modules/actions'\nimport Secret from './Secret'\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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {Button, Typography} from 'tocco-ui'\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 {twoFactorActive ? (\n <FormattedMessage id=\"client.two-factor-connector.overwriteInfo\" />\n ) : forced ? (\n <span dangerouslySetInnerHTML={{__html: msg('client.two-factor-connector.forcedInfo')}} />\n ) : (\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 {StyledEditableWrapperCss} from 'tocco-ui'\n\nexport const StyledLoginFormInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {Button, EditableValue, StatedValue, Typography} from 'tocco-ui'\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 <>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.verificationText\" />\n </Typography.P>\n <form\n onSubmit={e => {\n e.preventDefault()\n e.stopPropagation()\n if (userCode && userCode.toString().length >= 6) {\n handleVerifyClick()\n }\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}\n\nVerification.propTypes = {\n intl: PropTypes.object.isRequired,\n verifyCode: PropTypes.func.isRequired\n}\n\nexport default Verification\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {verifyCode} from '../../modules/actions'\nimport Verification from './Verification'\n\nconst mapActionCreators = {\n verifyCode\n}\n\nconst mapStateToProps = (state, props) => ({})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Verification))\n","import Verification from './VerificationContainer'\n\nexport default Verification\n","import PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {notification} from 'tocco-app-extensions'\nimport {LoadMask} from 'tocco-ui'\n\nimport Result from '../Result'\nimport Secret from '../Secret'\nimport Start from '../Start'\nimport Verification from '../Verification'\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 }, [initialize])\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 {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 _get from 'lodash/get'\nimport {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {rest, externalEvents} from 'tocco-app-extensions'\nimport {request} from 'tocco-util'\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 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])}`)\n .join('&')\n })\n\n yield put(actions.setSetupSuccessful(_get(response, 'TWOSTEPLOGIN_ACTIVATION.success', false)))\n}\n\nfunction* activateTwoFactor(username, secret, code) {\n const codeVerifyResponse = yield call(rest.requestSaga, `principals/${username}/two-factor`, {\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 twoFactorConnector from './reducer'\nimport rootSaga from './sagas'\n\nexport default {\n twoFactorConnector\n}\n\nexport const sagas = [rootSaga]\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {appFactory, cache, errorLogging, externalEvents, notification} from 'tocco-app-extensions'\nimport {reducer as reducerUtil} from 'tocco-util'\n\nimport TwoFactorConnector from './components/TwoFactorConnector'\nimport reducers, {sagas} from './modules'\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(packageName, content, store, {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\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 = ['onSuccess', 'onCancel', 'onResize']\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","import PropTypes from 'prop-types'\nimport React from 'react'\nimport styled from 'styled-components'\nimport {Icon, scale, theme, Typography} from 'tocco-ui'\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 (\n <StyledErrorView>\n <StyledIconWrapper>\n <Icon icon=\"times\" />\n </StyledIconWrapper>\n <Typography.H1>{title}</Typography.H1>\n <Typography.Span>{message}</Typography.Span>\n </StyledErrorView>\n )\n}\n\nErrorView.propTypes = {\n title: PropTypes.element.isRequired,\n message: PropTypes.element.isRequired\n}\n\nexport default ErrorView\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {appFactory, cache, errorLogging, externalEvents} from 'tocco-app-extensions'\nimport {env} from 'tocco-util'\n\nimport LoginContainer from './containers/LoginContainer'\nimport * as login from './modules/login/actions'\nimport * as passwordRequest from './modules/passwordRequest/actions'\nimport * as passwordUpdate from './modules/passwordUpdate/dialog/actions'\nimport loginReducers, {sagas} from './modules/reducers'\n\nconst packageName = 'login'\n\nconst EXTERNAL_EVENTS = ['loginSuccess', 'resize']\n\nexport const 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\n if (input.backendUrl) {\n env.setBackendUrl(input.backendUrl)\n }\n\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n cache.addToStore(store)\n\n return appFactory.createApp(packageName, content, store, {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n })\n}\n\nexport const LoginApp = props => {\n const {component} = appFactory.useApp({\n initApp: initLoginApp,\n props,\n packageName,\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 backendUrl: PropTypes.string,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {})\n}\n","import {appFactory} from 'tocco-app-extensions'\nimport {reducer as reducerUtil} from 'tocco-util'\n\nimport {initLoginApp, LoginApp} from './LoginApp'\nimport {initPasswordUpdateApp, PasswordUpdateApp} from './PasswordUpdateApp'\n\nconst packageName = 'login'\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\nexport {PasswordUpdateApp}\nexport default LoginApp\n","export default __webpack_public_path__ + \"imgs/tocco_white.5c80050a55945844e89ffaf71395e64b.svg\";","export default __webpack_public_path__ + \"imgs/tocco-circle.7ab925bf473f813493f00f069ed9746e.svg\";","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 Cookies from 'js-cookie'\nimport PropTypes from 'prop-types'\nimport React, {useState, useEffect} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport ToccoLogin from 'tocco-login/src/main'\nimport SsoLogin from 'tocco-sso-login/src/main'\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 }, [checkSsoAvailable])\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 ssoLoginEndpoint=\"/sso\" loginCompleted={ssoLoginCompleted} autoLogin={autoLogin} />\n {showRegistrationText && (\n <StyledSsoMsg breakWords={true}>\n <FormattedMessage id=\"client.sso-login.registration\" />\n </StyledSsoMsg>\n )}\n {showError && (\n <StyledSsoError breakWords={true}>\n <FormattedMessage id=\"client.sso-login.error\" />\n </StyledSsoError>\n )}\n <StyledSpanLogin>\n <FormattedMessage id=\"client.admin.loginChoice\" />\n </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>\n <FormattedMessage id=\"client.admin.welcomeTitle\" />\n </StyledHeadingLogin>\n {ssoAvailable && <SsoLoginPart />}\n <ToccoLogin loginSuccess={loginSuccess} showTitle={false} />\n </StyledLoginWrapper>\n </StyledLogin>\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {loginSuccessful, checkSsoAvailable} from '../../modules/session/actions'\nimport Login from './Login'\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 styled, {css} from 'styled-components'\n\nimport {theme} from '../index'\n\nexport const StyledBurgerButton = styled.div`\n width: 24px;\n height: 24px;\n position: absolute;\n transform: rotate(0deg);\n transition: 0.5s ease-in-out;\n cursor: pointer;\n\n span {\n display: block;\n position: absolute;\n height: 2px;\n width: 100%;\n background: ${theme.color('paper')};\n opacity: 1;\n left: 0;\n transform: rotate(0deg);\n transition: 0.25s ease-in-out;\n\n &:nth-child(1) {\n top: 0;\n transform-origin: left center;\n }\n\n &:nth-child(2) {\n top: 6.5px;\n transform-origin: left center;\n }\n\n &:nth-child(3) {\n top: 13.5px;\n transform-origin: left center;\n }\n }\n ${({isOpen}) =>\n isOpen &&\n css`\n span:nth-child(1) {\n transform: rotate(45deg);\n top: -3px;\n left: 0;\n }\n\n span:nth-child(2) {\n width: 0;\n opacity: 0;\n }\n\n span:nth-child(3) {\n transform: rotate(-45deg);\n top: 14.3px;\n left: 0;\n }\n `}\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {injectIntl} from 'react-intl'\n\nimport {StyledBurgerButton} from './StyledComponents'\n\nconst BurgerButton = ({isOpen, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledBurgerButton isOpen={isOpen} aria-label={msg('client.component.burgerButton.Label')}>\n <span />\n <span />\n <span />\n </StyledBurgerButton>\n )\n}\n\nBurgerButton.propTypes = {\n intl: PropTypes.object.isRequired,\n isOpen: PropTypes.bool\n}\n\nexport default injectIntl(BurgerButton)\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","const DropTypes = {\n Column: 'Column',\n InfoBox: 'InfoBox'\n}\n\nexport default DropTypes\n","export 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 =>\n 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.reduce(\n ({index, boxes}, box) => {\n const nextIndex = typeof index[box.col] === 'number' ? index[box.col] + 1 : 0\n const acc = {\n boxes: [...boxes, {...box, row: nextIndex}],\n index: {\n ...index,\n [box.col]: nextIndex\n }\n }\n return acc\n },\n {index: {}, boxes: []}\n ).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(\n sortedBoxes.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) =>\n flow([sortInfoBoxes, 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(\n ({folded, col, id}) =>\n !folded && col === column && (typeof dragOverId !== 'undefined' && !isOverItself ? id !== draggingId : true)\n )\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 ? [draggingPreviewBox] : []),\n key.id === draggingId && isOverItself ? {...key, type: InfoBoxRenderTypes.DropPreview} : key,\n ...(position === dragAndDrop.DropPosition.Bottom && showPreviewHere ? [draggingPreviewBox] : [])\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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {BallMenu, MenuItem} from 'tocco-ui'\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {displayInfoBoxSettings, resetInfoBoxSettings} from '../../modules/dashboard/actions'\nimport Menu from './Menu'\n\nconst mapActionCreators = {\n displayInfoBoxSettings,\n resetInfoBoxSettings\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(Menu))\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 React from 'react'\n\nimport {StyledDroppedPreview} from './StyledComponents'\n\nconst DropPreview = props => <StyledDroppedPreview {...props} />\n\nexport default DropPreview\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 PropTypes from 'prop-types'\nimport React from 'react'\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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {injectIntl} from 'react-intl'\nimport EntityListApp from 'tocco-entity-list/src/main'\nimport {AdminLink as StyledLink} from 'tocco-ui'\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 >\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 (\n <StyledInfoBoxContentWrapper scrollable>\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=\"fulltext\"\n searchFormPosition=\"top\"\n selectionStyle=\"none\"\n sortable\n disableSelectionController\n emitAction={emitAction}\n navigationStrategy={{...navigationStrategy, DetailLinkRelative}}\n showLink={true}\n scrollBehaviour=\"inline\"\n tableMinHeight=\"240px\"\n />\n </StyledInfoBoxContentWrapper>\n )\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {Typography} from 'tocco-ui'\n\nimport InfoBoxContent from './InfoBoxContent'\nimport {StyledInfoBoxWrapper} from './StyledComponents'\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 _get from 'lodash/get'\nimport styled from 'styled-components'\nimport {scale, StyledScrollbar, shadeColor, theme} from 'tocco-ui'\n\nexport const StyledDashboardWrapper = styled.div`\n width: 100%;\n height: calc(100% - 75px); // ~75px the height of header and breadcrumbs\n background: ${theme.color('paper')};\n padding: ${scale.space(-0.5)} ${scale.space(-2)} ${scale.space(-0.5)} ${scale.space(-0.5)};\n overflow-y: scroll;\n box-sizing: border-box;\n position: absolute;\n ${StyledScrollbar}\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","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport InfoBox from '../InfoBox/InfoBox'\nimport {StyledInfoBoxWrapper, StyledResizeHandle} from './StyledComponents'\n\nconst DashboardInfoBox = ({infoBox, isResizing, startResize, onDragStart, onDragEnter, onDragOver, onDrop}) => {\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 onMouseDown={startResize} isReszing={isResizing} />\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 PropTypes from 'prop-types'\nimport React from 'react'\n\nimport DropTypes from '../../utils/dropTypes'\nimport {InfoBoxRenderTypes} from '../../utils/infoBoxTypes'\nimport DropPreview from '../InfoBox/DropPreview'\nimport DashboardInfoBox from './DashboardInfoBox'\nimport {StyledColumn} from './StyledComponents'\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 const InfoBoxes = infoBoxes.map(infoBox => {\n const {id, height, type} = infoBox\n if (type === InfoBoxRenderTypes.DropPreview) {\n return <DropPreview key={`${type}-${id}`} height={height} {...makeDndEvents(currentlyDragOver)} />\n }\n\n return (\n <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 })\n\n return (\n <StyledColumn onDragEnter={onDragEnter} onDragOver={onDragOver} onDrop={onDrop}>\n {InfoBoxes}\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 PropTypes from 'prop-types'\nimport React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {LoadMask} from 'tocco-ui'\nimport {dragAndDrop, resize} from 'tocco-util'\n\nimport {NUMBER_OF_COLUMNS} from '../../utils/constants'\nimport {\n appendDraggedAsLastItemToDropped,\n getRenderInfoBoxesForColumn,\n moveDraggedToDropped\n} from '../../utils/dashboardUtils'\nimport DropTypes from '../../utils/dropTypes'\nimport Menu from '../Menu/MenuContainer'\nimport DashboardColumn from './DashboardColumn'\nimport {StyledDashboardWrapper, StyledColumnWrapper} from './StyledComponents'\n\nconst Dashboard = ({infoBoxes: storedInfoBoxes, saveInfoBoxHeight, saveInfoBoxPositions}) => {\n const infoBoxesLoaded = storedInfoBoxes?.length >= 0\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 = useCallback(id => ref.current.querySelector(`#infobox-${id}`), [])\n const onInfoBoxHeightChanged = useCallback(\n id => {\n const finalHeight = infoBoxes.find(c => c.id === id)?.height\n saveInfoBoxHeight(id, finalHeight)\n },\n [infoBoxes, saveInfoBoxHeight]\n )\n\n const onInfoBoxHeightChanging = useCallback((id, {height}) => {\n setInfoBoxes(infoBoxes => [\n ...infoBoxes.map(c =>\n c.id === id\n ? {\n ...c,\n height\n }\n : c\n )\n ])\n }, [])\n\n const {startResize, resizingEvents, resizeState} = resize.useResize(\n selector,\n onInfoBoxHeightChanging,\n onInfoBoxHeightChanged\n )\n\n const changeInfoBoxPosition = (currentlyDragging, currentlyDragOver, position) => {\n const {id: draggingId} = currentlyDragging\n const {type: dragOverType, id: dragOverId} = 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 {dndEvents, dndState} = dragAndDrop.useDnD(changeInfoBoxPosition, infoBoxes)\n const {currentlyDragOver, currentlyDragging, dropPosition} = dndState\n\n const {id: draggingId} = currentlyDragging || {}\n const DashboardColumns = columns.map(column => {\n const {onDragEnter, onDragOver, onDrop} = dndEvents({\n type: DropTypes.Column,\n id: column\n })\n const boxes = getRenderInfoBoxesForColumn(draggingId, currentlyDragOver, dropPosition, column, infoBoxes)\n\n return (\n <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\n return (\n <StyledDashboardWrapper ref={ref} {...resizingEvents}>\n <LoadMask required={[infoBoxesLoaded]}>\n <Menu />\n <StyledColumnWrapper>{DashboardColumns}</StyledColumnWrapper>\n </LoadMask>\n </StyledDashboardWrapper>\n )\n}\n\nDashboard.propTypes = {\n infoBoxes: PropTypes.array,\n saveInfoBoxPositions: PropTypes.func.isRequired,\n saveInfoBoxHeight: PropTypes.func.isRequired\n}\n\nexport default Dashboard\n","export const NUMBER_OF_COLUMNS = 2\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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: undefined\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 PropTypes from 'prop-types'\nimport React, {useState} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {Button, Typography} from 'tocco-ui'\n\nimport {StyledButtonWrapper, StyledCheckbox, StyledUl} from './StyledComponents'\n\nconst InfoBoxSettings = ({initialInfoBoxes, onOk}) => {\n const [infoBoxes, setInfoBoxes] = useState(initialInfoBoxes || [])\n\n const toggle = id => {\n const checkBoxes = boxes =>\n boxes.reduce((acc, box) => [...acc, {...box, folded: box.id === id ? !box.folded : box.folded}], [])\n setInfoBoxes(checkBoxes)\n }\n const InfoBoxesList = infoBoxes.map(box => (\n <Typography.Li key={box.id}>\n <StyledCheckbox type=\"checkbox\" checked={!box.folded} onChange={() => toggle(box.id)} id={box.id} />\n <Typography.Label for={box.id}>{box.label}</Typography.Label>\n </Typography.Li>\n ))\n\n return (\n <>\n <StyledUl>{InfoBoxesList}</StyledUl>\n <StyledButtonWrapper>\n <Button type=\"button\" onClick={() => onOk(infoBoxes)} look=\"raised\">\n <FormattedMessage id=\"client.common.ok\" />\n </Button>\n </StyledButtonWrapper>\n </>\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(\n (acc, col) => ({\n ...acc,\n [col]: infoBoxes.filter(b => b.col === col).length\n }),\n {}\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\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.reduce((acc, box) => {\n const {col, numberOfBoxes} = getColumnWithMinAmountOfInfoBoxes(acc)\n return [...acc, {...box, col, row: numberOfBoxes}]\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 =>\n sortInfoBoxes(distributeInfoBoxes(infoBoxes.map(box => ({...box, ...mapPositionToColAndRow(box.position)}))))\n","import React from 'react'\nimport {channel} from 'redux-saga'\nimport {put, call, all, take, takeLatest, takeEvery, select} from 'redux-saga/effects'\nimport {rest, notification} from 'tocco-app-extensions'\n\nimport InfoBoxSettings from '../../components/InfoBoxSettings/InfoBoxSettings'\nimport {mapColAndRowToPosition, prepareInfoBoxes} from '../../utils/positionUtils'\nimport * as actions from './actions'\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(\n (acc, box) => ({\n ...acc,\n [`${box.id}:POSITION`]: box.position\n }),\n {}\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(\n 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\n yield call(saveInfoBoxSettings, answerChannel)\n}\n\nfunction* saveInfoBoxSettings(answerChannel) {\n const infoBoxes = yield take(answerChannel)\n\n const preferences = infoBoxes.reduce(\n (acc, box) => ({\n ...acc,\n [`${box.id}:STATUS`]: box.folded ? 'folded' : 'open'\n }),\n {}\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 = [dashboardSagas]\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {appFactory, notification, actionEmitter} from 'tocco-app-extensions'\nimport {reducer as reducerUtil} from 'tocco-util'\n\nimport DashboardContainer from './components/Dashboard/DashboardContainer'\nimport reducers, {sagas} from './modules/reducers'\n\nconst packageName = 'dashboard'\n\nconst EXTERNAL_EVENTS = ['emitAction']\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(packageName, content, store, {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', 'entity-list', packageName]\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 PropTypes from 'prop-types'\nimport React from 'react'\nimport DashboardApp from 'tocco-dashboard/src/main'\nimport {Breadcrumbs} from 'tocco-ui'\n\nimport navigationStrategy from '../../../entities/utils/navigationStrategy'\nimport {StyledDashboardWrapper, StyledWrapper, StyledBreadcrumbs} from './StyledComponents'\n\nconst Dashboard = ({match, history, emitAction, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledWrapper>\n <StyledBreadcrumbs>\n <Breadcrumbs currentView={{display: msg('client.admin.dashboard'), title: 'Tocco'}} pathPrefix=\"/dashboard\" />\n </StyledBreadcrumbs>\n <StyledDashboardWrapper>\n <DashboardApp emitAction={emitAction} navigationStrategy={navigationStrategy(history, match)} />\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 React, {useMemo} from 'react'\nimport {useStore} from 'react-redux'\nimport {route} from 'tocco-util'\n\nconst Route = props => {\n const store = useStore()\n const Component = useMemo(() => {\n return route.loadRoute(store, {}, () => import('./route'), 'docs')\n }, [store])\n return <Component {...props} />\n}\n\nexport default Route\n","import _omit from 'lodash/omit'\nimport _omitBy from 'lodash/omitBy'\nimport React, {memo} from 'react'\nimport {ReactReduxContext} from 'react-redux'\nimport {route, js} from 'tocco-util'\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 React from 'react'\nimport {Typography} from 'tocco-ui'\n\nconst Settings = props => <Typography.H2>Settings</Typography.H2>\n\nSettings.propTypes = {}\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\n &:hover,\n &:focus {\n text-decoration: none; // nice2 reset\n }\n ${buttonStyle}\n`\n\nexport default StyledRouterLinkButton\n","import PropTypes from 'prop-types'\nimport React from 'react'\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 icon={icon} />}\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([design.look.BALL, design.look.FLAT, design.look.RAISED]),\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","export default __webpack_public_path__ + \"imgs/tocco_red.cb14a8eb6c3356bd83b114c13267546d.svg\";","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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {Link, Typography} from 'tocco-ui'\n\nimport ToccoLogo from '../../assets/tocco_red.svg'\nimport {StyledBlockWrapper, StyledFormattedMessageWrapper, StyledLogo} from './StyledComponents'\n\nconst AboutTocco = ({niceVersion, niceRevision, intl}) => {\n const msg = id => intl.formatMessage({id})\n const json = require('../../../package.json')\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 href={msg('client.admin.tocco.homepage')} neutral target=\"_blank\">\n <FormattedMessage id=\"client.admin.tocco.homepage\" />\n </Link>\n <br />\n <Link href={'mailto:' + msg('client.admin.tocco.email')} neutral target=\"_blank\">\n <FormattedMessage id=\"client.admin.tocco.email\" />\n </Link>\n <br />\n <Link href={'tel:' + msg('client.admin.tocco.phone')} neutral target=\"_blank\">\n <FormattedMessage id=\"client.admin.tocco.phone\" />\n </Link>\n </Typography.P>\n <StyledBlockWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.admin.about.versionLabel\" />\n :&nbsp; {niceVersion}\n <br />\n <FormattedMessage id=\"client.admin.about.revisionLabel\" />\n :&nbsp; {niceRevision}\n <br />\n <FormattedMessage id=\"client.admin.about.clientVersionLabel\" />\n :&nbsp; {json.version}\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 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, 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 PropTypes from 'prop-types'\nimport React from 'react'\n\nimport {StyledRedDot} from './StyledComponents'\n\nconst NotificationCenterRedDot = ({unreadNotificationKeys, onClick, innerRef}) =>\n unreadNotificationKeys.length > 0 && <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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 (\n popperElement.current &&\n !popperElement.current.contains(e.target) &&\n referenceElement.current &&\n !referenceElement.current.contains(e.target) &&\n redDotElement.current &&\n !redDotElement.current.contains(e.target)\n ) {\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 <>\n <StyledNotificationBellWrapper title=\"notifications\">\n <StyledBall onClick={() => setVisibility(!visible)} icon=\"bell\" ref={referenceElement} />\n <span ref={redDotElement}>\n <NotificationCenterRedDotContainer onClick={() => setVisibility(!visible)} />\n </span>\n </StyledNotificationBellWrapper>\n {ReactDOM.createPortal(\n <StyledPopper ref={popperElement} style={styles.popper} {...attributes.popper}>\n {visible && <notification.NotificationCenter navigationStrategy={navigationStrategy()} />}\n </StyledPopper>,\n document.body\n )}\n </>\n )\n}\n\nexport default NotificationCenterButton\n","import PropTypes from 'prop-types'\nimport React from 'react'\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'\nimport {MenuItem, ButtonMenu, BallMenu, StyledBall, scale, RouterLinkButton} from 'tocco-ui'\n\nimport {getDocsUrl} from '../../utils/docsUtils'\nimport AboutTocco from '../AboutTocco'\nimport NotificationCenterButton from './NotificationCenterButton'\nimport {StyledBackgroundCover, StyledHeader, StyledConfig, StyledBackgroundLogo} from './StyledComponents'\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 setMenuOpen\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 () => (\n <PasswordUpdateApp\n username={username}\n success={() => {\n removeModalComponent('passwordUpdateModal')\n info('success', 'client.login.passwordUpdate.success')\n }}\n />\n ),\n true\n )\n }\n\n const openTwoFactorConnector = () => {\n openModalComponent(\n 'passwordUpdateModal',\n 'client.actions.two-factor-connector.title',\n null,\n () => (\n <TwoFactorConnectorApp\n onSuccess={() => {\n removeModalComponent('passwordUpdateModal')\n }}\n />\n ),\n true\n )\n }\n\n const closeMenu = () => setMenuOpen(false)\n\n const msg = id => intl.formatMessage({id})\n\n return (\n <>\n <StyledBackgroundLogo runEnv={runEnv} />\n <StyledBackgroundCover />\n <StyledHeader>\n <StyledConfig>\n <RouterLinkButton to=\"/dashboard/reload\" onClick={closeMenu}>\n <FormattedMessage id=\"client.admin.dashboard\" />\n </RouterLinkButton>\n <ButtonMenu label={currentBusinessUnit.label} onOpen={handleBusinessUnitOpen}>\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 </ButtonMenu>\n <ButtonMenu label={username}>\n <MenuItem onClick={openPasswordUpdate}>\n <FormattedMessage id=\"client.admin.menu.passwordUpdate\" />\n </MenuItem>\n <MenuItem onClick={openTwoFactorConnector}>\n <FormattedMessage id=\"client.admin.menu.twoFactorConnector\" />\n </MenuItem>\n <MenuItem onClick={doLogout}>\n <FormattedMessage id=\"client.admin.menu.logout\" />\n </MenuItem>\n </ButtonMenu>\n <StyledBallMenuWrapper>\n <BallMenu\n buttonProps={{\n icon: 'question-circle',\n title: msg('client.admin.header.help')\n }}\n >\n {niceVersion && (\n <MenuItem\n onClick={() => {\n window.open(getDocsUrl(niceVersion), '_blank')\n }}\n >\n <FormattedMessage id=\"client.admin.menu.doc\" />\n </MenuItem>\n )}\n <MenuItem\n onClick={() => {\n window.open('/nice2/swagger', '_blank')\n }}\n >\n <FormattedMessage id=\"client.admin.menu.restDoc\" />\n </MenuItem>\n <MenuItem\n onClick={() => {\n openModalComponent('about', null, null, () => <AboutTocco />, true)\n }}\n >\n <FormattedMessage id=\"client.admin.menu.aboutToccoTitle\" />\n </MenuItem>\n </BallMenu>\n <NotificationCenterButton />\n </StyledBallMenuWrapper>\n </StyledConfig>\n </StyledHeader>\n </>\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 setMenuOpen: PropTypes.func.isRequired\n}\n\nexport default Header\n","export const getDocsUrl = niceVersion => {\n const subdomain = niceVersion\n .split('.')\n // always use two digits (01 vs 1) except for the first number\n .map((d, index) => (index === 0 ? d : d.padStart(2, '0')))\n .join('')\n return `https://${subdomain}.docs.tocco.ch/de/`\n}\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {notification} from 'tocco-app-extensions'\n\nimport {setMenuOpen} from '../../modules/navigation/actions'\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 setMenuOpen\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 {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\nexport const StyledExtendedSearchTitle = styled.div`\n && {\n ${declareFont()}\n font-weight: ${theme.fontWeight('bold')};\n margin-bottom: ${scale.space(-1.2)};\n margin-top: ${scale.space(0.6)};\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport {StyledMenuEntry} from './StyledComponents'\n\nconst MenuItem = ({item, menuTreePath = '', typeMapping}) => {\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 => (\n <MenuItem key={child.name} item={child} typeMapping={typeMapping} 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 )}\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","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {Typography} from 'tocco-ui'\n\nimport {prepareMenuTree} from '../../utils/navigationUtils'\nimport MenuItem from './MenuItem'\nimport {StyledExtendedSearchTitle, StyledMenuEntryWrapper} from './StyledComponents'\n\nconst MenuTree = ({items, extendedSearchItems, searchFilter, typeMapping, requireSearch}) => {\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 const actualExtendedSearchItems = extendedSearchItems\n ? prepareMenuTree(extendedSearchItems, searchFilter, typeMapping)\n : []\n\n const MenuItems = actualItems.map((item, index) => (\n <MenuItem key={index} item={item} typeMapping={typeMapping} menuTreePath={item.name} />\n ))\n\n const ExtendedSearchMenuItems = actualExtendedSearchItems.map((item, index) => (\n <MenuItem key={index} item={item} typeMapping={typeMapping} menuTreePath={item.name} />\n ))\n\n const showExtendedSearch = searchFilter && actualItems.length === 0\n const hasExtendedSearchResult = actualExtendedSearchItems.length > 0\n\n return (\n <StyledMenuEntryWrapper>\n {MenuItems}\n {showExtendedSearch && (\n <>\n <Typography.P>\n <FormattedMessage id=\"client.admin.navigation.noResults\" />\n </Typography.P>\n {hasExtendedSearchResult && (\n <>\n <StyledExtendedSearchTitle>\n <FormattedMessage id=\"client.admin.navigation.moreResults\" />\n </StyledExtendedSearchTitle>\n {ExtendedSearchMenuItems}\n </>\n )}\n </>\n )}\n </StyledMenuEntryWrapper>\n )\n}\n\nMenuTree.propTypes = {\n items: PropTypes.array,\n extendedSearchItems: 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 _get from 'lodash/get'\n\nimport {getMenuPreferencesKey} from '../../utils/navigationUtils'\n\nexport const menuIsOpenPrefrencesSelector = (state, {canCollapse, preferencesPrefix, menuTreePath}) =>\n canCollapse\n ? !_get(state.preferences.userPreferences, getMenuPreferencesKey(preferencesPrefix, menuTreePath), true)\n : undefined\n","import {Link} from 'react-router-dom'\nimport styled from 'styled-components'\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 text-decoration: none; // nice2 reset\n }\n\n &:focus {\n outline: none;\n text-decoration: none; // nice2 reset\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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {Icon} from 'tocco-ui'\n\nimport {getMenuPreferencesKey} from '../../../utils/navigationUtils'\nimport {StyledMenuEntry, StyledMenuIconWrapper, StyledTogglerIconWrapper} from './StyledComponents'\n\nconst MenuEntry = props => {\n const {item, isOpen, canCollapse, preferencesPrefix, menuTreePath, saveUserPreferences} = props\n const {icon, label} = item\n\n const toggleMenuEntryCollapsed = () =>\n saveUserPreferences({[getMenuPreferencesKey(preferencesPrefix, menuTreePath)]: isOpen})\n\n return (\n <StyledMenuEntry {...(canCollapse ? {onClick: toggleMenuEntryCollapsed} : {})}>\n <span>\n {icon && (\n <StyledMenuIconWrapper>\n <Icon icon={icon} />\n </StyledMenuIconWrapper>\n )}\n {label}\n </span>\n {canCollapse && (\n <StyledTogglerIconWrapper>\n <Icon icon={isOpen ? 'chevron-up' : 'chevron-down'} onClick={toggleMenuEntryCollapsed} />\n </StyledTogglerIconWrapper>\n )}\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {saveUserPreferences} from '../../../modules/preferences/actions'\nimport {menuIsOpenPrefrencesSelector} from '../../../modules/preferences/selectors'\nimport MenuEntry from './MenuEntry'\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 PropTypes from 'prop-types'\nimport React from 'react'\n\nimport {StyledMenuChildrenWrapper} from './StyledComponents'\n\nconst MenuChildrenWrapper = ({isOpen, canCollapse, children}) => (\n <StyledMenuChildrenWrapper isOpen={!canCollapse || isOpen}>\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {menuIsOpenPrefrencesSelector} from '../../../modules/preferences/selectors'\nimport MenuChildrenWrapper from './MenuChildrenWrapper'\n\nconst mapStateToProps = (state, props) => ({\n isOpen: menuIsOpenPrefrencesSelector(state, props)\n})\n\nexport default connect(mapStateToProps)(injectIntl(MenuChildrenWrapper))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledIconLink, StyledMenuLink, StyledMenuLinkWrapper} from './StyledComponents'\n\nconst EntityExplorerEntry = ({onClick, item}) => {\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}\n {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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {Icon} from 'tocco-ui'\n\nimport {StyledIconLink, StyledMenuLink, StyledMenuLinkWrapper} from './StyledComponents'\n\nconst ActionEntry = ({onClick, item}) => (\n <StyledMenuLinkWrapper>\n <StyledMenuLink data-quick-navigation={true} onClick={onClick} 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 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}) =>\n active &&\n css`\n 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 right: ${scale.space(0.6)};\n z-index: 1;\n display: flex;\n justify-content: flex-end;\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 PropTypes from 'prop-types'\nimport React, {useRef, useState, useEffect, useMemo, useCallback} from 'react'\nimport {SearchBox} from 'tocco-ui'\n\nimport {getCompleteMenuPreferences, menuTabs} from '../../utils/navigationUtils'\nimport MenuTree from '../MenuTree'\nimport {ActionEntry, EntityExplorerEntry, MenuEntry, MenuChildrenWrapper} from './menuType'\nimport {\n StyledTabsContainer,\n StyledNav,\n StyledMenuWrapper,\n StyledSearchBoxWrapper,\n StyledMenuButtonsWrapper,\n StyledMenuButton,\n StyledNavIconButton,\n StyledActiveTabLabel\n} from './StyledComponents'\n\nconst createMenuTypeMap = ({onClick, hasFilterApplied, preferencesPrefix}) => {\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 = useCallback(id => intl.formatMessage({id}), [intl])\n\n const menuTabsConfig = useMemo(\n () => ({\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 [msg, modulesMenuTree, completeMenuTree, settingsMenuTree, systemMenuTree]\n )\n\n const modulesTypeMap = useMemo(\n () =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied,\n preferencesPrefix: menuTabsConfig[menuTabs.MODULES].preferencesPrefix\n }),\n [onClick, hasFilterApplied, menuTabsConfig]\n )\n const settingsTypeMap = useMemo(\n () =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied,\n preferencesPrefix: menuTabsConfig[menuTabs.SETTINGS].preferencesPrefix\n }),\n [onClick, hasFilterApplied, menuTabsConfig]\n )\n const systemTypeMap = useMemo(\n () =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied\n }),\n [onClick, hasFilterApplied]\n )\n const completeTypeMap = useMemo(\n () =>\n createMenuTypeMap({\n onClick,\n hasFilterApplied\n }),\n [onClick, hasFilterApplied]\n )\n\n useEffect(() => {\n if (menuOpen) {\n if (!activeMenuTab) {\n setActiveMenuTab(menuTabs.MODULES)\n }\n inputEl.current.select()\n }\n }, [menuOpen, activeMenuTab, setActiveMenuTab])\n\n useEffect(() => {\n if (menuOpen) {\n if (inputEl.current) {\n // seems that without a slight delay the focus is NOT applied when the menu shortcuts are use\n setTimeout(() => {\n inputEl.current.focus()\n }, 10)\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 {items, preferencesPrefix} = 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 {items, preferencesPrefix} = 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)\n .map(key => menuTabs[key])\n .filter(menuTab => menuTabsConfig[menuTab].items?.length > 0)\n .map(menuTab => (\n <StyledNavIconButton\n key={menuTab}\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 return (\n <StyledNav ref={navigationEl} onKeyDown={onKeyDown} data-cy=\"admin-nav\">\n <StyledTabsContainer>\n <StyledActiveTabLabel>{menuTabsConfig[activeMenuTab]?.label}</StyledActiveTabLabel>\n <div>{MenuTabs}</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 && (\n <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\n {activeMenuTab === menuTabs.MODULES && (\n <MenuTree\n items={modulesMenuTree}\n searchFilter={filter}\n typeMapping={modulesTypeMap}\n extendedSearchItems={completeMenuTree}\n />\n )}\n {activeMenuTab === menuTabs.SETTINGS && (\n <MenuTree\n items={settingsMenuTree}\n searchFilter={filter}\n typeMapping={settingsTypeMap}\n extendedSearchItems={completeMenuTree}\n />\n )}\n {activeMenuTab === menuTabs.SYSTEM && (\n <MenuTree\n items={systemMenuTree}\n searchFilter={filter}\n typeMapping={systemTypeMap}\n extendedSearchItems={completeMenuTree}\n />\n )}\n {activeMenuTab === menuTabs.COMPLETE && (\n <MenuTree items={completeMenuTree} searchFilter={filter} typeMapping={completeTypeMap} requireSearch={true} />\n )}\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {setActiveMenuTab} from '../../modules/navigation/actions'\nimport {saveUserPreferences} from '../../modules/preferences/actions'\nimport Navigation from './Navigation'\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","import SlideMenu from 'react-burger-menu/lib/menus/slide'\nimport styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nconst calcViewportHeight = () => {\n const vh = window.innerHeight * 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`\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: '12px',\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 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 bmItemList: {\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 {createBrowserHistory} from 'history'\nimport PropTypes from 'prop-types'\nimport React, {useEffect, useState} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {Redirect, Route, Router, Switch} from 'react-router-dom'\nimport {withTheme} from 'styled-components'\nimport {notification} from 'tocco-app-extensions'\nimport {BurgerButton, GlobalStyles, LoadMask} from 'tocco-ui'\nimport {viewPersistor} from 'tocco-util'\n\nimport DashboardRoute from '../../routes/dashboard'\nimport DocsRoute from '../../routes/docs'\nimport EntitiesRoute from '../../routes/entities'\nimport Settings from '../../routes/settings'\nimport ErrorView from '../ErrorView'\nimport Header from '../Header'\nimport Navigation from '../Navigation'\nimport navigationStrategy from './../../routes/entities/utils/navigationStrategy'\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 adminAllowed\n}) => {\n const [history, setHistory] = useState(null)\n\n // only on mount\n useEffect(() => {\n initializeHistory()\n initializeNavigation()\n loadPrincipal()\n loadSettingsAndPreferences()\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\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 const handleClick = () => {\n setMenuOpen(false)\n viewPersistor.clearPersistedViews()\n }\n\n const adminAllowedContent = adminAllowed && (\n <>\n <StyledMenu\n isOpen={menuOpen}\n onStateChange={isMenuOpen}\n customCrossIcon={false}\n customBurgerIcon={<BurgerButton isOpen={menuOpen} />}\n styles={burgerMenuStyles}\n >\n <Navigation onClick={handleClick} />\n </StyledMenu>\n <StyledContent>\n <Switch>\n <Route exact path=\"/\" 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\n const adminForbiddenContent = adminAllowed === false && (\n <StyledContent>\n <ErrorView\n title={<FormattedMessage id={'client.admin.error.no_roles.title'} />}\n message={<FormattedMessage id={'client.admin.error.no_roles.message'} />}\n />\n </StyledContent>\n )\n\n return (\n <LoadMask required={[history !== null]}>\n <Router history={history || {}}>\n <GlobalStyles />\n <notification.Notifications navigationStrategy={navigationStrategy()} />\n <StyledWrapper>\n <Header />\n {adminAllowedContent || adminForbiddenContent}\n </StyledWrapper>\n </Router>\n </LoadMask>\n )\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {notification} from 'tocco-app-extensions'\n\nimport {initializeNavigation, setMenuOpen} from '../../modules/navigation/actions'\nimport {loadSettingsAndPreferences} from '../../modules/preferences/actions'\nimport {loadPrincipal} from '../../modules/session/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 PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {Helmet} from 'react-helmet'\nimport {LoadMask} from 'tocco-ui'\n\nimport Login from '../../components/Login'\nimport Admin from '../Admin'\n\nconst LoginGuard = ({doSessionCheck, loggedIn}) => {\n useEffect(() => {\n doSessionCheck()\n }, [doSessionCheck])\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>{!loggedIn ? <Login /> : <Admin />}</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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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 PropTypes from 'prop-types'\nimport React from 'react'\nimport {injectIntl} from 'react-intl'\nimport {AdminLink as StyledLink} from 'tocco-ui'\nimport {queryString as queryStringUtil} from 'tocco-util'\n\nimport {goBack} from '../../../utils/routing'\n\nconst DetailLinkRelativeWithoutIntl = ({entityKey, entityModel, children, relation, intl}) => {\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 >\n {children}\n </StyledLink>\n )\n}\n\nconst DetailLinkRelative = injectIntl(DetailLinkRelativeWithoutIntl)\n\nexport const DetailLink = ({entityName, entityKey, children}) => (\n <StyledLink to={`/e/${entityName}/${entityKey}`} target=\"_blank\">\n {children}\n </StyledLink>\n)\n\nexport const ListLink = ({entityName, entityKeys, children}) => {\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 = ({entityName, entityKeys, children}) => {\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'\nimport QRCodeC from 'qrcode.react'\nimport React from '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 _isObject from 'lodash/isObject'\nimport _mapValues from 'lodash/mapValues'\nimport queryStringUtil from 'query-string'\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","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {appFactory, errorLogging, externalEvents} from 'tocco-app-extensions'\nimport {consoleLogger, env} from 'tocco-util'\n\nimport LoginContainer from './containers/LoginContainer'\nimport * as passwordUpdate from './modules/passwordUpdate/dialog/actions'\nimport loginReducers, {sagas} from './modules/reducers'\n\nconst packageName = 'password-update'\n\nconst EXTERNAL_EVENTS_PASSWORD_UPDATE = ['success', 'resize']\n\nexport const 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 = [passwordUpdate.setUsernameOrPk(input.username), passwordUpdate.setForcedUpdate(forcedUpdate)]\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\n if (input.backendUrl) {\n env.setBackendUrl(input.backendUrl)\n }\n\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n\n return appFactory.createApp(packageName, content, store, {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n })\n}\n\nexport const PasswordUpdateApp = props => {\n const {component} = appFactory.useApp({\n initApp: initPasswordUpdateApp,\n props,\n packageName,\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 backendUrl: PropTypes.string,\n ...EXTERNAL_EVENTS_PASSWORD_UPDATE.reduce(\n (propTypes, event) => ({\n ...propTypes,\n [event]: PropTypes.func\n }),\n {}\n )\n}\n","import styled from 'styled-components'\nimport {StyledInputCss, StyledEditableWrapperCss, Button, StyledButton, StyledButtonGroup, theme, scale} 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 && {\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: 0.7rem;\n padding-bottom: 0.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, {useCallback, useEffect, useRef, useState} from 'react'\nimport ReCAPTCHA from 'react-google-recaptcha'\nimport {FormattedMessage} from 'react-intl'\nimport {SignalList, StatedValue, Typography} from 'tocco-ui'\nimport {react} from 'tocco-util'\n\nimport {Pages} from '../../types/Pages'\nimport {\n StyledLoginButton,\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton\n} from '../StyledLoginForm'\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 const prevRecaptchaActivated = react.usePrevious(recaptchaActivated)\n\n const handleSubmit = useCallback(\n 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 [login, username, password, recaptchaActivated]\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 useEffect(() => {\n if (recaptchaActivated && !prevRecaptchaActivated) {\n handleSubmit()\n }\n }, [recaptchaActivated, prevRecaptchaActivated, handleSubmit])\n\n const passwordFocus = !!username\n const usernameFocus = !passwordFocus\n\n return (\n <StyledLoginFormWrapper>\n {showTitle && (\n <React.Fragment>\n <Typography.H5>\n <FormattedMessage id=\"client.login.form.title\" />\n </Typography.H5>\n <Typography.P>\n <FormattedMessage id=\"client.login.form.introduction\" />\n </Typography.P>\n </React.Fragment>\n )}\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 {message && message.text && (\n <SignalList.List>\n <SignalList.Item condition={message.negative ? 'danger' : 'base'} label={message.text} />\n </SignalList.List>\n )}\n {captchaKey && recaptchaActivated && (\n <ReCAPTCHA ref={recaptchaRef} badge=\"bottomright\" size=\"invisible\" sitekey={captchaKey} 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}\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","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport LoginForm from '../components/LoginForm'\nimport {login} from '../modules/actions'\nimport {changePage, setUsername, setPassword} from '../modules/login/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 {PasswordRequest} from './PasswordRequest'\n\nexport default PasswordRequest\n","import PropTypes from 'prop-types'\nimport React, {useState} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {StatedValue, Typography} from 'tocco-ui'\n\nimport {Pages} from '../../types/Pages'\nimport {\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton,\n StyledLoginButton\n} from '../StyledLoginForm'\n\nexport const PasswordRequest = ({username, requestPassword, intl, showTitle, pending, changePage}) => {\n const [userName, setUserName] = useState(username || '')\n\n const handleSubmit = e => {\n e.preventDefault()\n requestPassword(userName)\n }\n\n const handleUsernameChange = e => {\n setUserName(e.target.value)\n }\n\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledLoginFormWrapper>\n {showTitle && (\n <Typography.H5>\n <FormattedMessage id=\"client.login.passwordRequest.title\" />\n </Typography.H5>\n )}\n <Typography.P>\n <FormattedMessage id=\"client.login.passwordRequest.introduction\" />\n </Typography.P>\n <form onSubmit={handleSubmit}>\n <StatedValue hasValue={Boolean(userName)} id=\"login-username\" label={msg('client.login.form.userPlaceholder')}>\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n name=\"user\"\n onChange={handleUsernameChange}\n required\n type=\"text\"\n value={userName}\n data-cy=\"password-request_input\"\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n <StyledLoginButton\n look=\"raised\"\n disabled={!userName || pending}\n ink=\"primary\"\n label={msg('client.login.passwordRequest.button')}\n pending={pending}\n type=\"submit\"\n data-cy=\"password-request_submit-button\"\n />\n <StyledTransparentButton\n disabled={pending}\n label={msg('client.login.passwordRequest.abortButton')}\n name=\"abort\"\n onClick={() => changePage(Pages.LOGIN_FORM)}\n data-cy=\"password-request_abort-button\"\n />\n </form>\n </StyledLoginFormWrapper>\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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","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 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 <SignalList.Item condition={condition} key={index} label={message} />\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","import styled from 'styled-components'\nimport {StyledInputCss, StyledEditableWrapperCss} 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, {useRef, useEffect} from 'react'\nimport ReCAPTCHA from 'react-google-recaptcha'\nimport {FormattedMessage} from 'react-intl'\nimport styled from 'styled-components'\nimport {LoadMask, SignalList, Typography} from 'tocco-ui'\n\nimport {StyledLoginButton} from '../../StyledLoginForm'\nimport FailureMessage from '../FailureMessage'\nimport ValidationRules from '../ValidationRules'\nimport PasswordInput from './PasswordInput'\nimport StyledPasswordUpdateDialog from './StyledPasswordUpdateDialog'\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 }, [fetchValidationRules])\n\n useEffect(() => {\n if (validationRules) {\n initialized()\n }\n }, [validationRules, initialized])\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) || password.passwordUpdatePending\n const newPasswordRepeatReadOnly =\n !password.newPassword ||\n password.passwordUpdatePending ||\n (password.newPasswordValidationErrors && Object.keys(password.newPasswordValidationErrors).length > 0)\n\n return (\n <StyledPasswordUpdateDialog>\n {showTitle && (\n <Typography.H5>\n <FormattedMessage id=\"client.login.passwordUpdate.title\" />\n </Typography.H5>\n )}\n {forcedUpdate && (\n <Typography.P>\n <FormattedMessage id=\"client.login.passwordUpdate.introduction\" />\n </Typography.P>\n )}\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 &&\n password.passwordUpdateErrorCode === 'INVALID_CREDENTIALS' && {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 {password.newPasswordRepeat && 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 && (\n <ReCAPTCHA ref={recaptchaRef} badge=\"bottomright\" size=\"invisible\" sitekey={captchaKey} hl={intl.locale} />\n )}\n </form>\n </StyledPasswordUpdateDialog>\n )\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","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport PasswordUpdateDialog from '../components/passwordUpdate/PasswordUpdateDialog'\nimport {initialized} from '../modules/passwordUpdate/actions'\nimport {\n updateOldPassword,\n updateNewPassword,\n updateNewPasswordRepeat,\n 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","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport TwoFactorConnectorApp from 'tocco-two-factor-connector/src/main'\nimport {Typography} from 'tocco-ui'\n\nimport {Pages} from '../../types/Pages'\n\nconst TwoFactorConnectorForm = ({username, password, secret, showTitle, changePage}) => {\n return (\n <div>\n {showTitle && (\n <Typography.H5>\n <FormattedMessage id=\"client.login.form.title\" />\n </Typography.H5>\n )}\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}\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 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: 0.7rem;\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useLayoutEffect, useRef} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {StatedValue, Typography, EditableValue} from 'tocco-ui'\n\nimport {StyledLoginButton, StyledLoginFormInputWrapper} from '../StyledLoginForm'\nimport {StyledTwoStepLogin} from './StyledTwoStepLoginForm'\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 (\n <StyledTwoStepLogin>\n {showTitle && (\n <Typography.H5>\n <FormattedMessage id=\"client.login.form.title\" />\n </Typography.H5>\n )}\n <form onSubmit={handleSubmit} ref={formEl}>\n <Typography.P>\n <FormattedMessage id=\"client.login.twoStepLogin.introduction\" />\n </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}\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","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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, {useEffect} from 'react'\nimport {createGlobalStyle} from 'styled-components'\n\nimport LoginFormContainer from '../../containers/LoginFormContainer'\nimport PasswordRequestContainer from '../../containers/PasswordRequestContainer'\nimport PasswordUpdateContainer from '../../containers/PasswordUpdateDialogContainer'\nimport TwoFactorConnectorContainer from '../../containers/TwoFactorConnectorContainer'\nimport TwoStepLoginContainer from '../../containers/TwoStepLoginContainer'\nimport {Pages} from '../../types/Pages'\n\nconst GlobalRecaptchaBadgeStyle = createGlobalStyle`\n .grecaptcha-badge {\n z-index: 9999999;\n opacity: .8;\n }\n`\n\nconst Login = ({initialize, showTitle, currentPage}) => {\n useEffect(() => {\n initialize()\n }, [initialize])\n\n return (\n <>\n <GlobalRecaptchaBadgeStyle />\n {(() => {\n switch (currentPage) {\n case Pages.PASSWORD_UPDATE:\n return <PasswordUpdateContainer showTitle={showTitle} />\n case Pages.PASSWORD_REQUEST:\n return <PasswordRequestContainer showTitle={showTitle} />\n case Pages.TWOSTEPLOGIN:\n return <TwoStepLoginContainer showTitle={showTitle} />\n case Pages.TWOSTEPLOGIN_ACTIVATION:\n return <TwoFactorConnectorContainer />\n default:\n return <LoginFormContainer showTitle={showTitle} />\n }\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 {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\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","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","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 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 INITIALIZED = 'INITIALIZED'\n\nexport const initialized = () => ({\n type: INITIALIZED\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 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","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 {reducer as reducerUtil} from 'tocco-util'\n\nimport {Pages} from './../../types/Pages'\nimport * as actions from './actions'\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","export const SET_MESSAGE = 'Login/SET_MESSAGE'\nexport const SET_PENDING = 'Login/SET_PENDING'\nexport const ACTIVATE_RECAPTCHA = 'loginForm/ACTIVATE_RECAPTCHA'\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 {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 * 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 {put, call, select, takeLatest, all} from 'redux-saga/effects'\nimport {rest} from 'tocco-app-extensions'\n\nimport {Pages} from '../../types/Pages'\nimport {changePage, setUsername} from '../login/actions'\nimport {setMessage, setPending} from '../loginForm/actions'\nimport * as actions from './actions'\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 {fork, all} from 'redux-saga/effects'\n\nimport reducer from './reducer'\nimport moduleSagas from './sagas'\n\nexport function* sagas() {\n yield all([fork(moduleSagas)])\n}\n\nexport default reducer\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","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 => initialState\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 reducer from './reducer'\nimport sagas from './sagas'\n\nexport {updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword}\n\nexport {sagas}\n\nexport default reducer\n","import {takeLatest, put, select, call, all} from 'redux-saga/effects'\nimport {externalEvents, rest} from 'tocco-app-extensions'\nimport {consoleLogger, request, cache, intl} from 'tocco-util'\n\nimport {Pages} from '../types/Pages'\nimport * as actions from './actions'\nimport * as loginActions from './login/actions'\nimport {changePage, setPassword} from './login/actions'\nimport {setMessage, setPending, activateRecaptcha} from './loginForm/actions'\nimport {setUsernameOrPk, setForcedUpdate} from './passwordUpdate/dialog/actions'\nimport {updateOldPassword} from './passwordUpdate/password/actions'\nimport {setSecret} from './twoStepLogin/actions'\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\n .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])}`)\n .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([takeLatest(actions.LOGIN, loginSaga), takeLatest(actions.INITIALIZE, initialize)])\n}\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 (\n (min === undefined || min === null || specificCharsCount >= min) &&\n (max === undefined || max === null || specificCharsCount <= max)\n )\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","import {takeLatest, call, select, put, all} from 'redux-saga/effects'\nimport {externalEvents, rest} from 'tocco-app-extensions'\n\nimport {setPassword} from '../../login/actions'\nimport {loginSaga} from '../../sagas'\nimport * as actions from './actions'\nimport {isEmptyObject, validationMessagesToErrorMap} from './utils'\nimport localValidate from './validate'\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(\n externalEvents.fireExternalEvent('success', {\n newPassword: data.newPassword\n })\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 {put, takeLatest, all} from 'redux-saga/effects'\nimport {externalEvents} from 'tocco-app-extensions'\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([takeLatest(actions.INITIALIZED, resizeWatcher)])\n}\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 reducer from './reducer'\nimport sagas from './sagas'\n\nexport {fetchValidationRules}\n\nexport {sagas}\n\nexport default reducer\n","import {takeLatest, call, put, select, all} from 'redux-saga/effects'\nimport {rest} from 'tocco-app-extensions'\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([takeLatest(actions.FETCH_VALIDATION_RULES, fetchValidationRules)])\n}\n","import dialog from './dialog'\nimport password, {sagas as passwordSagas} from './password'\nimport mainSagas from './sagas'\nimport validationRules, {sagas as validationRulesSagas} from './validationRules'\n\nexport default {\n dialog,\n password,\n validationRules\n}\n\nexport const sagas = [mainSagas, passwordSagas, validationRulesSagas]\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 {takeLatest, call, put, all} from 'redux-saga/effects'\n\nimport {setPending} from '../loginForm/actions'\nimport {loginSaga} from '../sagas'\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([takeLatest(actions.TWOSTEPLOGIN, twoStepSaga)])\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport reducer from './reducer'\nimport moduleSagas from './sagas'\n\nexport function* sagas() {\n yield all([fork(moduleSagas)])\n}\n\nexport default reducer\n","import {combineReducers} from 'redux'\n\nimport login from './login'\nimport loginForm from './loginForm'\nimport passwordRequest, {sagas as passwordRequestSagas} from './passwordRequest'\nimport passwordUpdateReducers, {sagas as passwordUpdateSagas} from './passwordUpdate/reducers'\nimport mainSagas from './sagas'\nimport twoStepLogin, {sagas as twoStepLoginSagas} from './twoStepLogin'\n\nexport default {\n login,\n loginForm,\n passwordRequest,\n passwordUpdate: combineReducers(passwordUpdateReducers),\n twoStepLogin\n}\n\nexport const sagas = [mainSagas, passwordRequestSagas, twoStepLoginSagas, ...passwordUpdateSagas]\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","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 {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}`], []).join(',')\n}\n","import _get from 'lodash/get'\nimport styled from 'styled-components'\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 =>\n declareInteractionColors(\n generateInteractionColors(props, {\n bg: props.primaryColor,\n fg: props.secondaryColor || `${_get(props.theme, 'colors.paper')}, ${_get(props.theme, 'colors.text')}`\n })\n )}\n span {\n margin-left: 0.5em;\n padding: 0.9rem 0;\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Icon} from 'tocco-ui'\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 PropTypes from 'prop-types'\nimport React from 'react'\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 (\n <StyledButtonContainer>\n {this.props.providers.map((provider, idx) => (\n <ProviderButton\n key={idx}\n provider={provider}\n loginEndpoint={this.props.loginEndpoint}\n loginCompleted={this.props.loginCompleted}\n />\n ))}\n </StyledButtonContainer>\n )\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","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 {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 {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 _reduce from 'lodash/reduce'\n\nexport const transformProviderEntities = response =>\n response.data.map(provider =>\n _reduce(\n provider.paths,\n (result, value, key) => {\n return {...result, [key]: value.value}\n },\n {}\n )\n )\n","import {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {externalEvents, rest} from 'tocco-app-extensions'\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([takeLatest(actions.LOAD_PROVIDERS, loadProviders), takeLatest(actions.LOGIN_COMPLETED, loginCompleted)])\n}\n","import ssoLogin from './reducer'\nimport rootSaga from './sagas'\n\nexport default {\n ssoLogin\n}\n\nexport const sagas = [rootSaga]\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {appFactory, cache, externalEvents} from 'tocco-app-extensions'\nimport {reducer as reducerUtil} from 'tocco-util'\n\nimport LoginBoxContainer from './containers/LoginBoxContainer'\nimport reducers, {sagas} from './modules'\n\nconst packageName = 'sso-login'\n\nconst EXTERNAL_EVENTS = ['loginCompleted']\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(packageName, content, store, {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\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"],"sourceRoot":""}