tocco-admin 0.5.22 → 0.5.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +7 -0
- package/dist/chunk-0.01f4d23e7da6b640beb4.js +2 -0
- package/dist/chunk-0.01f4d23e7da6b640beb4.js.map +1 -0
- package/dist/{chunk-230.640bf63742a9b86e250e.js → chunk-230.65e7e9a6a1f335412b65.js} +2 -2
- package/dist/{chunk-230.640bf63742a9b86e250e.js.map → chunk-230.65e7e9a6a1f335412b65.js.map} +1 -1
- package/dist/chunk-82.47c144da815d80da022f.js +2 -0
- package/dist/chunk-82.47c144da815d80da022f.js.map +1 -0
- package/dist/{chunk-actions.2622a002bf6809472bfc.js → chunk-actions.7858b437dd43bb25e76e.js} +2 -2
- package/dist/chunk-actions.7858b437dd43bb25e76e.js.map +1 -0
- package/dist/chunk-docs-actions.784964ffa1b642837352.js +2 -0
- package/dist/chunk-docs-actions.784964ffa1b642837352.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-82.598786f2192ebfafd9e8.js +0 -2
- package/dist/chunk-82.598786f2192ebfafd9e8.js.map +0 -1
- package/dist/chunk-995.0840eb32bdc26e55da8f.js +0 -2
- package/dist/chunk-995.0840eb32bdc26e55da8f.js.map +0 -1
- package/dist/chunk-actions.2622a002bf6809472bfc.js.map +0 -1
- package/dist/chunk-docs-actions.fa7aa069fda3106ab6c8.js +0 -2
- package/dist/chunk-docs-actions.fa7aa069fda3106ab6c8.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["webpack:///./packages/sso-login/src/utils/providers.js","webpack:///./packages/sso-login/src/modules/sagas.js","webpack:///./packages/sso-login/src/modules/actions.js","webpack:///./packages/sso-login/src/modules/reducer.js","webpack:///./packages/sso-login/src/modules/index.js","webpack:///./packages/sso-login/src/utils/loginWindow.js","webpack:///./packages/sso-login/src/utils/popUp.js","webpack:///./packages/sso-login/src/components/ProviderButton/StyledProviderButton.js","webpack:///./packages/sso-login/src/components/ProviderButton/ProviderButton.js","webpack:///./packages/sso-login/src/components/LoginBox/LoginBox.js","webpack:///./packages/sso-login/src/components/LoginBox/index.js","webpack:///./packages/sso-login/src/containers/LoginBoxContainer.js","webpack:///./packages/sso-login/src/main.js","webpack:///./packages/admin/src/components/Login/StyledComponents.js","webpack:///./packages/admin/src/components/Login/Login.js","webpack:///./packages/admin/src/components/Login/LoginContainer.js","webpack:///./packages/tocco-ui/src/BurgerButton/BurgerButton.js","webpack:///./packages/admin/src/components/MenuTree/StyledComponents.js","webpack:///./packages/admin/src/components/MenuTree/MenuTree.js","webpack:///./packages/admin/src/components/MenuTree/index.js","webpack:///./packages/admin/src/components/Navigation/StyledComponents.js","webpack:///./packages/admin/src/components/Navigation/Navigation.js","webpack:///./packages/admin/src/components/Navigation/NavigationContainer.js","webpack:///./packages/admin/src/components/Navigation/index.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/StyledComponents.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/Dashboard.js","webpack:///./packages/admin/src/routes/dashboard/components/Dashboard/index.js","webpack:///./packages/tocco-util/src/route/route.js","webpack:///./packages/tocco-util/src/route/Router.js","webpack:///./packages/tocco-util/src/route/index.js","webpack:///./packages/tocco-util/src/route/asyncRoute.js","webpack:///./packages/tocco-util/src/route/input.js","webpack:///./packages/admin/src/routes/entities/index.js","webpack:///./packages/admin/src/routes/docs/index.js","webpack:///./packages/admin/src/routes/settings/components/Settings/Settings.js","webpack:///./packages/admin/src/routes/settings/components/Settings/index.js","webpack:///./packages/admin/src/components/Header/StyledComponents.js","webpack:///./packages/admin/src/components/Header/NotificationCenterRedDot.js","webpack:///./packages/admin/src/components/Header/NotificationCenterRedDotContainer.js","webpack:///./packages/admin/src/components/Header/NotificationCenterButton.js","webpack:///./packages/admin/src/components/AboutTocco/StyledComponents.js","webpack:///./packages/admin/src/components/AboutTocco/AboutTocco.js","webpack:///./packages/admin/src/components/AboutTocco/AboutToccoContainer.js","webpack:///./packages/admin/src/components/Header/Header.js","webpack:///./packages/admin/src/components/Header/HeaderContainer.js","webpack:///./packages/admin/src/components/Admin/StyledComponents.js","webpack:///./packages/admin/src/components/Admin/Admin.js","webpack:///./packages/admin/src/components/Admin/AdminContainer.js","webpack:///./packages/admin/src/components/LoginGuard/LoginGuard.js","webpack:///./packages/admin/src/components/LoginGuard/LoginGuardContainer.js","webpack:///./packages/admin/src/routes/entities/utils/navigationStrategy.js","webpack:///./packages/admin/src/utils/routing.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/actions.js","webpack:///./packages/login/src/modules/passwordRequest/actions.js","webpack:///./packages/login/src/modules/login/actions.js","webpack:///./packages/login/src/types/Pages.js","webpack:///./packages/login/src/components/StyledLoginForm.js","webpack:///./packages/login/src/components/LoginForm/LoginForm.js","webpack:///./packages/login/src/components/LoginForm/index.js","webpack:///./packages/login/src/modules/actions.js","webpack:///./packages/login/src/containers/LoginFormContainer.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordInput.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordInput.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/StyledPasswordUpdateDialog.js","webpack:///./packages/login/src/components/passwordUpdate/ValidationRules/ValidationRules.js","webpack:///./packages/login/src/components/passwordUpdate/ValidationRules/index.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/messages.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/FailureMessage.js","webpack:///./packages/login/src/components/passwordUpdate/FailureMessage/index.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/PasswordUpdateDialog.js","webpack:///./packages/login/src/components/passwordUpdate/PasswordUpdateDialog/index.js","webpack:///./packages/login/src/modules/passwordUpdate/actions.js","webpack:///./packages/login/src/modules/passwordUpdate/password/actions.js","webpack:///./packages/login/src/containers/PasswordUpdateDialogContainer.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/actions.js","webpack:///./packages/login/src/components/PasswordRequest/PasswordRequest.js","webpack:///./packages/login/src/components/PasswordRequest/index.js","webpack:///./packages/login/src/containers/PasswordRequestContainer.js","webpack:///./packages/login/src/components/TwoStepLoginForm/StyledTwoStepLoginForm.js","webpack:///./packages/login/src/components/TwoStepLoginForm/TwoStepLoginForm.js","webpack:///./packages/login/src/components/TwoStepLoginForm/index.js","webpack:///./packages/login/src/modules/twoStepLogin/actions.js","webpack:///./packages/login/src/containers/TwoStepLoginContainer.js","webpack:///./packages/login/src/components/TwoFactorConnectorForm/TwoFactorConnectorForm.js","webpack:///./packages/login/src/components/TwoFactorConnectorForm/index.js","webpack:///./packages/login/src/containers/TwoFactorConnectorContainer.js","webpack:///./packages/login/src/components/Login/Login.js","webpack:///./packages/login/src/components/Login/index.js","webpack:///./packages/login/src/containers/LoginContainer.js","webpack:///./packages/login/src/modules/passwordUpdate/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/password/utils.js","webpack:///./packages/login/src/modules/passwordUpdate/password/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/password/index.js","webpack:///./packages/login/src/modules/passwordUpdate/password/validate.js","webpack:///./packages/login/src/modules/loginForm/actions.js","webpack:///./packages/login/src/modules/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/password/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/dialog/index.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/reducer.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/index.js","webpack:///./packages/login/src/modules/passwordUpdate/validationRules/sagas.js","webpack:///./packages/login/src/modules/passwordUpdate/reducers.js","webpack:///./packages/login/src/modules/login/reducer.js","webpack:///./packages/login/src/modules/login/index.js","webpack:///./packages/login/src/modules/loginForm/reducer.js","webpack:///./packages/login/src/modules/loginForm/index.js","webpack:///./packages/login/src/modules/twoStepLogin/sagas.js","webpack:///./packages/login/src/modules/twoStepLogin/reducer.js","webpack:///./packages/login/src/modules/twoStepLogin/index.js","webpack:///./packages/login/src/modules/passwordRequest/sagas.js","webpack:///./packages/login/src/modules/passwordRequest/reducer.js","webpack:///./packages/login/src/modules/passwordRequest/index.js","webpack:///./packages/login/src/modules/reducers.js","webpack:///./packages/login/src/main.js","webpack:///./packages/tocco-ui/src/AdminLink/linkStyle.js","webpack:///./packages/tocco-ui/src/AdminLink/StyledLink.js","webpack:///./packages/tocco-ui/src/ButtonGroup/ButtonGroup.js","webpack:///./packages/tocco-ui/src/ButtonGroup/StyledButtonGroup.js","webpack:///./packages/tocco-ui/src/DatePicker/GlobalDatePickerStyles.js","webpack:///./packages/tocco-ui/src/Select/ClearIndicator.js","webpack:///./packages/tocco-ui/src/Select/DropdownIndicator.js","webpack:///./packages/tocco-ui/src/Select/IndicatorsContainer.js","webpack:///./packages/tocco-ui/src/Select/LoadingIndicator.js","webpack:///./packages/tocco-ui/src/Select/Menu.js","webpack:///./packages/tocco-ui/src/Select/MenuList.js","webpack:///./packages/tocco-ui/src/Select/ClickableWrapper.js","webpack:///./packages/tocco-ui/src/Select/MultiValueLabel.js","webpack:///./packages/tocco-ui/src/Select/SingleValue.js","webpack:///./packages/tocco-ui/src/Select/Select.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/SingleSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/MultiSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledStringEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StringEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledTextEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/TextEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledDateAbstract.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DateAbstract.js","webpack:///./packages/tocco-ui/src/EditableValue/utils.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DateEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DateTimeEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledTimeEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/TimeEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/BoolEdit.js","webpack:///./packages/tocco-ui/src/Upload/StyledView.js","webpack:///./packages/tocco-ui/src/Upload/View.js","webpack:///./packages/tocco-ui/src/Upload/helpers.js","webpack:///./packages/tocco-ui/src/Upload/StyledUploadProgress.js","webpack:///./packages/tocco-ui/src/Upload/UploadProgress.js","webpack:///./packages/tocco-ui/src/Upload/StyledUploadInput.js","webpack:///./packages/tocco-ui/src/Upload/SyledUploadInput.js","webpack:///./packages/tocco-ui/src/Upload/UploadInput.js","webpack:///./packages/tocco-ui/src/Upload/Upload.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/Document.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/HtmlEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/RemoteSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/MultiRemoteSelect.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/SearchFilterEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledUrlEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/UrlEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledPhoneEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/PhoneEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledDurationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/DurationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledNumberEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/NumberEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/IntegerEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/StyledLocationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditors/LocationEdit.js","webpack:///./packages/tocco-ui/src/EditableValue/typeEditorFactory.js","webpack:///./packages/tocco-ui/src/EditableValue/EditableValue.js","webpack:///./packages/tocco-ui/src/EditableValue/StyledEditableValue.js","webpack:///./packages/tocco-ui/src/Menu/BallMenu.js","webpack:///./packages/tocco-ui/src/Menu/ButtonMenu.js","webpack:///./packages/tocco-ui/src/Menu/Menu.js","webpack:///./packages/tocco-ui/src/Menu/MenuItem.js","webpack:///./packages/tocco-ui/src/Menu/StyledComponents.js","webpack:///./packages/tocco-ui/src/QRCode/QRCode.js","webpack:///./packages/tocco-ui/src/SearchBox/StyledSearchBox.js","webpack:///./packages/tocco-ui/src/SearchBox/SearchBox.js","webpack:///./packages/tocco-ui/src/SearchBox/index.js","webpack:///./packages/tocco-ui/src/SignalList/StyledSignalListItem.js","webpack:///./packages/tocco-ui/src/SignalList/StyledSignalList.js","webpack:///./packages/tocco-ui/src/SignalList/SignalList.js","webpack:///./packages/tocco-ui/src/SignalList/SignalListItem.js","webpack:///./packages/tocco-ui/src/SignalList/index.js","webpack:///./packages/tocco-ui/src/StatedValue/ErrorList.js","webpack:///./packages/tocco-ui/src/StatedValue/StatedValue.js","webpack:///./packages/tocco-ui/src/StatedValue/StyledStatedValue.js","webpack:///./packages/tocco-ui/src/utilStyles/colorMap.js","webpack:///./packages/tocco-util/src/queryString/queryString.js","webpack:///./packages/tocco-util/src/queryString/index.js","webpack:///./packages/tocco-util/src/viewPersistor/viewPersistor.js","webpack:///./packages/tocco-util/src/viewPersistor/index.js","webpack:///./packages/two-factor-connector/src/modules/actions.js","webpack:///./packages/two-factor-connector/src/modules/sagas.js","webpack:///./packages/two-factor-connector/src/modules/reducer.js","webpack:///./packages/two-factor-connector/src/modules/index.js","webpack:///./packages/two-factor-connector/src/components/GlobalStyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Start/Start.js","webpack:///./packages/two-factor-connector/src/components/Start/StartContainer.js","webpack:///./packages/two-factor-connector/src/components/Start/index.js","webpack:///./packages/two-factor-connector/src/components/Secret/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Secret/Secret.js","webpack:///./packages/two-factor-connector/src/components/Secret/SecretContainer.js","webpack:///./packages/two-factor-connector/src/components/Secret/index.js","webpack:///./packages/two-factor-connector/src/components/Verification/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Verification/Verification.js","webpack:///./packages/two-factor-connector/src/components/Verification/VerificationContainer.js","webpack:///./packages/two-factor-connector/src/components/Verification/index.js","webpack:///./packages/two-factor-connector/src/components/Result/StyledComponents.js","webpack:///./packages/two-factor-connector/src/components/Result/Result.js","webpack:///./packages/two-factor-connector/src/components/Result/ResultContainer.js","webpack:///./packages/two-factor-connector/src/components/Result/index.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnector.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/TwoFactorConnectorContainer.js","webpack:///./packages/two-factor-connector/src/components/TwoFactorConnector/index.js","webpack:///./packages/two-factor-connector/src/main.js","webpack:///./packages/admin/src/assets/tocco-circle.svg","webpack:///./packages/admin/src/assets/tocco_red.svg","webpack:///./packages/admin/src/assets/tocco_white.svg"],"names":["transformProviderEntities","response","data","map","provider","_reduce","paths","result","value","key","loadProviders","loginCompleted","mainSagas","intlSelector","state","intl","select","query","conditions","locale","active","call","rest","method","entities","put","type","payload","providers","all","revisionChanged","localChanged","cache","externalEvents","takeLatest","ACTION_HANDLERS","reducerUtil","initialState","ssoLogin","action","handler","sagas","rootSaga","openLoginWindow","loginEndpoint","encodedWindowUrl","encodeURIComponent","window","location","href","url","__BACKEND_URL__","unique_id","popUp","open","label","height","width","features","left","screen","top","resizable","scrollbars","status","join","getPopUpFeatures","ssoPopUpCallback","close","styled","StyledButton","scale","theme","props","declareInteractionColors","generateInteractionColors","bg","primaryColor","fg","secondaryColor","_get","StyledProviderButton","button_primary_color","button_secondary_color","onClick","button_icon","position","icon","button_label","StyledButtonContainer","LoginBox","prevProps","prevState","snapshot","this","autoLogin","length","autoLoginProvider","find","entity","idx","React","mapActionCreators","connect","input","ssoLoginEndpoint","EXTERNAL_EVENTS","LoginBoxContainer","initApp","id","events","publicPath","content","store","appFactory","reducers","actions","textResourceModules","SsoLoginApp","reduce","event","app","component","GlobalBodyStyle","createGlobalStyle","StyledLogin","ToccoLogo","StyledHeadingLogin","StyledH1","StyledSpanLogin","StyledSpan","StyledLoginWrapper","StyledSloganImg","StyledMobileSloganImg","StyledSsoMsg","StyledSsoError","breakWords","src","ToccoSlogan","alt","ssoAvailable","loginSuccessful","checkSsoAvailable","useState","showError","setShowError","showRegistrationText","setShowRegistrationText","Cookies","useEffect","successful","registration","expires","SsoLoginPart","loginSuccess","timeout","showTitle","session","injectIntl","Login","isOpen","size","color","lineProps","stroke","vectorEffect","strokeWidth","initial","animate","transition","ease","duration","LazyMotion","then","res","m","viewBox","overflow","preserveAspectRatio","aria-label","formatMessage","x1","x2","y1","y2","variants","closed","rotate","translateY","opened","opacity","StyledMenuEntry","declareFont","level","childrenCount","StyledMenuEntryWrapper","MenuItem","item","typeMapping","mappedType","menuType","Component","children","child","name","prepareTree","searchFilter","matchingAttribute","filter","c","filterAttributes","filterAttribute","toLowerCase","includes","MenuTree","items","requireSearch","secondary","secondaryLight","StyledNav","StyledMenuWrapper","StyledScrollbar","StyledMenuLink","Link","StyledTabsContainer","StyledNavSwitchButton","Button","StyledNavButton","narrow","StyledSearchBoxWrapper","MenuMenuEntry","EntityExplorerMenuEntry","entityNameDisplay","to","ActionMenuEntry","tabs","modulesMenuTree","settingsMenuTree","systemMenuTree","completeMenuTree","menuOpen","activeMenuTab","setActiveMenuTab","setVisibleMenus","visibleMenus","inputEl","useRef","navigationEl","setFilter","useMemo","current","focus","msg","ref","onKeyDown","e","focusableElements","currentIndex","preventDefault","querySelectorAll","findIndex","el","document","activeElement","isEqualNode","SearchBox","minInputLength","onSearch","placeholder","navigation","Navigation","StyledDashBoardWrapper","StyledSlogan","StyledTitle","StyledH3","StyledLogo","Dashboard","packageJson","require","version","loadedComponents","importRouteDependencies","getComponent","Promise","resolve","imported","route","forEach","saga","sagaUtil","inputDispatches","inputDispatch","actionCreator","mandatory","defaultValue","logger","consoleLogger","Object","prototype","hasOwnProperty","dispatch","dispatchInput","container","AsyncComponent","mounted","setState","ignoredAttributes","areEqual","nextProps","diff","js","clean","_omitBy","_omit","v","keys","entries","memo","ReactReduxContext","useStore","Typography","StyledBackgroundCover","StyledHeader","StyledConfig","StyledBackgroundLogo","runEnv","colors","primary","StyledPopper","StyledNotificationBellWrapper","StyledBall","Ball","StyledRedDot","unreadNotificationKeys","innerRef","notification","center","NotificationCenterRedDot","popperModifiers","options","offset","padding","visible","setVisibility","referenceElement","popperElement","redDotElement","handleMouseDown","contains","target","addEventListener","removeEventListener","usePopper","modifiers","styles","attributes","title","NotificationCenterRedDotContainer","ReactDOM","style","popper","navigationStrategy","body","StyledFormattedMessageWrapper","StyledBlockWrapper","niceVersion","niceRevision","dangerouslySetInnerHTML","__html","neutral","preferences","serverSettings","AboutTocco","StyledBallMenuWrapper","username","currentBusinessUnit","businessUnits","loadBusinessUnits","changeBusinessUnit","doLogout","openModalComponent","removeModalComponent","info","ButtonMenu","onOpen","bU","disabled","success","onSuccess","BallMenu","buttonProps","replace","Header","calcViewportHeight","vh","documentElement","clientHeight","setProperty","StyledWrapper","StyledContent","StyledMenu","SlideMenu","burgerMenuStyles","bmBurgerButton","outline","zIndex","bmBurgerBarsHover","background","bmMenuWrap","minWidth","bmMenu","fontSize","bmMorphShape","fill","bmItemList","bmItem","display","bmOverlay","exact","path","DashboardRoute","EntitiesRoute","Settings","DocsRoute","withTheme","initializeNavigation","setMenuOpen","baseRoute","confirm","loadPrincipal","loadSettingsAndPreferences","history","setHistory","initializeHistory","browserHistory","createBrowserHistory","basename","getUserConfirmation","message","confirmCallback","LoadMask","required","onStateChange","customCrossIcon","customBurgerIcon","paper","pageWrapId","outerContainerId","viewPersistor","render","match","Admin","Helmet","defer","doSessionCheck","loggedIn","undefined","loadingText","login","LoginGuard","DetailLinkRelative","entityKey","relation","DetailLink","entityName","ListLink","entityKeys","queryString","pathname","search","navigateToCreateRelative","relationName","push","entityBaseUrl","goBack","navigateToActionRelative","definition","selection","queryStringUtil","actionProperties","properties","appId","openDetail","createHref","amount","normalizedUrl","i","substring","lastIndexOf","setShowOldPasswordField","showOldPasswordField","setForcedUpdate","forcedUpdate","setUsername","setPasswordRequest","passwordRequest","changePage","page","setPassword","password","Pages","StyledLoginFormInput","StyledInputCss","StyledLoginFormInputWrapper","StyledEditableWrapperCss","StyledLoginButton","StyledTransparentButton","StyledLoginFormWrapper","StyledButtonGroup","captchaKey","loginPending","recaptchaActivated","autoFill","setAutoFill","recaptchaRef","handleSubmit","recaptchaToken","executeAsync","reset","handleAutoFill","animationName","passwordFocus","usernameFocus","onSubmit","StatedValue","hasValue","autoFocus","data-cy","onChange","onAnimationStart","onFocus","text","SignalList","condition","negative","badge","sitekey","hl","ink","look","pending","captchaToken","loginForm","LoginForm","StyledPasswordInput","StyledPasswordInputWrapper","getSignal","valid","design","immutable","readOnly","signal","rules","rule","index","errors","error","messages","INVALID_CREDENTIALS","UNEXPECTED_ERROR","errorCode","StyledValidationRulesWrapper","fetchValidationRules","initialized","savePassword","updateNewPassword","updateNewPasswordRepeat","updateOldPassword","validationRules","isSubmittable","newPasswordRepeat","newPassword","passwordUpdatePending","oldPasswordReadOnly","newPasswordReadOnly","oldPassword","newPasswordRepeatReadOnly","newPasswordValidationErrors","StyledPasswordUpdateDialog","tabIndex","passwordUpdateFailed","passwordUpdateErrorCode","rulesNeutral","UPDATE_OLD_PASSWORD","UPDATE_NEW_PASSWORD","SAVE_PASSWORD","VALIDATE","setNewPasswordValidationErrors","savePasswordFailure","validationMessages","passwordUpdate","dialog","PasswordUpdateDialog","requestPassword","bind","handleUsernameChange","PasswordRequest","StyledTwoStepLogin","StyledEditableValue","twoStepLogin","userCode","setUserCode","formEl","useLayoutEffect","querySelector","EditableValue","format","allowLeadingZeros","toString","TwoStepLoginForm","secret","forced","TwoFactorConnectorForm","GlobalRecaptchaBadgeStyle","TwoFactorConnectorContainer","initialize","currentPage","PasswordRequestContainer","TwoStepLoginContainer","LoginFormContainer","resizeWatcher","validationMessagesToErrorMap","ruleName","validateCharacterRule","regex","min","max","specificCharsCount","VALIDATORS","params","validator","setMessage","setPending","doLoginRequest","doSessionRequest","handleTwoStepLoginResponse","handleTwoStepActivationResponse","handlePasswordUpdateResponse","handleBlockResponse","handleFailedResponse","handleSuccessfulLogin","loginSaga","checkSessionSaga","loadSettings","textResourceSelector","loginSelector","doRequest","fetch","resp","json","getOptions","headers","Headers","credentials","k","sort","twoFactorResponse","loginData","CAPTCHA","TWOSTEPLOGIN","RESET_PASSWORD_REQUIRED","LOGIN_BLOCKED","TWOSTEPLOGIN_ACTIVATION","settings","storePassword","remoteValidate","validate","getData","getLoginData","formChanged","validationRulesSelector","inputSelector","usernameSelector","passwordSelector","standaloneSelector","standalone","acceptedStatusCodes","ok","exception","queryParams","localValidate","object","constructor","singleTransferReducer","attributeName","val","loadValidationRules","resource","validationResponse","passwordSagas","validationRulesSagas","twoStepSaga","args","fork","moduleSagas","requestPasswordSaga","passwordRequestSaga","textResourcesState","combineReducers","passwordUpdateReducers","passwordRequestSagas","twoStepLoginSagas","passwordUpdateSagas","initLoginApp","customTheme","LoginContainer","loginReducers","errorLogging","initPasswordUpdateApp","LoginApp","EXTERNAL_EVENTS_PASSWORD_UPDATE","PasswordUpdateApp","setApp","propTypes","PropTypes","linkStyle","css","ButtonGroup","regular","baseSpace","GlobalDatePickerStyles","innerProps","selectProps","isDisabled","menuIsOpen","handleAdvancedSearch","openAdvancedSearch","stopPropagation","openCreate","openRemoteCreate","createPermission","onTouchEnd","onMouseDown","onMouseUp","TetherPosition","attachment","targetAttachment","constraints","wrapperWidth","wrapperHeight","moreOptionsAvailable","moreOptionsAvailableText","reactSelectTheme","tooltips","loadTooltip","tooltip","ClickableWrapper","Popover","onMouseOver","StyledSingleValueWrapper","fetchOptions","isLoading","isMulti","noResultsText","searchOptions","selectComponent","selectWrapper","debouncedSearchOptions","_debounce","clientWidth","outlineStyle","cursor","getOptionLabel","option","getOptionValue","components","ClearIndicator","LoadingIndicator","DropdownIndicator","IndicatorsContainer","IndicatorSeparator","Menu","MenuList","MultiValueLabel","SingleValue","noOptionsMessage","closeMenuOnSelect","isSearchable","filterOption","isClearable","loadingMessage","menuShouldScrollIntoView","onInputChange","searchTerm","onMenuOpen","reactSelectStyles","themeSelect","blurInputOnSelect","openMenuOnClick","react","maxRows","rows","StyledDateAbstractInput","StyledDateAbstractOuterWrapper","StyledDateAbstractWrapper","DateAbstract","flatpickr","localeMap","wrap","handleOnChange","altInput","altInputClass","clickOpens","defaultDate","flatpickrOptions","Flatpickr","wrapper","calendarContainer","classList","add","fontFamily","handleConfirmKey","localeCode","l10ns","en","selectedDates","isoStrings","date","toISOString","every","onBlur","altValue","r","setDate","shiftKey","focusInput","handleOnBlur","setTimeout","componentIsUnmounted","German","French","Italian","initializeFlatPickr","optionsDiff","set","redraw","_isEqual","getLocale","localize","destroy","inputElement","data-wrap","data-input","placeholderText","atMostOne","array","Error","momentJStoToFlatpickrFormat","_forOwn","d","Y","K","H","h","useIntl","getLocalizedAltFormat","moment","_locale","longDateFormat","parseDate","s","momentDate","isValid","toDate","altFormat","dateFormat","allowInput","dateString","values","setValue","parsed","dates","dateTime","dateObj","Date","year","getFullYear","month","getMonth","day","getDate","toLocalDateString","momentDateFormat","momentTimeFormat","altDateFormat","altTimeFormat","enableTime","time_24hr","isFirefox","sidebar","showClearButton","StyledBoolEdit","checked","StyledView","StyledButtonsWrapper","binaryLink","downloadTitle","onUpload","deleteTitle","isNotUploadedFile","startsWith","className","Preview","fileName","caption","maxDimensionX","maxDimensionY","srcUrl","thumbnailUrl","thumbnailLink","download","StyledUploadProgress","StyledUploadProgressText","StyledUploadProgressIconAndText","file","preview","bytes","Math","floor","log","pow","toFixed","colorizeText","StyledIconWrapper","StyledDropzone","Dropzone","onDropProp","onDrop","multiple","files","Upload","textResources","isUploading","previewFile","states","setStates","uploading","setUploadingState","defaultProps","Document","upload","uploadText","uploadingText","delete","deleteText","downloadText","StyledHtmlEdit","declareTypograhpy","HtmlEdit","delta","source","lazyQuill","lazy","Suspense","fallback","handleChange","modules","clipboard","matchVisual","indexOf","test","PhoneEdit","str","caretPosition","spaces","previousValue","previousFormatted","libPhoneImport","AsYouType","defaultCountry","currentFormatted","spacesPrevious","amountOfSpacesBeforeCaret","requestAnimationFrame","start","setSelectionRange","newValue","parsedNumber","parseNumber","valueNormalized","_isEmpty","removeSpaces","formatNumber","currentCaretPosition","selectionStart","repositionCaret","FALLBACK_DEFAULT_COUNTRY","importLibPhoneNumber","displayValue","determineDisplayValue","StyledDurationEdit","StyledDurationEditFocusable","generateDisabledShade","StyledDurationEditShadow","DurationEdit","milliSeconds","hours","minutes","parseInt","hoursWidth","hoursShadow","offsetWidth","minutesWidth","minutesShadow","validity","slice","getDesiredInputInMinutes","minutesValue","hoursValue","calculateMilliseconds","showUnits","charCode","millisecondsToDuration","overflowX","handleOnFocus","onInput","handleHourChange","onKeyPress","preventNonNumeric","pattern","step","hoursLabel","handleMinutesChange","minutesLabel","getPreDecimalPositions","number","ceil","log10","abs","isNumber","isNaN","parseFloat","checkValueRange","minValue","maxValue","isAllowedValue","floatValue","countryCode","thousandSeparator","toLocaleString","decimalSeparator","prePointDigits","postPointDigits","allowNegative","fixedDecimalScale","suffix","prefix","calculatedMaxValue","calculateMaxValue","numberFormatOptions","isAllowed","decimalScale","isNumericString","onValueChange","stringValue","valueBeforeBlur","StyledLocationEdit","shadeColor","BoolEdit","DateEdit","DateTimeEdit","IntegerEdit","LocationEdit","attr","suggestion","cantonString","countryString","country","postcode","city","field","fetchSuggestions","inputPropsZip","inputPropsCity","locationInput","focused","getRef","suggestions","onSuggestionsFetchRequested","returnOnSuggestionFetchRequested","getSuggestionValue","returnGetSuggestion","renderSuggestion","onSuggestionsClearRequested","inputProps","onSuggestionSelected","focusInputOnSuggestionClick","shouldRenderSuggestions","showGoogleMaps","dense","mapButtonTitle","MultiRemoteSelect","MultiSelect","NumberEdit","RemoteSelect","SearchFilterEdit","SingleSelect","StringEdit","TextEdit","UrlEdit","TimeEdit","blurValue","console","StyledEditableWrapper","StyledEditableControlCss","StyledEditableControl","ballEl","onOpenCalled","setOnOpenCalled","onClose","handleClick","handleClose","chevronIcon","ThisMenu","thisEl","setPopperElement","bottom","setBottom","handleClickOutside","getBoundingClientRect","placement","rectBottom","closeOnClick","childrenArr","Boolean","isGroup","hasOnClick","menuItem","lvl","displayName","StyledIconButtonWrapper","StyledPopperWrapper","StyledMenuItem","StyledItemLabel","interactiveStyling","renderAs","StyledSearchBox","StyledStatedValueBox","StyledSearchBoxInput","inputValue","setInputValue","debounce","COLORS","StyledSignalListItem","StyledLi","getColor","StyledUl","as","ICONS","SignalListItem","getIcon","List","Item","errorValues","description","dirty","fixLabel","isDisplay","mandatoryTitle","touched","signalProp","labelAlt","hasError","detectSignal","StyledStatedValue","secondaryPosition","htmlFor","declareCursor","StyledLabelWrapper","StyledStatedValueLabel","fontWeight","lineHeight","colorizeBorder","isDirty","declareFocus","StyledHtmlFormatter","StyledStatedValueDescription","fadeIn","keyframes","StyledStatedValueError","StyledStatedValueWrapper","shade0","shade1","shade2","transparent","hasJsonStructure","JSON","parse","err","fromQueryString","obj","_mapValues","toQueryString","stringifiedValues","_isObject","stringify","persistedViews","persistViewInfo","viewInfoSelector","clearPersistedViews","acc","persistedView","INITIALIZE","SET_SECRET","GO_TO_START","GO_TO_SECRET","setTwoFactorActive","twoFactorActive","setSecret","setUserName","goToStart","setSetupSuccessful","setupSuccessful","requestSecret","activateTwoFactorWithoutSession","activateTwoFactor","verifyCode","loadPrincipal2FAInfo","getUsername","fireResize","twoFactorConnector","secretSelector","principalsResponse","totpUri","uri","code","codeVerifyResponse","where","principals","twoFactorKey","inputUsername","setStage","stage","StyledButtonWrapper","Start","StyledQRCodeWrapper","StyledParagraph","goToSecretVerification","QRCode","Secret","Verification","StyledMessageWrapper","isSuccessful","StyledTextWrapper","Result","stages","renderContent","TwoFactorConnector","packageName","TwoFactorConnectorApp","module","exports"],"mappings":"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","file":"chunk-0.01f4d23e7da6b640beb4.js","sourcesContent":["import _reduce from 'lodash/reduce'\n\nexport const transformProviderEntities = response =>\n response.data.map(provider => _reduce(provider.paths, (result, value, key) => {\n return {...result, [key]: value.value}\n }, {})\n )\n","import {externalEvents, rest} from 'tocco-app-extensions'\nimport {cache, intl} from 'tocco-util'\nimport {takeLatest, all, call, put, select} from 'redux-saga/effects'\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 [revisionChanged, localChanged] = yield all([call(rest.hasRevisionIdChanged), call(intl.hasUserLocaleChanged)])\n if (revisionChanged || localChanged) {\n yield call(cache.clearAll)\n } else {\n yield call(cache.clearShortTerm)\n }\n yield put(externalEvents.fireExternalEvent('loginCompleted', result))\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.LOAD_PROVIDERS, loadProviders),\n takeLatest(actions.LOGIN_COMPLETED, loginCompleted)\n ])\n}\n","export const LOAD_PROVIDERS = 'root/LOAD_PROVIDERS'\nexport const SET_PROVIDERS = 'root/SET_PROVIDERS'\nexport const LOGIN_COMPLETED = 'root/LOGIN_COMPLETED'\n\nexport const loadProviders = () => ({\n type: LOAD_PROVIDERS\n})\n\nexport const setProviders = providers => ({\n type: SET_PROVIDERS,\n payload: {\n providers\n }\n})\n\nexport const loginCompleted = result => ({\n type: LOGIN_COMPLETED,\n payload: {\n result\n }\n})\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_PROVIDERS]: reducerUtil.singleTransferReducer('providers')\n}\n\nconst initialState = {\n providers: []\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import rootSaga from './sagas'\nimport ssoLogin from './reducer'\n\nexport default {\n ssoLogin\n}\n\nexport const sagas = [rootSaga]\n","import {getPopUpFeatures} from './popUp'\n\nexport const openLoginWindow = (loginEndpoint, loginCompleted, provider) => {\n const baseUrl = __DEV__ ? '' : __BACKEND_URL__\n const encodedWindowUrl = encodeURIComponent(window.location.href)\n const url = `${baseUrl}${loginEndpoint}?provider=${provider.unique_id}&sourceUri=${encodedWindowUrl}`\n\n const popUp = window.open(url, provider.label, getPopUpFeatures(650, 500))\n\n window.ssoPopUpCallback = result => {\n popUp.close()\n loginCompleted(result)\n }\n}\n","import _reduce from 'lodash/reduce'\n\nexport const getPopUpFeatures = (height = 200, width = 200) => {\n const features = {\n height,\n width,\n left: (window.screen.width / 2) - (width / 2),\n top: (window.screen.height / 2) - (height / 2),\n resizable: 1,\n scrollbars: 1,\n status: 1\n }\n\n return _reduce(features, (result, value, key) => [...result, `${key}=${value}`], [])\n .join(',')\n}\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\nimport {StyledButton} from 'tocco-ui/src/Button'\nimport {\n declareInteractionColors,\n generateInteractionColors,\n theme,\n scale\n} from 'tocco-ui/src/utilStyles'\n\nexport default styled(StyledButton)`\n && {\n margin-right: 0;\n flex: 1;\n font-size: ${scale.font(1.3)};\n justify-content: center;\n border-radius: ${theme.radii('large')};\n ${props => declareInteractionColors(\n generateInteractionColors(props, {\n bg: props.primaryColor,\n fg: props.secondaryColor || `${_get(props.theme, 'colors.paper')}, ${_get(props.theme, 'colors.text')}`\n }))}\n span {\n margin-left: .5em;\n padding: .9rem 0;\n }\n }\n`\n","import React from 'react'\nimport {Icon} from 'tocco-ui'\nimport PropTypes from 'prop-types'\n\nimport {openLoginWindow} from '../../utils/loginWindow'\nimport StyledProviderButton from './StyledProviderButton'\n\nconst ProviderButton = ({provider, loginCompleted, loginEndpoint}) => {\n const clickHandler = () => {\n openLoginWindow(loginEndpoint, loginCompleted, provider)\n }\n\n return (\n <StyledProviderButton\n primaryColor={provider.button_primary_color}\n secondaryColor={provider.button_secondary_color}\n onClick={clickHandler}\n >\n {provider.button_icon && <Icon position=\"prepend\" icon={provider.button_icon}/>}\n <span>{provider.button_label}</span>\n </StyledProviderButton>\n )\n}\n\nProviderButton.propTypes = {\n provider: PropTypes.shape({\n button_primary_color: PropTypes.string,\n button_secondary_color: PropTypes.string,\n button_icon: PropTypes.string,\n button_label: PropTypes.string\n }),\n loginEndpoint: PropTypes.string.isRequired,\n loginCompleted: PropTypes.func.isRequired\n}\n\nexport default ProviderButton\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport {openLoginWindow} from '../../utils/loginWindow'\nimport ProviderButton from '../ProviderButton/ProviderButton'\n\nconst StyledButtonContainer = styled.div`\n width: 100%;\n margin-top: 3rem;\n display: grid;\n grid-gap: 1rem;\n grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));\n\n @media (max-width: 1024px) {\n margin-top: 1.5rem;\n }\n`\n\nclass LoginBox extends React.Component {\n constructor(props) {\n super(props)\n props.loadProviders()\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.props.autoLogin && prevProps.providers.length === 0 && this.props.providers.length > 0) {\n const autoLoginProvider = this.props.providers.find(entity => entity.unique_id === this.props.autoLogin)\n if (autoLoginProvider) {\n openLoginWindow(this.props.loginEndpoint, this.props.loginCompleted, autoLoginProvider)\n }\n }\n }\n\n render() {\n return <StyledButtonContainer>\n {\n this.props.providers\n .map((provider, idx) => (\n <ProviderButton\n key={idx}\n provider={provider}\n loginEndpoint={this.props.loginEndpoint}\n loginCompleted={this.props.loginCompleted}\n />\n ))\n }\n </StyledButtonContainer>\n }\n}\n\nLoginBox.propTypes = {\n loginEndpoint: PropTypes.string,\n loginCompleted: PropTypes.func.isRequired,\n loadProviders: PropTypes.func.isRequired,\n providers: PropTypes.array,\n autoLogin: PropTypes.string\n}\n\nexport default LoginBox\n","import LoginBox from './LoginBox'\n\nexport default LoginBox\n","import {connect} from 'react-redux'\n\nimport LoginBox from '../components/LoginBox'\nimport * as actions from '../modules/actions'\n\nconst mapActionCreators = {\n loadProviders: actions.loadProviders,\n loginCompleted: actions.loginCompleted\n}\n\nconst mapStateToProps = state => {\n return {\n providers: state.ssoLogin.providers,\n loginEndpoint: state.input.ssoLoginEndpoint,\n autoLogin: state.input.autoLogin\n }\n}\n\nexport default connect(mapStateToProps, mapActionCreators)(LoginBox)\n","import React from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, externalEvents} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules'\nimport LoginBoxContainer from './containers/LoginBoxContainer'\n\nconst packageName = 'sso-login'\n\nconst EXTERNAL_EVENTS = [\n 'loginCompleted'\n]\n\nconst initApp = (id, input, events, publicPath) => {\n const content = <LoginBoxContainer/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n \n const app = initApp(packageName, input)\n \n if (module.hot) {\n module.hot.accept('./modules/index', () => {\n const reducers = require('./modules').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n \n appFactory.renderApp(app.component)\n }\n }\n})()\n\nclass SsoLoginApp extends React.Component {\n constructor(props) {\n super(props)\n\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n this.app = initApp('id', props, events)\n }\n\n render() {\n return this.app.component\n }\n}\n\nSsoLoginApp.propTypes = {\n ssoLoginEndpoint: PropTypes.string.isRequired,\n locale: PropTypes.string,\n autoLogin: PropTypes.bool\n}\n\nexport default SsoLoginApp\n","import styled, {createGlobalStyle} from 'styled-components'\nimport {scale, StyledH1, StyledSpan, theme} from 'tocco-ui'\n\nimport ToccoLogo from '../../assets/tocco-circle.svg'\n\n// Overwrite index.html overflow which is hidden\nexport const GlobalBodyStyle = createGlobalStyle`\n @media (max-width: 1024px) {\n body {\n overflow: auto !important;\n }\n }\n`\n\nexport const StyledLogin = styled.div`\n height: 100vh;\n width: 100vw;\n background-image: url(${ToccoLogo});\n background-repeat: no-repeat;\n background-size: 61vw;\n background-position-y: -25vw;\n background-position-x: -41vw;\n\n .tocco-sso-login {\n display: flex;\n justify-content: space-between;\n margin-bottom: 1.8rem;\n }\n\n @media (max-width: 1024px) {\n background-size: 2000px;\n background-position: 50% -1850px;\n }\n\n @media (max-width: 425px) {\n background-position: 50% -1890px;\n }\n`\n\nexport const StyledHeadingLogin = styled(StyledH1)`\n && {\n font-size: ${scale.font(11)};\n }\n`\nexport const StyledSpanLogin = styled(StyledSpan)`\n && {\n text-align: center;\n font-size: ${scale.font(1.3)};\n display: inline-block;\n width: 100%;\n margin: 1rem 0 1.8rem;\n }\n`\n\nexport const StyledLoginWrapper = styled.div`\n max-width: 410px;\n margin: 6% 5% 0 28%;\n\n && {\n .tocco-login * {\n font-size: ${scale.font(1.3)};\n }\n\n @media (max-width: 1024px) {\n margin: 14rem auto 0;\n padding-left: 2rem;\n padding-right: 2rem;\n }\n\n @media (max-width: 425px) {\n margin-top: 12rem;\n }\n }\n`\n\nexport const StyledSloganImg = styled.img`\n transform: rotate(270deg);\n position: relative;\n top: 12.5vw;\n left: -8%;\n width: 25vw;\n\n @media (max-width: 1024px) {\n display: none;\n }\n`\n\nexport const StyledMobileSloganImg = styled.img`\n display: none;\n max-width: 400px;\n width: 95%;\n height: auto;\n position: relative;\n margin: auto;\n top: 45px;\n\n @media (max-width: 1024px) {\n display: block;\n }\n\n @media (max-width: 425px) {\n max-width: 280px;\n }\n`\n\nexport const StyledSsoMsg = styled(StyledSpan)`\n && {\n display: inline-block;\n text-align: center;\n font-weight: ${theme.fontWeight('bold')};\n width: 100%;\n color: ${theme.color('signal.info.text')};\n }\n`\n\nexport const StyledSsoError = styled(StyledSsoMsg)`\n && {\n color: ${theme.color('signal.danger.text')};\n }\n`\n","import React, {useState, useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport ToccoLogin from 'tocco-login/src/main'\nimport SsoLogin from 'tocco-sso-login/src/main'\nimport {FormattedMessage} from 'react-intl'\nimport Cookies from 'js-cookie'\n\nimport ToccoSlogan from '../../assets/tocco_white.svg'\nimport {\n StyledSsoMsg,\n StyledSsoError,\n StyledSpanLogin,\n StyledLogin,\n StyledMobileSloganImg,\n StyledSloganImg,\n StyledLoginWrapper,\n StyledHeadingLogin,\n GlobalBodyStyle\n} from './StyledComponents'\n\nconst Login = ({ssoAvailable, loginSuccessful, checkSsoAvailable}) => {\n const [showError, setShowError] = useState(false)\n const [showRegistrationText, setShowRegistrationText] = useState(false)\n const autoLogin = Cookies.get('sso-autologin')\n\n useEffect(() => {\n checkSsoAvailable()\n }, [])\n\n const loginSuccess = ({timeout}) => {\n loginSuccessful(timeout)\n }\n\n const ssoLoginCompleted = ({successful, provider, registration}) => {\n if (successful) {\n Cookies.set('sso-autologin', provider, {expires: 365})\n loginSuccessful(30)\n } else if (!successful && registration) {\n setShowRegistrationText(true)\n } else {\n setShowError(true)\n }\n }\n\n const SsoLoginPart = () => (\n <>\n <SsoLogin\n ssoLoginEndpoint=\"/sso\"\n loginCompleted={ssoLoginCompleted}\n autoLogin={autoLogin}\n />\n {showRegistrationText\n && <StyledSsoMsg breakWords={true}><FormattedMessage id=\"client.sso-login.registration\"/></StyledSsoMsg>\n }\n {showError\n && <StyledSsoError breakWords={true}><FormattedMessage id=\"client.sso-login.error\"/></StyledSsoError>\n }\n <StyledSpanLogin><FormattedMessage id=\"client.admin.loginChoice\"/></StyledSpanLogin>\n </>\n )\n\n return (\n <>\n <GlobalBodyStyle/>\n <StyledLogin>\n <StyledMobileSloganImg src={ToccoSlogan} alt=\"Tocco Slogan\" height=\"42.3\" width=\"460\"/>\n <StyledSloganImg src={ToccoSlogan} alt=\"Tocco Slogan\" height=\"42.3\" width=\"460\"/>\n <StyledLoginWrapper>\n <StyledHeadingLogin><FormattedMessage id=\"client.admin.welcomeTitle\"/></StyledHeadingLogin>\n {ssoAvailable && <SsoLoginPart/>}\n <ToccoLogin\n loginSuccess={loginSuccess}\n showTitle={false}\n />\n </StyledLoginWrapper>\n </StyledLogin>\n </>\n\n )\n}\n\nLogin.propTypes = {\n ssoAvailable: PropTypes.bool,\n loginSuccessful: PropTypes.func.isRequired,\n checkSsoAvailable: PropTypes.func.isRequired\n}\n\nexport default Login\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Login from './Login'\nimport {loginSuccessful, checkSsoAvailable} from '../../modules/session/actions'\n\nconst mapActionCreators = {\n loginSuccessful,\n checkSsoAvailable\n}\n\nconst mapStateToProps = (state, props) => ({\n ssoAvailable: state.session.ssoAvailable\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Login))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {m, LazyMotion} from 'framer-motion'\nimport {injectIntl} from 'react-intl'\n\n/**\n * Animated Burger Menu Button\n */\nconst BurgerButton = ({isOpen, size = '20', color, intl}) => {\n const msg = id => intl.formatMessage({id})\n const variant = isOpen ? 'opened' : 'closed'\n const top = {\n closed: {\n rotate: 0,\n translateY: 0\n },\n opened: {\n rotate: 45,\n translateY: 2\n }\n }\n const center = {\n closed: {\n opacity: 1\n },\n opened: {\n opacity: 0\n }\n }\n const bottom = {\n closed: {\n rotate: 0,\n translateY: 0\n },\n opened: {\n rotate: -45,\n translateY: -2\n }\n }\n const lineProps = {\n stroke: color,\n vectorEffect: 'non-scaling-stroke',\n strokeWidth: 2,\n initial: 'closed',\n animate: variant,\n transition: {ease: 'easeOut', duration: 0.4}\n }\n\n const loadFeatures = () =>\n import('./framerMotionFeatures.js').then(res => res.default)\n\n return (\n <LazyMotion features={loadFeatures}>\n <m.svg\n viewBox=\"0 0 6 6\"\n overflow=\"visible\"\n preserveAspectRatio=\"none\"\n width={size}\n height={size}\n aria-label={msg('client.component.burgerButton.Label')}\n >\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"1\"\n y2=\"1\"\n variants={top}\n {...lineProps}\n />\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"3\"\n y2=\"3\"\n variants={center}\n {...lineProps}\n transition={{ease: 'easeOut', duration: 0.1}}\n />\n <m.line\n x1=\"0\"\n x2=\"6\"\n y1=\"5\"\n y2=\"5\"\n variants={bottom}\n {...lineProps}\n />\n </m.svg>\n </LazyMotion>\n )\n}\n\nBurgerButton.propTypes = {\n /**\n * Specify width and height.\n */\n size: PropTypes.string,\n /**\n * Color\n */\n color: PropTypes.string,\n /**\n * Specify width and height.\n */\n isOpen: PropTypes.bool,\n intl: PropTypes.object.isRequired\n}\n\nexport default injectIntl(BurgerButton)\n","import styled from 'styled-components'\nimport {declareFont, scale, theme} from 'tocco-ui'\n\nexport const StyledMenuEntry = styled.div`\n ${declareFont()}\n\n && {\n padding-left: ${({level}) => level * 7}px;\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\n > div {\n margin-bottom: ${scale.space(0)};\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuEntry, StyledMenuEntryWrapper} from './StyledComponents'\n\nconst MenuItem = ({item, typeMapping}) => {\n if (!item) {\n return null\n }\n\n const mappedType = typeMapping[item.menuType]\n if (!mappedType) {\n return null\n }\n\n const Component = mappedType.component\n return <StyledMenuEntry {...item} childrenCount={item.children ? item.children.length : 0}>\n <Component item={item} {...mappedType.props}/>\n {item.children && item.children.map(child => <MenuItem key={child.name} item={child} typeMapping={typeMapping}/>)}\n </StyledMenuEntry>\n}\n\nMenuItem.propTypes = {\n item: PropTypes.shape({\n menuType: PropTypes.string,\n children: PropTypes.array\n }),\n typeMapping: PropTypes.objectOf(\n PropTypes.shape({\n component: PropTypes.func,\n filterAttribute: PropTypes.arrayOf(PropTypes.string)\n })\n )\n}\n\nconst prepareTree = (item, searchFilter, typeMapping, level = 0) => {\n const mappedType = typeMapping[item.menuType]\n\n if (!mappedType) {\n return null\n }\n\n const children = (item.children || [])\n .map(child => prepareTree(child, searchFilter, typeMapping, level + 1))\n .filter(c => (c !== null))\n\n let matchingAttribute\n if (children.length === 0 && searchFilter) {\n matchingAttribute = mappedType.filterAttributes\n .find(filterAttribute =>\n item[filterAttribute]\n && item[filterAttribute].toLowerCase().includes(searchFilter.toLowerCase())\n )\n if (!matchingAttribute) {\n return null\n }\n }\n\n return {...item, level, children, matchingAttribute}\n}\n\nconst MenuTree = ({items, searchFilter, typeMapping, requireSearch}) => {\n if (requireSearch && !searchFilter) {\n return null\n }\n\n if (!items || items.length === 0) {\n return null\n }\n\n return (\n <StyledMenuEntryWrapper>\n {items.map(item => (\n <MenuItem\n key={item.name}\n item={prepareTree(item, searchFilter, typeMapping)}\n typeMapping={typeMapping}/>\n ))}\n </StyledMenuEntryWrapper>\n )\n}\n\nMenuTree.propTypes = {\n items: PropTypes.array,\n searchFilter: PropTypes.string,\n typeMapping: PropTypes.objectOf(\n PropTypes.shape({\n component: PropTypes.func,\n filterAttribute: PropTypes.arrayOf(PropTypes.string)\n })\n ),\n requireSearch: PropTypes.bool\n}\n\nexport default React.memo(MenuTree)\n","import MenuTree from './MenuTree'\n\nexport default MenuTree\n","import styled from 'styled-components'\nimport {Link} from 'react-router-dom'\nimport {Button, theme, StyledScrollbar, scale} 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: 1.5rem 3rem 1.8rem 1.8rem;\n }\n`\n\nexport const StyledMenuWrapper = styled.div`\n height: 100%;\n overflow: auto;\n padding: ${scale.space(0.6)} 0 0 ${scale.space(0.6)};\n ${StyledScrollbar}\n`\n\nexport const StyledMenuEntry = styled.span`\n color: ${theme.color('text')};\n font-weight: ${theme.fontWeight('bold')};\n`\n\nexport const StyledMenuLink = styled(Link)`\n color: ${theme.color('text')};\n text-decoration: none;\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n\n &:focus {\n outline: none;\n font-weight: ${theme.fontWeight('bold')};\n color: ${secondaryLight};\n }\n\n &.active {\n text-decoration: underline;\n }\n`\n\nexport const StyledTabsContainer = styled.div`\n display: flex;\n justify-content: space-evenly;\n align-items: center;\n margin-bottom: 10px;\n border-bottom: 3px solid ${theme.color('backgroundBody')};\n\n &:focus {\n background-color: transparent;\n }\n\n span {\n padding-top: .4rem;\n padding-bottom: .4rem;\n }\n`\n\nexport const StyledNavSwitchButton = styled(Button)`\n font-size: ${scale.font(0)};\n justify-content: center;\n border-radius: 0;\n margin: 12px 5px 5px;\n\n &:hover {\n background-color: transparent;\n color: ${secondaryLight};\n }\n`\n\nexport const StyledNavButton = styled(Button)`\n overflow: hidden;\n flex: ${({narrow}) => narrow ? 0.2 : 1};\n justify-content: center;\n border-radius: 0;\n margin: 5px;\n border-top: 5px solid ${({active}) => active ? secondary : 'transparent'};\n color: ${({active}) => active ? secondary : secondaryLight};\n font-weight: ${theme.fontWeight('bold')};\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","import React, {useRef, useState, useEffect, useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport SearchBox from 'tocco-ui/src/SearchBox'\n\nimport MenuTree from '../MenuTree'\nimport {\n StyledTabsContainer,\n StyledMenuEntry,\n StyledMenuLink,\n StyledNav,\n StyledMenuWrapper,\n StyledNavSwitchButton,\n StyledNavButton,\n StyledSearchBoxWrapper\n}\n from './StyledComponents'\n\nconst MenuMenuEntry = ({item}) => <StyledMenuEntry>\n {item.label}\n</StyledMenuEntry>\n\nMenuMenuEntry.propTypes = {\n item: PropTypes.shape({\n label: PropTypes.string\n })\n}\n\nconst EntityExplorerMenuEntry = ({onClick, item}) => {\n const entityNameDisplay = item.matchingAttribute === 'entity' ? <React.Fragment> ({item.entity})</React.Fragment> : ''\n\n return <StyledMenuLink onClick={onClick}\n to={`/e/${item.entity}`}>{item.label}{entityNameDisplay}\n </StyledMenuLink>\n}\n\nEntityExplorerMenuEntry.propTypes = {\n item: PropTypes.shape({\n entity: PropTypes.string,\n label: PropTypes.string,\n matchingAttribute: PropTypes.string\n }),\n onClick: PropTypes.func\n}\n\nconst ActionMenuEntry = ({onClick, item}) => <StyledMenuLink\n onClick={onClick}\n to={`/e/action/${item.name}`}>\n {item.label}\n</StyledMenuLink>\n\nActionMenuEntry.propTypes = {\n item: PropTypes.shape({\n name: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired\n }).isRequired,\n onClick: PropTypes.func\n}\n\nconst tabs = {\n MODULES: 'modules',\n SETTINGS: 'settings',\n SYSTEM: 'system',\n COMPLETE: 'complete'\n}\n\nconst Navigation = ({\n modulesMenuTree,\n settingsMenuTree,\n systemMenuTree,\n completeMenuTree,\n menuOpen,\n onClick,\n activeMenuTab,\n setActiveMenuTab,\n intl,\n setVisibleMenus,\n visibleMenus\n}) => {\n const inputEl = useRef(null)\n const navigationEl = useRef(null)\n const [filter, setFilter] = useState('')\n\n const map = useMemo(() => ({\n 'menu': {\n component: MenuMenuEntry,\n filterAttributes: []\n },\n 'entity-explorer': {\n component: EntityExplorerMenuEntry,\n props: {\n onClick\n },\n filterAttributes: ['label', 'entity']\n },\n 'action': {\n component: ActionMenuEntry,\n props: {\n onClick\n },\n filterAttributes: ['label']\n }\n }), [])\n\n useEffect(() => {\n if (menuOpen) {\n if (!activeMenuTab) {\n setActiveMenuTab(tabs.MODULES)\n }\n inputEl.current.select()\n inputEl.current.focus()\n }\n }, [menuOpen])\n\n const msg = id => intl.formatMessage({id})\n\n const handleCursorNavigation = key => {\n const focusableElements = navigationEl.current.querySelectorAll('a, input')\n const currentIndex = [...focusableElements].findIndex(el => document.activeElement.isEqualNode(el))\n if (currentIndex !== -1) {\n const indexDiff = key === 'ArrowDown' ? 1 : focusableElements.length - 1\n const targetIndex = (currentIndex + indexDiff) % focusableElements.length\n focusableElements[targetIndex].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 return (\n <StyledNav ref={navigationEl} onKeyDown={onKeyDown}>\n <StyledTabsContainer>\n {visibleMenus === 'main'\n && <>\n <StyledNavSwitchButton\n active={false}\n onClick={() => {\n setVisibleMenus('additional')\n setActiveMenuTab(tabs.COMPLETE)\n }}\n icon={'chevron-right'}\n narrow={true}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.MODULES}\n onClick={() => setActiveMenuTab(tabs.MODULES)}\n label={msg('client.admin.navigation.modules')}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.SETTINGS}\n onClick={() => setActiveMenuTab(tabs.SETTINGS)}\n label={msg('client.admin.navigation.settings')}\n />\n </>}\n {visibleMenus === 'additional'\n && <>\n <StyledNavSwitchButton\n active={false}\n onClick={() => {\n setVisibleMenus('main')\n setActiveMenuTab(tabs.MODULES)\n }}\n icon={'chevron-left'}\n narrow={true}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.SYSTEM}\n onClick={() => setActiveMenuTab(tabs.SYSTEM)}\n label={msg('client.admin.navigation.system')}\n />\n <StyledNavButton\n active={activeMenuTab === tabs.COMPLETE}\n onClick={() => setActiveMenuTab(tabs.COMPLETE)}\n label={msg('client.admin.navigation.complete')}\n />\n </>}\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 {activeMenuTab === tabs.MODULES\n && <StyledMenuWrapper>\n <MenuTree items={modulesMenuTree} searchFilter={filter} typeMapping={map}/>\n </StyledMenuWrapper>}\n {activeMenuTab === tabs.SETTINGS\n && <StyledMenuWrapper>\n <MenuTree items={settingsMenuTree} searchFilter={filter} typeMapping={map}/>\n </StyledMenuWrapper>}\n {activeMenuTab === tabs.SYSTEM\n && <StyledMenuWrapper>\n <MenuTree items={systemMenuTree} searchFilter={filter} typeMapping={map}/>\n </StyledMenuWrapper>}\n {activeMenuTab === tabs.COMPLETE\n && <StyledMenuWrapper>\n <MenuTree items={completeMenuTree} searchFilter={filter} typeMapping={map} requireSearch={true}/>\n </StyledMenuWrapper>}\n </StyledNav>\n )\n}\n\nNavigation.propTypes = {\n intl: PropTypes.object.isRequired,\n activeMenuTab: PropTypes.string.isRequired,\n settingsMenuTree: PropTypes.array,\n modulesMenuTree: PropTypes.array,\n systemMenuTree: PropTypes.array,\n completeMenuTree: PropTypes.array,\n onClick: PropTypes.func,\n setActiveMenuTab: PropTypes.func,\n menuOpen: PropTypes.bool,\n visibleMenus: PropTypes.string,\n setVisibleMenus: PropTypes.func\n}\n\nexport default Navigation\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Navigation from './Navigation'\nimport {setActiveMenuTab, setVisibleMenus} from '../../modules/navigation/actions'\nconst mapActionCreators = {\n setActiveMenuTab,\n setVisibleMenus\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 visibleMenus: state.navigation.visibleMenus\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Navigation))\n","import NavigationContainer from './NavigationContainer'\n\nexport default NavigationContainer\n","import styled from 'styled-components'\nimport {StyledH3, theme} from 'tocco-ui'\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\n @media (max-width: 568px) {\n justify-content: center;\n align-items: center;\n }\n`\n\nexport const StyledSlogan = styled.div`\n max-width: 900px;\n width: 100%;\n height: 100px;\n text-align: right;\n margin-bottom: 150px;\n margin-right: 100px;\n margin-left: 100px;\n\n @media (max-width: 568px) {\n margin-right: 25px;\n margin-left: 25px;\n margin-bottom: 0;\n }\n`\n\nexport const StyledTitle = styled(StyledH3)`\n && {\n font-size: 3rem;\n color: ${theme.color('primary')};\n }\n`\n\nexport const StyledLogo = styled.img`\n width: 100%;\n height: auto;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport ToccoLogo from '../../../../assets/tocco_red.svg'\nimport {StyledDashBoardWrapper, StyledSlogan, StyledLogo, StyledTitle} from './StyledComponents'\n\nconst Dashboard = () => {\n const packageJson = require('../../../../../package')\n return (\n <StyledDashBoardWrapper>\n <StyledSlogan>\n <StyledLogo src={ToccoLogo} alt=\"tocco-logo\" height=\"53.34\" width=\"580\"/>\n <StyledTitle>beta v{packageJson.version}</StyledTitle>\n </StyledSlogan>\n </StyledDashBoardWrapper>\n )\n}\n\nDashboard.propTypes = {\n match: PropTypes.object\n}\n\nexport default React.memo(Dashboard, () => true)\n","import Dashboard from './Dashboard'\n\nexport default Dashboard\n","import React from 'react'\n\nimport reducerUtil from '../reducer'\nimport sagaUtil from '../saga'\nimport asyncRoute from './asyncRoute'\nimport {dispatchInput} from './input'\n\nconst loadedComponents = {}\n\nexport const loadRoute = (store, input, importRouteDependencies, key) => props => {\n if (key && loadedComponents[key]) {\n const Component = loadedComponents[key]\n return <Component {...props}/>\n }\n\n const Component = asyncRoute(() =>\n new Promise(resolve => {\n importRouteDependencies().then(imported => {\n const route = imported.default\n\n if (route.reducers) {\n reducerUtil.injectReducers(store, route.reducers)\n }\n\n if (route.sagas) {\n route.sagas.forEach(saga => {\n sagaUtil.injectSaga(store, saga)\n })\n }\n\n if (route.inputDispatches) {\n route.inputDispatches.forEach(inputDispatch => {\n dispatchInput(\n store,\n input,\n inputDispatch\n )\n })\n }\n\n resolve(route.container)\n })\n })\n )\n\n if (key) {\n loadedComponents[key] = Component\n }\n\n return <Component {...props}/>\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Router as ReactRouter} from 'react-router'\n\nimport RouteWithSubRoutes from './RouteWithSubRoutes'\n\nconst Router = ({history, routes}) => (\n <ReactRouter history={history}>\n <React.Fragment>\n {routes.map((route, i) => (\n <RouteWithSubRoutes key={i} {...route}/>\n ))}\n </React.Fragment>\n </ReactRouter>\n)\n\nRouter.propTypes = {\n routes: PropTypes.array.isRequired,\n history: PropTypes.object\n}\n\nexport default Router\n","import {loadRoute} from './route'\nimport Router from './Router'\nimport RouteWithSubRoutes from './RouteWithSubRoutes'\n\nexport default {\n loadRoute,\n Router,\n RouteWithSubRoutes\n}\n","import React from 'react'\n\nexport default function asyncRoute(getComponent) {\n return class AsyncComponent extends React.Component {\n static Component = null\n mounted = false\n\n state = {\n Component: AsyncComponent.Component\n }\n\n componentDidMount() {\n this.mounted = true\n if (this.state.Component === null) {\n getComponent().then(Component => {\n AsyncComponent.Component = Component\n if (this.mounted) {\n this.setState({Component})\n }\n })\n }\n }\n\n componentWillUnmount() {\n this.mounted = false\n }\n\n render() {\n const {Component} = this.state\n\n if (Component !== null) {\n return <Component {...this.props}/>\n }\n\n return null\n }\n }\n}\n","import consoleLogger from '../consoleLogger'\n\nexport const dispatchInput = (store,\n input,\n {key, actionCreator, mandatory = false, defaultValue},\n logger = consoleLogger.logError) => {\n if (Object.prototype.hasOwnProperty.call(input, key) || defaultValue) {\n const action = actionCreator(input[key] || defaultValue)\n store.dispatch(action)\n } else if (mandatory === true) {\n logger(`EntityBrowser: Mandatory field '${key}' not set in input`)\n }\n}\n","import {route, js} from 'tocco-util'\nimport React, {memo} from 'react'\nimport {ReactReduxContext} from 'react-redux'\nimport _omit from 'lodash/omit'\nimport _omitBy from 'lodash/omitBy'\n\nconst ignoredAttributes = ['location.key', 'location.search', 'location.hash']\n\nfunction areEqual(prevProps, nextProps) {\n const diff = js.difference(prevProps, nextProps)\n const clean = _omitBy(_omit(diff, ignoredAttributes), v => Object.keys(v).length === 0)\n return Object.entries(clean).length === 0\n}\n\nexport default memo(\n props => (\n <ReactReduxContext.Consumer>\n {({store}) => {\n const Component = route.loadRoute(store, {}, () => (import('./route')))\n return <Component {...props}/>\n }}\n </ReactReduxContext.Consumer>\n ),\n areEqual\n)\n","import {route} from 'tocco-util'\nimport React, {useMemo} from 'react'\nimport {useStore} from 'react-redux'\n\nconst Route = props => {\n const store = useStore()\n const Component = useMemo(() => {\n return route.loadRoute(store, {}, () => (import('./route')), 'docs')\n }, [])\n return <Component {...props}/>\n}\n\nexport default Route\n","import React from 'react'\nimport {Typography} from 'tocco-ui'\n\nconst Settings = props => <Typography.H2>Settings</Typography.H2>\n\nSettings.propTypes = {\n}\n\nexport default Settings\n","import Settings from './Settings'\n\nexport default Settings\n","import styled from 'styled-components'\nimport {Ball, scale, theme} from 'tocco-ui'\n\nimport ToccoLogo from '../../assets/tocco-circle.svg'\n\n// intermediate div to add a white background below StyledBackgroundLogo\nexport const StyledBackgroundCover = styled.div`\n position: absolute;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n height: 40px;\n width: 100%;\n background-color: ${theme.color('paper')};\n`\nexport const StyledHeader = styled.div`\n grid-area: header;\n display: flex;\n height: 40px;\n padding-right: 10px;\n padding-left: 40px;\n position: relative;\n z-index: 3; // higher than StyledBackgroundCover to enable button interactions\n`\n\nexport const StyledConfig = styled.div`\n flex: 1;\n z-index: 2;\n display: flex;\n justify-content: flex-end;\n padding: 7px;\n`\nexport const StyledBackgroundLogo = styled.div`\n position: absolute;\n z-index: 3; // higher than StyledBackgroundCover to prevent coverage\n height: 40px;\n width: 100%;\n background-color: ${({runEnv, theme}) => runEnv === 'PRODUCTION' ? theme.colors.primary : theme.colors.secondary};\n mask-image: url(${ToccoLogo});\n mask-repeat: no-repeat;\n mask-position: -300px -900px;\n`\n\nexport const StyledPopper = styled.div`\n width: 350px;\n z-index: 1001; // higher than bm-overlay\n box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n`\n\nexport const StyledNotificationBellWrapper = styled.span`\n position: relative;\n`\n\nexport const StyledBall = styled(Ball)`\n margin-left: ${scale.space(-0.5)};\n`\n\nexport const StyledRedDot = styled.span`\n width: 7px;\n height: 7px;\n position: absolute;\n top: 3px;\n left: 21.5px;\n background-color: ${theme.color('secondaryLight')};\n border-radius: 50%;\n display: inline-block;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledRedDot} from './StyledComponents'\n\nconst NotificationCenterRedDot = ({\n unreadNotificationKeys,\n onClick,\n innerRef\n}) => unreadNotificationKeys.length > 0\n && <StyledRedDot onClick={onClick} ref={innerRef}/>\n\nNotificationCenterRedDot.propTypes = {\n unreadNotificationKeys: PropTypes.arrayOf(PropTypes.string),\n onClick: PropTypes.func.isRequired,\n innerRef: PropTypes.shape({current: PropTypes.any})\n}\n\nexport default NotificationCenterRedDot\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport NotificationCenterRedDot from './NotificationCenterRedDot'\n\nconst mapStateToProps = state => ({\n unreadNotificationKeys: state.notification.center.unreadNotificationKeys\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(NotificationCenterRedDot))\n","import React, {useState, useEffect, useRef} from 'react'\nimport ReactDOM from 'react-dom'\nimport {usePopper} from 'react-popper'\nimport {notification} from 'tocco-app-extensions'\n\nimport navigationStrategy from './../../routes/entities/utils/navigationStrategy'\nimport NotificationCenterRedDotContainer from './NotificationCenterRedDotContainer'\nimport {StyledNotificationBellWrapper, StyledBall, StyledPopper} from './StyledComponents'\n\nconst popperModifiers = [\n {\n name: 'offset',\n options: {\n offset: [0, 3]\n }\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 35\n }\n }\n]\n\nconst NotificationCenterButton = () => {\n const [visible, setVisibility] = useState(false)\n\n const referenceElement = useRef(null)\n const popperElement = useRef(null)\n const redDotElement = useRef(null)\n\n const handleMouseDown = e => {\n if (popperElement.current && !popperElement.current.contains(e.target)\n && referenceElement.current && !referenceElement.current.contains(e.target)\n && redDotElement.current && !redDotElement.current.contains(e.target)) {\n setVisibility(false)\n }\n }\n\n useEffect(() => {\n document.addEventListener('mousedown', handleMouseDown)\n return () => {\n document.removeEventListener('mousedown', handleMouseDown)\n }\n }, [referenceElement, popperElement])\n\n const {styles, attributes} = usePopper(referenceElement.current, popperElement.current, {modifiers: popperModifiers})\n\n return <>\n <StyledNotificationBellWrapper title=\"notifications\">\n <StyledBall onClick={() => setVisibility(!visible)} icon=\"bell\" ref={referenceElement}/>\n <span ref={redDotElement}><NotificationCenterRedDotContainer onClick={() => setVisibility(!visible)}/></span>\n </StyledNotificationBellWrapper>\n {ReactDOM.createPortal(\n <StyledPopper\n ref={popperElement}\n style={styles.popper}\n {...attributes.popper}\n >\n {visible && <notification.NotificationCenter navigationStrategy={navigationStrategy()}/>}\n </StyledPopper>,\n document.body\n )}\n </>\n}\n\nexport default NotificationCenterButton\n","import styled from 'styled-components'\nimport {scale} from 'tocco-ui'\n\nexport const StyledFormattedMessageWrapper = styled.div`\n font-size: ${scale.font(-1.5)};\n margin-top: ${scale.space(0.5)};\n`\n\nexport const StyledBlockWrapper = styled.div`\n margin-top: ${scale.space(0.5)};\n`\n\nexport const StyledLogo = styled.img`\n margin-top: ${scale.space(1)};\n width: 80%;\n height: auto;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography, Link} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport ToccoLogo from '../../assets/tocco_red.svg'\nimport {StyledLogo, StyledBlockWrapper, StyledFormattedMessageWrapper} from './StyledComponents'\n\nconst AboutTocco = ({niceVersion, niceRevision, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <Typography.Span>\n <StyledLogo src={ToccoLogo} height=\"53.34\" width=\"580\" alt=\"tocco-logo\"/>\n <div dangerouslySetInnerHTML={{__html: msg('client.admin.tocco.address')}}/>\n <Typography.P>\n <Link\n href={msg('client.admin.tocco.homepage')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.homepage\"/>\n </Link><br/>\n <Link\n href={'mailto:' + msg('client.admin.tocco.email')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.email\"/>\n </Link><br/>\n <Link\n href={'tel:' + msg('client.admin.tocco.phone')}\n neutral\n target=\"_blank\"\n >\n <FormattedMessage id=\"client.admin.tocco.phone\"/>\n </Link>\n </Typography.P>\n <StyledBlockWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.admin.about.versionLabel\"/>: {niceVersion}<br/>\n <FormattedMessage id=\"client.admin.about.revisionLabel\"/>: {niceRevision}\n </Typography.P>\n </StyledBlockWrapper>\n <StyledFormattedMessageWrapper>\n <FormattedMessage id=\"client.admin.copyright\"/>\n </StyledFormattedMessageWrapper>\n </Typography.Span>\n )\n}\n\nAboutTocco.propTypes = {\n intl: PropTypes.object,\n niceVersion: PropTypes.string,\n niceRevision: PropTypes.string\n}\n\nexport default AboutTocco\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport AboutTocco from './AboutTocco'\n\nconst mapStateToProps = state => ({\n niceVersion: state.preferences.serverSettings.niceVersion,\n niceRevision: state.preferences.serverSettings.niceRevision\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(AboutTocco))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {MenuItem, ButtonMenu, BallMenu, StyledBall, scale} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport styled from 'styled-components'\nimport {PasswordUpdateApp} from 'tocco-login/src/main'\nimport TwoFactorConnectorApp from 'tocco-two-factor-connector/src/main'\n\nimport NotificationCenterButton from './NotificationCenterButton'\nimport {\n StyledBackgroundCover,\n StyledHeader,\n StyledConfig,\n StyledBackgroundLogo\n} from './StyledComponents'\nimport AboutTocco from '../AboutTocco'\n\nconst StyledBallMenuWrapper = styled.span`\n display: flex;\n margin-top: 2px;\n\n ${StyledBall} {\n font-size: ${scale.font(1)};\n }\n`\n\nconst Header = ({\n username,\n currentBusinessUnit,\n businessUnits,\n loadBusinessUnits,\n changeBusinessUnit,\n doLogout,\n runEnv,\n niceVersion,\n openModalComponent,\n removeModalComponent,\n info,\n intl\n}) => {\n const handleBusinessUnitOpen = () => {\n if (businessUnits.length === 0) {\n loadBusinessUnits()\n }\n }\n\n const openPasswordUpdate = () => {\n openModalComponent(\n 'passwordUpdateModal',\n 'client.login.passwordUpdate.title',\n null,\n () => <PasswordUpdateApp username={username} success={() => {\n removeModalComponent('passwordUpdateModal')\n info('success', 'client.login.passwordUpdate.success')\n }}/>\n , true\n )\n }\n\n const openTwoFactorConnector = () => {\n openModalComponent(\n 'passwordUpdateModal',\n 'client.actions.two-factor-connector.title',\n null,\n () => <TwoFactorConnectorApp\n onSuccess={() => {\n removeModalComponent('passwordUpdateModal')\n }}\n />,\n true)\n }\n\n const msg = id => intl.formatMessage({id})\n\n return <>\n <StyledBackgroundLogo runEnv={runEnv}/>\n <StyledBackgroundCover/>\n <StyledHeader>\n <StyledConfig>\n <ButtonMenu label={currentBusinessUnit.label} onOpen={handleBusinessUnitOpen}>\n {\n businessUnits.map(bU =>\n <MenuItem\n key={`buMenu-${bU.id}`}\n disabled={bU.id === currentBusinessUnit.id}\n onClick={() => {\n changeBusinessUnit(bU.id)\n }}\n >\n {bU.label}\n </MenuItem>\n )\n }\n </ButtonMenu>\n <ButtonMenu label={username}>\n <MenuItem onClick={openPasswordUpdate}><FormattedMessage id=\"client.admin.menu.passwordUpdate\"/></MenuItem>\n <MenuItem onClick={openTwoFactorConnector}>\n <FormattedMessage id=\"client.admin.menu.twoFactorConnector\"/>\n </MenuItem>\n <MenuItem onClick={doLogout}><FormattedMessage id=\"client.admin.menu.logout\"/></MenuItem>\n </ButtonMenu>\n <StyledBallMenuWrapper>\n <BallMenu buttonProps={{\n icon: 'question-circle',\n title: msg('client.admin.header.help')\n }}>\n {niceVersion && <MenuItem onClick={() => {\n window.open(\n `https://${niceVersion.replace('.', '')}.docs.tocco.ch/de/`,\n '_blank'\n )\n }}>\n <FormattedMessage id=\"client.admin.menu.doc\"/>\n </MenuItem>}\n <MenuItem onClick={() => {\n window.open(\n '/nice2/swagger',\n '_blank'\n )\n }}>\n <FormattedMessage id=\"client.admin.menu.restDoc\"/>\n </MenuItem>\n <MenuItem onClick={() => {\n openModalComponent('about', null, null, () => <AboutTocco/>, true)\n }}>\n <FormattedMessage id=\"client.admin.menu.aboutToccoTitle\"/>\n </MenuItem>\n </BallMenu>\n <NotificationCenterButton/>\n </StyledBallMenuWrapper>\n </StyledConfig>\n </StyledHeader>\n </>\n}\n\nconst bUPropType = PropTypes.shape({\n id: PropTypes.string,\n label: PropTypes.string\n})\n\nHeader.propTypes = {\n username: PropTypes.string,\n currentBusinessUnit: bUPropType,\n businessUnits: PropTypes.arrayOf(bUPropType),\n doLogout: PropTypes.func.isRequired,\n changeBusinessUnit: PropTypes.func.isRequired,\n loadBusinessUnits: PropTypes.func.isRequired,\n runEnv: PropTypes.string,\n niceVersion: PropTypes.string,\n openModalComponent: PropTypes.func.isRequired,\n removeModalComponent: PropTypes.func.isRequired,\n info: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nexport default Header\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification} from 'tocco-app-extensions'\n\nimport {doLogout, loadBusinessUnits, changeBusinessUnit} from '../../modules/session/actions'\nimport Header from './Header'\n\nconst mapActionCreators = {\n doLogout,\n loadBusinessUnits,\n changeBusinessUnit,\n openModalComponent: notification.modal,\n removeModalComponent: notification.removeModal,\n info: notification.toaster\n}\n\nconst mapStateToProps = (state, props) => ({\n username: state.session.username,\n currentBusinessUnit: state.session.currentBusinessUnit,\n businessUnits: state.session.businessUnits,\n runEnv: state.preferences.serverSettings.runEnv,\n niceVersion: state.preferences.serverSettings.niceVersion\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Header))\n","import styled from 'styled-components'\nimport SlideMenu from 'react-burger-menu/lib/menus/slide'\nimport {theme} from 'tocco-ui'\n\nconst calcViewportHeight = () => {\n const vh = document.documentElement.clientHeight * 0.01\n document.documentElement.style.setProperty('--vh', `${vh}px`)\n}\n\ncalcViewportHeight()\n\nwindow.addEventListener('resize', () => calcViewportHeight())\nwindow.addEventListener('orientationchange', () => calcViewportHeight())\n\nexport const StyledWrapper = styled.div`\n display: grid;\n grid-template:\n 'header header' auto\n 'menu content' 1fr / auto 1fr;\n background-color: ${theme.color('paper')};\n height: calc(var(--vh, 1vh) * 100);\n\n .bm-burger-button button:focus {\n outline: 0;\n }\n`\n\nexport const StyledContent = styled.div`\n grid-area: content;\n background-color: ${theme.color('backgroundBody')};\n overflow: hidden;\n display: flex;\n`\nexport const StyledMenu = styled(SlideMenu)`\n grid-area: menu;\n`\n\nexport const burgerMenuStyles = {\n bmBurgerButton: {\n position: 'absolute',\n outline: '0',\n width: '24px',\n height: '24px',\n left: '17px',\n top: '10px',\n // Default z-index of button is 1000 which is higher than the mask of the legacy action modal windows (not good).\n // It seems like it doesn't need to be higher than 3, therefore we set it to 3.\n zIndex: 3\n },\n bmBurgerBarsHover: {\n background: '#a90000'\n },\n bmMenuWrap: {\n position: 'fixed',\n height: '100%',\n width: '16%',\n minWidth: '350px'\n },\n bmMenu: {\n background: '#fff',\n padding: '0 0 3rem 0',\n fontSize: '1.15em',\n overflow: 'hidden'\n },\n bmMorphShape: {\n fill: '#373a47'\n },\n bmItemList: {\n color: '#b8b7ad',\n height: '100%'\n },\n bmItem: {\n display: 'inline-block'\n },\n bmOverlay: {\n background: 'rgba(0, 0, 0, 0.3)'\n }\n}\n","import React, {useState, useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {Router, Route, Redirect, Switch} from 'react-router-dom'\nimport {createBrowserHistory} from 'history'\nimport {BurgerButton, LoadMask} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport {withTheme} from 'styled-components'\nimport {notification} from 'tocco-app-extensions'\nimport {viewPersistor} from 'tocco-util'\n\nimport navigationStrategy from './../../routes/entities/utils/navigationStrategy'\nimport Navigation from '../Navigation'\nimport DashboardRoute from '../../routes/dashboard'\nimport EntitiesRoute from '../../routes/entities'\nimport DocsRoute from '../../routes/docs'\nimport Settings from '../../routes/settings'\nimport Header from '../Header'\nimport {\n StyledWrapper,\n StyledContent,\n StyledMenu,\n burgerMenuStyles\n} from './StyledComponents'\n\nconst Admin = ({\n initializeNavigation,\n setMenuOpen,\n menuOpen,\n baseRoute,\n confirm,\n loadPrincipal,\n loadSettingsAndPreferences,\n theme\n}) => {\n const [history, setHistory] = useState(null)\n\n useEffect(() => {\n initializeHistory()\n initializeNavigation()\n loadPrincipal()\n loadSettingsAndPreferences()\n }, [])\n\n const initializeHistory = () => {\n const browserHistory = createBrowserHistory({\n ...baseRoute && {basename: baseRoute},\n getUserConfirmation: (message, confirmCallback) => {\n confirm(\n '',\n message,\n <FormattedMessage id=\"client.common.ok\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n () => confirmCallback(true),\n () => confirmCallback(false)\n )\n }\n })\n setHistory(browserHistory)\n }\n\n const isMenuOpen = state => {\n if (state.isOpen !== menuOpen) {\n setMenuOpen(state.isOpen)\n }\n }\n\n return <LoadMask required={[history !== null]}>\n <Router history={history || {}}>\n <notification.Notifications navigationStrategy={navigationStrategy()}/>\n <StyledWrapper id=\"outer-container\">\n <Header/>\n <StyledMenu\n isOpen={menuOpen}\n onStateChange={isMenuOpen}\n customCrossIcon={false}\n customBurgerIcon={<BurgerButton isOpen={menuOpen} size=\"20\" color={theme.colors.paper}/>}\n styles={burgerMenuStyles}\n pageWrapId={'page-wrap'}\n outerContainerId={'outer-container'}>\n <Navigation onClick={() => {\n setMenuOpen(false)\n viewPersistor.clearPersistedViews()\n }}/>\n </StyledMenu>\n <StyledContent id=\"page-wrap\">\n <Switch>\n <Route exact path=\"/\"\n render={({match}) => <Redirect to={`${match.url.replace(/\\/$/, '')}/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 </StyledWrapper>\n </Router>\n </LoadMask>\n}\n\nAdmin.propTypes = {\n baseRoute: PropTypes.string,\n loggedIn: PropTypes.bool,\n menuOpen: PropTypes.bool,\n loadPrincipal: PropTypes.func.isRequired,\n setMenuOpen: PropTypes.func.isRequired,\n confirm: PropTypes.func.isRequired,\n initializeNavigation: PropTypes.func.isRequired,\n loadSettingsAndPreferences: PropTypes.func.isRequired,\n theme: PropTypes.object.isRequired\n}\n\nexport default withTheme(Admin)\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification} from 'tocco-app-extensions'\n\nimport {loadPrincipal} from '../../modules/session/actions'\nimport {initializeNavigation, setMenuOpen} from '../../modules/navigation/actions'\nimport {loadSettingsAndPreferences} from '../../modules/preferences/actions'\nimport Admin from './Admin'\n\nconst mapActionCreators = {\n loadPrincipal,\n confirm: notification.confirm,\n initializeNavigation,\n setMenuOpen,\n loadSettingsAndPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n baseRoute: state.input.baseRoute,\n menuOpen: state.navigation.menuOpen\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Admin))\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {LoadMask} from 'tocco-ui'\nimport {Helmet} from 'react-helmet'\n\nimport Login from '../../components/Login'\nimport Admin from '../Admin'\n\nconst LoginGuard = ({doSessionCheck, loggedIn}) => {\n useEffect(() => {\n doSessionCheck()\n }, [])\n\n return (\n <div>\n <Helmet defer={false}>\n <title>Tocco</title>\n </Helmet>\n <LoadMask required={[loggedIn !== undefined]} loadingText=\"Logging in...\">\n <div>\n {!loggedIn ? <Login/> : <Admin/>}\n </div>\n </LoadMask>\n </div>\n )\n}\n\nLoginGuard.propTypes = {\n loggedIn: PropTypes.bool,\n doSessionCheck: PropTypes.func.isRequired\n}\n\nexport default LoginGuard\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\nimport {notification, login} from 'tocco-app-extensions'\n\nimport LoginGuard from './LoginGuard'\n\nconst mapActionCreators = {\n doSessionCheck: login.doSessionCheck,\n confirm: notification.confirm\n}\n\nconst mapStateToProps = (state, props) => ({\n loggedIn: state.login.loggedIn\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(LoginGuard))\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {queryString as queryStringUtil} from 'tocco-util'\nimport {AdminLink as StyledLink} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {goBack} from '../../../utils/routing'\n\nconst DetailLinkRelativeWithoutIntl = ({entityKey, 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 {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\" neutral={false}>{children}</StyledLink>\n\nexport const ListLink = ({entityName, entityKeys, children}) => {\n const queryString = entityKeys && entityKeys.length > 0 && 'tql=KEYS(' + entityKeys.join(',') + ')'\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 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) => {\n const url = history.createHref({pathname: `/e/${entityName}/${key}`})\n window.open(url, '_blank')\n }\n\n return {\n DetailLink,\n ListLink,\n DetailLinkRelative,\n navigateToCreateRelative,\n navigateToActionRelative,\n openDetail\n }\n}\n\nDetailLinkRelativeWithoutIntl.propTypes = {\n entityKey: 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","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 = 'PasswordUpdateDialog/SET_USERNAME'\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 setUsername = username => ({\n type: SET_USERNAME,\n payload: {\n username\n }\n})\n","export const REQUEST_PASSWORD = 'Login/REQUEST_PASSWORD'\nexport const PASSWORD_REQUEST = 'Login/PASSWORD_REQUEST'\nexport const SET_USERNAME = 'Login/SET_USERNAME'\n\nexport const requestPassword = username => ({\n type: REQUEST_PASSWORD,\n payload: {\n username\n }\n})\n\nexport const setPasswordRequest = passwordRequest => ({\n type: PASSWORD_REQUEST,\n payload: {\n passwordRequest\n }\n})\n\nexport const setUsername = username => ({\n type: SET_USERNAME,\n payload: {\n username\n }\n})\n","export const CHANGE_PAGE = 'Login/CHANGE_PAGE'\nexport const SET_USERNAME = 'Login/SET_USERNAME'\nexport const SET_PASSWORD = 'Login/SET_PASSWORD'\nexport const SET_CAPTCHA_KEY = 'login/SET_CAPTCHA_KEY'\n\nexport const changePage = page => ({\n type: CHANGE_PAGE,\n payload: {\n page\n }\n})\n\nexport const setUsername = username => ({\n type: SET_USERNAME,\n payload: {\n username\n }\n})\n\nexport const setPassword = password => ({\n type: SET_PASSWORD,\n payload: {\n password\n }\n})\n\nexport const setCaptchaKey = captchaKey => ({\n type: SET_CAPTCHA_KEY,\n payload: {\n captchaKey\n }\n})\n","export const Pages = {\n LOGIN_FORM: 'LOGIN_FORM',\n PASSWORD_REQUEST: 'PASSWORD_REQUEST',\n TWOSTEPLOGIN: 'TWOSTEPLOGIN',\n PASSWORD_UPDATE: 'PASSWORD_UPDATE',\n TWOSTEPLOGIN_ACTIVATION: 'TWOSTEPLOGIN_ACTIVATION'\n}\n","import styled from 'styled-components'\nimport {\n StyledInputCss,\n StyledEditableWrapperCss,\n Button,\n theme,\n scale\n} from 'tocco-ui'\nimport {StyledButton} from 'tocco-ui/src/Button'\nimport {StyledButtonGroup} from 'tocco-ui/src/ButtonGroup'\n\nexport const StyledLoginFormInput = styled.input`\n /* stylelint-disable-next-line block-no-empty */\n @keyframes onAutoFillStart {\n from {}\n }\n\n && {\n transition: background-color 50000s, color 50000s, filter 50000s;\n\n &:-webkit-autofill {\n animation-duration: 50000s;\n animation-name: onAutoFillStart;\n }\n padding-top: .7rem;\n padding-bottom: .7rem;\n }\n ${StyledInputCss}\n`\n\nexport const StyledLoginFormInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n\nexport const StyledLoginButton = styled(Button)`\n &&& {\n font-size: ${scale.font(1.3)};\n border-radius: ${theme.radii('large')};\n display: flex;\n justify-content: center;\n padding: 1.25rem 0;\n width: 100%;\n margin-top: 20px;\n margin-bottom: 10px;\n\n &:not(:last-child) {\n margin-right: 0;\n }\n }\n`\n\nexport const StyledTransparentButton = styled(Button)`\n &&& {\n margin-right: 0;\n background-color: transparent;\n color: ${theme.color('primary')};\n padding: 1.25rem 0;\n width: 100%;\n justify-content: center;\n\n &:hover {\n background-color: transparent;\n }\n }\n`\n\nexport const StyledLoginFormWrapper = styled.div`\n ${StyledButtonGroup} {\n margin-top: 1.8rem;\n width: auto;\n flex-direction: column;\n\n ${StyledButton} {\n flex-grow: 1;\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useEffect, useState, useRef} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n SignalList,\n StatedValue,\n Typography\n} from 'tocco-ui'\nimport ReCAPTCHA from 'react-google-recaptcha'\n\nimport {\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton,\n StyledLoginButton\n} from '../StyledLoginForm'\nimport {Pages} from '../../types/Pages'\n\nconst LoginForm = ({\n captchaKey,\n changePage,\n intl,\n login,\n loginPending,\n message,\n password,\n recaptchaActivated,\n setPassword,\n setUsername,\n showTitle,\n username\n}) => {\n const [autoFill, setAutoFill] = useState(false)\n const recaptchaRef = useRef()\n\n const msg = id => intl.formatMessage({id})\n\n useEffect(() => {\n if (recaptchaActivated) {\n handleSubmit()\n }\n }, [recaptchaActivated])\n\n const handleSubmit = async e => {\n if (e) {\n e.preventDefault()\n }\n\n let recaptchaToken = null\n if (recaptchaActivated) {\n recaptchaToken = await recaptchaRef.current.executeAsync()\n recaptchaRef.current.reset()\n }\n\n login(username, password, recaptchaToken)\n }\n\n const handleUsernameChange = e => {\n setUsername(e.target.value)\n setAutoFill(false)\n }\n\n const handlePasswordChange = e => {\n setPassword(e.target.value)\n setAutoFill(false)\n }\n\n const handleAutoFill = e => {\n if (e.animationName === 'onAutoFillStart') {\n setAutoFill(true)\n }\n }\n\n const passwordFocus = !!username\n const usernameFocus = !passwordFocus\n\n return <StyledLoginFormWrapper>\n {showTitle\n && <React.Fragment>\n <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>\n <Typography.P><FormattedMessage id=\"client.login.form.introduction\"/></Typography.P>\n </React.Fragment>}\n <form onSubmit={handleSubmit}>\n <StatedValue\n hasValue={!!username || autoFill}\n id=\"login-username\"\n label={msg('client.login.form.userPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n autoFocus={usernameFocus}\n name=\"user\"\n data-cy=\"login-form_user-input\"\n onChange={handleUsernameChange}\n required\n type=\"text\"\n value={username}\n onAnimationStart={handleAutoFill}\n onFocus={e => e.target.select()}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n <StatedValue\n hasValue={!!password || autoFill}\n id=\"login-password\"\n label={msg('client.login.form.passwordPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n autoFocus={passwordFocus}\n name=\"password\"\n data-cy=\"login-form_password-input\"\n onChange={handlePasswordChange}\n required\n type=\"password\"\n value={password}\n onAnimationStart={handleAutoFill}\n onFocus={e => e.target.select()}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n {\n message && message.text\n && <SignalList.List>\n <SignalList.Item\n condition={message.negative ? 'danger' : 'base'}\n label={message.text}\n />\n </SignalList.List>\n }\n {captchaKey && recaptchaActivated && <ReCAPTCHA\n ref={recaptchaRef}\n badge=\"bottomright\"\n size=\"invisible\"\n sitekey={captchaKey}\n hl={intl.locale}\n />}\n <StyledLoginButton\n disabled={!autoFill && (loginPending || username === '' || password === '')}\n ink=\"primary\"\n look=\"raised\"\n label={msg('client.login.form.button')}\n pending={loginPending}\n type=\"submit\"\n data-cy=\"login-form_login-button\"\n />\n <StyledTransparentButton\n label={msg('client.login.form.forgotLink')}\n onClick={() => changePage(Pages.PASSWORD_REQUEST)}\n data-cy=\"login-form_request-button\"\n />\n </form>\n </StyledLoginFormWrapper>\n}\n\nLoginForm.propTypes = {\n captchaKey: PropTypes.string,\n changePage: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n login: PropTypes.func.isRequired,\n loginPending: PropTypes.bool.isRequired,\n message: PropTypes.shape({\n negative: PropTypes.bool,\n text: PropTypes.string\n }),\n password: PropTypes.string,\n recaptchaActivated: PropTypes.bool,\n setPassword: PropTypes.func.isRequired,\n setUsername: PropTypes.func.isRequired,\n showTitle: PropTypes.bool,\n username: PropTypes.string\n}\n\nexport default LoginForm\n","import LoginForm from './LoginForm'\n\nexport default LoginForm\n","export const INITIALIZE = 'login/INITIALIZE'\nexport const INITIALIZED = 'Login/INITIALIZED'\nexport const LOGIN = 'Login/LOGIN'\n\nexport const initialized = () => ({\n type: INITIALIZED\n})\n\nexport const login = (username, password, captchaToken) => ({\n type: LOGIN,\n payload: {\n username,\n password,\n captchaToken\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport LoginForm from '../components/LoginForm'\nimport {changePage, setUsername, setPassword} from '../modules/login/actions'\nimport {login} from '../modules/actions'\n\nconst mapActionCreators = {\n changePage,\n setUsername,\n setPassword,\n login\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n message: state.loginForm.message,\n loginPending: state.loginForm.loginPending,\n captchaKey: state.login.captchaKey,\n recaptchaActivated: state.loginForm.recaptchaActivated\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(LoginForm))\n","import styled from 'styled-components'\nimport {\n StyledInputCss,\n StyledEditableWrapperCss\n} from 'tocco-ui'\n\nexport const StyledPasswordInput = styled.input.attrs(props => ({\n type: 'password'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport const StyledPasswordInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {design, StatedValue} from 'tocco-ui'\n\nimport {StyledPasswordInput, StyledPasswordInputWrapper} from './StyledPasswordInput'\n\nconst PasswordInput = props => {\n const getSignal = props.value\n ? props.valid === undefined\n ? null\n : props.valid\n ? design.condition.SUCCESS\n : design.condition.DANGER\n : null\n\n return (\n <StatedValue\n hasValue={!!props.value}\n id={`${props.name}-input`}\n immutable={props.readOnly === true}\n label={props.label}\n signal={getSignal}\n >\n <StyledPasswordInputWrapper immutable={props.readOnly === true}>\n <StyledPasswordInput\n id={`${props.name}-input`}\n value={props.value}\n onChange={e => props.onChange(e.target.value)}\n disabled={props.readOnly === true}\n immutable={props.readOnly === true}\n onKeyDown={props.onKeyDown}\n autoFocus={props.autoFocus}\n />\n </StyledPasswordInputWrapper>\n </StatedValue>\n )\n}\n\nPasswordInput.propTypes = {\n name: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n value: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n readOnly: PropTypes.bool,\n onKeyDown: PropTypes.func,\n autoFocus: PropTypes.bool,\n valid: PropTypes.bool\n}\n\nexport default PasswordInput\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui/src/Button'\n\nexport default styled.div`\n ${StyledButton} {\n width: 100%;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {design, SignalList} from 'tocco-ui'\n\nconst ValidationRules = props => (\n <SignalList.List>\n {props.rules.map((rule, index) => {\n let condition = null\n\n let message = rule.message\n\n if (props.errors) {\n const error = props.errors[rule.name]\n if (error === true) {\n condition = design.condition.DANGER\n } else if (typeof error === 'string') {\n condition = design.condition.DANGER\n message = error\n } else {\n condition = design.condition.SUCCESS\n }\n }\n\n return (\n <SignalList.Item\n condition={condition}\n key={index}\n label={message}\n />\n )\n })}\n </SignalList.List>\n)\n\nValidationRules.propTypes = {\n errors: PropTypes.object,\n rules: PropTypes.array.isRequired,\n rulesNeutral: PropTypes.bool\n}\n\nexport default ValidationRules\n","import ValidationRules from './ValidationRules'\n\nexport default ValidationRules\n","export const DEFAULT = 'client.login.passwordUpdate.failure'\n\nexport const messages = {\n INVALID_CREDENTIALS: 'client.login.passwordUpdate.invalidCredentials',\n UNEXPECTED_ERROR: 'client.login.passwordUpdate.unexpectedError'\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {design, SignalList} from 'tocco-ui'\n\nimport {messages, DEFAULT as DEFAULT_MESSAGE} from './messages'\n\nfunction getMessage(errorCode) {\n return messages[errorCode] || DEFAULT_MESSAGE\n}\n\nconst FailureMessage = props => (\n <SignalList.List>\n <SignalList.Item condition={design.condition.DANGER}>\n <FormattedMessage id={getMessage(props.errorCode)}/>\n </SignalList.Item>\n </SignalList.List>\n)\n\nFailureMessage.propTypes = {\n errorCode: PropTypes.string\n}\n\nexport default FailureMessage\n","import FailureMessage from './FailureMessage'\n\nexport default FailureMessage\n","import PropTypes from 'prop-types'\nimport React, {useRef, useEffect} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {LoadMask, SignalList, Typography} from 'tocco-ui'\nimport styled from 'styled-components'\nimport ReCAPTCHA from 'react-google-recaptcha'\n\nimport PasswordInput from './PasswordInput'\nimport StyledPasswordUpdateDialog from './StyledPasswordUpdateDialog'\nimport ValidationRules from '../ValidationRules'\nimport FailureMessage from '../FailureMessage'\nimport {StyledLoginButton} from '../../StyledLoginForm'\n\nconst StyledValidationRulesWrapper = styled.div`\n margin: 1rem;\n`\n\nconst PasswordUpdateDialog = ({\n captchaKey,\n fetchValidationRules,\n forcedUpdate,\n initialized,\n intl,\n password,\n savePassword,\n showOldPasswordField,\n showTitle,\n updateNewPassword,\n updateNewPasswordRepeat,\n updateOldPassword,\n validationRules\n}) => {\n const recaptchaRef = useRef()\n\n useEffect(() => {\n fetchValidationRules()\n }, [])\n\n useEffect(() => {\n if (validationRules) {\n initialized()\n }\n }, [validationRules])\n\n const handleSubmit = async e => {\n e.preventDefault()\n\n if (isSubmittable() === true) {\n const recaptchaToken = await recaptchaRef.current.executeAsync()\n recaptchaRef.current.reset()\n savePassword(recaptchaToken)\n }\n }\n\n const isSubmittable = () => {\n if (!password.newPasswordRepeat) {\n return false\n }\n if (password.newPassword !== password.newPasswordRepeat) {\n return false\n }\n if (password.passwordUpdatePending) {\n return false\n }\n return true\n }\n\n const msg = id => intl.formatMessage({id})\n\n if (!validationRules) {\n return <LoadMask/>\n }\n\n const oldPasswordReadOnly = password.passwordUpdatePending\n const newPasswordReadOnly = (!password.oldPassword && showOldPasswordField)\n || password.passwordUpdatePending\n const newPasswordRepeatReadOnly = !password.newPassword\n || password.passwordUpdatePending\n || (password.newPasswordValidationErrors && Object.keys(password.newPasswordValidationErrors).length > 0)\n\n return <StyledPasswordUpdateDialog>\n {showTitle\n && <Typography.H5><FormattedMessage id=\"client.login.passwordUpdate.title\"/></Typography.H5>}\n {forcedUpdate\n && <Typography.P><FormattedMessage id=\"client.login.passwordUpdate.introduction\"/></Typography.P>}\n <form onSubmit={handleSubmit}>\n {showOldPasswordField === true\n && <PasswordInput\n tabIndex={1}\n label={msg('client.login.passwordUpdate.oldPassword')}\n name=\"oldPassword\"\n value={password.oldPassword}\n onChange={updateOldPassword}\n readOnly={oldPasswordReadOnly}\n autoFocus\n {...(password.passwordUpdateFailed && password.passwordUpdateErrorCode === 'INVALID_CREDENTIALS'\n && {valid: false})\n }\n />}\n <PasswordInput\n tabIndex={2}\n label={msg('client.login.passwordUpdate.newPassword')}\n name=\"newPassword\"\n value={password.newPassword}\n onChange={updateNewPassword}\n readOnly={newPasswordReadOnly}\n autoFocus={showOldPasswordField !== true}\n valid={!newPasswordRepeatReadOnly}\n />\n <StyledValidationRulesWrapper>\n <ValidationRules\n rules={validationRules}\n errors={password.newPasswordValidationErrors}\n rulesNeutral={!password.newPassword}\n />\n </StyledValidationRulesWrapper>\n <PasswordInput\n tabIndex={3}\n label={msg('client.login.passwordUpdate.newPasswordRepeat')}\n name=\"newPasswordRepeat\"\n value={password.newPasswordRepeat}\n onChange={updateNewPasswordRepeat}\n readOnly={newPasswordRepeatReadOnly}\n valid={isSubmittable()}\n />\n\n {\n password.newPasswordRepeat\n && password.newPassword !== password.newPasswordRepeat\n && <SignalList.List>\n <SignalList.Item condition=\"danger\" label={<FormattedMessage id=\"client.login.passwordUpdate.noMatch\"/>}/>\n </SignalList.List>\n }\n\n {password.passwordUpdateFailed === true && <FailureMessage errorCode={password.passwordUpdateErrorCode}/>}\n <StyledLoginButton\n pending={password.passwordUpdatePending}\n disabled={isSubmittable() === false}\n ink=\"primary\"\n label={msg('client.login.passwordUpdate.saveButton')}\n look=\"raised\"\n type=\"submit\"\n />\n {captchaKey && <ReCAPTCHA\n ref={recaptchaRef}\n badge=\"bottomright\"\n size=\"invisible\"\n sitekey={captchaKey}\n hl={intl.locale}\n />}\n </form>\n </StyledPasswordUpdateDialog>\n}\n\nPasswordUpdateDialog.propTypes = {\n captchaKey: PropTypes.string,\n fetchValidationRules: PropTypes.func.isRequired,\n forcedUpdate: PropTypes.bool,\n initialized: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n password: PropTypes.shape({\n newPassword: PropTypes.string.isRequired,\n newPasswordRepeat: PropTypes.string.isRequired,\n newPasswordValidationErrors: PropTypes.object,\n oldPassword: PropTypes.string.isRequired,\n passwordUpdateErrorCode: PropTypes.string,\n passwordUpdateFailed: PropTypes.bool,\n passwordUpdatePending: PropTypes.bool.isRequired\n }).isRequired,\n savePassword: PropTypes.func.isRequired,\n showOldPasswordField: PropTypes.bool,\n showTitle: PropTypes.bool,\n updateNewPassword: PropTypes.func.isRequired,\n updateNewPasswordRepeat: PropTypes.func.isRequired,\n updateOldPassword: PropTypes.func.isRequired,\n validationRules: PropTypes.array\n}\n\nexport default PasswordUpdateDialog\n","import PasswordUpdateDialog from './PasswordUpdateDialog'\n\nexport default PasswordUpdateDialog\n","export const INITIALIZED = 'INITIALIZED'\n\nexport const initialized = () => ({\n type: INITIALIZED\n})\n","export const UPDATE_OLD_PASSWORD = 'PasswordUpdateDialog/UPDATE_OLD_PASSWORD'\nexport const UPDATE_NEW_PASSWORD = 'PasswordUpdateDialog/UPDATE_NEW_PASSWORD'\nexport const SET_NEW_PASSWORD = 'PasswordUpdateDialog/SET_NEW_PASSWORD'\nexport const SET_NEW_PASSWORD_VALIDATION_ERRORS = 'PasswordUpdateDialog/SET_NEW_PASSWORD_VALIDATION_ERRORS'\nexport const UPDATE_NEW_PASSWORD_REPEAT = 'PasswordUpdateDialog/UPDATE_NEW_PASSWORD_REPEAT'\nexport const SAVE_PASSWORD = 'PasswordUpdateDialog/SAVE_PASSWORD'\nexport const SAVE_PASSWORD_SUCCESS = 'PasswordUpdateDialog/SAVE_PASSWORD_SUCCESS'\nexport const SAVE_PASSWORD_FAILURE = 'PasswordUpdateDialog/SAVE_PASSWORD_FAILURE'\nexport const VALIDATE = 'PasswordUpdateDialog/VALIDATE'\nexport const RESET_PASSWORD_UPDATED_FAILED = 'PasswordUpdateDialog/RESET_PASSWORD_UPDATED_FAILED'\n\nexport const updateOldPassword = oldPassword => ({\n type: UPDATE_OLD_PASSWORD,\n payload: {\n oldPassword\n }\n})\n\nexport const updateNewPassword = newPassword => ({\n type: UPDATE_NEW_PASSWORD,\n payload: {\n newPassword\n }\n})\n\nexport const setNewPassword = newPassword => ({\n type: SET_NEW_PASSWORD,\n payload: {\n newPassword\n }\n})\n\nexport const setNewPasswordValidationErrors = errors => ({\n type: SET_NEW_PASSWORD_VALIDATION_ERRORS,\n payload: {\n errors\n }\n})\n\nexport const updateNewPasswordRepeat = newPasswordRepeat => ({\n type: UPDATE_NEW_PASSWORD_REPEAT,\n payload: {\n newPasswordRepeat\n }\n})\n\nexport const savePassword = captchaToken => ({\n type: SAVE_PASSWORD,\n payload: {\n captchaToken\n }\n})\n\nexport const savePasswordSuccess = () => ({\n type: SAVE_PASSWORD_SUCCESS\n})\n\nexport const savePasswordFailure = (errorCode, validationMessages) => ({\n type: SAVE_PASSWORD_FAILURE,\n payload: {\n errorCode,\n validationMessages\n }\n})\n\nexport const validate = () => ({\n type: VALIDATE\n})\n\nexport const resetPasswordUpdateFailed = () => ({\n type: RESET_PASSWORD_UPDATED_FAILED\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport PasswordUpdateDialog from '../components/passwordUpdate/PasswordUpdateDialog'\nimport {initialized} from '../modules/passwordUpdate/actions'\nimport {\n updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword\n} from '../modules/passwordUpdate/password'\nimport {fetchValidationRules} from '../modules/passwordUpdate/validationRules'\n\nconst mapActionCreators = {\n updateOldPassword,\n updateNewPassword,\n updateNewPasswordRepeat,\n fetchValidationRules,\n savePassword,\n initialized\n}\n\nconst mapStateToProps = state => ({\n password: state.passwordUpdate.password,\n validationRules: state.passwordUpdate.validationRules,\n showOldPasswordField: state.passwordUpdate.dialog.showOldPasswordField,\n forcedUpdate: state.passwordUpdate.dialog.forcedUpdate,\n captchaKey: state.login.captchaKey\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(PasswordUpdateDialog))\n","export const FETCH_VALIDATION_RULES = 'PasswordUpdateDialog/FETCH_VALIDATION_RULES'\nexport const SET_VALIDATION_RULES = 'PasswordUpdateDialog/SET_VALIDATION_RULES'\n\nexport const fetchValidationRules = () => ({\n type: FETCH_VALIDATION_RULES\n})\n\nexport const setValidationRules = rules => ({\n type: SET_VALIDATION_RULES,\n payload: {\n rules\n }\n})\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n StatedValue,\n Typography\n} from 'tocco-ui'\n\nimport {\n StyledLoginFormInput,\n StyledLoginFormInputWrapper,\n StyledLoginFormWrapper,\n StyledTransparentButton,\n StyledLoginButton\n} from '../StyledLoginForm'\nimport {Pages} from '../../types/Pages'\n\nexport class PasswordRequest extends React.Component {\n constructor(props) {\n super(props)\n this.state = {\n username: this.props.username || ''\n }\n }\n\n handleSubmit(e) {\n e.preventDefault()\n this.props.requestPassword(this.state.username)\n }\n\n handleUsernameChange(e) {\n this.setState({\n username: e.target.value\n })\n }\n\n render() {\n return (\n <StyledLoginFormWrapper>\n {this.props.showTitle\n && <Typography.H5><FormattedMessage id=\"client.login.passwordRequest.title\"/></Typography.H5>}\n <Typography.P><FormattedMessage id=\"client.login.passwordRequest.introduction\"/></Typography.P>\n <form onSubmit={this.handleSubmit.bind(this)}>\n <StatedValue\n hasValue={!!this.state.username}\n id=\"login-username\"\n label={this.msg('client.login.form.userPlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <StyledLoginFormInput\n name=\"user\"\n onChange={this.handleUsernameChange.bind(this)}\n required\n type=\"text\"\n value={this.state.username}\n data-cy=\"password-request_input\"\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n\n <StyledLoginButton\n look=\"raised\"\n disabled={!this.state.username || this.props.pending}\n ink=\"primary\"\n label={this.msg('client.login.passwordRequest.button')}\n pending={this.props.pending}\n type=\"submit\"\n data-cy=\"password-request_submit-button\"\n />\n <StyledTransparentButton\n disabled={this.props.pending}\n label={this.msg('client.login.passwordRequest.abortButton')}\n name=\"abort\"\n onClick={() => this.props.changePage(Pages.LOGIN_FORM)}\n data-cy=\"password-request_abort-button\"\n />\n </form>\n </StyledLoginFormWrapper>\n )\n }\n\n msg(id) {\n return this.props.intl.formatMessage({\n id\n })\n }\n}\n\nPasswordRequest.propTypes = {\n intl: PropTypes.object.isRequired,\n changePage: PropTypes.func.isRequired,\n requestPassword: PropTypes.func.isRequired,\n showTitle: PropTypes.bool,\n pending: PropTypes.bool,\n username: PropTypes.string\n}\n","import {PasswordRequest} from './PasswordRequest'\n\nexport default PasswordRequest\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport PasswordRequest from '../components/PasswordRequest'\nimport {changePage} from '../modules/login/actions'\nimport {requestPassword} from '../modules/passwordRequest/actions'\n\nconst mapActionCreators = {\n changePage,\n requestPassword\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n pending: state.loginForm.loginPending\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(PasswordRequest))\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui/src/Button'\nimport {StyledEditableValue, StyledInputCss} from 'tocco-ui/src/EditableValue/StyledEditableValue'\n\nexport const StyledTwoStepLogin = styled.div`\n ${StyledButton} {\n width: 100%;\n }\n\n ${StyledEditableValue} {\n ${StyledInputCss}\n padding-top: .7rem;\n padding-bottom: .7rem;\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useLayoutEffect, useRef} from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n StatedValue,\n Typography,\n EditableValue\n} from 'tocco-ui'\n\nimport {\n StyledTwoStepLogin\n} from './StyledTwoStepLoginForm'\nimport {StyledLoginButton, StyledLoginFormInputWrapper} from '../StyledLoginForm'\n\nconst TwoStepLoginForm = ({username, password, showTitle, loginPending, twoStepLogin, intl}) => {\n const [userCode, setUserCode] = useState(null)\n const formEl = useRef()\n\n useLayoutEffect(() => {\n const firstInput = formEl.current.querySelector('input')\n firstInput.focus()\n }, [])\n\n const handleSubmit = e => {\n e.preventDefault()\n twoStepLogin(username, password, userCode)\n }\n\n const msg = id => intl.formatMessage({id})\n return <StyledTwoStepLogin>\n {showTitle && <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>}\n <form onSubmit={handleSubmit} ref={formEl}>\n <Typography.P><FormattedMessage id=\"client.login.twoStepLogin.introduction\"/></Typography.P>\n <StatedValue\n hasValue={!!userCode}\n id=\"twoFactorCode-label\"\n label={msg('client.login.twoStepLogin.codePlaceholder')}\n >\n <StyledLoginFormInputWrapper>\n <EditableValue\n type=\"integer\"\n value={userCode}\n events={{onChange: setUserCode}}\n options={{format: '### ###', allowLeadingZeros: true}}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n <StyledLoginButton\n disabled={!userCode || userCode.toString().length < 6 || loginPending}\n ink=\"primary\"\n label={msg('client.login.form.button')}\n look=\"raised\"\n name=\"submit\"\n pending={loginPending}\n type=\"submit\"\n />\n </form>\n </StyledTwoStepLogin>\n}\n\nTwoStepLoginForm.propTypes = {\n intl: PropTypes.object.isRequired,\n twoStepLogin: PropTypes.func.isRequired,\n username: PropTypes.string.isRequired,\n password: PropTypes.string.isRequired,\n showTitle: PropTypes.bool,\n loginPending: PropTypes.bool\n}\n\nexport default TwoStepLoginForm\n","import TwoStepLoginForm from './TwoStepLoginForm'\n\nexport default TwoStepLoginForm\n","export const TWOSTEPLOGIN = 'Login/TWOSTEPLOGIN'\nexport const SET_SECRET = 'Login/SET_SECRET'\n\nexport const twoStepLogin = (username, password, userCode) => ({\n type: TWOSTEPLOGIN,\n payload: {\n username,\n password,\n userCode\n }\n})\n\nexport const setSecret = secret => ({\n type: SET_SECRET,\n payload: {\n secret\n }\n})\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport TwoStepLoginForm from '../components/TwoStepLoginForm'\nimport {twoStepLogin} from '../modules/twoStepLogin/actions'\n\nconst mapActionCreators = {\n twoStepLogin\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n loginPending: state.loginForm.loginPending\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(TwoStepLoginForm))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport {\n Typography\n} from 'tocco-ui'\nimport TwoFactorConnectorApp from 'tocco-two-factor-connector/src/main'\n\nimport {Pages} from '../../types/Pages'\n\nconst TwoFactorConnectorForm = ({username, password, secret, showTitle, changePage}) => {\n return <div>\n {showTitle && <Typography.H5><FormattedMessage id=\"client.login.form.title\"/></Typography.H5>}\n <TwoFactorConnectorApp\n username={username}\n password={password}\n secret={secret}\n forced={true}\n onSuccess={() => {\n changePage(Pages.LOGIN_FORM)\n }}\n />\n </div>\n}\n\nTwoFactorConnectorForm.propTypes = {\n username: PropTypes.string.isRequired,\n password: PropTypes.string.isRequired,\n secret: PropTypes.shape({\n text: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }).isRequired,\n showTitle: PropTypes.bool,\n changePage: PropTypes.func.isRequired\n}\n\nexport default TwoFactorConnectorForm\n","import TwoFactorConnectorForm from './TwoFactorConnectorForm'\n\nexport default TwoFactorConnectorForm\n","import {connect} from 'react-redux'\n\nimport TwoFactorConnectorForm from '../components/TwoFactorConnectorForm'\nimport {changePage} from '../modules/login/actions'\n\nconst mapActionCreators = {\n changePage\n}\n\nconst mapStateToProps = state => ({\n username: state.login.username,\n password: state.login.password,\n secret: state.twoStepLogin.secret\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(TwoFactorConnectorForm)\n","import PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {createGlobalStyle} from 'styled-components'\n\nimport {Pages} from '../../types/Pages'\nimport LoginFormContainer from '../../containers/LoginFormContainer'\nimport PasswordUpdateContainer from '../../containers/PasswordUpdateDialogContainer'\nimport PasswordRequestContainer from '../../containers/PasswordRequestContainer'\nimport TwoStepLoginContainer from '../../containers/TwoStepLoginContainer'\nimport TwoFactorConnectorContainer from '../../containers/TwoFactorConnectorContainer'\n\nconst GlobalRecaptchaBadgeStyle = createGlobalStyle`\n .grecaptcha-badge {\n z-index: 9999999;\n opacity: .8;\n }\n`\n\nconst Login = props => {\n useEffect(() => {\n props.initialize()\n }, [])\n\n return <>\n <GlobalRecaptchaBadgeStyle/>\n {(() => {\n switch (props.currentPage) {\n case Pages.PASSWORD_UPDATE:\n return <PasswordUpdateContainer showTitle={props.showTitle}/>\n case Pages.PASSWORD_REQUEST:\n return <PasswordRequestContainer showTitle={props.showTitle}/>\n case Pages.TWOSTEPLOGIN:\n return <TwoStepLoginContainer showTitle={props.showTitle}/>\n case Pages.TWOSTEPLOGIN_ACTIVATION:\n return <TwoFactorConnectorContainer/>\n default:\n return <LoginFormContainer showTitle={props.showTitle}/>\n }\n })()}\n </>\n}\n\nLogin.propTypes = {\n initialize: PropTypes.func.isRequired,\n currentPage: PropTypes.string,\n showTitle: PropTypes.bool\n}\n\nexport default Login\n","import Login from './Login'\n\nexport default Login\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Login from '../components/Login'\nimport {initialize} from '../modules/actions'\n\nconst mapActionCreators = {\n initialize\n}\n\nconst mapStateToProps = (state, props) => ({\n currentPage: props.currentPage || state.login.currentPage,\n showTitle: props.showTitle\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Login))\n","import {externalEvents} from 'tocco-app-extensions'\nimport {put, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nexport function* resizeWatcher() {\n yield put(externalEvents.fireExternalEvent('resize'))\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZED, resizeWatcher)\n ])\n}\n","export function isEmptyObject(object) {\n // http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object\n return Object.keys(object).length === 0 && object.constructor === Object\n}\n\nexport function validationMessagesToErrorMap(messages) {\n const errors = {}\n messages.forEach(message => {\n errors[message.ruleName] = message.message\n })\n return errors\n}\n","import * as actions from './actions'\nimport {validationMessagesToErrorMap} from './utils'\n\nconst initialState = {\n oldPassword: '',\n newPassword: '',\n newPasswordRepeat: '',\n newPasswordValidationErrors: null,\n passwordUpdatePending: false,\n passwordUpdateFailed: false,\n passwordUpdateErrorCode: null\n}\n\nconst updateOldPassword = (state, {payload}) => ({\n ...state,\n oldPassword: payload.oldPassword\n})\n\nconst setNewPassword = (state, {payload}) => ({\n ...state,\n newPassword: payload.newPassword\n})\n\nconst setNewPasswordValidationErrors = (state, {payload}) => ({\n ...state,\n newPasswordValidationErrors: payload.errors\n})\n\nconst updateNewPasswordRepeat = (state, {payload}) => ({\n ...state,\n newPasswordRepeat: payload.newPasswordRepeat\n})\n\nconst savePassword = state => ({\n ...state,\n passwordUpdatePending: true,\n passwordUpdateFailed: false\n})\n\nconst savePasswordSuccess = state => (\n initialState\n)\n\nconst savePasswordFailure = (state, {payload}) => {\n if (payload.validationMessages) {\n const errors = validationMessagesToErrorMap(payload.validationMessages)\n return {\n ...state,\n passwordUpdatePending: false,\n newPasswordValidationErrors: errors\n }\n } else {\n return {\n ...state,\n passwordUpdatePending: false,\n passwordUpdateFailed: true,\n passwordUpdateErrorCode: payload.errorCode\n }\n }\n}\n\nconst resetPasswordUpdateFailed = (state, {payload}) => ({\n ...state,\n passwordUpdateFailed: false\n})\n\nconst ACTION_HANDLERS = {\n [actions.UPDATE_OLD_PASSWORD]: updateOldPassword,\n [actions.SET_NEW_PASSWORD]: setNewPassword,\n [actions.SET_NEW_PASSWORD_VALIDATION_ERRORS]: setNewPasswordValidationErrors,\n [actions.UPDATE_NEW_PASSWORD_REPEAT]: updateNewPasswordRepeat,\n [actions.SAVE_PASSWORD]: savePassword,\n [actions.SAVE_PASSWORD_SUCCESS]: savePasswordSuccess,\n [actions.SAVE_PASSWORD_FAILURE]: savePasswordFailure,\n [actions.RESET_PASSWORD_UPDATED_FAILED]: resetPasswordUpdateFailed\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword} from './actions'\nimport sagas from './sagas'\nimport reducer from './reducer'\n\nexport {updateOldPassword, updateNewPassword, updateNewPasswordRepeat, savePassword}\n\nexport {sagas}\n\nexport default reducer\n","export const RULE_PASSWORD_NOT_CHANGED = 'PASSWORD_NOT_CHANGED'\nexport const RULE_LENGTH = 'LENGTH'\nexport const RULE_CHARACTER_INSUFFICIENT_LOWERCASE = 'CHARACTER_INSUFFICIENT_LOWERCASE'\nexport const RULE_CHARACTER_INSUFFICIENT_UPPERCASE = 'CHARACTER_INSUFFICIENT_UPPERCASE'\nexport const RULE_CHARACTER_INSUFFICIENT_DIGIT = 'CHARACTER_INSUFFICIENT_DIGIT'\n\nfunction validateCharacterRule(password, regex, min, max) {\n if (typeof password !== 'string') {\n return false\n }\n\n const initialLength = password.length\n const lengthWithoutSpecificChars = password.replace(regex, '').length\n const specificCharsCount = initialLength - lengthWithoutSpecificChars\n\n return (min === undefined || min === null || specificCharsCount >= min)\n && (max === undefined || max === null || specificCharsCount <= max)\n}\n\nconst VALIDATORS = {\n [RULE_PASSWORD_NOT_CHANGED]: (newPassword, oldPassword) =>\n typeof newPassword === 'string' && typeof oldPassword === 'string' && newPassword !== oldPassword,\n [RULE_LENGTH]: (newPassword, oldPassword, rule) =>\n typeof newPassword === 'string'\n && (rule.params.min === undefined || rule.params.min === null || newPassword.length >= rule.params.min)\n && (rule.params.max === undefined || rule.params.max === null || newPassword.length <= rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_LOWERCASE]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[a-z]/g, rule.params.min, rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_UPPERCASE]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[A-Z]/g, rule.params.min, rule.params.max),\n [RULE_CHARACTER_INSUFFICIENT_DIGIT]: (newPassword, oldPassword, rule) =>\n validateCharacterRule(newPassword, /[0-9]/g, rule.params.min, rule.params.max)\n}\n\nfunction validate(newPassword, oldPassword, validationRules) {\n const errors = {}\n\n if (validationRules) {\n validationRules.forEach(rule => {\n const validator = VALIDATORS[rule.name]\n if (validator) {\n const valid = validator(newPassword, oldPassword, rule)\n if (valid !== true) {\n errors[rule.name] = true\n }\n }\n })\n }\n\n return errors\n}\n\nexport default validate\n","export const SET_MESSAGE = 'Login/SET_MESSAGE'\nexport const SET_PENDING = 'Login/SET_PENDING'\nexport const ACTIVATE_RECAPTCHA = 'loginForm/ACTIVATE_RECAPTCHA'\r\n\nexport const setMessage = (text, negative = false) => ({\n type: SET_MESSAGE,\n payload: {\n text,\n negative\n }\n})\n\nexport const setPending = (pending = false) => ({\n type: SET_PENDING,\n payload: {\n pending\n }\n})\n\nexport const activateRecaptcha = () => ({\n type: ACTIVATE_RECAPTCHA\n})\n","import {consoleLogger, cache, intl} from 'tocco-util'\nimport {externalEvents, rest} from 'tocco-app-extensions'\nimport {takeLatest, put, select, call, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport * as loginActions from './login/actions'\nimport {setMessage, setPending, activateRecaptcha} from './loginForm/actions'\nimport {updateOldPassword} from './passwordUpdate/password/actions'\nimport {setUsername, setForcedUpdate} from './passwordUpdate/dialog/actions'\nimport {changePage, setPassword} from './login/actions'\nimport {setSecret} from './twoStepLogin/actions'\nimport {Pages} from '../types/Pages'\n\nexport const DEFAULT_TIMEOUT = 30\n\nexport const textResourceSelector = (state, key) => state.intl.messages[key] || key\nexport const loginSelector = state => state.login\n\nexport function doRequest(url, options) {\n return new Promise(resolve => {\n fetch(url, options)\n .then(resp => resp.json().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, `${__BACKEND_URL__}/nice2/login`, getOptions(data))\n}\n\nexport function* doSessionRequest() {\n return yield call(doRequest, `${__BACKEND_URL__}/nice2/session`, getOptions())\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 credentials: 'include',\n body: Object.keys(data)\n .filter(k => !!data[k])\n .sort()\n .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&')\n }\n}\n\nexport function* handleTwoStepLoginResponse() {\n yield put(changePage(Pages.TWOSTEPLOGIN))\n}\n\nexport function* handleTwoStepActivationResponse(response) {\n const twoFactorResponse = response[Pages.TWOSTEPLOGIN_ACTIVATION]\n yield put(setSecret(twoFactorResponse))\n yield put(changePage(Pages.TWOSTEPLOGIN_ACTIVATION))\n}\n\nexport function* handlePasswordUpdateResponse() {\n const login = yield select(loginSelector)\n yield put(updateOldPassword(login.password))\n yield put(setUsername(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 [revisionChanged, localChanged] = yield all([call(rest.hasRevisionIdChanged), call(intl.hasUserLocaleChanged)])\n if (revisionChanged || localChanged) {\n yield call(cache.clearAll)\n } else {\n yield call(cache.clearShortTerm)\n }\n yield put(setPassword(''))\n const timeout = response.timeout || DEFAULT_TIMEOUT\n yield put(externalEvents.fireExternalEvent('loginSuccess', {timeout}))\n}\n\nexport function* loginSaga({payload}) {\n const {username, password, captchaToken, userCode} = payload\n const loginData = {\n username,\n password,\n ...(captchaToken && {captchaToken}),\n ...(userCode && {userCode})\n }\n yield put(setPending(true))\n\n const response = yield call(doLoginRequest, loginData)\n if (response.success) {\n yield call(handleSuccessfulLogin, response)\n } else {\n yield put(changePage(Pages.LOGIN_FORM)) // in order to display possible error message\n if (response.CAPTCHA) {\n yield put(activateRecaptcha())\n } else if (response.TWOSTEPLOGIN) {\n yield call(handleTwoStepLoginResponse, response)\n } else if (response.RESET_PASSWORD_REQUIRED) {\n yield call(handlePasswordUpdateResponse)\n } else if (response.LOGIN_BLOCKED) {\n yield call(handleBlockResponse)\n } else if (response.TWOSTEPLOGIN_ACTIVATION) {\n yield call(handleTwoStepActivationResponse, response)\n } else {\n yield call(handleFailedResponse)\n }\n yield put(setPending(false))\n }\n}\n\nexport function* checkSessionSaga() {\n const response = yield call(doSessionRequest)\n\n if (response.success) {\n yield call(handleSuccessfulLogin, response)\n }\n}\n\nexport function* loadSettings() {\n const settings = yield call(rest.fetchServerSettings)\n yield put(loginActions.setCaptchaKey(settings.captchaKey))\n}\n\nexport function* initialize() {\n yield call(checkSessionSaga)\n yield call(loadSettings)\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.LOGIN, loginSaga),\n takeLatest(actions.INITIALIZE, initialize)\n ])\n}\n","import {externalEvents, rest} from 'tocco-app-extensions'\nimport {takeLatest, call, select, put, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport localValidate from './validate'\nimport {isEmptyObject, validationMessagesToErrorMap} from './utils'\nimport {loginSaga} from '../../sagas'\nimport {setPassword} from '../../login/actions'\n\nexport const validationRulesSelector = state => state.passwordUpdate.validationRules\nexport const inputSelector = state => state.input\nexport const usernameSelector = state => state.passwordUpdate.dialog.username\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(username, 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/${username}/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(username, 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/${username}/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 username = yield select(usernameSelector)\n const data = yield call(getData)\n const result = yield call(remoteValidate, username, 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 username = yield select(usernameSelector)\n const data = yield call(getData)\n const result = yield call(storePassword, username, data, captchaToken)\n\n if (result.error) {\n if (result.error.valid === false) {\n yield put(actions.savePasswordFailure(null, result.error.validationMessages))\n } else {\n yield put(actions.savePasswordFailure(result.error.errorCode))\n }\n } else {\n const standalone = yield select(standaloneSelector)\n if (standalone) {\n yield put(externalEvents.fireExternalEvent('success', {\n newPassword: data.newPassword\n }))\n } else {\n const loginData = yield call(getLoginData)\n yield put(setPassword(loginData.payload.password))\n yield call(loginSaga, loginData)\n }\n\n yield put(actions.savePasswordSuccess())\n }\n}\n\nexport function* getData() {\n const input = yield select(inputSelector)\n const password = yield select(passwordSelector)\n\n return {\n oldPassword: input.oldPassword ? input.oldPassword : password.oldPassword,\n newPassword: password.newPassword\n }\n}\n\nexport function* getLoginData() {\n const password = yield select(passwordSelector)\n const username = yield select(usernameSelector)\n\n return {\n payload: {\n username,\n password: password.newPasswordRepeat\n }\n }\n}\n\nexport function* formChanged() {\n yield put(actions.resetPasswordUpdateFailed())\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.UPDATE_NEW_PASSWORD, updateNewPassword),\n takeLatest(actions.VALIDATE, validate),\n takeLatest(actions.SAVE_PASSWORD, savePassword),\n takeLatest(actions.UPDATE_NEW_PASSWORD, formChanged),\n takeLatest(actions.UPDATE_OLD_PASSWORD, formChanged),\n takeLatest(actions.UPDATE_NEW_PASSWORD_REPEAT, formChanged)\n ])\n}\n","import * as actions from './actions'\n\nconst initialState = {\n showOldPasswordField: true,\n forcedUpdate: false,\n standalone: true,\n username: ''\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]: singleTransferReducer('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 reducer from './reducer'\n\nexport default reducer\n","import * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_VALIDATION_RULES]: (state, action) => action.payload.rules\n}\n\nconst initialState = null\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fetchValidationRules} from './actions'\nimport sagas from './sagas'\nimport reducer from './reducer'\n\nexport {fetchValidationRules}\n\nexport {sagas}\n\nexport default reducer\n","import {rest} from 'tocco-app-extensions'\nimport {takeLatest, call, put, select, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nexport const usernameSelector = state => state.passwordUpdate.dialog.username\nexport const intlSelector = state => state.intl\n\nexport function* loadValidationRules(username, locale = '') {\n const resource = `principals/${username}/password-rules`\n\n const validationResponse = yield call(rest.requestSaga, resource, {queryParams: {locale}})\n return validationResponse.body\n}\n\nexport function* fetchValidationRules() {\n const username = yield select(usernameSelector)\n const {locale} = yield select(intlSelector)\n\n const response = yield call(loadValidationRules, username, locale)\n yield put(actions.setValidationRules(response.rules))\n}\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.FETCH_VALIDATION_RULES, fetchValidationRules)\n ])\n}\n","import mainSagas from './sagas'\nimport password, {sagas as passwordSagas} from './password'\nimport dialog from './dialog'\nimport validationRules, {sagas as validationRulesSagas} from './validationRules'\n\nexport default {\n dialog,\n password,\n validationRules\n}\n\nexport const sagas = [\n mainSagas,\n passwordSagas,\n validationRulesSagas\n]\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\nimport {Pages} from './../../types/Pages'\n\nconst changePage = (state, {payload}) => {\n const {page} = payload\n return {\n ...state,\n currentPage: page\n }\n}\n\nconst setUsername = (state, {payload}) => {\n const {username} = payload\n return {\n ...state,\n username\n }\n}\n\nconst setPassword = (state, {payload}) => {\n const {password} = payload\n return {\n ...state,\n password\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.CHANGE_PAGE]: changePage,\n [actions.SET_USERNAME]: setUsername,\n [actions.SET_PASSWORD]: setPassword,\n [actions.SET_CAPTCHA_KEY]: reducerUtil.singleTransferReducer('captchaKey')\n}\n\nconst initialState = {\n currentPage: Pages.LOGIN_FORM,\n username: '',\n password: '',\n captchaKey: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import {SET_MESSAGE, SET_PENDING, ACTIVATE_RECAPTCHA} from './actions'\n\nconst setMessage = (state, {payload}) => {\n const {text, negative} = payload\n return {\n ...state,\n message: {\n text,\n negative\n }\n }\n}\n\nconst setPending = (state, {payload}) => ({\n ...state,\n loginPending: payload.pending\n})\n\nconst activateRecaptcha = state => ({\n ...state,\n recaptchaActivated: true\n})\n\nconst ACTION_HANDLERS = {\n [SET_MESSAGE]: setMessage,\n [SET_PENDING]: setPending,\n [ACTIVATE_RECAPTCHA]: activateRecaptcha\n}\n\nconst initialState = {\n message: {},\n loginPending: false,\n recaptchaActivated: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\n\nexport default reducer\n","import {takeLatest, call, put, all} from 'redux-saga/effects'\n\nimport {loginSaga} from '../sagas'\nimport {setPending} from '../loginForm/actions'\nimport * as actions from './actions'\n\nexport function* twoStepSaga(args) {\n yield put(setPending(true))\n yield call(loginSaga, args)\n}\n\nexport default function* rootSaga() {\n yield all([\n takeLatest(actions.TWOSTEPLOGIN, twoStepSaga)\n ])\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_SECRET]: reducerUtil.singleTransferReducer('secret')\n}\n\nconst initialState = {\n secret: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport moduleSagas from './sagas'\nimport reducer from './reducer'\n\nexport function* sagas() {\n yield all([\n fork(moduleSagas)\n ])\n}\n\nexport default reducer\n","import {rest} from 'tocco-app-extensions'\nimport {put, call, select, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport {changePage, setUsername} from '../login/actions'\nimport {setMessage, setPending} from '../loginForm/actions'\nimport {Pages} from '../../types/Pages'\n\nexport const textResourceSelector = state => state.intl.messages\n\nexport function* requestPasswordSaga({payload}) {\n yield put(setPending(true))\n yield call(rest.requestSaga, `principals/${payload.username}/password-reset`, {method: 'POST'})\n yield put(setUsername(payload.username))\n const textResourcesState = yield select(textResourceSelector)\n yield put(setMessage(textResourcesState['client.login.from.passwordRequested']))\n yield put(changePage(Pages.LOGIN_FORM))\n yield put(setPending(false))\n}\n\nexport function* passwordRequestSaga({payload}) {\n if (payload.passwordRequest === true) {\n yield put(changePage(Pages.PASSWORD_REQUEST))\n }\n}\n\nexport default function* saga() {\n yield all([\n takeLatest(actions.REQUEST_PASSWORD, requestPasswordSaga),\n takeLatest(actions.PASSWORD_REQUEST, passwordRequestSaga)\n ])\n}\n","import * as actions from './actions'\n\nconst setUsername = (state, {payload}) => {\n const {username} = payload\n return {\n ...state,\n username\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_USERNAME]: setUsername\n}\n\nconst initialState = {\n username: ''\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport moduleSagas from './sagas'\nimport reducer from './reducer'\n\nexport function* sagas() {\n yield all([\n fork(moduleSagas)\n ])\n}\n\nexport default reducer\n","import {combineReducers} from 'redux'\n\nimport passwordUpdateReducers, {sagas as passwordUpdateSagas} from './passwordUpdate/reducers'\nimport login from './login'\nimport loginForm from './loginForm'\nimport twoStepLogin, {sagas as twoStepLoginSagas} from './twoStepLogin'\nimport mainSagas from './sagas'\nimport passwordRequest, {sagas as passwordRequestSagas} from './passwordRequest'\n\nexport default {\n login,\n loginForm,\n passwordRequest,\n passwordUpdate: combineReducers(passwordUpdateReducers),\n twoStepLogin\n}\n\nexport const sagas = [\n mainSagas,\n passwordRequestSagas,\n twoStepLoginSagas,\n ...passwordUpdateSagas\n]\n","import React, {useState, useEffect} from 'react'\nimport {consoleLogger, reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, errorLogging, externalEvents} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport * as passwordUpdate from './modules/passwordUpdate/dialog/actions'\nimport * as passwordRequest from './modules/passwordRequest/actions'\nimport * as login from './modules/login/actions'\nimport LoginContainer from './containers/LoginContainer'\nimport loginReducers, {sagas} from './modules/reducers'\n\nconst packageName = 'login'\n\nconst EXTERNAL_EVENTS = [\n 'loginSuccess',\n 'resize'\n]\n\nconst initLoginApp = (id, input, events, publicPath, customTheme) => {\n const actions = [\n passwordUpdate.setShowOldPasswordField(false),\n passwordUpdate.setStandalone(false),\n passwordRequest.setPasswordRequest(!!input.passwordRequest),\n login.setUsername(input.username)\n ]\n\n const showTitle = !!input.showTitle\n const content = <LoginContainer showTitle={showTitle}/>\n\n const store = appFactory.createStore(loginReducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n }\n )\n}\n\nconst initPasswordUpdateApp = (id, input, events, publicPath, customTheme) => {\n const showTitle = !!input.showTitle\n const forcedUpdate = !!input.forcedUpdate\n\n const content = <LoginContainer currentPage=\"PASSWORD_UPDATE\" showTitle={showTitle}/>\n\n if (typeof input.username !== 'string' || input.username.length === 0) {\n consoleLogger.logError('Mandatory input \"username\" is not set on password-update')\n return\n }\n\n const actions = [\n passwordUpdate.setUsername(input.username),\n passwordUpdate.setForcedUpdate(forcedUpdate)\n ]\n\n if (typeof input.showOldPasswordField === 'boolean') {\n actions.push(passwordUpdate.setShowOldPasswordField(input.showOldPasswordField))\n }\n\n const store = appFactory.createStore(loginReducers, sagas, input, packageName)\n externalEvents.addToStore(store, events)\n errorLogging.addToStore(store, true, ['console', 'remote'])\n\n return appFactory.createApp(\n `${packageName}.passwordUpdate`,\n content,\n store,\n {\n input,\n actions,\n publicPath,\n textResourceModules: ['login'],\n customTheme\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initLoginApp)\n appFactory.registerAppInRegistry('password-update', initPasswordUpdateApp)\n\n if (__DEV__) {\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n }\n \n const app = initLoginApp('id', require('./dev/login_input.json'))\n // uncomment to develop passwordUpdate App\n // const app = initPasswordUpdateApp('id', require('./dev/password_update_input.json'))\n \n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n \n appFactory.renderApp(app.component)\n }\n }\n})()\n\nclass LoginApp extends React.Component {\n constructor(props) {\n super(props)\n this.input = {\n showTitle: props.showTitle,\n locale: props.locale,\n passwordRequest: props.passwordRequest,\n username: props.username || ''\n }\n\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n this.app = initLoginApp('id', this.input, events)\n }\n\n render() {\n return this.app.component\n }\n}\n\nLoginApp.propTypes = {\n showTitle: PropTypes.bool,\n locale: PropTypes.string,\n passwordRequest: PropTypes.bool,\n username: PropTypes.string,\n setLocale: PropTypes.func,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {})\n}\n\nexport default LoginApp\n\nconst EXTERNAL_EVENTS_PASSWORD_UPDATE = [\n 'success',\n 'resize'\n]\n\nexport const PasswordUpdateApp = props => {\n const [app, setApp] = useState(null)\n useEffect(() => {\n const events = EXTERNAL_EVENTS_PASSWORD_UPDATE.reduce((events, event) => (\n {...events, ...(props[event] && {[event]: props[event]})}\n ), {})\n\n setApp(initPasswordUpdateApp('password-update', props, events))\n }, [])\n\n return app ? app.component : null\n}\n\nPasswordUpdateApp.propTypes = {\n username: PropTypes.string,\n showTitle: PropTypes.bool,\n showOldPasswordField: PropTypes.bool,\n oldPassword: PropTypes.string,\n ...EXTERNAL_EVENTS_PASSWORD_UPDATE.reduce((propTypes, event) => ({...propTypes, [event]: PropTypes.func}), {})\n}\n","import {css} from 'styled-components'\n\nimport {declareFont, theme} from '../utilStyles'\n\nexport const linkStyle = css`\n ${declareFont()}\n color: ${theme.color('text')};\n\n * {\n color: ${theme.color('text')};\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n\n &:hover,\n &:hover *,\n &:focus,\n &:focus * {\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n\n &:active,\n &:active * {\n text-decoration: ${({neutral}) => neutral ? 'none' : 'underline'};\n }\n`\n","import {Link} from 'react-router-dom'\nimport styled from 'styled-components'\n\nimport {linkStyle} from './linkStyle'\n\nexport default styled(Link)`\n ${linkStyle}\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledButtonGroup from './StyledButtonGroup'\n\n/**\n * Wrap a Button into a ButtonGroup to control flow and style.\n */\nconst ButtonGroup = React.forwardRef((props, ref) => (\n <StyledButtonGroup ref={ref}>\n {props.children}\n </StyledButtonGroup>\n))\n\nButtonGroup.propTypes = {\n /**\n * List of true buttons morphs into a split button. Default value is 'false'.\n */\n children: PropTypes.node\n}\n\nexport default ButtonGroup\n","import styled from 'styled-components'\n\nimport {StyledButton} from '../Button'\n\nconst StyledButtonGroup = styled.div`\n display: flex;\n\n &&& > ${StyledButton} {\n :not(:first-child) {\n margin-left: -1px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n :not(:last-child) {\n margin-right: 0;\n border-right: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n`\n\nexport default StyledButtonGroup\n","import {createGlobalStyle} from 'styled-components'\n\nimport {theme, declareFont, scale} from '../utilStyles'\n\nconst calendarWidth = 270\nconst secondaryLight = theme.color('secondaryLight')\nconst secondary = theme.color('secondary')\nconst paper = theme.color('paper')\nconst regular = theme.fontWeight('regular')\nconst baseSpace = scale.space(-2)\n\nexport const GlobalDatePickerStyles = createGlobalStyle`\n .flatpickr-calendar {\n && {\n ${declareFont()}\n width: ${calendarWidth}px;\n border: 1px solid ${secondaryLight};\n border-radius: 0;\n }\n\n &.arrowTop:before,\n &.arrowTop:after {\n border-bottom-color: ${secondaryLight} !important;\n }\n\n &.arrowBottom:before,\n &.arrowBottom:after {\n border-top-color: ${secondaryLight} !important;\n }\n\n .flatpickr-rContainer {\n width: 100%;\n }\n\n .dayContainer {\n padding-top: ${baseSpace};\n padding-right: ${baseSpace};\n padding-bottom: ${baseSpace};\n width: ${calendarWidth}px;\n min-width: ${calendarWidth}px;\n max-width: ${calendarWidth}px;\n }\n\n .numInput.cur-year,\n .flatpickr-current-month span.cur-month{\n font-weight: ${regular};\n }\n\n .flatpickr-current-month .numInputWrapper {\n span.arrowUp:after {\n border-bottom-color: ${paper};\n }\n\n span.arrowDown:after {\n border-top-color: ${paper};\n }\n }\n\n .flatpickr-weekday {\n font-size: ${scale.font(-2)};\n font-weight: ${regular};\n }\n\n .flatpickr-days {\n width: ${calendarWidth}px;\n }\n\n .flatpickr-day.today {\n border-color: ${secondary};\n font-weight: ${theme.fontWeight('bold')};\n }\n\n .flatpickr-day {\n max-width: 34px;\n height: 34px;\n line-height: 34px;\n margin-bottom: ${baseSpace};\n font-weight: ${regular};\n }\n\n .flatpickr-months .flatpickr-month {\n border-radius: 0;\n }\n\n .flatpickr-months .flatpickr-month,\n .flatpickr-weekdays,\n .flatpickr-weekday {\n background-color: ${secondaryLight};\n color: ${paper};\n }\n\n .flatpickr-day.selected,\n .flatpickr-day.startRange,\n .flatpickr-day.endRange,\n .flatpickr-day.selected.inRange,\n .flatpickr-day.startRange.inRange,\n .flatpickr-day.endRange.inRange,\n .flatpickr-day.selected:focus,\n .flatpickr-day.startRange:focus,\n .flatpickr-day.endRange:focus,\n .flatpickr-day.selected:hover,\n .flatpickr-day.startRange:hover,\n .flatpickr-day.endRange:hover,\n .flatpickr-day.selected.prevMonthDay,\n .flatpickr-day.startRange.prevMonthDay,\n .flatpickr-day.endRange.prevMonthDay,\n .flatpickr-day.selected.nextMonthDay,\n .flatpickr-day.startRange.nextMonthDay,\n .flatpickr-day.endRange.nextMonthDay,\n .flatpickr-day.today:hover,\n .flatpickr-day.today:focus {\n background-color: ${secondary};\n border-color: ${secondary};\n }\n\n .flatpickr-day.inRange,\n .flatpickr-day.prevMonthDay.inRange,\n .flatpickr-day.nextMonthDay.inRange,\n .flatpickr-day.today.inRange,\n .flatpickr-day.prevMonthDay.today.inRange,\n .flatpickr-day.nextMonthDay.today.inRange,\n .flatpickr-day:hover,\n .flatpickr-day.prevMonthDay:hover,\n .flatpickr-day.nextMonthDay:hover,\n .flatpickr-day:focus,\n .flatpickr-day.prevMonthDay:focus,\n .flatpickr-day.nextMonthDay:focus {\n background-color: ${secondaryLight};\n border-color: ${secondaryLight};\n color: ${paper};\n }\n\n .flatpickr-months .flatpickr-prev-month,\n .flatpickr-months .flatpickr-next-month {\n color: ${paper};\n fill: ${paper};\n\n &:hover svg {\n color: ${secondary};\n fill: ${secondary};\n }\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\n\nimport Ball from '../Ball'\n\nconst ClearIndicator = props => {\n const msg = id => props.intl.formatMessage({id})\n\n return (\n <span {...props.innerProps}>\n <Ball\n icon=\"times\"\n tabIndex={-1}\n aria-label={msg('client.component.select.clearFieldLabel')}\n />\n </span>\n )\n}\n\nClearIndicator.propTypes = {\n innerProps: PropTypes.object,\n intl: PropTypes.object.isRequired\n}\n\nexport default injectIntl(ClearIndicator)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {components} from 'react-select'\n\nimport Ball from '../Ball'\n\nconst DropdownIndicator = props => {\n return !props.selectProps.isDisabled && <components.DropdownIndicator {...props}>\n <Ball\n icon={props.selectProps.menuIsOpen ? 'chevron-up' : 'chevron-down'}\n tabIndex={-1}\n />\n </components.DropdownIndicator>\n}\n\nDropdownIndicator.propTypes = {\n immutable: PropTypes.bool,\n selectProps: PropTypes.shape({\n menuIsOpen: PropTypes.bool,\n isDisabled: PropTypes.bool\n })\n}\n\nexport default DropdownIndicator\n","import React from 'react'\nimport {components} from 'react-select'\nimport PropTypes from 'prop-types'\n\nimport Ball from '../Ball'\nimport {StyledIndicatorsContainerWrapper} from './StyledComponents'\n\nconst handleAdvancedSearch = (openAdvancedSearch, value) => event => {\n openAdvancedSearch(value)\n event.stopPropagation()\n}\n\nconst handleCreate = openCreate => event => {\n openCreate()\n event.stopPropagation()\n}\n\nconst IndicatorsContainer = props => {\n const {openAdvancedSearch, openRemoteCreate, isDisabled, createPermission} = props.selectProps\n\n return (\n <StyledIndicatorsContainerWrapper>\n <components.IndicatorsContainer {...props}>\n {props.children}\n {openAdvancedSearch\n && !isDisabled\n && <span\n onTouchEnd={e => e.stopPropagation()}\n onMouseDown={e => e.stopPropagation()}\n onMouseUp={handleAdvancedSearch(openAdvancedSearch, props.value)}>\n <Ball\n icon=\"search\"\n tabIndex={-1}\n />\n </span>}\n {createPermission\n && <span\n onTouchEnd={e => e.stopPropagation()}\n onMouseDown={e => e.stopPropagation()}\n onMouseUp={handleCreate(openRemoteCreate)}>\n <Ball\n icon=\"plus\"\n tabIndex={-1}\n />\n </span>}\n </components.IndicatorsContainer>\n </StyledIndicatorsContainerWrapper>\n )\n}\n\nconst ItemPropType = PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]).isRequired,\n display: PropTypes.string\n})\n\nIndicatorsContainer.propTypes = {\n children: PropTypes.node,\n selectProps: PropTypes.shape({\n openAdvancedSearch: PropTypes.func,\n openRemoteCreate: PropTypes.func,\n isDisabled: PropTypes.bool,\n createPermission: PropTypes.bool\n }),\n value: PropTypes.oneOfType([\n ItemPropType,\n PropTypes.arrayOf(ItemPropType)\n ])\n}\n\nexport default IndicatorsContainer\n","import React from 'react'\n\nimport LoadingSpinner from '../LoadingSpinner'\n\nconst LoadingIndicator = () => <span><LoadingSpinner size=\"1.8rem\"/></span>\n\nexport default LoadingIndicator\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport _omit from 'lodash/omit'\n\nimport {StyledTether, StyledMenu} from './StyledComponents'\n\nconst TetherPosition = () => <div/>\n\nconst Menu = props => (\n <StyledTether\n attachment=\"top left\"\n targetAttachment=\"bottom left\"\n constraints={[{\n to: 'window',\n attachment: 'together'\n }]}\n >\n <TetherPosition/>\n <div>\n <StyledMenu\n {...(_omit(props, ['innerRef']))}\n wrapperWidth={props.selectProps.wrapperWidth}\n wrapperHeight={props.selectProps.wrapperHeight}>\n {props.children}\n </StyledMenu>\n </div>\n </StyledTether>\n)\n\nMenu.propTypes = {\n children: PropTypes.node,\n selectProps: PropTypes.shape({\n wrapperHeight: PropTypes.number,\n wrapperWidth: PropTypes.number\n })\n}\n\nexport default Menu\n","import React from 'react'\nimport {components} from 'react-select'\nimport PropTypes from 'prop-types'\n\nimport {StyledMoreOptionsAvailable} from './StyledComponents'\n\nconst MenuList = props => {\n const {selectProps, children, theme} = props\n const {moreOptionsAvailable, moreOptionsAvailableText} = selectProps\n return (\n <components.MenuList {...props}>\n {children}\n {moreOptionsAvailable\n && <StyledMoreOptionsAvailable reactSelectTheme={theme}>\n {moreOptionsAvailableText}\n </StyledMoreOptionsAvailable>\n }\n </components.MenuList>\n )\n}\n\nMenuList.propTypes = {\n children: PropTypes.node,\n selectProps: PropTypes.shape({\n moreOptionsAvailable: PropTypes.bool,\n moreOptionsAvailableText: PropTypes.string\n }),\n theme: PropTypes.object\n}\n\nexport default MenuList\n","import styled from 'styled-components'\n\nexport default styled.span`\n pointer-events: auto;\n cursor: pointer;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {components} from 'react-select'\nimport _get from 'lodash/get'\n\nimport Popover from '../Popover'\nimport ClickableWrapper from './ClickableWrapper'\n\nexport const MultiValueLabel = props => {\n const {data} = props\n const {tooltips, loadTooltip, DetailLink} = props.selectProps\n const tooltip = _get(tooltips, data.key, null)\n\n const content = DetailLink\n ? <ClickableWrapper onMouseDown={e => {\n e.stopPropagation()\n e.preventDefault()\n }}>\n <DetailLink entityKey={data.key}><components.MultiValueLabel {...props}/></DetailLink>\n </ClickableWrapper>\n : <components.MultiValueLabel {...props}/>\n\n return (\n <Popover content={tooltip ? <div dangerouslySetInnerHTML={{__html: tooltip}}/> : null}>\n <span onMouseOver={() => loadTooltip && !tooltip && loadTooltip(data.key)}>\n {content}\n </span>\n </Popover>\n )\n}\n\nMultiValueLabel.propTypes = {\n data: PropTypes.object,\n selectProps: PropTypes.shape({\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.elementType\n })\n}\n\nexport default MultiValueLabel\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {components} from 'react-select'\nimport _get from 'lodash/get'\nimport styled from 'styled-components'\n\nimport Popover from '../Popover'\nimport ClickableWrapper from './ClickableWrapper'\nimport {theme} from '../utilStyles'\n\nconst StyledSingleValueWrapper = styled.div`\n overflow-x: hidden;\n color: ${({isDisabled}) => isDisabled ? theme.color('text') : 'inherit'};\n`\n\nexport const SingleValue = props => {\n const {data, selectProps, isDisabled, children} = props\n const {tooltips, loadTooltip, DetailLink} = selectProps\n const tooltip = _get(tooltips, data.key, null)\n const content = DetailLink\n ? <ClickableWrapper onMouseDown={e => {\n e.stopPropagation()\n e.preventDefault()\n }}>\n <DetailLink entityKey={data.key}>{children}</DetailLink>\n </ClickableWrapper>\n : children\n\n return <components.SingleValue {...props}>\n <StyledSingleValueWrapper\n onMouseOver={() => loadTooltip && !tooltip && loadTooltip(data.key)}\n isDisabled={isDisabled}\n >\n <Popover content={tooltip\n ? <div dangerouslySetInnerHTML={{__html: tooltip}}/>\n : null}>\n {content}\n </Popover>\n </StyledSingleValueWrapper>\n </components.SingleValue>\n}\n\nSingleValue.propTypes = {\n children: PropTypes.node,\n data: PropTypes.object,\n isDisabled: PropTypes.bool,\n selectProps: PropTypes.shape({\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.func\n })\n}\n\nexport default SingleValue\n","import PropTypes from 'prop-types'\nimport React, {useRef} from 'react'\nimport ReactSelect from 'react-select'\nimport _debounce from 'lodash/debounce'\nimport {withTheme} from 'styled-components'\n\nimport ClearIndicator from './ClearIndicator'\nimport DropdownIndicator from './DropdownIndicator'\nimport IndicatorsContainer from './IndicatorsContainer'\nimport LoadingIndicator from './LoadingIndicator'\nimport Menu from './Menu'\nimport MenuList from './MenuList'\nimport MultiValueLabel from './MultiValueLabel'\nimport SingleValue from './SingleValue'\nimport {reactSelectStyles, reactSelectTheme} from './StyledComponents'\n\nconst SEARCH_DEBOUNCE = 300\n\n/**\n * To select between multiple options. Loading of options and so on are remotely controlled.\n */\nconst Select = ({\n fetchOptions,\n id,\n immutable,\n isLoading,\n isMulti,\n loadTooltip,\n moreOptionsAvailable,\n moreOptionsAvailableText,\n noResultsText,\n onChange,\n openAdvancedSearch,\n options,\n searchOptions,\n theme,\n tooltips,\n value,\n DetailLink,\n createPermission,\n openRemoteCreate\n}) => {\n const selectComponent = useRef(null)\n const selectWrapper = useRef(null)\n\n const getOptions = () => [...(options || [])]\n\n const handleInputChange = (searchTerm, event) => {\n if (searchOptions && searchTerm) {\n debouncedSearchOptions(searchTerm)\n }\n if (searchTerm === '' && event.action === 'input-change') {\n fetchOptions()\n }\n }\n\n const handleMenuOpen = () => {\n if (fetchOptions) {\n fetchOptions()\n }\n }\n\n const debouncedSearchOptions\n = searchOptions ? _debounce(searchOptions, SEARCH_DEBOUNCE) : () => {}\n\n const wrapperWidth = selectWrapper.current ? selectWrapper.current.clientWidth : 300\n const wrapperHeight = selectWrapper.current ? selectWrapper.current.clientHeight : 35\n\n return (\n <div\n tabIndex=\"-1\"\n id={id}\n onFocus={() => {\n selectComponent.current.focus()\n }}\n style={{\n outlineStyle: 'none',\n cursor: immutable ? 'not-allowed' : 'default'\n }}>\n <div ref={selectWrapper} style={{outlineStyle: 'none'}}>\n <ReactSelect\n getOptionLabel={option => option.display}\n getOptionValue={option => option.key}\n wrapperWidth={wrapperWidth}\n wrapperHeight={wrapperHeight}\n components={{\n ClearIndicator,\n LoadingIndicator,\n DropdownIndicator: DropdownIndicator,\n IndicatorsContainer: IndicatorsContainer,\n IndicatorSeparator: null,\n Menu: Menu,\n MenuList: MenuList,\n MultiValueLabel,\n SingleValue\n }}\n noOptionsMessage={() => (noResultsText || ' - ')}\n isMulti={isMulti}\n closeMenuOnSelect={!isMulti}\n isSearchable\n {...(searchOptions ? {filterOption: () => (true)} : {})}\n isClearable\n loadingMessage={() => null}\n placeholder=\"\"\n menuShouldScrollIntoView={false}\n autoFocus={false}\n value={value || null}\n onChange={onChange}\n onInputChange={handleInputChange}\n options={getOptions()}\n isLoading={isLoading}\n isDisabled={immutable}\n ref={selectComponent}\n onMenuOpen={handleMenuOpen}\n styles={reactSelectStyles(theme)}\n theme={themeSelect => reactSelectTheme(themeSelect, theme)}\n loadTooltip={loadTooltip}\n tooltips={tooltips}\n DetailLink={DetailLink}\n openAdvancedSearch={openAdvancedSearch}\n moreOptionsAvailable={moreOptionsAvailable}\n moreOptionsAvailableText={moreOptionsAvailableText}\n blurInputOnSelect={false}\n createPermission={createPermission}\n openRemoteCreate={openRemoteCreate}\n />\n </div>\n </div>\n )\n}\n\nconst ItemPropType = PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]).isRequired,\n display: PropTypes.string\n})\n\nSelect.propTypes = {\n /**\n * If one more multiple values can be selected\n */\n isMulti: PropTypes.bool,\n /**\n * Callback function on change event. Passes the new value as first parameter.\n */\n onChange: PropTypes.func,\n /**\n * Expects an array or single object containing a display and key attribute.\n */\n value: PropTypes.oneOfType([\n ItemPropType,\n PropTypes.arrayOf(ItemPropType)\n ]),\n /**\n * Possible options that the user can select\n */\n options: PropTypes.arrayOf(ItemPropType),\n /**\n * Callback to load options (is invoked on focus)\n */\n fetchOptions: PropTypes.func,\n /**\n * Callback to load options if the user types into to select. The search value is passed as first parameter.\n */\n searchOptions: PropTypes.func,\n /**\n * Can be set to true while loading the options. Shows a loading indicator.\n */\n isLoading: PropTypes.bool,\n /**\n * Wil be displayed if no options are left to choose from.\n */\n noResultsText: PropTypes.string,\n /**\n * If true, a disabled option is appended that says that not all options are shown.\n */\n moreOptionsAvailable: PropTypes.bool,\n /**\n * Text that is shown if moreOptionsAvailable is true.\n */\n moreOptionsAvailableText: PropTypes.string,\n /**\n * If defined a button is shown next to the select box that invokes this callback.\n */\n openAdvancedSearch: PropTypes.func,\n /**\n * Component that allows to render a <Link> around the value label for navigation purposes.\n * First parameter is the key of the value, the second parameter is the value node itself / child.\n *\n * e.g.\n * ({entityKey, children}) => <a href={`/${key}`} target=\"_blank\" rel=\"noopener noreferrer\">{children}</a>\n */\n DetailLink: PropTypes.func,\n /**\n * Theme provided by styled-components ThemeProvider.\n */\n theme: PropTypes.object,\n /**\n * Object containing tooltips with the key as attribute name.\n */\n tooltips: PropTypes.objectOf(PropTypes.string),\n /**\n * Callback to enhance tooltip object with new tooltips.\n */\n loadTooltip: PropTypes.func,\n /**\n * Whether the user can edit the value or not.\n */\n immutable: PropTypes.bool,\n /**\n * Id of outter element\n */\n id: PropTypes.string,\n /**\n * Open menu with click on input field\n */\n openMenuOnClick: PropTypes.bool,\n /**\n * Whether a new option may be created\n */\n createPermission: PropTypes.bool,\n /**\n * Opens a modal with a create form\n */\n openRemoteCreate: PropTypes.func\n}\n\nexport default withTheme(Select)\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst SingleSelect = props => (\n <Select\n id={props.id}\n immutable={props.immutable}\n isMulti={false}\n onChange={props.onChange}\n value={props.value}\n openMenuOnClick\n {...props.options}\n />\n)\n\nSingleSelect.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ])\n }),\n options: PropTypes.shape({\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.any,\n label: PropTypes.string\n })),\n fetchOptions: PropTypes.func,\n noResultsText: PropTypes.string,\n isLoading: PropTypes.bool,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default SingleSelect\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst MultiSelect = props => (\n <Select\n id={props.id}\n isMulti={true}\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n openMenuOnClick\n {...props.options}\n />\n)\n\nMultiSelect.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.array,\n options: PropTypes.shape({\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.any,\n label: PropTypes.string\n })),\n fetchOptions: PropTypes.func,\n isLoading: PropTypes.bool,\n noResultsText: PropTypes.string,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default MultiSelect\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledStringEdit = styled.input.attrs(props => ({\n type: 'text'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledStringEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport {StyledEditableWrapper} from '../StyledEditableValue'\nimport StyledStringEdit from './StyledStringEdit'\n\nconst StringEdit = props =>\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledStringEdit\n disabled={props.immutable}\n id={props.id}\n name={props.name}\n onChange={e => props.onChange(e.target.value)}\n immutable={props.immutable}\n value={props.value || ''}\n />\n </StyledEditableWrapper>\n\nStringEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default react.Debouncer(StringEdit)\n","import React from 'react'\nimport TextareaAutosize from 'react-textarea-autosize'\nimport styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledTextareaAutosize = styled(({immutable, ...rest}) => <TextareaAutosize {...rest}/>)`\n && {\n ${StyledInputCss}\n padding-top: 2px;\n padding-bottom: 2px;\n }\n`\n\nexport default StyledTextareaAutosize\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport {StyledEditableWrapper} from '../StyledEditableValue'\nimport StyledTextareaAutosize from './StyledTextEdit'\n\nconst TextEdit = props =>\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledTextareaAutosize\n id={props.id}\n immutable={props.immutable}\n maxRows={20}\n name={props.name}\n onChange={e => props.onChange(e.target.value)}\n disabled={props.immutable}\n rows={2}\n value={props.value}\n />\n </StyledEditableWrapper>\n\nTextEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default react.Debouncer(TextEdit)\n","import styled from 'styled-components'\n\nimport {\n StyledEditableWrapperCss,\n StyledInputCss\n} from '../StyledEditableValue'\n\nexport const StyledDateAbstractInput = styled.input`\n &&& {\n ${StyledInputCss}\n }\n`\n\nexport const StyledDateAbstractOuterWrapper = styled.div`\n outline: ${({immutable}) => immutable ? 0 : 'initial'};\n`\n\nexport const StyledDateAbstractWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n\n input {\n display: ${({immutable}) => immutable ? 'none' : 'block'};\n\n &:last-of-type {\n display: ${({immutable}) => immutable ? 'block' : 'none'};\n }\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\nimport _isEqual from 'lodash/isEqual'\nimport {withTheme} from 'styled-components'\nimport {js} from 'tocco-util'\n\nimport {theme} from '../../utilStyles'\nimport {\n StyledDateAbstractInput,\n StyledDateAbstractWrapper,\n StyledDateAbstractOuterWrapper\n} from './StyledDateAbstract'\nimport {GlobalDatePickerStyles} from '../../DatePicker/GlobalDatePickerStyles'\nimport Ball from '../../Ball'\n\nclass DateAbstract extends React.Component {\n Flatpickr = null\n componentIsUnmounted = false\n\n constructor(props) {\n super(props)\n this.wrapper = React.createRef()\n\n this.state = {altInput: ''}\n\n // eslint-disable-next-line chai-friendly/no-unused-expressions\n import(/* webpackChunkName: \"vendor-flatpickr\" */ '!style-loader!css-loader!flatpickr/dist/themes/light.css')\n\n Promise.all([\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr'),\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr/dist/l10n/de.js'),\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr/dist/l10n/fr.js'),\n import(/* webpackChunkName: \"vendor-flatpickr\" */ 'flatpickr/dist/l10n/it.js')\n ]).then(response => {\n if (!this.componentIsUnmounted) {\n this.Flatpickr = response[0].default\n this.localeMap = {\n 'de-CH': response[1].German,\n 'de': response[1].German,\n 'fr': response[2].French,\n 'it': response[3].Italian\n }\n\n this.initializeFlatPickr()\n }\n })\n }\n\n msg = id => this.props.intl.formatMessage({id})\n\n initializeFlatPickr = flatpickr => {\n const locale = this.localeMap[this.props.intl.locale]\n\n this.options = {\n wrap: true,\n onChange: this.handleOnChange,\n altInput: true,\n altInputClass: '',\n clickOpens: !this.props.immutable,\n defaultDate: this.props.value,\n ...(locale ? {locale} : {}),\n ...(this.props.options ? this.props.options.flatpickrOptions : {})\n }\n\n this.flatpickr = new this.Flatpickr(this.wrapper.current, this.options)\n this.flatpickr.calendarContainer.classList.add('tocco-ui-theme')\n this.flatpickr.calendarContainer.style.fontFamily = theme.fontFamily('regular')(this.props)\n this.flatpickr.calendarContainer.addEventListener('keydown', this.handleConfirmKey)\n\n if (this.props.initialized) {\n this.props.initialized()\n }\n this.setState({altInput: this.flatpickr.altInput.value})\n }\n\n getLocale = localeCode => {\n if (this.localeMap) {\n let locale = this.localeMap[localeCode]\n\n // Fallback english\n if (!locale && this.Flatpickr) {\n locale = this.Flatpickr.l10ns.en\n }\n return locale\n }\n return null\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (this.Flatpickr && this.flatpickr) {\n const optionsDiff = js.difference(this.props.options.flatpickrOptions, prevProps.options.flatpickrOptions)\n if (Object.keys(optionsDiff).length > 0) {\n Object.entries(optionsDiff).forEach(([key, value]) => {\n this.flatpickr.set(key, value)\n })\n this.flatpickr.redraw()\n }\n\n if (!_isEqual(prevProps.intl.locale, this.props.intl.locale)) {\n const locale = this.getLocale(this.props.intl.locale)\n this.Flatpickr.localize(locale)\n this.flatpickr.set('locale', locale)\n this.flatpickr.redraw()\n }\n if (!_isEqual(prevProps.value, this.props.value)) {\n this.flatpickr.setDate(this.props.value, false)\n this.flatpickr.redraw()\n }\n }\n }\n\n componentWillUnmount() {\n this.componentIsUnmounted = true\n if (this.flatpickr) {\n this.flatpickr.destroy()\n }\n }\n\n handleOnChange = selectedDates => {\n const isoStrings = selectedDates.map(date => date.toISOString())\n this.setState({altInput: this.flatpickr.altInput.value})\n if (this.hasValue() || isoStrings.length !== 0) {\n this.props.onChange(isoStrings)\n }\n }\n\n hasValue = () => {\n return this.props.value && this.props.value.length > 0 && this.props.value.every(v => v)\n }\n\n handleOnBlur = () => {\n if (this.props.onBlur) {\n const altValue = this.flatpickr.altInput.value\n this.props.onBlur(altValue, this.flatpickr.selectedDates, r => this.flatpickr.setDate(r, true))\n }\n }\n\n focusInput() {\n // flatpickr add two input in the DOM. One for the actual value (hidden) and one for the altInput\n const inputElement = this.wrapper.current.querySelector('input.flatpickr-input:not([type=\"hidden\"])')\n if (inputElement) {\n inputElement.focus()\n }\n }\n\n handleConfirmKey = e => {\n if ((!e.target.classList.contains('flatpickr-hour') && e.key === 'Tab' && !e.shiftKey) || e.key === 'Enter') {\n this.focusInput()\n this.handleOnBlur()\n setTimeout(() => {\n this.flatpickr.close()\n })\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n }\n }\n\n render() {\n return (\n <>\n <GlobalDatePickerStyles/>\n <StyledDateAbstractOuterWrapper\n immutable={this.props.immutable}\n id={this.props.id}\n tabIndex=\"-1\"\n onFocus={() => {\n this.focusInput()\n setTimeout(() => {\n if (this.flatpickr) {\n this.flatpickr.open()\n }\n })\n }}\n onKeyDown={this.handleConfirmKey}\n >\n <StyledDateAbstractWrapper\n data-wrap\n onBlur={this.handleOnBlur}\n immutable={this.props.immutable}\n ref={this.wrapper}\n >\n <StyledDateAbstractInput\n {...this.props.immutable ? {disabled: 'disabled'} : {}}\n type=\"text\"\n data-input\n immutable={this.props.immutable}\n {...(this.props.options ? {placeholder: this.props.options.placeholderText} : {})}\n />\n <StyledDateAbstractInput\n disabled\n immutable={this.props.immutable}\n value={this.state.altInput}\n />\n {!this.props.immutable && this.props.value.filter(i => i).length > 0 && <Ball\n icon=\"times\"\n tabIndex={-1}\n aria-label={this.msg('client.component.dateAbstract.clearDateLabel')}\n onMouseDown={e => {\n e.preventDefault()\n this.props.onChange(null)\n }}/>}\n </StyledDateAbstractWrapper>\n </StyledDateAbstractOuterWrapper>\n </>\n )\n }\n}\n\nDateAbstract.propTypes = {\n id: PropTypes.string,\n intl: PropTypes.object.isRequired,\n onBlur: PropTypes.func,\n onChange: PropTypes.func.isRequired,\n value: PropTypes.arrayOf(PropTypes.string),\n options: PropTypes.shape({\n placeholderText: PropTypes.string,\n flatpickrOptions: PropTypes.object\n }),\n immutable: PropTypes.bool,\n initialized: PropTypes.func,\n events: PropTypes.shape({\n onFocus: PropTypes.func\n })\n}\n\nexport default withTheme(injectIntl(DateAbstract))\n","import _forOwn from 'lodash/forOwn'\n\nexport const atMostOne = array => {\n if (!array || array.length === 0) {\n return null\n } else if (array.length === 1) {\n return array[0]\n } else {\n throw new Error(`Expected at most one item in array: ${array.join(', ')}`)\n }\n}\n\n/**\n * Get a date value as `YYYY-MM-DD` string representation.\n *\n * @param date Anything that the `Date` constructor accepts as single argument\n * @returns {string} The given date in format `YYYY-MM-DD`\n */\nexport const toLocalDateString = date => {\n if (date == null) {\n return null\n }\n\n const dateObj = new Date(date)\n\n const year = dateObj.getFullYear()\n const month = dateObj.getMonth() + 1 // getMonth() is zero-based\n const day = dateObj.getDate()\n\n return [\n year,\n (month > 9 ? '' : '0') + month,\n (day > 9 ? '' : '0') + day\n ].join('-')\n}\n\n/**\n * Converts the formatting string of momentJS to one compatible with flatpickr.\n * see: https://flatpickr.js.org/formatting/\n * @param format momentJS formatting string\n * @returns {string} flatpickr formatting string\n */\nexport const momentJStoToFlatpickrFormat = format => {\n const formattingMap = {\n d: 'DD',\n m: 'MM',\n Y: 'YYYY',\n K: 'A',\n H: 'HH',\n h: 'h',\n i: 'mm'\n }\n _forOwn(formattingMap, (v, k) => {\n format = format.replace(v, k)\n })\n return format\n}\n\n/*\n * Returns format separators provided by intl API.\n */\nexport const parseLocalePlaceholder = countryCode => {\n const thousandSeparator = (1111).toLocaleString(countryCode).replace(/1/g, '')\n const decimalSeparator = (1.1).toLocaleString(countryCode).replace(/1/g, '')\n\n return {thousandSeparator, decimalSeparator}\n}\n\n/*\n * String to number converter\n */\nexport const convertStringToNumber = stringValue => (\n !stringValue || isNaN(stringValue) ? null : parseFloat(stringValue)\n)\n\n/*\n * Convert two numbers as hours and minutes to milliseconds\n */\nexport const calculateMilliseconds = (hours, minutes) => {\n if (!hours && !minutes) {\n return null\n }\n const hoursMilliseconds = (hours || 0) * 60 * 60000\n const minutesMilliseconds = (minutes || 0) * 60000\n return hoursMilliseconds + minutesMilliseconds\n}\n\n/*\n * Return true if the value is null or undefined\n */\nexport const isNullOrUndefined = value => value === null || value === undefined\n\n/*\n * Return true if the value is null or undefined\n */\nexport const millisecondsToDuration = milliseconds => {\n if (!milliseconds && milliseconds !== 0) {\n return {hoursOfDay: 0, minutesOfHour: 0}\n }\n\n const hoursOfDay = Math.floor(milliseconds / (60 * 60 * 1000))\n const minutesOfHour = Math.floor((milliseconds - (hoursOfDay * (60 * 60 * 1000))) / (60 * 1000))\n return {hoursOfDay, minutesOfHour}\n}\n\n/*\n * Pad a string with leading zeros\n */\nexport const padLeadingZeros = (string, numberOfZeros) => {\n return string.length < numberOfZeros ? string.padStart(numberOfZeros, '0') : string\n}\n\n/*\n * Convert hour and minute numbers to time string of type HH:MM\n */\nexport const numbersToTimeFormat = (hours, minutes) => {\n if (!hours && !minutes) {\n if (hours !== 0 && minutes !== 0) {\n return '--:--'\n }\n }\n const hourString = hours ? hours.toString() : '00'\n const minuteString = minutes ? minutes.toString() : '00'\n\n const paddedHour = padLeadingZeros(hourString, 2)\n const paddedMinute = padLeadingZeros(minuteString, 2)\n\n return paddedHour + ':' + paddedMinute\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport moment from 'moment'\nimport {useIntl} from 'react-intl'\n\nimport DateAbstract from './DateAbstract'\nimport {atMostOne, toLocalDateString, momentJStoToFlatpickrFormat} from '../utils'\n\nexport const DateEdit = ({onChange, options, id, value, immutable, events}) => {\n const DATE_FORMAT = 'YYYY-MM-DD'\n const intl = useIntl()\n\n const getLocalizedAltFormat = () => moment().locale(intl.locale)._locale.longDateFormat('L')\n\n const parseDate = s => {\n const momentDate = moment(s, [getLocalizedAltFormat(), DATE_FORMAT])\n return momentDate.isValid() ? momentDate.toDate() : null\n }\n\n const handleChange = dates => {\n const dateTime = atMostOne(dates)\n const date = dateTime ? toLocalDateString(dateTime) : null\n onChange(date)\n }\n\n const onBlur = (dateString, values, setValue) => {\n const parsed = parseDate(dateString)\n if (values[0] - parsed !== 0) {\n setValue(parsed)\n }\n }\n\n const flatpickrOptions = {\n altFormat: momentJStoToFlatpickrFormat(getLocalizedAltFormat()),\n dateFormat: momentJStoToFlatpickrFormat(DATE_FORMAT),\n allowInput: true,\n parseDate: parseDate,\n ...(options ? options.flatpickrOptions : {})\n }\n\n return (\n <DateAbstract\n id={id}\n value={[value]}\n onBlur={onBlur}\n onChange={handleChange}\n options={{...options, flatpickrOptions}}\n immutable={immutable}\n events={events}\n />\n )\n}\n\nDateEdit.propTypes = {\n id: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n value: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n placeholderText: PropTypes.string,\n flatpickrOptions: PropTypes.object\n }),\n events: PropTypes.shape({\n onFocus: PropTypes.func\n })\n}\n\nexport default DateEdit\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport {injectIntl} from 'react-intl'\nimport moment from 'moment'\n\nimport DateAbstract from './DateAbstract'\nimport {atMostOne, momentJStoToFlatpickrFormat} from '../utils'\n\nexport const DateTimeEdit = props => {\n const momentDateFormat = moment().locale(props.intl.locale)._locale.longDateFormat('L')\n const momentTimeFormat = moment().locale(props.intl.locale)._locale.longDateFormat('LT')\n const altDateFormat = momentJStoToFlatpickrFormat(momentDateFormat)\n const altTimeFormat = momentJStoToFlatpickrFormat(momentTimeFormat)\n\n const parseDate = useMemo(() => s => {\n const momentDate = moment(s, ['D.M.YYYY H:m', momentDateFormat, momentTimeFormat])\n return momentDate.isValid() ? momentDate.toDate() : null\n }, [])\n\n const onBlur = (dateString, values, setValue) => {\n const parsed = parseDate(dateString)\n if (values[0] - parsed !== 0) {\n setValue(parsed)\n }\n }\n\n const flatpickrOptions = {\n enableTime: true,\n time_24hr: true,\n allowInput: true,\n parseDate: parseDate,\n altFormat: `${altDateFormat} ${altTimeFormat}`,\n dateFormat: 'Y-m-d\\\\TH:i:S.000\\\\Z',\n ...(props.options ? props.options.flatpickrOptions : {})\n }\n\n const handleChange = dates => props.onChange(atMostOne(dates))\n\n return (\n <DateAbstract\n value={[props.value]}\n onChange={handleChange}\n onBlur={onBlur}\n immutable={props.immutable}\n options={{...props.options, flatpickrOptions}}\n events={props.events}\n />\n )\n}\n\nDateTimeEdit.propTypes = {\n intl: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n value: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n placeholderText: PropTypes.string,\n flatpickrOptions: PropTypes.object\n }),\n events: PropTypes.shape({\n onFocus: PropTypes.func\n })\n}\n\nexport default injectIntl(DateTimeEdit)\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledTimeEdit = styled.input.attrs(props => ({\n type: 'time'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledTimeEdit\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport Ball from '../../Ball'\nimport {\n StyledEditableControl,\n StyledEditableWrapper\n} from '../StyledEditableValue'\nimport StyledTimeEdit from './StyledTimeEdit'\n\nconst TimeEdit = props => {\n const handleChange = e => {\n props.onChange(e.target.value)\n }\n\n const clearInput = () => {\n props.onChange(null)\n }\n\n const isFirefox = !!window.sidebar\n\n const showClearButton = props.value && !props.immutable && !isFirefox\n\n const value = props.value || ''\n\n return (\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledTimeEdit\n disabled={props.immutable}\n id={props.id}\n immutable={props.immutable}\n name={props.name}\n onChange={handleChange}\n value={value}\n />\n {showClearButton && <StyledEditableControl>\n <Ball\n icon=\"times\"\n onClick={clearInput}\n tabIndex={-1}\n />\n </StyledEditableControl>}\n </StyledEditableWrapper>\n )\n}\n\nTimeEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.string,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default TimeEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport styled from 'styled-components'\n\nconst StyledBoolEdit = styled.div`\n margin: 5px 0;\n`\n\nconst BoolEdit = props => {\n const handleChange = e => {\n if (props.onChange) {\n props.onChange(e.target.checked)\n }\n }\n\n return (\n <StyledBoolEdit>\n <input\n type=\"checkbox\"\n checked={props.value || false}\n name={props.name}\n onChange={handleChange}\n id={props.id}\n disabled={props.immutable}\n />\n </StyledBoolEdit>\n )\n}\n\nBoolEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.bool,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default BoolEdit\n","import styled from 'styled-components'\n\nimport {StyledButton} from '../Button'\nimport {scale} from '../utilStyles'\n\nexport const StyledView = styled.div`\n display: flex;\n justify-content: space-between;\n padding-top: ${scale.space(-2)};\n`\n\nexport const StyledButtonsWrapper = styled.div`\n display: flex;\n align-items: center;\n\n ${StyledButton} {\n margin: 0;\n border-radius: 50%;\n padding: ${scale.space(-2)};\n\n a:hover {\n color: unset;\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {download} from 'tocco-util'\n\nimport Button from '../Button'\nimport Link from '../Link'\nimport Preview from '../Preview'\nimport {StyledView, StyledButtonsWrapper} from './StyledView'\n\nexport const getDownloadUrl = binaryLink =>\n download.addParameterToURL(binaryLink, 'download', true)\n\nconst View = ({value, downloadTitle, immutable, onUpload, deleteTitle}) => {\n const isNotUploadedFile = value.binaryLink && value.binaryLink.startsWith('blob:')\n\n return (\n <StyledView className=\"StyledView\">\n <Preview\n alt={value.fileName}\n {...isNotUploadedFile && {caption: value.fileName}}\n fileName={value.fileName}\n maxDimensionX=\"96px\"\n maxDimensionY=\"96px\"\n srcUrl={value.binaryLink}\n thumbnailUrl={value.thumbnailLink}\n />\n <StyledButtonsWrapper>\n {!immutable\n && <Button\n icon=\"trash\"\n onClick={() => onUpload(null)}\n tabIndex={-1}\n title={deleteTitle || 'delete'}\n />\n }\n <Button>\n <Link\n neutral\n icon=\"arrow-to-bottom\"\n download={value.fileName}\n href={getDownloadUrl(value.binaryLink)}\n tabIndex={-1}\n title={downloadTitle || 'download'}\n />\n </Button>\n </StyledButtonsWrapper>\n </StyledView>\n )\n}\n\nView.propTypes = {\n immutable: PropTypes.bool,\n onUpload: PropTypes.func,\n value: PropTypes.shape({\n fileName: PropTypes.string.isRequired,\n binaryLink: PropTypes.string.isRequired,\n thumbnailLink: PropTypes.string,\n mimeType: PropTypes.string\n }).isRequired,\n deleteTitle: PropTypes.string,\n downloadTitle: PropTypes.string\n}\n\nexport default View\n","export const bytesToSize = bytes => {\n const units = ['Bytes', 'KB', 'MB', 'GB', 'TB']\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n return `${(bytes / Math.pow(1024, i)).toFixed(2) * 1} ${units[i]}`\n}\n","import styled from 'styled-components'\n\nimport {declareFont, scale} from '../utilStyles'\nimport {StyledSpan} from '../Typography'\n\nexport const StyledUploadProgress = styled.div`\n && {\n padding-top: ${scale.space(-2)};\n text-align: center;\n display: inline-block;\n }\n`\n\nexport const StyledUploadProgressText = styled(StyledSpan)`\n && {\n ${declareFont({fontSize: scale.font(-1)})}\n }\n`\n\nexport const StyledUploadProgressIconAndText = styled.div`\n && {\n display: flex;\n justify-content: center;\n align-items: center;\n\n span {\n margin-left: ${scale.space(-2)};\n }\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Preview from '../Preview'\nimport {bytesToSize} from './helpers'\nimport LoadingSpinner from '../LoadingSpinner'\nimport {design} from '../utilStyles'\nimport {\n StyledUploadProgress,\n StyledUploadProgressIconAndText,\n StyledUploadProgressText\n} from './StyledUploadProgress'\n\nconst UploadProgress = props => (\n <StyledUploadProgress>\n <Preview\n caption={props.file.name}\n maxDimensionX=\"96px\"\n maxDimensionY=\"96px\"\n srcUrl={props.file.preview}\n thumbnailUrl={props.file.type.startsWith('image') ? props.file.preview : null}\n />\n <StyledUploadProgressIconAndText>\n <LoadingSpinner position={design.position.PREPEND}/>\n <StyledUploadProgressText>{props.text || 'uploading'} ({bytesToSize(props.file.size)})</StyledUploadProgressText>\n </StyledUploadProgressIconAndText>\n </StyledUploadProgress>\n)\n\nUploadProgress.propTypes = {\n text: PropTypes.string,\n file: PropTypes.shape({\n preview: PropTypes.string,\n size: PropTypes.number,\n type: PropTypes.string,\n name: PropTypes.string\n })\n}\n\nexport default UploadProgress\n","import styled from 'styled-components'\n\nimport {\n colorizeText,\n declareFont,\n scale,\n theme\n} from '../utilStyles'\n\nconst StyledUploadInput = styled.div`\n ${declareFont()}\n cursor: ${props => props.immutable ? 'not-allowed' : 'pointer'};\n background-color: ${theme.color('paper')};\n color: ${props => props.immutable ? colorizeText.shade2(props) : colorizeText.shade0(props)};\n padding: ${scale.space(-2)} 0 0 0;\n`\n\nexport default StyledUploadInput\n","import styled from 'styled-components'\nimport Dropzone from 'react-dropzone'\n\nimport {StyledButton} from '../Button'\nimport {scale} from '../utilStyles'\n\nexport const StyledIconWrapper = styled.div`\n ${StyledButton} {\n position: relative;\n top: -${scale.space(-3.1)};\n margin: 0;\n border-radius: 50%;\n padding: ${scale.space(-1.5)} ${scale.space(-2)};\n }\n`\n\nexport const StyledDropzone = styled(Dropzone)`\n position: relative;\n display: flex;\n justify-content: flex-end;\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Button from '../Button'\nimport Icon from '../Icon'\nimport StyledUploadInput from './StyledUploadInput'\nimport {design} from '../utilStyles'\nimport {StyledDropzone, StyledIconWrapper} from './SyledUploadInput'\n\nconst UploadInput = ({onDrop: onDropProp, immutable, text}) => {\n const onDrop = files => onDropProp(files[0])\n\n return (\n <StyledUploadInput immutable={immutable}>\n <StyledDropzone\n disabled={immutable}\n multiple={false}\n onDrop={onDrop}\n title={text || 'drag and drop or click'}\n >\n <StyledIconWrapper>\n <Button>\n <Icon\n icon=\"arrow-to-top\"\n position={design.position.PREPEND}\n />\n </Button>\n </StyledIconWrapper>\n </StyledDropzone>\n </StyledUploadInput>\n )\n}\n\nUploadInput.propTypes = {\n immutable: PropTypes.bool,\n onDrop: PropTypes.func.isRequired,\n text: PropTypes.string\n}\n\nexport default UploadInput\n","import PropTypes from 'prop-types'\nimport React, {useState, useEffect} from 'react'\nimport _isEqual from 'lodash/isEqual'\n\nimport View from './View'\nimport UploadProgress from './UploadProgress'\nimport UploadInput from './UploadInput'\n\n/**\n * Component to upload files. If uploaded, the file will be displayed by the Preview component.\n */\nexport const Upload = props => {\n const {\n value,\n textResources,\n onUpload\n } = props\n const [states, setStates] = useState({\n isUploading: false,\n previewFile: null\n })\n\n const setUploadingState = file => {\n setStates({isUploading: true, previewFile: file})\n }\n\n const abortUploadingState = () => {\n setStates({isUploading: false, previewFile: null})\n }\n\n const onDrop = file => {\n setUploadingState(file)\n onUpload(file)\n }\n\n useEffect(() => {\n if (!_isEqual(value)) {\n abortUploadingState()\n }\n }, [value])\n\n if (value && value.binaryLink) {\n return <View {...props} deleteTitle={textResources.delete} downloadTitle={textResources.download}/>\n } else if (states.isUploading) {\n return <UploadProgress file={states.previewFile} text={textResources.uploading} {...props}/>\n }\n return <UploadInput {...props} onDrop={onDrop}/>\n}\n\nUpload.defaultProps = {\n textResources: {}\n}\n\nUpload.propTypes = {\n /**\n * Callback function if user uploads a file. Return the file {File}\n */\n onUpload: PropTypes.func.isRequired,\n /**\n * Object that contains the following\n */\n value: PropTypes.shape({\n fileName: PropTypes.string.isRequired,\n binaryLink: PropTypes.string.isRequired,\n thumbnailLink: PropTypes.string\n }),\n /**\n * Can user upload new files or just view existing\n */\n immutable: PropTypes.bool,\n /**\n * Allows to overwrite texts of the component\n */\n textResources: PropTypes.shape({\n uploading: PropTypes.string,\n delete: PropTypes.string,\n download: PropTypes.string\n })\n}\n\nexport default Upload\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Upload from '../../Upload'\n\nconst Document = props => {\n const onUpload = file => {\n if (file === null) {\n if (props.onChange) {\n props.onChange(null)\n }\n } else {\n if (props.options.upload) {\n props.options.upload(file)\n }\n }\n }\n\n return (\n <Upload\n onUpload={onUpload}\n immutable={props.immutable}\n textResources={{\n upload: props.options.uploadText,\n uploading: props.options.uploadingText,\n delete: props.options.deleteText,\n download: props.options.downloadText\n }}\n value={props.value ? props.value : null}\n />\n )\n}\n\nDocument.defaultProps = {\n options: {}\n}\n\nDocument.propTypes = {\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n upload: PropTypes.func.isRequired,\n uploadText: PropTypes.string,\n uploadingText: PropTypes.string,\n deleteText: PropTypes.string,\n downloadText: PropTypes.string\n }),\n onChange: PropTypes.func,\n value: PropTypes.object\n}\n\nexport default Document\n","import PropTypes from 'prop-types'\nimport React, {lazy, Suspense} from 'react'\nimport styled from 'styled-components'\n\nimport Typography, {declareTypograhpy} from '../../Typography'\n\nconst StyledHtmlEdit = styled.div`\n && {\n button {\n margin-bottom: 0;\n }\n\n .ql-editor {\n ${props => declareTypograhpy(props, 'quill')}\n\n &[contenteditable='false'] * {\n cursor: not-allowed;\n }\n }\n }\n`\n\nclass HtmlEdit extends React.Component {\n lazyQuill = null\n\n constructor(props) {\n super(props)\n\n // eslint-disable-next-line chai-friendly/no-unused-expressions\n import(/* webpackChunkName: \"vendor-quill\" */ '!style-loader!css-loader!react-quill/dist/quill.snow.css')\n // eslint-disable-next-line chai-friendly/no-unused-expressions\n import(/* webpackChunkName: \"vendor-quill\" */ '!style-loader!css-loader!react-quill/dist/quill.core.css')\n\n this.lazyQuill = lazy(() => import(/* webpackChunkName: \"vendor-quill\" */ 'react-quill'))\n }\n\n handleChange = (value, delta, source) => {\n if (this.props.onChange && source === 'user') {\n const v = value === '<p><br></p>' ? '' : value\n this.props.onChange(v)\n }\n }\n\n render() {\n if (this.props.immutable) {\n return <Typography.Span>\n <div dangerouslySetInnerHTML={{__html: this.props.value}}></div>\n </Typography.Span>\n }\n\n return (\n <StyledHtmlEdit>\n <Suspense fallback={<i/>}>\n <this.lazyQuill\n name={this.props.name}\n onChange={this.handleChange}\n id={this.props.id}\n theme=\"snow\"\n defaultValue={this.props.value}\n modules={{\n clipboard: {\n matchVisual: false\n }\n }}\n />\n </Suspense>\n </StyledHtmlEdit>\n )\n }\n}\n\nHtmlEdit.defaultProps = {\n value: ''\n}\n\nHtmlEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default HtmlEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst RemoteSelect = props => (\n <Select\n id={props.id}\n isMulti={false}\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n {...props.options}\n />\n)\n\nRemoteSelect.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ])\n }),\n options: PropTypes.shape({\n options: PropTypes.array,\n fetchOptions: PropTypes.func,\n searchOptions: PropTypes.func,\n isLoading: PropTypes.bool,\n valueClick: PropTypes.func,\n clearValueText: PropTypes.string,\n searchPromptText: PropTypes.string,\n noResultsText: PropTypes.string,\n moreOptionsAvailable: PropTypes.bool,\n moreOptionsAvailableText: PropTypes.string,\n openAdvancedSearch: PropTypes.func,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.func,\n createPermission: PropTypes.bool\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default RemoteSelect\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Select from '../../Select'\n\nconst MultiRemoteSelect = props => (\n <Select\n id={props.id}\n isMulti\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n {...props.options}\n />\n)\n\nMultiRemoteSelect.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.arrayOf(\n PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ])\n })\n ),\n options: PropTypes.shape({\n options: PropTypes.array,\n fetchOptions: PropTypes.func,\n searchOptions: PropTypes.func,\n openAdvancedSearch: PropTypes.func,\n isLoading: PropTypes.bool,\n valueClick: PropTypes.func,\n clearAllText: PropTypes.string,\n searchPromptText: PropTypes.string,\n noResultsText: PropTypes.string,\n moreOptionsAvailable: PropTypes.bool,\n moreOptionsAvailableText: PropTypes.string,\n tooltips: PropTypes.objectOf(PropTypes.string),\n loadTooltip: PropTypes.func,\n DetailLink: PropTypes.elementType\n }),\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default MultiRemoteSelect\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport Select from '../../Select'\n\nconst SearchFilterEdit = props => (\n <Select\n immutable={props.immutable}\n onChange={props.onChange}\n value={props.value}\n {...props.options}\n />\n)\n\nconst valueObjectType = PropTypes.shape({\n key: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number\n ]).isRequired\n})\n\nSearchFilterEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.oneOfType([\n valueObjectType,\n PropTypes.arrayOf(valueObjectType)\n ]),\n options: PropTypes.shape({\n isMulti: PropTypes.bool,\n fetchOptions: PropTypes.func,\n options: PropTypes.arrayOf(\n PropTypes.shape({\n value: PropTypes.any,\n label: PropTypes.string\n }))\n }).isRequired,\n immutable: PropTypes.bool,\n id: PropTypes.string\n}\n\nexport default SearchFilterEdit\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledUrlEdit = styled.input.attrs(props => ({\n type: 'url'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledUrlEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport Link from '../../Link'\nimport {\n StyledEditableControl,\n StyledEditableWrapper\n} from '../StyledEditableValue'\nimport StyledUrlEdit from './StyledUrlEdit'\n\nconst normalizeUrl = url => {\n url = url.toLowerCase()\n if (url.indexOf('.') > 0 && !/^[a-z0-9]+:\\/\\//.test(url)) {\n url = `https://${url}`\n }\n\n return url\n}\n\nconst UrlEdit = props =>\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledUrlEdit\n disabled={props.immutable}\n id={props.id}\n immutable={props.immutable}\n name={props.name}\n onChange={e => props.onChange(normalizeUrl(e.target.value))}\n value={props.value}\n />\n {props.value && <StyledEditableControl>\n <Link\n href={props.value}\n icon=\"external-link\"\n look=\"ball\"\n tabIndex={-1}\n target=\"_blank\"\n neutral\n />\n </StyledEditableControl>}\n </StyledEditableWrapper>\n\nUrlEdit.propTypes = {\n onChange: PropTypes.func,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default react.Debouncer(UrlEdit)\n","import styled from 'styled-components'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledPhoneEdit = styled.input.attrs(props => ({\n type: 'tel'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledPhoneEdit\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport _isEmpty from 'lodash/isEmpty'\nimport _get from 'lodash/get'\n\nimport Link from '../../Link'\nimport {\n StyledEditableControl,\n StyledEditableWrapper\n} from '../StyledEditableValue'\nimport StyledPhoneEdit from './StyledPhoneEdit'\n\nclass PhoneEdit extends React.Component {\n componentIsUnmounted = false\n FALLBACK_DEFAULT_COUNTRY = 'CH'\n\n constructor(props) {\n super(props)\n const defaultCountry = _get(props, 'options.defaultCountry') || this.FALLBACK_DEFAULT_COUNTRY\n this.state = {libPhoneImport: null, defaultCountry}\n this.importLibPhoneNumber()\n this.inputElement = React.createRef()\n }\n\n async importLibPhoneNumber() {\n const libPhoneImport = await import(/* webpackChunkName: \"vendor-libphonenumber-js\" */ 'libphonenumber-js')\n if (!this.componentIsUnmounted) {\n this.setState({...this.state, libPhoneImport})\n }\n }\n\n componentWillUnmount() {\n this.componentIsUnmounted = true\n }\n\n amountOfSpacesBeforeCaret = (str, caretPosition) => {\n const spaces = str.substring(0, caretPosition - 1).match(/\\s/g)\n return spaces ? spaces.length : 0\n }\n\n repositionCaret = (value, previousValue, caretPosition) => {\n if (caretPosition && value.length !== caretPosition) {\n const previousFormatted = new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(previousValue)\n const currentFormatted = new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(value)\n\n const spacesPrevious = this.amountOfSpacesBeforeCaret(previousFormatted, caretPosition)\n const spacesCurrent = this.amountOfSpacesBeforeCaret(currentFormatted, caretPosition)\n\n const offset = spacesCurrent - spacesPrevious\n\n window.requestAnimationFrame(function() {\n const start = caretPosition + offset\n this.setSelectionRange(start, start)\n }.bind(this.inputElement.current))\n }\n }\n\n removeSpaces = str => str.replace(/\\s/g, '')\n\n handleChange = e => {\n const newValue = e.target.value\n const {libPhoneImport} = this.state\n const parsedNumber = libPhoneImport ? libPhoneImport.parseNumber(newValue, this.state.defaultCountry) : newValue\n\n const valueNormalized = _isEmpty(parsedNumber)\n ? this.removeSpaces(new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(newValue))\n : libPhoneImport.formatNumber(parsedNumber, 'E.164')\n\n this.props.onChange(valueNormalized)\n\n const currentCaretPosition = e.target.selectionStart\n this.repositionCaret(newValue, this.props.value, currentCaretPosition)\n }\n\n determineDisplayValue = () => {\n if (this.props.value && this.state.libPhoneImport && this.state.libPhoneImport.AsYouType) {\n return new this.state.libPhoneImport.AsYouType(this.state.defaultCountry).input(this.props.value)\n }\n\n return this.props.value || ''\n }\n\n render() {\n const displayValue = this.determineDisplayValue()\n\n return (\n <StyledEditableWrapper immutable={this.props.immutable}>\n <StyledPhoneEdit\n disabled={this.props.immutable || !this.state.libPhoneImport}\n id={this.props.id}\n name={name}\n onChange={this.handleChange}\n immutable={this.props.immutable || !this.state.libPhoneImport}\n ref={this.inputElement}\n value={displayValue}\n />\n {displayValue && <StyledEditableControl>\n <Link\n href={`tel:${this.props.value}`}\n icon=\"phone\"\n tabIndex={-1}\n neutral\n />\n </StyledEditableControl>}\n </StyledEditableWrapper>\n )\n }\n}\n\nPhoneEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.node,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n defaultCountry: PropTypes.string,\n customPhoneRegex: PropTypes.string\n })\n}\n\nexport default PhoneEdit\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {\n generateDisabledShade,\n scale,\n theme\n} from '../../utilStyles'\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledDurationEdit = styled.input`\n && {\n ${StyledInputCss}\n flex-grow: 0;\n min-width: 1ch;\n }\n`\n\nconst StyledDurationEditFocusable = styled.label`\n &&& {\n align-items: center;\n display: flex;\n flex-wrap: nowrap;\n margin-bottom: 0; /* reset bootstrap */\n\n &:first-child {\n margin-right: ${scale.space(-1)};\n }\n\n > span {\n color: ${props => props.immutable\n ? generateDisabledShade(_get(props.theme, 'colors.text'))\n : theme.color('text')};\n cursor: ${props => props.immutable ? 'not-allowed' : 'default'};\n }\n }\n`\n\nconst StyledDurationEditShadow = styled.span`\n && {\n border: 1px solid transparent;\n left: 0;\n max-width: 100%;\n overflow: hidden;\n position: absolute;\n z-index: -1;\n visibility: hidden;\n }\n`\n\nexport {\n StyledDurationEditShadow,\n StyledDurationEditFocusable,\n StyledDurationEdit\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport {calculateMilliseconds} from '../utils'\nimport Typography from '../../Typography'\nimport {\n StyledDurationEditShadow,\n StyledDurationEditFocusable,\n StyledDurationEdit\n} from './StyledDurationEdit'\nimport {StyledEditableWrapper} from '../StyledEditableValue'\n\nclass DurationEdit extends React.Component {\n constructor(props) {\n super(props)\n this.hoursShadow = React.createRef()\n this.minutesShadow = React.createRef()\n this.state = {\n ...this.millisecondsToDuration(props.value),\n showUnits: props.value >= 0\n }\n }\n\n millisecondsToDuration = milliSeconds => {\n if (!milliSeconds && milliSeconds !== 0) {\n return {hours: '', minutes: ''}\n }\n\n const minutes = parseInt((milliSeconds / (1000 * 60)) % 60)\n const hours = parseInt((milliSeconds / (1000 * 60 * 60)) % 24)\n return {hours, minutes}\n }\n\n componentDidMount = () => {\n this.setState({\n hoursWidth: this.hoursShadow.current.offsetWidth,\n minutesWidth: this.minutesShadow.current.offsetWidth\n })\n }\n\n componentDidUpdate = (prevProps, prevState) => {\n if (this.state.hours !== prevState.hours) {\n this.setState({hoursWidth: this.hoursShadow.current.offsetWidth})\n }\n if (this.state.minutes !== prevState.minutes) {\n this.setState({minutesWidth: this.minutesShadow.current.offsetWidth})\n }\n }\n\n handleHourChange = e => {\n const hours = e.target.value.replace(/[^-\\d]/g, '')\n this.setState({...this.state, hours})\n this.handleChange(hours, null)\n }\n\n getDesiredInputInMinutes = target => {\n let minutes = target.value.replace(/[^-\\d]/g, '')\n\n if (!target.validity.valid) {\n minutes = 0\n }\n\n if (`${minutes}`.length > 2) {\n minutes = `${minutes}`.slice(0, 2)\n }\n\n if (minutes > 59) {\n minutes = 0\n }\n\n if (minutes < 0) {\n minutes = 59\n }\n\n return minutes\n }\n\n handleMinutesChange = e => {\n const minutes = this.getDesiredInputInMinutes(e.target)\n this.setState({...this.state, minutes})\n\n this.handleChange(null, minutes)\n\n if (minutes.toString().length === 2 || minutes === 0) {\n e.target.select()\n }\n }\n\n handleChange = (hours, minutes) => {\n const minutesValue = minutes !== null ? minutes : this.state.minutes\n const hoursValue = (hours !== null ? hours : this.state.hours)\n if (minutesValue === '' && hoursValue === '') {\n this.props.onChange(null)\n return\n }\n this.props.onChange(calculateMilliseconds(hoursValue, minutesValue))\n }\n\n handleOnBlur = () => this.setState({\n showUnits:\n (this.state.hours.toString().length >= 1 || this.state.minutes.toString().length >= 1)\n })\n\n handleOnFocus = () => this.setState({showUnits: true})\n\n preventNonNumeric = event => {\n if (!(event.charCode >= 48 && event.charCode <= 57)) {\n event.preventDefault()\n }\n }\n\n render() {\n return (\n <StyledEditableWrapper\n onBlur={this.handleOnBlur}\n immutable={this.props.immutable}\n style={{overflowX: 'auto'}}>\n <StyledDurationEditFocusable immutable={this.props.immutable}>\n <StyledDurationEdit\n disabled={this.props.immutable}\n immutable={this.props.immutable}\n min={0}\n onChange={() => {}} // Empty onChange function to prevent React internal error\n onFocus={this.handleOnFocus}\n onInput={this.handleHourChange}\n onKeyPress={this.preventNonNumeric}\n pattern=\"\\d+\"\n step={1}\n style={{width: this.state.hoursWidth}}\n type=\"number\"\n value={this.state.hours}\n />\n {this.state.showUnits && <Typography.Span>{this.props.options.hoursLabel}</Typography.Span>}\n </StyledDurationEditFocusable>\n <StyledDurationEditFocusable immutable={this.props.immutable}>\n <StyledDurationEdit\n disabled={this.props.immutable}\n immutable={this.props.immutable}\n onChange={() => {}} // Empty onChange function to prevent React internal error\n onFocus={this.handleOnFocus}\n onInput={this.handleMinutesChange}\n onKeyPress={this.preventNonNumeric}\n pattern=\"\\d+\"\n step={1}\n style={{width: this.state.minutesWidth}}\n type=\"number\"\n value={this.state.minutes}\n />\n {this.state.showUnits && <Typography.Span>{this.props.options.minutesLabel}</Typography.Span>}\n </StyledDurationEditFocusable>\n <StyledDurationEditShadow ref={this.hoursShadow}>{this.state.hours}</StyledDurationEditShadow>\n <StyledDurationEditShadow ref={this.minutesShadow}>{this.state.minutes}</StyledDurationEditShadow>\n </StyledEditableWrapper>\n )\n }\n}\n\nDurationEdit.defaultProps = {\n options: {\n hoursLabel: 'hrs',\n minutesLabel: 'min'\n }\n}\n\nDurationEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.number,\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n hoursLabel: PropTypes.string,\n minutesLabel: PropTypes.string\n })\n}\n\nexport default DurationEdit\n","import React from 'react'\nimport styled from 'styled-components'\nimport NumberFormat from 'react-number-format'\n\nimport {StyledInputCss} from '../StyledEditableValue'\n\nconst StyledNumberEdit = styled(({immutable, ...rest}) => <NumberFormat {...rest}/>)`\n && {\n ${StyledInputCss}\n }\n`\n\nexport default StyledNumberEdit\n","import PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport {parseLocalePlaceholder, convertStringToNumber} from '../utils'\nimport {StyledEditableWrapper} from '../StyledEditableValue'\nimport StyledNumberEdit from './StyledNumberEdit'\n\nexport const calculateMaxValue = (prePointDigits, postPointDigits, maxValue) => {\n if (prePointDigits) {\n const calculatedMaxValue = (10 ** prePointDigits) - (postPointDigits ? (1 / (10 ** postPointDigits)) : 1)\n return maxValue && maxValue > calculatedMaxValue ? maxValue : calculatedMaxValue\n }\n\n return maxValue\n}\n\nconst getPreDecimalPositions = number => number !== 0 ? Math.ceil(Math.log10(Math.abs(number) + 1)) : 1\n\nconst isNumber = number => number !== null && number !== undefined && !isNaN(parseFloat(number))\n\nconst checkValueRange = (minValue, maxValue, value) => {\n if (!isNumber(value)) {\n return true\n }\n\n if (isNumber(maxValue) && value > maxValue) {\n return false\n }\n\n if (isNumber(minValue) && value < minValue) {\n return false\n }\n\n return true\n}\n\nexport const isAllowedValue = (minValue, maxValue) => ({floatValue}) => {\n if (getPreDecimalPositions(floatValue) < getPreDecimalPositions(minValue)) {\n return true\n }\n\n return checkValueRange(minValue, maxValue, floatValue)\n}\n\nconst NumberEdit = props => {\n const {thousandSeparator, decimalSeparator} = parseLocalePlaceholder(props.intl.locale)\n const {\n prePointDigits,\n postPointDigits,\n minValue,\n maxValue,\n allowNegative,\n fixedDecimalScale,\n suffix,\n prefix,\n format\n } = props.options || {}\n\n const calculatedMaxValue = calculateMaxValue(prePointDigits, postPointDigits, maxValue)\n const numberFormatOptions = {\n isAllowed: isAllowedValue(minValue, calculatedMaxValue),\n allowNegative: !!allowNegative,\n ...(!isNaN(postPointDigits) ? {decimalScale: postPointDigits} : {}),\n fixedDecimalScale: !!fixedDecimalScale\n }\n\n const handleChange = values => {\n if (props.onChange && checkValueRange(minValue, calculatedMaxValue, values.floatValue)) {\n props.onChange(values.floatValue !== undefined ? values.floatValue : null)\n }\n }\n\n const handleBlur = event => {\n const valueBeforeBlur = convertStringToNumber(event.target.value)\n if (props.onChange && !checkValueRange(minValue, calculatedMaxValue, valueBeforeBlur)) {\n // if we reach this, then onChange was never called for the last entered value, so just remove it\n event.target.value = null\n }\n }\n\n return (\n <StyledEditableWrapper immutable={props.immutable}>\n <StyledNumberEdit\n decimalSeparator={decimalSeparator}\n disabled={props.immutable}\n id={props.id}\n isNumericString={true}\n name={props.name}\n onValueChange={handleChange}\n immutable={props.immutable}\n thousandSeparator={thousandSeparator}\n value={props.value}\n suffix={suffix}\n prefix={prefix}\n {...numberFormatOptions}\n format={format}\n onBlur={handleBlur}\n />\n </StyledEditableWrapper>\n )\n}\n\nNumberEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.number,\n name: PropTypes.string,\n id: PropTypes.string,\n intl: PropTypes.object,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n allowNegative: PropTypes.bool,\n fixedDecimalScale: PropTypes.bool,\n postPointDigits: PropTypes.number,\n prePointDigits: PropTypes.number,\n minValue: PropTypes.number,\n maxValue: PropTypes.number,\n suffix: PropTypes.string,\n prefix: PropTypes.string,\n format: PropTypes.string\n })\n}\n\nexport default injectIntl(react.Debouncer(NumberEdit, 800))\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {react} from 'tocco-util'\n\nimport {StyledEditableWrapper} from '../StyledEditableValue'\nimport StyledNumberEdit from './StyledNumberEdit'\n\nconst IntegerEdit = ({value, onChange, options, immutable, name, id}) => {\n const {\n minValue,\n maxValue,\n format,\n allowLeadingZeros\n } = options || {}\n\n const handleChange = ({value, floatValue}) => {\n let newValue = allowLeadingZeros ? value : floatValue\n if (newValue === undefined) {\n newValue = null\n }\n onChange(newValue)\n }\n\n const isAllowed = ({floatValue}) =>\n !((maxValue && floatValue > maxValue) || (minValue && floatValue < minValue))\n\n return (\n <StyledEditableWrapper immutable={immutable}>\n <StyledNumberEdit\n isAllowed={isAllowed}\n allowNegative={true}\n decimalScale={0}\n disabled={immutable}\n id={id}\n name={name}\n onValueChange={handleChange}\n value={value}\n allowLeadingZeros={allowLeadingZeros}\n format={format}\n />\n </StyledEditableWrapper>\n )\n}\n\nIntegerEdit.propTypes = {\n onChange: PropTypes.func.isRequired,\n value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n name: PropTypes.string,\n id: PropTypes.string,\n intl: PropTypes.object,\n immutable: PropTypes.bool,\n options: PropTypes.shape({\n minValue: PropTypes.number,\n maxValue: PropTypes.number,\n format: PropTypes.string,\n allowLeadingZeros: PropTypes.bool\n })\n}\n\nexport default react.Debouncer(IntegerEdit, 800)\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {\n generateDisabledShade,\n scale,\n shadeColor,\n theme\n} from '../../utilStyles'\nimport {\n StyledEditableWrapperCss,\n StyledInputCss\n} from '../StyledEditableValue'\n\nexport const StyledLocationEdit = styled.div`\n && {\n ${StyledEditableWrapperCss}\n position: relative;\n\n div {\n :nth-of-type(1) {\n flex: 0 0 6ch;\n margin-right: ${scale.space(-2)};\n }\n\n :nth-of-type(2) {\n flex: 1 1 auto;\n }\n }\n\n > span {\n flex: 0 0 auto;\n margin-right: ${scale.space(-2)};\n color: ${({immutable, theme}) => immutable\n ? generateDisabledShade(_get(theme, 'colors.text'))\n : _get(theme, 'colors.text')};\n }\n\n .react-autosuggest__input {\n ${StyledInputCss}\n width: 100%;\n }\n\n .react-autosuggest__suggestions-container--open {\n width: calc(100% + 17.5px);\n background-color: ${theme.color('paper')};\n box-shadow: 0 0 6px ${theme.color('signal.info.text')};\n border: 1px solid ${theme.color('secondaryLight')};\n bottom: -9px;\n left: -10px;\n max-height: 300px;\n overflow-y: auto;\n position: absolute;\n transform: translateY(100%);\n z-index: 2; // higher than StyledIndicatorsContainerWrapper\n }\n\n .react-autosuggest__suggestions-list {\n margin: 0;\n padding: 0;\n list-style-type: none;\n }\n\n .react-autosuggest__suggestion {\n cursor: pointer;\n padding: 8px 12px;\n }\n\n .react-autosuggest__suggestion--highlighted {\n background-color: ${({theme}) => shadeColor(_get(theme, 'colors.paper'), 1)};\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Autosuggest from 'react-autosuggest'\nimport FocusWithin from 'react-simple-focus-within'\n\nimport Link from '../../Link'\nimport LoadingSpinner from '../../LoadingSpinner'\nimport Typography from '../../Typography'\nimport {StyledEditableControl} from '../StyledEditableValue'\nimport {StyledLocationEdit} from './StyledLocationEdit'\n\nexport const getGoogleMapsAddress = locationInput => {\n const mapsBaseAddress = 'https://www.google.com/maps/search/?api=1&query='\n\n const queryParams = locationInput\n ? Object.values(locationInput)\n .filter(value => value)\n .map(value => (typeof value === 'object' && value.display) ? value.display : value)\n .join('+')\n : ''\n\n return `${mapsBaseAddress}${queryParams}`\n}\n\nclass LocationEdit extends React.Component {\n returnGetSuggestion = attr => suggestion => suggestion[attr]\n\n renderSuggestion = suggestion => {\n const cantonString = suggestion.state ? `- ${suggestion.state}` : ''\n const countryString = suggestion.country ? `/ ${suggestion.country.display}` : ''\n\n return <Typography.Span>{suggestion.postcode} {suggestion.city} {cantonString} {countryString}</Typography.Span>\n }\n\n onChange = field => (event, {newValue}) => {\n this.props.onChange({[field]: newValue})\n }\n\n onSuggestionSelected = (event, {suggestion}) => {\n this.props.onChange(suggestion)\n }\n\n returnOnSuggestionFetchRequested = field => ({value}) => {\n this.props.options.fetchSuggestions({[field]: value}, this.props.value.country)\n }\n\n onSuggestionsClearRequested = () => {}\n\n showGoogleMaps = value => !!(value.city || value.postcode)\n\n render() {\n const inputPropsZip = {\n id: this.props.id,\n value: this.props.value.postcode || '',\n onChange: this.onChange('postcode'),\n disabled: this.props.immutable\n }\n\n const inputPropsCity = {\n value: this.props.value.city || '',\n onChange: this.onChange('city'),\n disabled: this.props.immutable\n }\n\n return (\n <FocusWithin>\n {({focused, getRef}) => {\n return <StyledLocationEdit\n immutable={this.props.immutable}\n name={this.props.name}\n ref={getRef}\n >\n <Autosuggest\n suggestions={this.props.options.suggestions || []}\n onSuggestionsFetchRequested={this.returnOnSuggestionFetchRequested('postcode')}\n getSuggestionValue={this.returnGetSuggestion('postcode')}\n renderSuggestion={this.renderSuggestion}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n inputProps={inputPropsZip}\n onSuggestionSelected={this.onSuggestionSelected}\n focusInputOnSuggestionClick={false}\n shouldRenderSuggestions={v => v && !this.props.immutable}\n />\n {(focused || this.props.value.city || this.props.value.postcode) && <Typography.Span>/</Typography.Span>}\n <Autosuggest\n suggestions={this.props.options.suggestions || []}\n onSuggestionsFetchRequested={this.returnOnSuggestionFetchRequested('city')}\n getSuggestionValue={this.returnGetSuggestion('city')}\n renderSuggestion={this.renderSuggestion}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n inputProps={inputPropsCity}\n onSuggestionSelected={this.onSuggestionSelected}\n focusInputOnSuggestionClick={false}\n shouldRenderSuggestions={v => v && !this.props.immutable}\n />\n <StyledEditableControl>\n {this.props.options.isLoading && <LoadingSpinner size=\"1.8rem\"/>}\n {this.showGoogleMaps(this.props.value)\n && <Link\n href={getGoogleMapsAddress(this.props.value)}\n icon=\"map-marked\"\n tabIndex={-1}\n target=\"_blank\"\n dense={false}\n title={this.props.options.mapButtonTitle || 'Show on map'}\n neutral\n />\n }\n </StyledEditableControl>\n </StyledLocationEdit>\n }}\n </FocusWithin>\n )\n }\n}\n\nconst locationObjectPropType = PropTypes.shape({\n city: PropTypes.string,\n postcode: PropTypes.string,\n address: PropTypes.string,\n country: PropTypes.shape({\n display: PropTypes.string,\n key: PropTypes.string\n }),\n canton: PropTypes.string,\n district: PropTypes.string\n})\n\nLocationEdit.propTypes = {\n onChange: PropTypes.func,\n value: locationObjectPropType,\n options: PropTypes.shape({\n suggestions: PropTypes.arrayOf(locationObjectPropType),\n fetchSuggestions: PropTypes.func,\n isLoading: PropTypes.bool,\n mapButtonTitle: PropTypes.string\n }),\n name: PropTypes.string,\n id: PropTypes.string,\n immutable: PropTypes.bool\n}\n\nexport default LocationEdit\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport _isEmpty from 'lodash/isEmpty'\nimport _omit from 'lodash/omit'\n\nimport SingleSelect from './typeEditors/SingleSelect'\nimport MultiSelect from './typeEditors/MultiSelect'\nimport StringEdit from './typeEditors/StringEdit'\nimport TextEdit from './typeEditors/TextEdit'\nimport DateEdit from './typeEditors/DateEdit'\nimport DateTimeEdit from './typeEditors/DateTimeEdit'\nimport TimeEdit from './typeEditors/TimeEdit'\nimport BoolEdit from './typeEditors/BoolEdit'\nimport Document from './typeEditors/Document'\nimport HtmlEdit from './typeEditors/HtmlEdit'\nimport RemoteSelect from './typeEditors/RemoteSelect'\nimport MultiRemoteSelect from './typeEditors/MultiRemoteSelect'\nimport SearchFilterEdit from './typeEditors/SearchFilterEdit'\nimport UrlEdit from './typeEditors/UrlEdit'\nimport PhoneEdit from './typeEditors/PhoneEdit'\nimport DurationEdit from './typeEditors/DurationEdit'\nimport NumberEdit from './typeEditors/NumberEdit'\nimport IntegerEdit from './typeEditors/IntegerEdit'\nimport LocationEdit from './typeEditors/LocationEdit'\n\nexport const map = {\n 'boolean': BoolEdit,\n 'date': DateEdit,\n 'datetime': DateTimeEdit,\n 'document': Document,\n 'duration': DurationEdit,\n 'html': HtmlEdit,\n 'integer': IntegerEdit,\n 'location': LocationEdit,\n 'multi-remote': MultiRemoteSelect,\n 'multi-select': MultiSelect,\n 'number': NumberEdit,\n 'phone': PhoneEdit,\n 'remote': RemoteSelect,\n 'search-filter': SearchFilterEdit,\n 'single-select': SingleSelect,\n 'string': StringEdit,\n 'text': TextEdit,\n 'url': UrlEdit,\n 'time': TimeEdit\n}\n\nconst TypeEditorFactory = ({type, value, options, id, events, readOnly = false}) => {\n if (map[type]) {\n const Component = map[type]\n\n // blur workaround for known react-select issue: https://github.com/erikras/redux-form/issues/82\n // Date component only works properly on blur if the event is called with the value saved from the change event\n let blurValue\n if (events && events.onBlur) {\n const onBlur = events.onBlur\n events.onBlur = () => {\n return onBlur(blurValue !== undefined ? blurValue : value)\n }\n }\n\n return (\n <div {..._omit(events, 'onChange')} data-cy=\"form-field\">\n <Component\n value={value}\n onChange={v => {\n blurValue = v\n events.onChange(v)\n }}\n {...(_isEmpty(options) ? {} : {options})}\n id={id}\n immutable={readOnly}\n events={events}\n />\n </div>\n )\n }\n\n // eslint-disable-next-line no-console\n console.log('No type-editor defined for type', type)\n return null\n}\n\nTypeEditorFactory.propTypes = {\n type: PropTypes.oneOf(\n Object.keys(map)\n ).isRequired,\n events: PropTypes.objectOf(PropTypes.func),\n id: PropTypes.string,\n readOnly: PropTypes.bool,\n options: PropTypes.object,\n value: PropTypes.any\n}\n\nexport default TypeEditorFactory\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport TypeEditorFactory, {map as typeEditorFactoryMap} from './typeEditorFactory'\nimport StyledEditableValue from './StyledEditableValue'\n\n/**\n * To edit values of given type.\n */\nconst EditableValue = props => (\n <StyledEditableValue>\n <TypeEditorFactory {...props}/>\n </StyledEditableValue>\n)\n\nEditableValue.propTypes = {\n /**\n * Type of value. e.g. 'string'\n */\n type: PropTypes.oneOf(\n Object.keys(typeEditorFactoryMap)\n ).isRequired,\n /**\n * Value to display\n */\n value: PropTypes.any,\n /**\n * Depending on the type an object of options can be passed\n */\n options: PropTypes.object,\n /**\n * Id of element (for htmlFor)\n */\n id: PropTypes.string,\n /**\n * Object of functions that gets assigned to the component. E.g. {onChange: v => {}, onBlur: () => {}}\n */\n events: PropTypes.objectOf(PropTypes.func),\n /**\n * Determines if value is editable\n */\n readOnly: PropTypes.bool\n}\n\nexport default EditableValue\n","import styled, {css} from 'styled-components'\n\nimport {\n declareFont,\n theme\n} from '../utilStyles'\n\nconst StyledEditableWrapperCss = css`\n align-items: center;\n cursor: ${({immutable}) => immutable ? 'not-allowed' : 'default'};\n display: flex;\n`\n\nconst StyledEditableWrapper = styled.label`\n &&& {\n margin: 0; /* reset Bootstrap and Ext JS */\n padding: 0; /* reset Ext JS */\n ${StyledEditableWrapperCss}\n }\n`\n\nconst StyledInputCss = css`\n background-color: transparent;\n border: 0;\n cursor: ${({immutable}) => immutable ? 'not-allowed' : 'default'};\n flex-grow: 1;\n min-height: 2.6rem;\n min-width: 0;\n outline: 0;\n padding: 0;\n ${() => declareFont({\n color: theme.color('text')\n })}\n &::-ms-clear {\n display: none;\n }\n\n &::-webkit-clear-button {\n display: none;\n }\n\n &::-webkit-inner-spin-button {\n display: none;\n }\n\n &[type='number'] {\n appearance: textfield;\n }\n\n &[type='search'] {\n appearance: none;\n }\n\n &:disabled {\n -webkit-text-fill-color: ${theme.color('text')}; // Safari fix\n opacity: 1; // iOS fix\n }\n\n /* remove indicators */\n &[type='date'],\n &[type='datetime-local'],\n &[type='month'],\n &[type='time'],\n &[type='week'] {\n appearance: none;\n display: flex;\n\n /* reset margin on smaller screens */\n ::-webkit-date-and-time-value {\n ${({immutable}) => immutable && 'margin: unset;'}\n }\n }\n\n // allow pointer event only on touch devices\n @media (pointer: coarse) {\n pointer-events: ${({immutable}) => immutable ? 'none' : 'auto'};\n }\n`\n\nconst StyledEditableControlCss = css`\n display: flex;\n align-items: center;\n`\n\nconst StyledEditableControl = styled.div`\n &&& {\n ${StyledEditableControlCss}\n }\n`\n\nexport const StyledEditableValue = styled.span`\n width: 100%;\n\n && {\n //textarea\n textarea {\n resize: vertical; // react-textarea-autosize consumes resize property\n max-height: 25rem; // react-textarea-autosize respects max-height property\n }\n\n //url\n [type='url'] + .input-group-addon > a {\n color: inherit; // reset bootstrap default\n }\n\n //url\n [type='tel'] + .input-group-addon > a {\n color: inherit; // reset bootstrap default\n }\n\n //html edit\n .quill {\n .ql-toolbar {\n border-top-left-radius: .27rem;\n border-top-right-radius: .27rem;\n }\n\n .ql-container {\n border-bottom-left-radius: .27rem;\n border-bottom-right-radius: .27rem;\n background-color: #fff;\n }\n\n .ql-container.ql-disabled {\n border-top-left-radius: .27rem;\n border-top-right-radius: .27rem;\n\n .ql-editor {\n cursor: not-allowed;\n }\n }\n }\n\n //date\n .date-edit {\n .input-group-addon {\n cursor: pointer;\n }\n\n input {\n z-index: 0;\n }\n\n &.disabled {\n input {\n cursor: not-allowed;\n }\n }\n\n .right-addon {\n position: relative;\n }\n\n .right-addon input {\n padding-right: 30px;\n }\n\n .reset {\n position: absolute;\n padding-right: 10px;\n padding-top: 5px;\n right: 0;\n color: #999;\n font-size: 18px;\n font-style: normal;\n cursor: pointer;\n }\n\n .reset:hover {\n color: ${theme.color('signal.danger.text')};\n }\n }\n }\n`\n\nexport {\n StyledEditableControl,\n StyledEditableControlCss,\n StyledEditableValue as default,\n StyledEditableWrapper,\n StyledEditableWrapperCss,\n StyledInputCss\n}\n","import React, {useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\n\nimport {Ball} from '../'\nimport {Menu} from './'\n\n/**\n * Ball Button with a menu that pops out on click.\n */\nconst BallMenu = ({buttonProps, onOpen, children}) => {\n const ballEl = useRef(null)\n const [menuOpen, setMenuOpen] = useState(false)\n const [onOpenCalled, setOnOpenCalled] = useState(false)\n\n const handleClick = e => {\n setMenuOpen(!menuOpen)\n e.stopPropagation()\n\n if (onOpen && !onOpenCalled) {\n onOpen()\n setOnOpenCalled(true)\n }\n }\n\n const handleClose = () => {\n setMenuOpen(false)\n }\n\n return <>\n <Ball {...buttonProps} onClick={handleClick} ref={ballEl}/>\n {menuOpen && <Menu\n referenceElement={ballEl.current}\n open={menuOpen}\n onClose={handleClose}\n >\n {children}\n </Menu>}\n </>\n}\n\nBallMenu.propTypes = {\n /**\n * Tree of <MenuItem>\n */\n children: PropTypes.oneOfType([\n PropTypes.element,\n PropTypes.arrayOf(PropTypes.element)\n ]).isRequired,\n /**\n * Object of properties as described in Ball component\n */\n buttonProps: PropTypes.object,\n /**\n * Callback when the menu is opened (only called once)\n */\n onOpen: PropTypes.func\n}\n\nexport default BallMenu\n","import React, {useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\n\nimport {Menu, Icon, Button, ButtonGroup} from '../'\nimport {StyledIconButtonWrapper, StyledIconWrapper} from './StyledComponents'\n\n/**\n * Button with a menu that pops out on click.\n */\nconst ButtonMenu = props => {\n const {onOpen, children, onClick, buttonProps, label} = props\n const referenceElement = useRef(null)\n const [menuOpen, setMenuOpen] = useState(false)\n const [onOpenCalled, setOnOpenCalled] = useState(false)\n\n const handleClick = () => {\n setMenuOpen(!menuOpen)\n if (onOpen && !onOpenCalled) {\n onOpen()\n setOnOpenCalled(true)\n }\n }\n\n const handleClose = () => {\n setMenuOpen(false)\n }\n\n const chevronIcon = menuOpen ? 'chevron-up' : 'chevron-down'\n\n const ThisMenu = () => <Menu\n referenceElement={referenceElement.current}\n open={menuOpen}\n onClose={handleClose}\n >\n {children}\n </Menu>\n\n if (onClick) {\n return <>\n <ButtonGroup ref={referenceElement}>\n <Button {...buttonProps || {}} onClick={onClick} label={label} data-cy={props['data-cy']}/>\n <StyledIconButtonWrapper icon={chevronIcon} onClick={handleClick} {...buttonProps || {}}/>\n </ButtonGroup>\n {menuOpen && <ThisMenu/>}\n </>\n }\n\n return <>\n <Button\n data-cy={props['data-cy']}\n {...buttonProps || {}} ref={referenceElement}\n onClick={handleClick}\n >\n {label}\n <StyledIconWrapper>\n <Icon icon={chevronIcon}/>\n </StyledIconWrapper>\n </Button>\n {menuOpen && <ThisMenu/>}\n </>\n}\n\nButtonMenu.propTypes = {\n /**\n * Optional handler. If defined, a split button will be rendered\n */\n 'onClick': PropTypes.func,\n /**\n * Will be shown on the button\n */\n 'label': PropTypes.string,\n /**\n * Will be passed to the underlying Button\n */\n 'buttonProps': PropTypes.object,\n /**\n * Tree of <MenuItem>\n */\n 'children': PropTypes.any,\n /**\n * Callback when the menu is opened (only called once)\n */\n 'onOpen': PropTypes.func,\n /**\n * cypress selector string\n */\n 'data-cy': PropTypes.string\n}\n\nexport default ButtonMenu\n","import React, {useEffect, useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {usePopper} from 'react-popper'\n\nimport {StyledPopper, StyledPopperWrapper} from './StyledComponents'\n\n/**\n * Menu realised with popper.\n */\nconst Menu = ({referenceElement, onClose, open, children}) => {\n const thisEl = useRef(null)\n const [popperElement, setPopperElement] = useState(null)\n const [bottom, setBottom] = useState(0)\n\n const handleClickOutside = e => {\n if (thisEl && thisEl.current && !thisEl.current.contains(e.target)\n && referenceElement && !referenceElement.contains(e.target)) {\n onClose()\n }\n }\n\n useEffect(() => {\n if (thisEl.current) {\n setBottom(thisEl.current.getBoundingClientRect().bottom)\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [referenceElement])\n\n const {styles, attributes} = usePopper(referenceElement, popperElement, {\n placement: 'bottom-start',\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: [0, 5]\n }\n }\n ]\n }\n )\n\n if (!open) {\n return null\n }\n\n return (\n <StyledPopperWrapper ref={thisEl}>\n {children && <StyledPopper\n ref={setPopperElement}\n style={styles.popper}\n {...attributes.popper}\n rectBottom={bottom}>\n {React.Children.map(children, child => child && React.cloneElement(child, {onClose: onClose}))}\n </StyledPopper>}\n </StyledPopperWrapper>\n )\n}\n\nMenu.propTypes = {\n /**\n * Element to attach popper menu to\n */\n referenceElement: PropTypes.any,\n /**\n * Will be called if menu is closed\n */\n onClose: PropTypes.func.isRequired,\n /**\n * Tree of <MenuItems>\n */\n children: PropTypes.node,\n /**\n * Whether menu is open or not\n */\n open: PropTypes.bool\n}\n\nexport default Menu\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {StyledMenuItem, StyledItemLabel} from './StyledComponents'\n\n/**\n * Item of Menu\n */\nconst MenuItem = ({\n children,\n onClick,\n onClose,\n disabled,\n closeOnClick,\n title,\n level\n}) => {\n const childrenArr = React.Children.toArray(children).filter(Boolean)\n const isGroup = childrenArr.length > 1\n const hasOnClick = Boolean(onClick)\n\n const handleClick = e => {\n if (hasOnClick && !disabled) {\n onClick()\n\n if (closeOnClick && onClose) {\n onClose()\n }\n }\n e.stopPropagation()\n }\n\n const menuItem = childrenArr.map((child, idx) => {\n const lvl = level ? level++ : 1\n if (child.type && child.type.displayName === 'MenuItem') {\n return React.cloneElement(child, {\n ...child.props,\n onClose: onClose,\n closeOnClick: closeOnClick,\n level: lvl,\n key: `menu-item-${idx}-${lvl}`\n })\n }\n return <StyledItemLabel\n key={`menu-item-label-${idx}-${lvl}`}\n hasOnClick={hasOnClick}\n isGroup={isGroup}\n title={title}\n disabled={disabled}\n look=\"raised\"\n level={level}\n >\n {child}\n </StyledItemLabel>\n })\n\n return (\n <StyledMenuItem onClick={handleClick} level={level}>\n {menuItem}\n </StyledMenuItem>\n )\n}\n\nMenuItem.defaultProps = {\n closeOnClick: true\n}\n\nMenuItem.displayName = 'MenuItem'\n\nMenuItem.propTypes = {\n /**\n * Can either be another MenuItem for tree hierarchy or an element that gets rendered e.g. label\n */\n children: PropTypes.any,\n /**\n * Will be called on click\n */\n onClick: PropTypes.func,\n /**\n * If true, the Item will be read only\n */\n disabled: PropTypes.bool,\n /**\n * Html attribute. Will be shown on mouse over\n */\n title: PropTypes.string,\n /**\n * Will be passed down from Menu. Indicated whether the menu should close or not on click.\n */\n closeOnClick: PropTypes.bool,\n /**\n * Will be passed down from Menu.\n */\n onClose: PropTypes.func,\n /**\n * Will be set automatically and indicates the level\n */\n level: PropTypes.number\n}\n\nexport default MenuItem\n","import styled from 'styled-components'\n\nimport {Button, declareFont, scale, theme, StyledScrollbar} from '../index'\nimport {interactiveStyling} from '../utilStyles'\n\nexport const StyledIconWrapper = styled.div`\n margin-left: 4px;\n margin-right: -3px;\n`\n\nexport const StyledIconButtonWrapper = styled(Button)`\n padding-left: .9rem;\n padding-right: .9rem;\n`\n\nexport const StyledPopperWrapper = styled.div`\n position: relative;\n`\n\nexport const StyledPopper = styled.div`\n max-height: ${({rectBottom}) => `calc(100vh - ${rectBottom + 15}px)`}; // add 15px for small padding\n width: max-content;\n overflow-y: auto;\n overflow-x: hidden;\n background: ${theme.color('paper')};\n box-shadow: 0 0 5px rgba(0, 0, 0, .3);\n border: 1px solid ${theme.color('secondaryLight')};\n z-index: 99999;\n ${StyledScrollbar}\n`\n\nexport const StyledMenuItem = styled.div`\n min-width: 200px;\n max-width: 300px;\n`\n\nexport const StyledItemLabel = styled.div`\n cursor: ${({hasOnClick}) => hasOnClick ? 'pointer' : 'default'};\n ${declareFont()}\n ${interactiveStyling}\n padding:\n ${scale.space(-2)}\n ${scale.space(-0.5)}\n ${scale.space(-2)}\n calc(${scale.space(-0.5)} + ${({level}) => (level || 0) * 5 + 'px'});\n font-weight: ${({isGroup}) => isGroup ? theme.fontWeight('bold') : theme.fontWeight('regular')};\n box-shadow: none;\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport QRCodeC from 'qrcode.react'\n\n/**\n * Use to display a string as QR-Code Image.\n */\nconst QRCode = ({value}) => <QRCodeC value={value} renderAs=\"svg\"/>\n\nQRCode.propTypes = {\n /**\n * Value that will be shown as qr-code. e.g. an Url.\n */\n value: PropTypes.string\n}\n\nexport default QRCode\n","import styled from 'styled-components'\n\nimport {theme, scale} from '../utilStyles'\nimport {StyledInputCss} from '../EditableValue/StyledEditableValue'\nimport {StyledStatedValueBox} from '../StatedValue'\n\nexport const StyledSearchBox = styled.div`\n && {\n margin-right: ${scale.space(0)};\n margin-top: ${scale.space(-2.8)};\n margin-left: ${scale.space(-2.8)};\n\n ${StyledStatedValueBox} {\n border: 0;\n width: 100%;\n border-bottom: 1px solid ${theme.color('text')};\n padding-right: .3rem;\n\n input[type='search']::-webkit-search-decoration {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n }\n }\n`\n\nexport const StyledSearchBoxInput = styled.input.attrs(props => ({\n type: 'search'\n}))`\n && {\n ${StyledInputCss}\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState} from 'react'\nimport {react} from 'tocco-util'\n\nimport {StyledSearchBox, StyledSearchBoxInput} from './StyledSearchBox'\nimport {StyledEditableWrapper} from '../EditableValue/StyledEditableValue'\nimport StatedValue from '../StatedValue'\n\nconst SearchBox = React.forwardRef((props, ref) => {\n const {value, minInputLength, onSearch, placeholder} = props\n const [inputValue, setInputValue] = useState(value || '')\n\n const onChange = e => {\n const newValue = e.target.value\n setInputValue(newValue)\n\n if ((newValue.length === 0 || newValue.length >= minInputLength)) {\n onSearch(newValue)\n }\n }\n\n return (\n <StyledSearchBox className=\"StyledSearchBox\">\n <StatedValue\n hasValue={!!inputValue}\n label={placeholder}\n >\n <StyledEditableWrapper>\n <StyledSearchBoxInput\n ref={ref}\n onChange={onChange}\n value={inputValue}\n aria-label={placeholder}\n />\n </StyledEditableWrapper>\n </StatedValue>\n </StyledSearchBox>\n )\n})\n\nSearchBox.defaultProps = {\n debounce: 200,\n minInputLength: 3\n}\n\nSearchBox.propTypes = {\n /**\n * Optional default value\n */\n value: PropTypes.string,\n /**\n * Function that will be triggered. The input value will be passed as argument.\n */\n onSearch: PropTypes.func.isRequired,\n /**\n * Placeholder of the input field.\n */\n placeholder: PropTypes.string,\n /**\n * onSearch is only called when the input has at least the length of minInputLength or 0\n */\n minInputLength: PropTypes.number\n}\n\nexport default react.Debouncer(SearchBox, 100, 'onSearch')\n","import SearchBox from './SearchBox'\n\nexport default SearchBox\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {StyledLi} from '../Typography'\nimport {\n design,\n shadeColor,\n theme\n} from '../utilStyles'\n\nconst COLORS = {\n [design.condition.BASE]: 'inherit',\n [design.condition.DANGER]: theme.color('signal.danger.text'),\n [design.condition.PRIMARY]: props => shadeColor(_get(props.theme, 'colors.primary'), 1),\n [design.condition.SUCCESS]: theme.color('signal.success.text'),\n [design.condition.WARNING]: theme.color('signal.warning.text'),\n [design.condition.INFO]: theme.color('signal.info.text')\n}\n\nconst getColor = props => {\n const color = COLORS[props.condition]\n return color || 'inherit'\n}\n\nconst StyledSignalListItem = styled(StyledLi)`\n && {\n color: ${props => getColor(props)};\n position: relative;\n\n > i,\n > svg {\n position: absolute;\n left: -1.6rem;\n text-align: left;\n }\n\n > svg {\n top: .2em;\n }\n }\n`\n\nStyledSignalListItem.propTypes = {\n condition: design.conditionPropTypes(COLORS)\n}\n\nexport default StyledSignalListItem\n","import styled from 'styled-components'\n\nimport {StyledUl} from '../Typography'\n\nconst StyledSignalList = styled(StyledUl)`\n && {\n list-style-type: none;\n }\n`\n\nexport default StyledSignalList\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledSignalList from './StyledSignalList'\n\n/**\n * Signalize conditions by icon and color in a list.\n */\nexport const SignalList = props =>\n <StyledSignalList as=\"ul\">\n {React.Children.map(props.children, child => React.cloneElement(child))}\n </StyledSignalList>\n\nSignalList.propTypes = {\n children: PropTypes.node\n}\n\nexport default SignalList\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport Icon from '../Icon'\nimport StyledSignalListItem from './StyledSignalListItem'\nimport {design} from '../utilStyles'\n\nconst ICONS = {\n [design.condition.BASE]: false,\n [design.condition.PRIMARY]: false,\n [design.condition.DANGER]: 'times',\n [design.condition.SUCCESS]: 'check',\n [design.condition.WARNING]: 'exclamation-triangle',\n [design.condition.INFO]: 'info'\n}\n\nconst getIcon = props => {\n const icon = ICONS[props.condition]\n if (icon) {\n return <Icon icon={icon} position={design.position.SOLE}/>\n } else {\n return <i>{'\\u2022'}</i>\n }\n}\n\n/**\n * Signalize single condition by icon and color. It must be wrapped by <SignalList/>\n */\nconst SignalListItem = props =>\n <StyledSignalListItem condition={props.condition}>\n {getIcon(props)}\n {props.label}\n {React.Children.map(props.children, child => React.cloneElement(child))}\n </StyledSignalListItem>\n\nSignalListItem.defaultProps = {\n condition: design.condition.BASE\n}\n\nSignalListItem.propTypes = {\n /**\n * Visible text. Default is an empty string.\n */\n label: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.node\n ]),\n children: PropTypes.node,\n /**\n * Color and icon is set according condition. Default value is 'base'.\n * Possible values: base|danger|primary|success|warning\n */\n condition: design.conditionPropTypes(ICONS)\n}\n\nexport default SignalListItem\n","import List from './SignalList'\nimport StyledSignalList from './StyledSignalList'\nimport Item from './SignalListItem'\nimport StyledSignalListItem from './StyledSignalListItem'\n\nexport {\n StyledSignalList,\n StyledSignalListItem\n}\n\nexport default {\n List,\n Item\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport SignalList from '../SignalList'\n\nconst ErrorList = props => {\n if (!props.error) {\n return null\n }\n\n const errorValues = []\n Object.keys(props.error).forEach(key => {\n errorValues.push(...props.error[key])\n })\n\n return (\n <SignalList.List>\n {errorValues.map((value, idx) => (\n <SignalList.Item\n condition=\"danger\"\n key={idx}\n label={value}\n />\n ))}\n </SignalList.List>\n )\n}\n\nErrorList.propTypes = {\n error: PropTypes.objectOf(\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.node, PropTypes.string]))\n )\n}\n\nexport default ErrorList\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport FocusWithin from 'react-simple-focus-within'\nimport {js} from 'tocco-util'\n\nimport ErrorList from './ErrorList'\nimport {\n StyledStatedValueBox,\n StyledStatedValueDescription,\n StyledStatedValueError,\n StyledStatedValueLabel,\n StyledStatedValueWrapper,\n StyledLabelWrapper\n} from './StyledStatedValue'\nimport {design} from '../utilStyles'\n\nconst detectSignal = (dirty, hasError, mandatory, hasValue) => {\n if (hasError) {\n return design.condition.DANGER\n } else if (dirty) {\n return design.condition.INFO\n } else if (mandatory && !hasValue) {\n return design.condition.WARNING\n }\n}\n\n/**\n * Wrap <EditableValue> and <FormattedValUe> in <StatedValue> to describe it\n * and signal conditions.\n */\nconst StatedValue = props => {\n const {\n children,\n description,\n dirty,\n fixLabel,\n isDisplay,\n error,\n hasValue,\n id,\n label,\n mandatory,\n mandatoryTitle,\n immutable,\n touched,\n signal: signalProp\n } = props\n\n const showError = !immutable && touched && error && Object.keys(error).length > 0\n const labelAlt = `${js.adjustedHTMLString(label)}${mandatory && mandatoryTitle ? `, ${mandatoryTitle}` : ''}`\n const signal = signalProp || detectSignal(dirty, showError, mandatory, hasValue)\n\n return (\n <FocusWithin>\n {({focused, getRef}) => {\n const secondaryPosition = (!immutable && focused) || hasValue || isDisplay || fixLabel\n return (\n <StyledStatedValueWrapper\n ref={getRef}\n secondaryPosition={secondaryPosition}>\n <StyledStatedValueBox\n className=\"StyledStatedValueBox\"\n hasValue={hasValue}\n immutable={immutable}\n isDisplay={isDisplay}\n signal={signal}>\n {children}\n {label && <StyledLabelWrapper>\n <StyledStatedValueLabel\n {...!isDisplay && !immutable && {htmlFor: id}}\n hasValue={hasValue}\n dirty={dirty}\n title={labelAlt}\n secondaryPosition={secondaryPosition}\n immutable={immutable}\n isDisplay={isDisplay}\n signal={signal}\n >\n <span dangerouslySetInnerHTML={{__html: `${label}${mandatory ? ' *' : ''}`}}/>\n </StyledStatedValueLabel>\n </StyledLabelWrapper>\n }\n </StyledStatedValueBox>\n {description\n && <StyledStatedValueDescription>{description}</StyledStatedValueDescription>}\n {showError && <StyledStatedValueError>\n <ErrorList error={error}/>\n </StyledStatedValueError>\n }\n </StyledStatedValueWrapper>\n )\n }}\n </FocusWithin>\n )\n}\n\nStatedValue.propTypes = {\n /**\n * A component to enter or display data.\n */\n children: PropTypes.node,\n /**\n * Visualize as display and not as field.\n */\n isDisplay: PropTypes.bool,\n /**\n * A helper text to instruct users.\n */\n description: PropTypes.string,\n /**\n * If true field is marked as changed.\n */\n dirty: PropTypes.bool,\n /**\n * Error object.\n */\n error: PropTypes.objectOf(PropTypes.arrayOf(\n PropTypes.oneOfType([PropTypes.node, PropTypes.string]))\n ),\n /**\n * Force label on secondaryPosition.\n */\n fixLabel: PropTypes.bool,\n /**\n * If true label is moved to uncover value.\n */\n hasValue: PropTypes.bool,\n /**\n * Focus target id by clicking on label.\n */\n id: PropTypes.string,\n /**\n * Describe editable value briefly.\n */\n label: PropTypes.string,\n /**\n * If true an asterisk is appended to the label.\n */\n mandatory: PropTypes.bool,\n /**\n * Append to label's alternative text.\n */\n mandatoryTitle: PropTypes.string,\n /**\n * Determines if value is editable\n */\n immutable: PropTypes.bool,\n /**\n * Pass a valid signal condition to omit auto detection\n */\n signal: PropTypes.string,\n /**\n * If true field was in focus.\n */\n touched: PropTypes.bool\n}\n\nexport default StatedValue\n","import styled, {css, keyframes} from 'styled-components'\n\nimport {\n colorizeBorder,\n colorizeText,\n declareFocus,\n declareFont,\n scale,\n theme\n} from '../utilStyles'\nimport {StyledHtmlFormatter} from '../FormattedValue/typeFormatters/HtmlFormatter'\n\nconst borderWidth = '1.1px' // deliberately uneven to force correct rendering in chrome\nconst animationDuration = '200ms'\n\nconst getTextColor = ({isDisplay, secondaryPosition, immutable, signal, hasValue}) => {\n return signal\n ? 'signal'\n : hasValue\n ? 'hasValue'\n : isDisplay && secondaryPosition && immutable && !signal\n ? 'shade1'\n : isDisplay\n ? secondaryPosition\n ? 'shade0'\n : 'shade1'\n : secondaryPosition\n ? 'shade1'\n : immutable\n ? 'shade0'\n : signal\n ? 'signal'\n : 'shade1'\n}\n\nconst getBorderColor = ({immutable, isDisplay, signal, isDirty}) => {\n return isDirty\n ? 'isDirty'\n : isDisplay || immutable\n ? 'transparent'\n : signal\n ? 'signal'\n : 'shade1'\n}\n\nconst transformLabel = ({secondaryPosition}) => css`\n &&& {\n transition: color ${animationDuration},\n font-size ${animationDuration},\n font-weight ${animationDuration},\n margin ${animationDuration},\n top ${animationDuration};\n will-change: color, font-size, font-weight, margin, top;\n ${secondaryPosition && css`\n top: 0;\n font-size: ${scale.font(-0.8)};\n margin: calc(${scale.font(-0.5)} / -2) 0 0;\n `}\n }\n`\n\nconst declareCursor = ({isDisplay, immutable}) => `cursor: ${(!isDisplay && immutable) ? 'not-allowed' : 'auto'};`\n\nexport const StyledLabelWrapper = styled.div`\n width: calc(100% - ${scale.space(0.5)});\n`\n\nconst StyledStatedValueLabel = styled.label`\n &&& {\n ${declareFont({\n fontSize: scale.font(0),\n fontWeight: ({dirty}) => dirty ? theme.fontWeight('bold') : theme.fontWeight('regular'),\n lineHeight: 1\n })}\n background-color: ${theme.color('paper')};\n color: ${props => colorizeText[getTextColor(props)](props)};\n left: ${scale.space(-2)};\n margin: calc(${scale.font(0)} / -2) 0 0;\n padding: 1px ${scale.space(-2)}; // 1px to prevent label bottom from being cut\n position: absolute;\n top: 50%;\n width: ${({secondaryPosition}) => secondaryPosition ? 'auto' : 'inherit'};\n height: calc(${scale.font(0)} + 1px);\n overflow: hidden;\n ${props => transformLabel(props)}\n ${props => declareCursor(props)}\n pointer-events: ${({secondaryPosition}) => secondaryPosition ? 'auto' : 'none'};\n padding-left: ${({immutable}) => immutable && '0'};\n\n span {\n white-space: nowrap;\n }\n }\n`\n\nconst StyledStatedValueBox = styled.div`\n &&& {\n border: ${borderWidth} solid ${props => colorizeBorder[getBorderColor(props)](props)};\n padding: ${scale.space(-1)} ${scale.space(-1)} ${scale.space(-2)} ${scale.space(-1)};\n position: relative;\n ${props => !props.immutable && declareFocus(props)}\n ${props => declareCursor(props)}\n transition: border-color ${animationDuration};\n will-change: border-color;\n margin-top: ${({isDisplay}) => isDisplay && scale.space(-1)};\n padding-left: ${({immutable}) => immutable && scale.space(-2)};\n padding-top: ${({isDisplay, immutable}) => isDisplay && immutable && scale.space(-1)};\n\n * {\n padding-left: ${({isDisplay}) => isDisplay && '0'};\n margin-bottom: 0;\n }\n\n > ${StyledHtmlFormatter} {\n padding-top: ${({isDisplay}) => isDisplay && scale.space(-1)};\n position: relative;\n top: 5px;\n\n p:first-of-type {\n margin-top: 0;\n }\n }\n }\n`\n\nconst StyledStatedValueDescription = styled.p`\n &&& {\n ${declareFont({\n fontSize: scale.font(-1)\n })}\n }\n`\n\nconst fadeIn = keyframes`\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n`\n\nconst StyledStatedValueError = styled.div`\n animation: ${fadeIn} 500ms ease-in-out both;\n`\n\nconst StyledStatedValueWrapper = styled.div`\n &&& {\n margin-bottom: ${scale.space(-1)};\n padding-top: ${scale.space(-2)};\n\n ${/* sc-selector */StyledStatedValueBox},\n ${/* sc-selector */StyledStatedValueDescription},\n ${/* sc-selector */StyledStatedValueError} {\n margin-bottom: ${scale.space(-2)};\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n ${/* sc-selector */StyledStatedValueDescription},\n ${/* sc-selector */StyledStatedValueError} {\n margin-left: calc(${scale.space(-1)} + ${borderWidth});\n }\n }\n`\n\nexport {\n getTextColor,\n getBorderColor,\n StyledStatedValueBox,\n StyledStatedValueDescription,\n StyledStatedValueError,\n StyledStatedValueLabel,\n StyledStatedValueWrapper\n}\n","import _get from 'lodash/get'\n\nimport {shadeColor} from '../utilStyles'\n\nconst colorizeText = {\n shade0: ({theme}) => _get(theme, 'colors.text'),\n shade1: ({theme}) => shadeColor(_get(theme, 'colors.text'), 3.5),\n shade2: ({theme}) => shadeColor(_get(theme, 'colors.text'), 5.5),\n signal: ({theme, signal}) => _get(theme, `colors.signal.${signal}.text`),\n hasValue: ({theme}) => _get(theme, 'colors.signal.info.text')\n}\n\nconst colorizeBorder = {\n shade0: ({theme}) => _get(theme, 'colors.paper'),\n shade1: ({theme}) => shadeColor(_get(theme, 'colors.paper'), 2),\n shade2: ({theme}) => shadeColor(_get(theme, 'colors.paper'), 4),\n signal: ({theme, signal}) => _get(theme, `colors.signal.${signal}.text`),\n isDirty: ({theme}) => _get(theme, 'colors.secondaryLight'),\n transparent: () => 'transparent'\n}\n\nexport {colorizeBorder, colorizeText}\n","import queryStringUtil from 'query-string'\nimport _isObject from 'lodash/isObject'\nimport _mapValues from 'lodash/mapValues'\n\n/**\n * Build query string from params map object.\n *\n * Note: object values will be JSON-stringified\n *\n * @param obj The params map.\n * @returns the params map as query string.\n */\nexport const toQueryString = obj => {\n const stringifiedValues = _mapValues(obj, value => _isObject(value) ? JSON.stringify(value) : value)\n return queryStringUtil.stringify(stringifiedValues)\n}\n\n/**\n * Get params map object from query string.\n *\n * Note: param values that represent a JSON string will be parsed and returned as object.\n *\n * @param queryString The query string to parse.\n * @returns the query string as parsed object.\n */\nexport const fromQueryString = queryString => {\n const obj = queryStringUtil.parse(queryString)\n return _mapValues(obj, value => hasJsonStructure(value) ? JSON.parse(value) : value)\n}\n\nexport const hasJsonStructure = str => {\n if (typeof str !== 'string') {\n return false\n }\n try {\n const parsed = JSON.parse(str)\n const type = Object.prototype.toString.call(parsed)\n return type === '[object Object]'\n } catch (err) {\n return false\n }\n}\n","import {fromQueryString, toQueryString} from './queryString'\nexport default {\n fromQueryString,\n toQueryString\n}\n","\nimport _get from 'lodash/get'\n\nlet persistedViews = {}\n\nexport const viewInfoSelector = location =>\n _get(persistedViews, [location, 'info'], {})\n\nexport const persistViewInfo = (location, info, level = 0) => {\n persistedViews = {\n ...persistedViews,\n [location]: {\n level,\n info: {...(_get(persistedViews, [location, 'info'], {})), ...info}\n }\n }\n}\n\nexport const clearPersistedViews = (level = 0) => {\n persistedViews = {\n ...(Object.keys(persistedViews).reduce((acc, key) => {\n const persistedView = persistedViews[key]\n return {...acc, ...(persistedView.level < level && {[key]: persistedView})}\n }, {}))\n }\n}\n","import {viewInfoSelector, persistViewInfo, clearPersistedViews} from './viewPersistor'\n\nexport default {persistViewInfo, viewInfoSelector, clearPersistedViews}\n","export const CONNECT_LOGIN = 'two-factor-connector/CONNECT_LOGIN'\nexport const INITIALIZE = 'two-factor-connector/INITIALIZE'\nexport const SET_TWO_STEP_ACTIVE = 'two-factor-connector/SET_TWO_STEP_ACTIVE'\nexport const SET_SECRET = 'two-factor-connector/SET_SECRET'\nexport const SET_USER_NAME = 'two-factor-connector/SET_USER_NAME'\nexport const REQUEST_SECRET = 'two-factor-connector/REQUEST_SECRET'\nexport const GO_TO_SECRET_VERIFICATION = 'two-factor-connector/GO_TO_SECRET_VERIFICATION'\nexport const GO_TO_START = 'two-factor-connector/GO_TO_START'\nexport const GO_TO_SECRET = 'two-factor-connector/GO_TO_SECRET'\nexport const VERIFY_CODE = 'two-factor-connector/VERIFY_CODE'\nexport const SUCCESS = 'root/SUCCESS'\nexport const SET_SETUP_SUCCESSFUL = 'root/SET_SETUP_SUCCESSFUL'\nexport const GO_TO_RESULT = 'root/GO_TO_RESULT'\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setTwoFactorActive = twoFactorActive => ({\n type: SET_TWO_STEP_ACTIVE,\n payload: {\n twoFactorActive\n }\n})\n\nexport const setSecret = secret => ({\n type: SET_SECRET,\n payload: {\n secret\n }\n})\n\nexport const setUserName = username => ({\n type: SET_USER_NAME,\n payload: {\n username\n }\n})\n\nexport const requestSecret = () => ({\n type: REQUEST_SECRET\n})\n\nexport const goToSecretVerification = () => ({\n type: GO_TO_SECRET_VERIFICATION\n})\n\nexport const goToStart = () => ({\n type: GO_TO_START\n})\n\nexport const goToSecret = () => ({\n type: GO_TO_SECRET\n})\n\nexport const verifyCode = userCode => ({\n type: VERIFY_CODE,\n payload: {\n userCode\n }\n})\n\nexport const success = () => ({\n type: SUCCESS\n})\n\nexport const setSetupSuccessful = setupSuccessful => ({\n type: SET_SETUP_SUCCESSFUL,\n payload: {\n setupSuccessful\n }\n})\n\nexport const goToResult = () => ({\n type: GO_TO_RESULT\n})\n","import {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {rest, externalEvents} from 'tocco-app-extensions'\nimport _get from 'lodash/get'\n\nimport * as actions from './actions'\n\nconst twoFactorField = 'relTwo_step_login_status'\nconst twoFactorActiveState = '1'\n\nexport const usernameSelector = state => state.twoFactorConnector.username\nexport const secretSelector = state => state.twoFactorConnector.secret\nexport const inputSelector = state => state.input\n\nexport function* requestSecret() {\n const {secret: inputSecret} = yield select(inputSelector)\n if (!inputSecret) {\n const username = yield select(usernameSelector)\n const principalsResponse = yield call(rest.requestSaga, `principals/${username}/two-factor`, {method: 'GET'})\n const {secret, totpUri} = principalsResponse.body\n yield put(actions.setSecret({secret, uri: totpUri}))\n }\n yield put(actions.goToSecret())\n}\n\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 const response = yield call(rest.requestSaga, 'nice2/login',\n {\n method: 'POST',\n headers: new Headers({\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'\n }),\n body: Object.keys(data)\n .filter(k => !!data[k])\n .sort()\n .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&')\n })\n\n yield put(actions.setSetupSuccessful(_get(response, 'body.TWOSTEPLOGIN_ACTIVATION.success', false)))\n}\n\nfunction* activateTwoFactor(username, secret, code) {\n const codeVerifyResponse = yield call(rest.requestSaga, `principals/${username}/two-factor`,\n {\n method: 'POST',\n body: {\n secret,\n code\n },\n acceptedStatusCodes: [400]\n })\n\n yield put(actions.setSetupSuccessful(codeVerifyResponse.status === 204))\n}\n\nexport function* verifyCode({payload: {userCode}}) {\n const username = yield select(usernameSelector)\n const {secret} = yield select(secretSelector)\n const {password, forced} = yield select(inputSelector)\n\n if (forced) {\n yield call(activateTwoFactorWithoutSession, secret, userCode, username, password)\n } else {\n yield call(activateTwoFactor, username, secret, userCode)\n }\n yield put(actions.goToResult())\n}\n\nexport function* initialize() {\n yield call(loadPrincipal2FAInfo)\n const {secret} = yield select(inputSelector)\n if (secret) {\n yield put(actions.setSecret(secret))\n }\n yield put(actions.goToStart())\n}\n\nexport function* success() {\n yield put(externalEvents.fireExternalEvent('onSuccess'))\n}\n\nexport function* loadPrincipal2FAInfo() {\n const username = yield call(getUsername)\n yield put(actions.setUserName(username))\n const where = `username === \"${username}\"`\n const principals = yield call(rest.fetchEntities, 'Principal', {where, paths: [twoFactorField]})\n\n if (principals.length > 1) {\n throw new Error(`More than one user found for username ${username}`)\n }\n\n const twoFactorKey = _get(principals, `[0].paths.${twoFactorField}.value.key`)\n const twoFactorActive = twoFactorKey === twoFactorActiveState\n\n yield put(actions.setTwoFactorActive(twoFactorActive))\n}\n\nfunction* getUsername() {\n const {username: inputUsername} = yield select(inputSelector)\n if (inputUsername) {\n return inputUsername\n } else {\n const principalsResponse = yield call(rest.requestSaga, 'principals')\n return principalsResponse.body.username\n }\n}\n\nexport function* fireResize() {\n yield put(externalEvents.fireExternalEvent('onResize'))\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.REQUEST_SECRET, requestSecret),\n takeLatest(actions.VERIFY_CODE, verifyCode),\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(actions.SUCCESS, success),\n takeLatest(actions.GO_TO_START, fireResize),\n takeLatest(actions.GO_TO_SECRET, fireResize),\n takeLatest(actions.GO_TO_SECRET_VERIFICATION, fireResize),\n takeLatest(actions.GO_TO_RESULT, fireResize)\n ])\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst setStage = stage => state => ({\n ...state,\n stage\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_TWO_STEP_ACTIVE]: reducerUtil.singleTransferReducer('twoFactorActive'),\n [actions.SET_SECRET]: reducerUtil.singleTransferReducer('secret'),\n [actions.SET_USER_NAME]: reducerUtil.singleTransferReducer('username'),\n [actions.SET_SETUP_SUCCESSFUL]: reducerUtil.singleTransferReducer('setupSuccessful'),\n [actions.GO_TO_START]: setStage(0),\n [actions.GO_TO_SECRET]: setStage(1),\n [actions.GO_TO_SECRET_VERIFICATION]: setStage(2),\n [actions.GO_TO_RESULT]: setStage(3)\n}\n\nconst initialState = {\n stage: null,\n twoFactorActive: null,\n secret: null,\n username: null,\n setupSuccessful: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import rootSaga from './sagas'\nimport twoFactorConnector from './reducer'\n\nexport default {\n twoFactorConnector\n}\n\nexport const sagas = [rootSaga]\n","import styled from 'styled-components'\nimport {scale, StyledButton} from 'tocco-ui'\n\nexport const StyledButtonWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n margin-top: ${scale.space(0.5)};\n\n > ${StyledButton} {\n margin-right: 0;\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\n\nconst Start = ({twoFactorActive, forced, requestSecret, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n return (\n <>\n <Typography.P>\n {\n twoFactorActive\n ? <FormattedMessage id=\"client.two-factor-connector.overwriteInfo\"/>\n : forced\n ? <span dangerouslySetInnerHTML={{__html: msg('client.two-factor-connector.forcedInfo')}}/>\n : <span dangerouslySetInnerHTML={{__html: msg('client.two-factor-connector.info')}}/>\n }\n </Typography.P>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.nextButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={requestSecret}\n />\n </StyledButtonWrapper>\n </>\n )\n}\n\nStart.propTypes = {\n intl: PropTypes.object.isRequired,\n requestSecret: PropTypes.func.isRequired,\n twoFactorActive: PropTypes.bool,\n forced: PropTypes.bool\n}\n\nexport default Start\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {initialize, requestSecret} from '../../modules/actions'\nimport Start from './Start'\n\nconst mapActionCreators = {\n initialize,\n requestSecret\n}\n\nconst mapStateToProps = state => ({\n twoFactorActive: state.twoFactorConnector.twoFactorActive,\n secret: state.twoFactorConnector.secret,\n forced: state.input.forced\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Start))\n","import Start from './StartContainer'\n\nexport default Start\n","import styled from 'styled-components'\nimport {scale} from 'tocco-ui'\n\nexport const StyledQRCodeWrapper = styled.div`\n display: flex;\n justify-content: center;\n margin: ${scale.space(1.2)} ${scale.space(1)} ${scale.space(1.5)} ${scale.space(1)};\n`\n\nexport const StyledParagraph = styled.div`\n display: flex;\n justify-content: center;\n margin-top: ${scale.space(-1)};\n margin-bottom: ${scale.space(-0.9)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {QRCode, Typography, Button} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledQRCodeWrapper, StyledParagraph} from './StyledComponents'\n\nconst Secret = ({secret, goToSecretVerification}) => {\n return <>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.qrCodeInfo\"/>\n </Typography.P>\n <StyledQRCodeWrapper>\n <QRCode value={secret.uri}/>\n </StyledQRCodeWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.secretInfo\"/>\n </Typography.P>\n <StyledParagraph>\n <Typography.B>{secret.secret}</Typography.B>\n </StyledParagraph>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.backupInfo\"/>\n </Typography.P>\n <StyledButtonWrapper>\n <Button\n ink=\"primary\"\n look=\"raised\"\n onClick={goToSecretVerification}\n >\n <FormattedMessage id=\"client.two-factor-connector.nextButton\"/>\n </Button>\n </StyledButtonWrapper>\n </>\n}\n\nSecret.propTypes = {\n secret: PropTypes.shape({\n secret: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }).isRequired,\n goToSecretVerification: PropTypes.func.isRequired\n}\n\nexport default Secret\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Secret from './Secret'\nimport {goToSecretVerification} from '../../modules/actions'\n\nconst mapActionCreators = {\n goToSecretVerification\n}\n\nconst mapStateToProps = state => ({\n secret: state.twoFactorConnector.secret\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Secret))\n","import Secret from './SecretContainer'\n\nexport default Secret\n","import styled from 'styled-components'\nimport {StyledEditableWrapperCss} from 'tocco-ui'\n\nexport const StyledLoginFormInputWrapper = styled.div`\n && {\n ${StyledEditableWrapperCss}\n }\n`\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, EditableValue, StatedValue, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledLoginFormInputWrapper} from './StyledComponents'\n\nconst Verification = ({verifyCode, intl}) => {\n const [userCode, setUserCode] = useState(null)\n const msg = id => intl.formatMessage({id})\n const handleVerifyClick = () => verifyCode(userCode)\n\n return <>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.verificationText\"/>\n </Typography.P>\n <form onSubmit={e => {\n e.preventDefault()\n e.stopPropagation()\n if (userCode && userCode.toString().length >= 6) {\n handleVerifyClick()\n }\n }}>\n <StatedValue\n hasValue={!!userCode}\n id=\"verification-input\"\n label={msg('client.two-factor-connector.verificationInputLabel')}\n >\n <StyledLoginFormInputWrapper>\n <EditableValue\n type=\"integer\"\n value={userCode}\n events={{onChange: setUserCode}}\n options={{format: '### ###', allowLeadingZeros: true}}\n />\n </StyledLoginFormInputWrapper>\n </StatedValue>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n type=\"submit\"\n disabled={!userCode || userCode.toString().length < 6}\n />\n </StyledButtonWrapper>\n </form>\n </>\n}\n\nVerification.propTypes = {\n intl: PropTypes.object.isRequired,\n verifyCode: PropTypes.func.isRequired\n}\n\nexport default Verification\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Verification from './Verification'\nimport {verifyCode} from '../../modules/actions'\n\nconst mapActionCreators = {\n verifyCode\n}\n\nconst mapStateToProps = (state, props) => ({\n\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Verification))\n","import Verification from './VerificationContainer'\n\nexport default Verification\n","import styled from 'styled-components'\nimport {scale, theme} from 'tocco-ui'\n\nexport const StyledMessageWrapper = styled.div`\n display: grid;\n grid-template-columns: 9% 1fr;\n grid-column-gap: ${scale.space(-0.5)};\n`\n\nexport const StyledIconWrapper = styled.span`\n display: flex;\n align-items: center;\n color: ${({isSuccessful}) => isSuccessful ? theme.color('signal.success.text') : theme.color('signal.danger.text')};\n font-size: ${scale.font(10)};\n\n > * {\n max-width: 100%;\n }\n`\n\nexport const StyledTextWrapper = styled.div`\n display: flex;\n align-items: center;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Button, Typography, Icon} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButtonWrapper} from '../GlobalStyledComponents'\nimport {StyledMessageWrapper, StyledIconWrapper, StyledTextWrapper} from './StyledComponents'\n\nconst Result = ({success, goToStart, setupSuccessful, intl}) => {\n const msg = id => intl.formatMessage({id})\n\n if (setupSuccessful) {\n return (\n <>\n <StyledMessageWrapper>\n <StyledIconWrapper isSuccessful={true}>\n <Icon icon={'check'}/>\n </StyledIconWrapper>\n <StyledTextWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.successfulText\"/>\n </Typography.P>\n </StyledTextWrapper>\n </StyledMessageWrapper>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={success}\n />\n </StyledButtonWrapper>\n </>\n )\n }\n\n return (\n <>\n <StyledMessageWrapper>\n <StyledIconWrapper isSuccessful={false}>\n <Icon icon={'times'}/>\n </StyledIconWrapper>\n <StyledTextWrapper>\n <Typography.P>\n <FormattedMessage id=\"client.two-factor-connector.errorText\"/>\n </Typography.P>\n </StyledTextWrapper>\n </StyledMessageWrapper>\n <StyledButtonWrapper>\n <Button\n label={msg('client.two-factor-connector.okButton')}\n ink=\"primary\"\n look=\"raised\"\n onClick={goToStart}\n />\n </StyledButtonWrapper>\n </>\n )\n}\n\nResult.propTypes = {\n intl: PropTypes.object.isRequired,\n success: PropTypes.func.isRequired,\n goToStart: PropTypes.func.isRequired,\n setupSuccessful: PropTypes.bool\n}\n\nexport default Result\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {success, goToStart} from '../../modules/actions'\nimport Result from './Result'\n\nconst mapActionCreators = {\n success,\n goToStart\n}\n\nconst mapStateToProps = state => ({\n setupSuccessful: state.twoFactorConnector.setupSuccessful\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Result))\n","import Result from './ResultContainer'\n\nexport default Result\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {LoadMask} from 'tocco-ui'\nimport {notification} from 'tocco-app-extensions'\n\nimport Start from '../Start'\nimport Secret from '../Secret'\nimport Verification from '../Verification'\nimport Result from '../Result'\n\nconst stages = {\n Start: 0,\n Secret: 1,\n Verification: 2,\n Result: 3\n}\n\nconst TwoFactorConnector = ({initialize, stage}) => {\n useEffect(() => {\n initialize()\n }, [])\n\n const renderContent = () => {\n switch (stage) {\n case stages.Start:\n return <Start/>\n case stages.Secret:\n return <Secret/>\n case stages.Verification:\n return <Verification/>\n case stages.Result:\n return <Result/>\n default:\n return <LoadMask/>\n }\n }\n\n return (\n <>\n <notification.Notifications/>\n {renderContent()}\n </>\n )\n}\n\nTwoFactorConnector.propTypes = {\n stage: PropTypes.number,\n initialize: PropTypes.func.isRequired,\n twoFactorActive: PropTypes.bool,\n secret: PropTypes.shape({\n secret: PropTypes.string,\n uri: PropTypes.string\n })\n}\n\nexport default TwoFactorConnector\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport {initialize} from '../../modules/actions'\nimport TwoFactorConnector from './TwoFactorConnector'\n\nconst mapActionCreators = {\n initialize\n}\n\nconst mapStateToProps = state => ({\n stage: state.twoFactorConnector.stage\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(TwoFactorConnector))\n","import TwoFactorConnector from './TwoFactorConnectorContainer'\n\nexport default TwoFactorConnector\n","import React, {useEffect, useState} from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, errorLogging, notification, externalEvents} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules'\nimport TwoFactorConnector from './components/TwoFactorConnector'\n\nconst packageName = 'two-factor-connector'\n\nconst initApp = (id, input, events, publicPath) => {\n const content = <TwoFactorConnector/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n\n notification.addToStore(store, true)\n errorLogging.addToStore(store, true, ['console', 'remote', 'notification'])\n externalEvents.addToStore(store, events)\n\n return appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [],\n publicPath,\n textResourceModules: ['component', 'common', packageName]\n }\n )\n}\n\n(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp(packageName, input)\n\n if (module.hot) {\n module.hot.accept('./modules/reducer', () => {\n const reducers = require('./modules/reducer').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst EXTERNAL_EVENTS = [\n 'onSuccess',\n 'onCancel',\n 'onResize'\n]\n\nconst TwoFactorConnectorApp = props => {\n const [app, setApp] = useState(null)\n useEffect(() => {\n const events = EXTERNAL_EVENTS.reduce((events, event) => (\n {...events, ...(props[event] && {[event]: props[event]})}\n ), {})\n\n setApp(initApp('two-factor-connector', props, events))\n }, [])\n\n return app ? app.component : null\n}\n\nTwoFactorConnectorApp.propTypes = {\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => ({...propTypes, [event]: PropTypes.func}), {}),\n username: PropTypes.string,\n password: PropTypes.string,\n secret: PropTypes.shape({\n secret: PropTypes.string.isRequired,\n uri: PropTypes.string.isRequired\n }),\n forced: PropTypes.bool\n}\n\nexport default TwoFactorConnectorApp\n","module.exports = __webpack_public_path__ + \"imgs/tocco-circle.25b8cb1141417ffc7763e9309b5a36ec.svg\";","module.exports = __webpack_public_path__ + \"imgs/tocco_red.6ab51a129d1195d204cd84e69da2f044.svg\";","module.exports = __webpack_public_path__ + \"imgs/tocco_white.8f9290d80aa3635828f36920cf13aa11.svg\";"],"sourceRoot":""}
|