tocco-admin 1.0.20 → 1.0.21
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-229.e12c5922ff4247f8e928.js → chunk-229.2ea952f1867a78801d4b.js} +1 -2
- package/dist/{chunk-314.06fbc31e051912aa797d.js → chunk-314.fd36699dbd136490aa1f.js} +1 -2
- package/dist/{chunk-333.94430ae53118a015e8b6.js → chunk-333.6e7bb6ee20346be796e1.js} +1 -2
- package/dist/{chunk-335.fdc7bbdeec181e5348b5.js → chunk-335.7cef6cf94cd9ea8910eb.js} +1 -2
- package/dist/{chunk-342.662b51c5da9667aa463c.js → chunk-342.8f3c7176df159e2a140e.js} +1 -2
- package/dist/{chunk-404.9cfbbb274fd39911d8ca.js → chunk-404.34b136a50b9cf1357c4f.js} +1 -2
- package/dist/{chunk-413.a87d7653543f87fb986b.js → chunk-413.8f9875231f3ea3dc91b3.js} +1 -2
- package/dist/{chunk-51.6b8c9d2c2b4f89de46ce.js → chunk-51.ff992f4a4488d7d44357.js} +1 -2
- package/dist/{chunk-696.c28466168bbf1bd96ac6.js → chunk-696.4246384f89ce1ee8933f.js} +1 -2
- package/dist/{chunk-82.31084b7daa6e3ae23a98.js → chunk-82.fe992385267f6eb716e8.js} +1 -2
- package/dist/{chunk-actions.a3c953c898ab2901a5b6.js → chunk-actions.66c72d85dd44315566fe.js} +1 -2
- package/dist/{chunk-code-editor.24492a0a1c34a4a13233.js → chunk-code-editor.64a44ea8d4fed4580847.js} +1 -2
- package/dist/chunk-vendor-icons.c1cc12e8f9e141eb191b.js +1 -0
- package/dist/index.js +2 -3
- package/package.json +1 -1
- package/dist/chunk-229.e12c5922ff4247f8e928.js.map +0 -1
- package/dist/chunk-314.06fbc31e051912aa797d.js.map +0 -1
- package/dist/chunk-333.94430ae53118a015e8b6.js.map +0 -1
- package/dist/chunk-335.fdc7bbdeec181e5348b5.js.map +0 -1
- package/dist/chunk-342.662b51c5da9667aa463c.js.map +0 -1
- package/dist/chunk-404.9cfbbb274fd39911d8ca.js.map +0 -1
- package/dist/chunk-413.a87d7653543f87fb986b.js.map +0 -1
- package/dist/chunk-51.6b8c9d2c2b4f89de46ce.js.map +0 -1
- package/dist/chunk-696.c28466168bbf1bd96ac6.js.map +0 -1
- package/dist/chunk-82.31084b7daa6e3ae23a98.js.map +0 -1
- package/dist/chunk-actions.a3c953c898ab2901a5b6.js.map +0 -1
- package/dist/chunk-code-editor.24492a0a1c34a4a13233.js.map +0 -1
- package/dist/chunk-vendor-icons.2dfa9e40ce8cf6fce5bd.js +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./packages/admin/src/routes/entities/modules/path/actions.js","webpack:///./packages/admin/src/routes/entities/components/Action/LazyAction.js","webpack:///./packages/admin/src/routes/entities/components/ActionView/ActionView.js","webpack:///./packages/admin/src/routes/entities/components/ActionView/ActionViewContainer.js","webpack:///./packages/admin/src/routes/entities/components/CreateView/CreateView.js","webpack:///./packages/admin/src/routes/entities/components/CreateView/CreateViewContainer.js","webpack:///./packages/admin/src/routes/entities/components/DocsView/DocsView.js","webpack:///./packages/admin/src/routes/entities/components/DocsView/index.js","webpack:///./packages/admin/src/routes/entities/components/ListView/DocsViewAdapter.js","webpack:///./packages/admin/src/routes/entities/components/ListView/ListView.js","webpack:///./packages/admin/src/routes/entities/components/ListView/ListViewContainer.js","webpack:///./packages/admin/src/routes/entities/components/EditView/EditView.js","webpack:///./packages/admin/src/routes/entities/components/EditView/EditViewContainer.js","webpack:///./packages/admin/src/routes/entities/utils/relationPersistor.js","webpack:///./packages/admin/src/routes/entities/components/RelationsView/DocsViewAdapter.js","webpack:///./packages/admin/src/routes/entities/components/RelationsView/ListView.js","webpack:///./packages/admin/src/routes/entities/components/RelationsView/StyledComponents.js","webpack:///./packages/admin/src/routes/entities/components/RelationsView/RelationBox.js","webpack:///./packages/admin/src/routes/entities/components/RelationsView/RelationsView.js","webpack:///./packages/admin/src/routes/entities/components/RelationsView/RelationViewContainer.js","webpack:///./packages/admin/src/routes/entities/components/RelationsView/index.js","webpack:///./packages/admin/src/routes/entities/components/DetailView/StyledComponents.js","webpack:///./packages/admin/src/routes/entities/components/DetailView/DetailView.js","webpack:///./packages/admin/src/routes/entities/components/DetailView/DetaiViewContainer.js","webpack:///./packages/admin/src/routes/entities/components/EntityRecordRoute/EntityRecordRoute.js","webpack:///./packages/admin/src/routes/entities/components/EntityRecordRoute/index.js","webpack:///./packages/admin/src/routes/entities/components/EntityRoute/EntityRoute.js","webpack:///./packages/admin/src/routes/entities/components/EntityRoute/index.js","webpack:///./packages/admin/src/routes/entities/components/EntitiesOverview/EntitiesOverview.js","webpack:///./packages/admin/src/routes/entities/components/EntitiesOverview/index.js","webpack:///./packages/admin/src/routes/entities/components/Breadcrumbs/BreadcrumbsContainer.js","webpack:///./packages/admin/src/routes/entities/components/ErrorView/EntityErrorView.js","webpack:///./packages/admin/src/routes/entities/components/ErrorView/ErrorViewContainer.js","webpack:///./packages/admin/src/routes/entities/components/EntitiesRoute/EntitiesRoute.js","webpack:///./packages/admin/src/routes/entities/components/EntitiesRoute/EntitiesRouteContainer.js","webpack:///./packages/admin/src/routes/entities/components/EntitiesRoute/index.js","webpack:///./packages/admin/src/routes/entities/modules/path/reducer.js","webpack:///./packages/admin/src/routes/entities/utils/url.js","webpack:///./packages/admin/src/routes/entities/modules/path/sagas.js","webpack:///./packages/admin/src/routes/entities/modules/path/index.js","webpack:///./packages/admin/src/routes/entities/route.js","webpack:///./packages/docs-browser/src/modules/path/actions.js","webpack:///./packages/docs-browser/src/utils/isRootLocation.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/Breadcrumbs/Breadcrumbs.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/Breadcrumbs/RouterlessBreadcrumbs.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/Breadcrumbs/BreadcrumbsContainer.js","webpack:///./packages/docs-browser/src/modules/list/actions.js","webpack:///./packages/docs-browser/src/components/Action/LazyAction.js","webpack:///./packages/docs-browser/src/components/FileInput/FileInput.js","webpack:///./packages/docs-browser/src/components/FileInput/FileInputContainer.js","webpack:///./packages/docs-browser/src/modules/create/actions.js","webpack:///./packages/docs-browser/src/components/DocsView/StyledComponents.js","webpack:///./packages/docs-browser/src/components/DocsView/DocsView.js","webpack:///./packages/docs-browser/src/components/DocsView/DocsViewContainer.js","webpack:///./packages/docs-browser/src/components/DocumentView/StyledComponents.js","webpack:///./packages/docs-browser/src/components/DocumentView/DocumentView.js","webpack:///./packages/docs-browser/src/components/DocumentView/DocumentViewContainer.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/Content/RouterlessContent.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/Content/RoutesContent.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/Content/ContentContainer.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/StyledComponents.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/DocsBrowser.js","webpack:///./packages/docs-browser/src/components/DocsBrowser/DocsBrowserContainer.js","webpack:///./packages/docs-browser/src/components/App/RouterlessApp.js","webpack:///./packages/docs-browser/src/components/App/InheritedApp.js","webpack:///./packages/docs-browser/src/components/App/StandaloneApp.js","webpack:///./packages/docs-browser/src/input.js","webpack:///./packages/docs-browser/src/modules/create/reducer.js","webpack:///./packages/docs-browser/src/modules/create/sagas.js","webpack:///./packages/docs-browser/src/modules/create/index.js","webpack:///./packages/docs-browser/src/modules/list/reducer.js","webpack:///./packages/docs-browser/src/modules/list/index.js","webpack:///./packages/docs-browser/src/modules/list/sagas.js","webpack:///./packages/docs-browser/src/modules/move/reducer.js","webpack:///./packages/docs-browser/src/modules/move/sagas.js","webpack:///./packages/docs-browser/src/modules/move/index.js","webpack:///./packages/docs-browser/src/modules/path/reducer.js","webpack:///./packages/docs-browser/src/modules/path/sagas.js","webpack:///./packages/docs-browser/src/modules/path/index.js","webpack:///./packages/docs-browser/src/modules/routing/reducer.js","webpack:///./packages/docs-browser/src/modules/routing/sagas.js","webpack:///./packages/docs-browser/src/modules/routing/index.js","webpack:///./packages/docs-browser/src/modules/reducers.js","webpack:///./packages/docs-browser/src/main.js","webpack:///./packages/docs-browser/src/modules/move/actions.js","webpack:///./packages/docs-browser/src/modules/routing/actions.js","webpack:///./packages/docs-browser/src/utils/getNode.js","webpack:///./packages/docs-browser/src/utils/withRouter.js","webpack:///./packages/docs-browser/src/utils/withRouterTypeCompProvider.js"],"names":["setCurrentViewInfo","location","currentViewInfo","type","payload","updateBreadcrumbsInfo","path","breadcrumbsInfo","setRelations","relations","setRelationsInfo","relationsInfo","selectRelation","selectedRelation","actions","lazy","resourcescheduler","delete","merge","copy","documents","LoadMask","props","appId","LazyAction","consoleLogger","ActionComponent","connect","emitAction","action","actionEmitter","Suspense","fallback","ActionView","history","match","setCurrentViewTitle","intl","useEffect","formatMessage","id","actionId","queryParams","queryStringUtil","search","selection","_get","actionProperties","navigateBack","replace","goBack","url","navigationStrategy","onSuccess","onError","onCancel","areEqual","prevProps","nextProps","Object","keys","js","length","React","mapActionCreators","currentViewTitle","state","entities","currentViewInfos","pathname","injectIntl","StyledEntityDetailAppWrapper","styled","theme","scale","chooseDocument","dispatchEmittedAction","stateDefaultValues","useState","touched","setTouched","model","reverseRelation","parentKey","entityName","name","isMultiReverseRelation","defaultValues","value","when","message","formName","mode","onEntityCreated","push","onTouchedChange","CreateView","entityKey","showActions","noLeftPadding","openResource","folderKey","setFolderKey","fetchFolder","useCallback","rest","then","res","body","key","routerType","sortable","searchFormType","rootNodes","embedded","selectionStyle","disableViewPersistor","scrollBehaviour","parentModel","searchFormCollapsed","saveUserPreferences","queryString","limit","onRowClick","parent","reverseRelationName","showLink","searchFormPosition","store","viewPersistor","onStoreCreate","level","actionAppComponent","Action","tql","onSearchFormCollapsedChange","collapsed","preferences","userPreferences","ListView","propagateRefresh","invalidateLastBreadcrumb","queryFormName","entityId","navigateToCreateRelative","relationName","entityBaseUrl","onEntityDeleted","onEntityUpdated","onRefresh","onSubGridRowClick","EditView","selectedRelations","targetEntity","onNavigateToCreate","StyledRelationsViewWrapper","isCollapsed","StyledPlaceHolder","StyledToggleCollapse","StyledToggleCollapseButton","Button","StyledPreviewBox","StyledRelationBoxes","StyledScrollbar","StyledPreviewLink","StyledLink","StyledRelationLinks","StyledRelationBox","selected","StyledRelationLabel","StyledSpan","icon","relation","relationDisplay","msg","onClick","entity","setRelation","title","label","count","aria-label","to","createPermission","RelationsView","toggleCollapse","updateSelectedRelation","queryRelation","find","r","persistedSelectedRelation","RelationPreview","DocsViewAdapter","RelationBoxes","map","Typography","StyledDetailViewContainer","StyledDetailViewLeft","StyledDetailViewRight","relationViewCollapsed","setIsCollapsed","DetailView","str","word","split","exact","render","component","Detail","Edit","Relations","Entity","List","Create","Record","pathPrefix","currentView","display","Breadcrumbs","prefix","description","error","ErrorView","values","EntityErrorView","StyledWrapper","StyledContent","StyledBreadcrumbs","loadCurrentRoute","content","Overview","EntitiesRoute","ACTION_HANDLERS","reducerUtil","info","initialState","getPathInfo","entityParams","route","actionParams","mainSagas","loadRoute","updateCurrentViewInfo","loadRouteInfo","initMultiRelations","reloadRelationsInfo","getLastBreadcrumbsPath","getLastEntityInPath","loadRelationInfos","entitiesPathSelector","relationPathRegex","all","takeLatest","call","routeInfo","spawn","deriveCurrentViewInfo","put","deriveBreadcrumbs","breadcrumbs","routeInfos","baseModel","splittedRelation","i","relationStringPart","paths","relationModel","view","lastEntry","_omit","filter","e","_pickBy","show","relationsTransformed","k","_pick","sort","a","b","order","select","lastEntity","breadcrumbsPath","Boolean","join","splittedEntities","resource","relationInfoResponse","handler","container","reducers","combineReducers","sagas","setBreadcrumbs","ROOT_PATH_REGEX","test","withTheme","resetSearchMode","backgroundColor","themeUtil","breadcrumbsItem","BreadcrumbLink","navigate","linkComp","mapStateToProps","docs","input","RouterBreadcumbs","RouterlessBreadcrumbs","RouterlessBreadcrumbsComp","withRouterTypeCompProvider","routerless","router","instanceCount","directory","onChange","fileInput","useRef","prevInstanceCount","react","current","click","ref","style","files","target","multiple","webkitdirectory","isDirectory","create","dialog","FileInput","StyledContentWrapper","StyledIconWrapper","LazyListApp","domainTypes","changeListParent","onSearchChange","openFileDialog","getCustomLocation","getListFormName","domainDetailFormName","folderDetailFormName","searchMode","locale","changeSelection","changeSearchFormCollapsed","params","useReducer","x","entityListNumber","forceEntityListUpdate","entityListKey","setSelection","useMemo","charAt","toUpperCase","slice","getParent","node","getFormName","mounted","searchModeRef","onSelectChange","Array","isArray","getTql","handleUploadDocument","definition","config","handleUploadDirectory","undefined","isRootLocation","searchStore","Error","getDefaultLocation","handleStoreCreation","cellRenderers","rowData","column","cellRenderer","children","c","dmsEntityModel","contextParams","detailFormNames","Domain","Folder","customActions","listLimit","list","DocsView","StyledDocumentViewWrapper","LazyDetailApp","lastList","reverse","breadcrumb","lastListUrl","documentDetailFormName","DocumentView","handleSearchChange","docsKey","RouterlessContent","RoutesContent","setSearchMode","loadBreadcrumbs","docsViewNumber","forceDocsViewUpdate","query","hasUserChanges","DocsBrowser","notification","GlobalStyles","withInternalRouter","handleNotifications","rootPath","getDispatchActions","actionSettings","reduce","acc","actionSetting","argsFactory","handleFilesSelected","createDocuments","dialogSelector","textResourceSelector","messages","uuid","blockingInfoId","response","status","remoteEvents","items","item","bean","msgId","getNode","formData","FormData","file","append","f","options","method","acceptedStatusCodes","takeEvery","fork","moduleSagas","externalEvents","isWaiting","moveElements","setDone","inputSelector","move","targetEntityKey","selectedEntityKeys","errorCode","validation","errors","ids","getSearchBreadcrumbs","getRootNodesParam","docsPathSelector","rootNodesSelector","rootnodes","result","setParams","routing","pathSagas","createSagas","listSagas","moveSagas","routingSagas","EXTERNAL_EVENTS","getContent","createHashHistory","getUserConfirmation","confirmCallback","getState","okText","cancelText","dispatch","createHistory","initApp","events","publicPath","appFactory","backendUrl","env","businessUnit","errorLogging","cache","singleRootNode","toLowerCase","initialLocation","textResourceModules","DocsBrowserApp","packageName","changedProps","_isEqual","_isEmpty","forEach","propTypes","PropTypes","searchFormTypePropTypes","selectionStylePropType","scrollBehaviourPropType","event","INITIALIZE","MOVE_ELEMENTS","SET_WAITING","CLOSE","initialize","setWaiting","close","NAVIGATE","SET_PARAMS","DOC_PATH_REGEX","PARENT_PATH_REGEX","docMatches","exec","getResourceNode","parentMatches","getParentNode","withReactRouter","WrappedComponent","useLocation","useHistory","useParams","compProviderRouterType","RouterlessComp","RouterComp"],"mappings":"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","file":"chunk-404.9cfbbb274fd39911d8ca.js","sourcesContent":["export const SET_CURRENT_VIEW_INFO = 'path/SET_CURRENT_VIEW_INFO'\nexport const LOAD_CURRENT_ROUTE = 'path/LOAD_CURRENT_ROUTE'\nexport const SET_BREADCRUMBS_INFO = 'path/SET_BREADCRUMBS_INFO'\nexport const UPDATE_BREADCRUMBS_INFO = 'path/UPDATE_BREADCRUMBS_INFO'\nexport const SET_RELATIONS = 'path/SET_RELATIONS'\nexport const SET_CURRENT_VIEW_TITLE = 'path/SET_CURRENT_VIEW_TITLE'\nexport const SET_RELATIONS_INFO = 'path/SET_RELATIONS_INFO'\nexport const PROPAGATE_REFRESH = 'path/PROPAGATE_REFRESH'\nexport const INVALIDATE_LAST_BREADCRUMB = 'path/INVALIDATE_LAST_BREADCRUMB'\nexport const SELECT_RELATION = 'path/SELECT_RELATION'\n\nexport const setCurrentViewInfo = (location, currentViewInfo) => ({\n type: SET_CURRENT_VIEW_INFO,\n payload: {\n location,\n currentViewInfo\n }\n})\n\nexport const loadCurrentRoute = location => ({\n type: LOAD_CURRENT_ROUTE,\n payload: {\n location\n }\n})\n\nexport const setBreadcrumbsInfo = breadcrumbsInfo => ({\n type: SET_BREADCRUMBS_INFO,\n payload: {\n breadcrumbsInfo\n }\n})\n\nexport const updateBreadcrumbsInfo = (path, breadcrumbsInfo) => ({\n type: UPDATE_BREADCRUMBS_INFO,\n payload: {\n path,\n breadcrumbsInfo\n }\n})\n\nexport const setRelations = relations => ({\n type: SET_RELATIONS,\n payload: {\n relations\n }\n})\n\nexport const setCurrentViewTitle = currentViewTitle => ({\n type: SET_CURRENT_VIEW_TITLE,\n payload: {\n currentViewTitle\n }\n})\n\nexport const setRelationsInfo = relationsInfo => ({\n type: SET_RELATIONS_INFO,\n payload: {\n relationsInfo\n }\n})\n\nexport const propagateRefresh = location => ({\n type: PROPAGATE_REFRESH,\n payload: {\n location\n }\n})\n\nexport const invalidateLastBreadcrumb = location => ({\n type: INVALIDATE_LAST_BREADCRUMB,\n payload: {\n location\n }\n})\n\nexport const selectRelation = selectedRelation => ({\n type: SELECT_RELATION,\n payload: {\n selectedRelation\n }\n})\n","import PropTypes from 'prop-types'\nimport React, {lazy, Suspense} from 'react'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\nimport {LoadMask} from 'tocco-ui'\nimport {consoleLogger} from 'tocco-util'\n\nconst actions = {\n 'widget-code-copy': lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/WidgetCodeCopy')),\n 'user-qr-action': lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/UserQrAction')),\n 'input-edit': lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/InputEdit')),\n resourcescheduler: lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/ResourceScheduler')),\n 'show-output-jobs-action': lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/ShowOutputJobsAction')),\n delete: lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/Delete')),\n merge: lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/Merge')),\n copy: lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/Copy')),\n documents: lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/Documents')),\n 'password-update': lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/PasswordUpdate')),\n 'widget-config-edit': lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/WidgetConfigEdit')),\n 'connect-principal': lazy(() => import(/* webpackChunkName: \"actions\" */ './actions/ConnectPrincipal'))\n}\n\nconst renderLoader = () => <LoadMask />\n\nconst LazyAction = props => {\n const {appId} = props\n const LazyAction = actions[appId]\n\n if (!LazyAction) {\n consoleLogger.logError(`no action found with id: ${appId}`)\n return null\n }\n\n const ActionComponent = connect(null, {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n })(LazyAction)\n\n return (\n <Suspense fallback={renderLoader()}>\n <ActionComponent {...props} />\n </Suspense>\n )\n}\n\nLazyAction.propTypes = {\n appId: PropTypes.string.isRequired\n}\n\nexport default LazyAction\n","import _get from 'lodash/get'\nimport PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {queryString as queryStringUtil, js} from 'tocco-util'\n\nimport {goBack} from '../../../../utils/routing'\nimport navigationStrategy from '../../utils/navigationStrategy'\nimport {currentViewPropType} from '../../utils/propTypes'\nimport Action from '../Action'\n\nconst ActionView = ({history, match, setCurrentViewTitle, currentViewInfo, intl}) => {\n const {location} = history\n useEffect(() => {\n if (currentViewInfo) {\n setCurrentViewTitle(intl.formatMessage({id: `client.actions.${currentViewInfo.actionId}.title`}))\n }\n\n return () => {\n setCurrentViewTitle(null)\n }\n }, [currentViewInfo, setCurrentViewTitle, intl])\n\n if (!currentViewInfo) {\n return null\n }\n\n const queryParams = queryStringUtil.fromQueryString(location.search)\n const selection = _get(location, 'state.selection', queryParams.actionProperties)\n const actionProperties = _get(location, 'state.definition.properties', queryParams.actionProperties)\n\n const navigateBack = () => {\n history.replace(goBack(match.url, 2))\n }\n\n return (\n <Action\n history={history}\n match={match}\n appId={currentViewInfo.actionId}\n selection={selection}\n actionProperties={actionProperties}\n navigationStrategy={navigationStrategy(history, match)}\n onSuccess={navigateBack}\n onError={navigateBack}\n onCancel={navigateBack}\n />\n )\n}\n\nActionView.propTypes = {\n intl: PropTypes.object.isRequired,\n currentViewInfo: currentViewPropType,\n setCurrentViewTitle: PropTypes.func.isRequired,\n history: PropTypes.shape({\n replace: PropTypes.func.isRequired,\n location: PropTypes.shape({\n search: PropTypes.string,\n state: PropTypes.shape({\n selection: PropTypes.object,\n definition: PropTypes.shape({\n appId: PropTypes.string\n })\n })\n })\n }).isRequired,\n match: PropTypes.object\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(ActionView, areEqual)\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {setCurrentViewTitle} from '../../modules/path/actions'\nimport ActionView from './ActionView'\nconst mapActionCreators = {\n setCurrentViewTitle\n}\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname]\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(ActionView))\n","import _get from 'lodash/get'\nimport PropTypes from 'prop-types'\nimport React, {useState} from 'react'\nimport {Prompt} from 'react-router'\nimport styled from 'styled-components'\nimport EntityDetailApp from 'tocco-entity-detail/src/main'\nimport {theme, scale} from 'tocco-ui'\n\nimport navigationStrategy from '../../utils/navigationStrategy'\nimport {currentViewPropType} from '../../utils/propTypes'\n\nconst StyledEntityDetailAppWrapper = styled.div`\n margin: 0;\n background-color: ${theme.color('paper')};\n padding: 0 0 0 ${scale.space(0)};\n overflow: hidden;\n height: 100%;\n`\n\nconst CreateView = props => {\n const {currentViewInfo, history, match, intl, chooseDocument, dispatchEmittedAction} = props\n const {location} = history\n const stateDefaultValues = _get(location, 'state.defaultValues', [])\n const [touched, setTouched] = useState(false)\n\n const mode = 'create'\n\n if (!currentViewInfo) {\n return null\n }\n const {model, reverseRelation, parentKey} = currentViewInfo\n const entityName = model.name\n\n const isMultiReverseRelation = _get(model, `paths.${reverseRelation}.multi`, false)\n\n const defaultValues = [\n ...(reverseRelation && parentKey\n ? [{id: reverseRelation, value: isMultiReverseRelation ? [parentKey] : parentKey}]\n : []),\n ...stateDefaultValues\n ]\n\n const handleEntityCreated = ({id}) => {\n setTouched(false)\n history.push(match.url.replace(/create$/, id))\n }\n\n const msg = id => intl.formatMessage({id})\n const handleToucheChanged = ({touched}) => setTouched(touched)\n\n return (\n <StyledEntityDetailAppWrapper>\n <Prompt when={touched} message={msg('client.entity-browser.detail.confirmTouchedFormLeave')} />\n <EntityDetailApp\n entityName={entityName}\n formName={entityName}\n mode={mode}\n defaultValues={defaultValues}\n emitAction={action => {\n dispatchEmittedAction(action)\n }}\n navigationStrategy={navigationStrategy(history, match)}\n chooseDocument={chooseDocument}\n onEntityCreated={handleEntityCreated}\n onTouchedChange={handleToucheChanged}\n />\n </StyledEntityDetailAppWrapper>\n )\n}\n\nCreateView.propTypes = {\n intl: PropTypes.object,\n match: PropTypes.object,\n history: PropTypes.object,\n currentViewInfo: currentViewPropType,\n chooseDocument: PropTypes.func.isRequired,\n dispatchEmittedAction: PropTypes.func.isRequired\n}\n\nexport default CreateView\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\nimport {chooseDocument} from 'tocco-docs-browser/src/main'\n\nimport CreateView from './CreateView'\n\nconst mapActionCreators = {\n chooseDocument: chooseDocument.actions.chooseDocument,\n dispatchEmittedAction: actionEmitter.dispatchEmittedAction\n}\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname]\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(CreateView))\n","import PropTypes from 'prop-types'\nimport React, {useEffect, useState, useCallback} from 'react'\nimport {rest} from 'tocco-app-extensions'\nimport DocsBrowserApp from 'tocco-docs-browser/src/main'\n\nconst DocsView = ({entityName, entityKey, showActions, noLeftPadding, openResource}) => {\n const [folderKey, setFolderKey] = useState(null)\n\n const fetchFolder = useCallback(async () => {\n rest.simpleRequest('entities/2.0/' + entityName + '/' + entityKey + '/entitydocs/folder').then(res => {\n setFolderKey(res.body.key)\n })\n }, [entityName, entityKey])\n\n useEffect(() => {\n fetchFolder()\n }, [fetchFolder])\n\n return (\n folderKey && (\n <DocsBrowserApp\n routerType=\"routerless\"\n noLeftPadding={noLeftPadding}\n sortable={false}\n searchFormType=\"none\"\n rootNodes={[\n {\n key: folderKey,\n entityName: 'Folder'\n }\n ]}\n embedded={true}\n showActions={showActions}\n {...(showActions === false ? {selectionStyle: 'none'} : {})}\n disableViewPersistor={true}\n {...(openResource ? {openResource} : {})}\n scrollBehaviour=\"inline\"\n />\n )\n )\n}\n\nDocsView.propTypes = {\n entityName: PropTypes.string.isRequired,\n entityKey: PropTypes.string.isRequired,\n showActions: PropTypes.bool.isRequired,\n noLeftPadding: PropTypes.bool,\n openResource: PropTypes.func\n}\n\nexport default DocsView\n","import DocsView from './DocsView'\n\nexport default DocsView\n","import React from 'react'\n\nimport {currentViewPropType} from '../../utils/propTypes'\nimport DocsView from '../DocsView'\n\nconst DocsViewAdapter = ({currentViewInfo}) => (\n <DocsView\n noLeftPadding={false}\n entityName={currentViewInfo.parentModel.name}\n entityKey={currentViewInfo.parentKey}\n showActions={true}\n />\n)\n\nDocsViewAdapter.propTypes = {\n currentViewInfo: currentViewPropType\n}\n\nexport default DocsViewAdapter\n","import PropTypes from 'prop-types'\nimport queryString from 'query-string'\nimport React from 'react'\nimport EntityListApp from 'tocco-entity-list/src/main'\nimport {viewPersistor} from 'tocco-util'\n\nimport navigationStrategy from '../../utils/navigationStrategy'\nimport {currentViewPropType} from '../../utils/propTypes'\nimport Action from '../Action/LazyAction'\nimport DocsViewAdapter from './DocsViewAdapter'\n\nconst ListView = ({match, history, currentViewInfo, emitAction, searchFormCollapsed, saveUserPreferences}) => {\n if (!currentViewInfo) {\n return null\n }\n\n const queryParams = queryString.parse(history.location.search)\n\n const handleRowClick = ({id}) => {\n history.push(match.url.replace(/list$/, '') + id)\n }\n\n if (currentViewInfo.model.name === 'Resource') {\n return <DocsViewAdapter currentViewInfo={currentViewInfo} />\n }\n\n return (\n <EntityListApp\n emitAction={emitAction}\n limit={25}\n id={`${currentViewInfo.model.name}_list`}\n entityName={currentViewInfo.model.name}\n formName={queryParams.formName || currentViewInfo.model.name}\n onRowClick={handleRowClick}\n {...(currentViewInfo.reverseRelation && {\n parent: {\n key: currentViewInfo.parentKey,\n reverseRelationName: currentViewInfo.reverseRelation,\n model: currentViewInfo.parentModel.name\n }\n })}\n showLink={true}\n navigationStrategy={navigationStrategy(history, match)}\n searchFormPosition=\"left\"\n searchFormType=\"admin\"\n scrollBehaviour=\"inline\"\n store={viewPersistor.viewInfoSelector(history.location.pathname).store}\n onStoreCreate={store => {\n viewPersistor.persistViewInfo(history.location.pathname, {store}, currentViewInfo.level)\n }}\n actionAppComponent={Action}\n tql={queryParams.tql}\n searchFormCollapsed={searchFormCollapsed}\n onSearchFormCollapsedChange={({collapsed}) => {\n saveUserPreferences({'admin.list.searchFormCollapsed': collapsed})\n }}\n />\n )\n}\n\nListView.propTypes = {\n match: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired,\n history: PropTypes.object.isRequired,\n currentViewInfo: currentViewPropType,\n persistedViewInfo: PropTypes.shape({\n store: PropTypes.object\n }),\n searchFormCollapsed: PropTypes.bool,\n saveUserPreferences: PropTypes.func\n}\n\nexport default ListView\n","import _get from 'lodash/get'\nimport {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport {saveUserPreferences} from '../../../../modules/preferences/actions'\nimport ListView from './ListView'\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action),\n saveUserPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname],\n searchFormCollapsed: _get(state.preferences.userPreferences, 'admin.list.searchFormCollapsed', false)\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(ListView))\n","import PropTypes from 'prop-types'\nimport queryString from 'query-string'\nimport React, {useState} from 'react'\nimport {Prompt} from 'react-router'\nimport styled from 'styled-components'\nimport EntityDetailApp from 'tocco-entity-detail/src/main'\nimport {scale, theme} from 'tocco-ui'\n\nimport {goBack} from '../../../../utils/routing'\nimport navigationStrategy from '../../utils/navigationStrategy'\nimport {currentViewPropType} from '../../utils/propTypes'\nimport Action from '../Action'\n\nexport const StyledEntityDetailAppWrapper = styled.div`\n margin: 0;\n background-color: ${theme.color('paper')};\n padding: 0 0 0 ${scale.space(0)};\n overflow: hidden;\n height: 100%;\n`\n\nconst EditView = props => {\n const {\n currentViewInfo,\n history,\n match,\n intl,\n chooseDocument,\n emitAction,\n propagateRefresh,\n invalidateLastBreadcrumb\n } = props\n\n const [touched, setTouched] = useState(false)\n const mode = 'update'\n\n if (!currentViewInfo || currentViewInfo.pathname !== history.location.pathname) {\n return null\n }\n\n const queryFormName = queryString.parse(location.search).formName\n\n const handleToucheChanged = ({touched}) => {\n setTouched(touched)\n }\n\n const navigateToCreateRelative = (relationName, state) => {\n if (relationName) {\n const entityBaseUrl = goBack(match.url, 1)\n history.push({\n pathname: `${entityBaseUrl}/${relationName}/create`,\n state\n })\n } else {\n const entityBaseUrl = goBack(match.url, 2)\n history.push({\n pathname: entityBaseUrl + '/create',\n state\n })\n }\n }\n\n const handleEntityDeleted = () => {\n const entityBaseUrl = goBack(match.url, 2)\n history.push(entityBaseUrl)\n }\n\n const handleEntityUpdated = () => {\n const location = history.location\n invalidateLastBreadcrumb(location)\n }\n\n const handleRefresh = () => {\n const location = history.location\n propagateRefresh(location)\n }\n\n const handleSubGridRowClick = ({id, relationName}) => {\n const entityBaseUrl = goBack(match.url)\n history.push(`${entityBaseUrl}/${relationName}/${id}`)\n }\n\n const entityName = currentViewInfo.model.name\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledEntityDetailAppWrapper>\n <Prompt\n when={touched}\n message={location => {\n if (history.location.pathname !== location.pathname) {\n return msg('client.entity-browser.detail.confirmTouchedFormLeave')\n }\n\n return false\n }}\n />\n <EntityDetailApp\n entityName={entityName}\n entityId={currentViewInfo.key}\n formName={queryFormName || entityName}\n mode={mode}\n emitAction={emitAction}\n onTouchedChange={handleToucheChanged}\n navigationStrategy={{...navigationStrategy(history, match), navigateToCreateRelative}}\n chooseDocument={chooseDocument}\n onEntityDeleted={handleEntityDeleted}\n onEntityUpdated={handleEntityUpdated}\n onRefresh={handleRefresh}\n actionAppComponent={Action}\n onSubGridRowClick={handleSubGridRowClick}\n />\n </StyledEntityDetailAppWrapper>\n )\n}\n\nEditView.propTypes = {\n intl: PropTypes.object,\n match: PropTypes.object,\n history: PropTypes.object,\n currentViewInfo: currentViewPropType,\n chooseDocument: PropTypes.func.isRequired,\n emitAction: PropTypes.func.isRequired,\n propagateRefresh: PropTypes.func.isRequired,\n invalidateLastBreadcrumb: PropTypes.func.isRequired\n}\n\nexport default EditView\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\nimport {chooseDocument} from 'tocco-docs-browser/src/main'\n\nimport {propagateRefresh, invalidateLastBreadcrumb} from '../../modules/path/actions'\nimport EditView from './EditView'\n\nconst mapActionCreators = {\n chooseDocument: chooseDocument.actions.chooseDocument,\n emitAction: action => actionEmitter.dispatchEmittedAction(action),\n propagateRefresh,\n invalidateLastBreadcrumb\n}\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname]\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(EditView))\n","const selectedRelations = {}\n\nexport const getRelation = entity => selectedRelations[entity]\n\nexport const setRelation = (entity, selectedRelation) => {\n selectedRelations[entity] = selectedRelation\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport {currentViewPropType} from '../../utils/propTypes'\nimport DocsView from '../DocsView'\n\nconst DocsViewAdapter = ({currentViewInfo, history, selectedRelation}) => (\n <DocsView\n entityName={currentViewInfo.model.name}\n entityKey={currentViewInfo.key}\n showActions={false}\n noLeftPadding={true}\n history={history}\n openResource={location => {\n history.push(`${selectedRelation.relationName}/list#${location}`)\n }}\n />\n)\n\nDocsViewAdapter.propTypes = {\n history: PropTypes.object.isRequired,\n selectedRelation: PropTypes.shape({\n relationName: PropTypes.string.isRequired\n }).isRequired,\n currentViewInfo: currentViewPropType\n}\n\nexport default DocsViewAdapter\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport EntityListApp from 'tocco-entity-list/src/main'\nimport {viewPersistor} from 'tocco-util'\n\nimport {goBack} from '../../../../utils/routing'\nimport navigationStrategy from '../../utils/navigationStrategy'\nimport {currentViewPropType} from '../../utils/propTypes'\n\nconst ListView = ({selectedRelation, currentViewInfo, match, history, emitAction}) => {\n return (\n <EntityListApp\n id={'preview' + selectedRelation.reverseRelationName + selectedRelation.targetEntity}\n key={selectedRelation.reverseRelationName + selectedRelation.targetEntity}\n entityName={selectedRelation.targetEntity}\n formName={selectedRelation.targetEntity}\n parent={{\n key: currentViewInfo.key,\n reverseRelationName: selectedRelation.reverseRelationName,\n model: currentViewInfo.model.name,\n relationName: selectedRelation.relationName\n }}\n showLink={true}\n navigationStrategy={navigationStrategy(history, match)}\n onRowClick={({id}) => {\n const entityBaseUrl = match.url.replace(/detail$/, '')\n history.push(`${entityBaseUrl}${selectedRelation.relationName}/${id}`)\n }}\n onNavigateToCreate={() => {\n const entityBaseUrl = goBack(match.url)\n history.push(entityBaseUrl + '/' + selectedRelation.relationName + '/create')\n }}\n searchFormType=\"fulltext\"\n selectionStyle=\"none\"\n store={viewPersistor.viewInfoSelector(history.location.pathname)[`store-${selectedRelation.relationName}`]}\n onStoreCreate={store => {\n viewPersistor.persistViewInfo(\n currentViewInfo.pathname,\n {[`store-${selectedRelation.relationName}`]: store},\n currentViewInfo.level\n )\n }}\n showActions={false}\n limit={15}\n emitAction={emitAction}\n scrollBehaviour=\"inline\"\n />\n )\n}\n\nListView.propTypes = {\n selectedRelation: PropTypes.shape({\n reverseRelationName: PropTypes.string,\n targetEntity: PropTypes.string,\n relationName: PropTypes.string\n }).isRequired,\n currentViewInfo: currentViewPropType,\n match: PropTypes.object.isRequired,\n history: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired\n}\n\nexport default React.memo(ListView)\n","import styled from 'styled-components'\nimport {AdminLink as StyledLink, StyledSpan, theme, scale, StyledScrollbar, Button} from 'tocco-ui'\n\nexport const StyledRelationsViewWrapper = styled.div`\n display: ${({isCollapsed}) => (isCollapsed ? 'none' : 'flex')};\n height: 100%;\n flex-direction: column;\n`\n\nexport const StyledPlaceHolder = styled.div`\n display: ${({isCollapsed}) => (isCollapsed ? 'flex' : 'none')};\n flex: 1;\n height: 100%;\n width: 25px;\n background: ${theme.color('paper')};\n padding-top: ${scale.space(-1.5)};\n padding-left: ${scale.space(-2.5)};\n align-items: flex-start;\n\n &:hover {\n cursor: pointer;\n }\n`\n\nexport const StyledToggleCollapse = styled.div`\n display: flex;\n background-color: ${theme.color('paper')};\n padding-top: ${scale.space(-1.5)};\n padding-bottom: ${scale.space(-1.5)};\n`\n\nexport const StyledToggleCollapseButton = styled(Button)`\n font-size: ${scale.font(0)};\n padding: 0;\n margin-left: auto;\n\n &:hover,\n ${/* sc-selector */ StyledPlaceHolder}:hover & {\n background-color: transparent;\n color: ${theme.color('secondaryLight')};\n }\n`\n\nexport const StyledPreviewBox = styled.div`\n background-color: ${theme.color('paper')};\n padding: ${scale.space(-1)};\n margin-top: 3px;\n display: flex;\n flex-direction: column;\n flex: 1;\n`\n\nexport const StyledRelationBoxes = styled.div`\n background-color: ${theme.color('paper')};\n padding: ${scale.space(-1)};\n display: grid;\n grid-template-columns: repeat(auto-fit, 170px);\n grid-gap: ${scale.space(-2)};\n justify-content: space-between;\n overflow-y: auto;\n align-content: flex-start;\n height: fit-content;\n min-height: 150px;\n max-height: 20%;\n ${StyledScrollbar}\n`\n\nexport const StyledPreviewLink = styled(StyledLink)`\n padding-left: ${scale.space(-0.5)};\n\n &:nth-child(2) {\n padding-left: 0;\n }\n`\n\nexport const StyledRelationLinks = styled.div`\n display: none;\n margin-left: auto;\n\n * {\n color: ${theme.color('text')};\n padding-left: ${scale.space(-4.5)};\n }\n`\n\nexport const StyledRelationBox = styled.div`\n border-radius: ${theme.radii('large')};\n padding: ${scale.space(-2.7)} ${scale.space(-1)};\n display: flex;\n background-color: ${({selected}) => selected && theme.color('secondary')};\n height: fit-content;\n\n &&& {\n * {\n color: ${({selected}) => selected && theme.color('paper')};\n box-sizing: initial;\n }\n }\n ${({selected}) =>\n selected &&\n `\n ${StyledRelationLinks} {\n display: flex;\n }\n `};\n\n // allow hover styles only on non-touch devices\n @media (hover: hover) and (pointer: fine) {\n &:hover ${StyledRelationLinks} {\n display: flex;\n }\n\n && {\n :hover {\n background-color: ${theme.color('secondaryLight')};\n\n * {\n color: ${theme.color('paper')};\n }\n cursor: pointer;\n }\n }\n\n ${/* sc-selector */ StyledLink}:hover * {\n color: ${theme.color('secondary')};\n }\n }\n`\n\nexport const StyledRelationLabel = styled(StyledSpan)`\n && {\n max-width: 110px;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {AdminLink as StyledLink, Icon} from 'tocco-ui'\n\nimport {setRelation} from '../../utils/relationPersistor'\nimport {StyledRelationBox, StyledRelationLabel, StyledRelationLinks} from './StyledComponents'\n\nconst RelationBox = ({relation, history, match, relationsInfo, selectRelation, selectedRelation, intl, entityName}) => {\n const {relationName, targetEntity, relationDisplay} = relation\n\n const msg = id => intl.formatMessage({id})\n const hasCreateRights = () => relationsInfo[relationName]?.createPermission\n\n const getRelationCountLabel = () =>\n relationsInfo[relationName]?.count > 0 ? (\n <StyledRelationLabel> ({relationsInfo[relationName].count})</StyledRelationLabel>\n ) : null\n\n const handleBoxClick = () => {\n selectRelation(relation)\n history.replace({\n search: `?relation=${relationName}`\n })\n setRelation(entityName, relationName)\n }\n\n return (\n <StyledRelationBox selected={selectedRelation?.relationName === relationName} onClick={handleBoxClick}>\n <StyledRelationLabel title={relationDisplay.label}>{relationDisplay.label}</StyledRelationLabel>\n {getRelationCountLabel()}\n <StyledRelationLinks>\n <StyledLink\n aria-label={msg('client.admin.entities.relationsView.relationLinkView')}\n to={match.url.replace(/(relations|detail)$/, relationName)}\n >\n <Icon icon=\"arrow-right\" />\n </StyledLink>\n {hasCreateRights() && targetEntity !== 'Resource' && (\n <StyledLink\n aria-label={msg('client.admin.entities.relationsView.relationLinkCreate')}\n to={match.url.replace(/(relations|detail)$/, relationName) + '/create'}\n >\n <Icon icon=\"plus\" />\n </StyledLink>\n )}\n </StyledRelationLinks>\n </StyledRelationBox>\n )\n}\n\nRelationBox.propTypes = {\n relation: PropTypes.object.isRequired,\n history: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n relationsInfo: PropTypes.objectOf(\n PropTypes.shape({\n count: PropTypes.number,\n createPermission: PropTypes.bool\n })\n ),\n intl: PropTypes.object.isRequired,\n selectRelation: PropTypes.func.isRequired,\n selectedRelation: PropTypes.object,\n entityName: PropTypes.string\n}\n\nexport default RelationBox\n","import _get from 'lodash/get'\nimport PropTypes from 'prop-types'\nimport queryString from 'query-string'\nimport React, {useCallback, useEffect} from 'react'\nimport {Icon, Typography} from 'tocco-ui'\nimport {js} from 'tocco-util'\n\nimport {currentViewPropType} from '../../utils/propTypes'\nimport {getRelation} from '../../utils/relationPersistor'\nimport DocsViewAdapter from './DocsViewAdapter'\nimport ListView from './ListView'\nimport RelationBox from './RelationBox'\nimport {\n StyledPlaceHolder,\n StyledPreviewBox,\n StyledPreviewLink,\n StyledRelationBoxes,\n StyledRelationsViewWrapper,\n StyledToggleCollapse,\n StyledToggleCollapseButton\n} from './StyledComponents'\n\nconst RelationsView = props => {\n const {\n history,\n match,\n currentViewInfo,\n relations,\n relationsInfo,\n emitAction,\n intl,\n isCollapsed,\n toggleCollapse,\n selectedRelation,\n selectRelation\n } = props\n const entityName = _get(currentViewInfo, 'model.name')\n\n const updateSelectedRelation = useCallback(() => {\n if (relations?.length > 0) {\n const queryRelation = queryString.parse(history.location.search).relation\n if (queryRelation) {\n selectRelation(relations.find(r => r.relationName === queryRelation))\n } else {\n const persistedSelectedRelation = getRelation(entityName)\n if (persistedSelectedRelation) {\n selectRelation(relations.find(r => r.relationName === persistedSelectedRelation))\n } else {\n selectRelation(relations[0])\n }\n }\n }\n }, [relations, entityName, history.location.search, selectRelation])\n\n useEffect(updateSelectedRelation, [updateSelectedRelation])\n useEffect(() => (!selectedRelation ? updateSelectedRelation() : null), [selectedRelation, updateSelectedRelation])\n\n if (!relations || relations.length === 0 || !currentViewInfo) {\n return null\n }\n\n const msg = id => intl.formatMessage({id})\n const hasCreateRights = relationName => relationsInfo[relationName]?.createPermission\n const RelationPreview = selectedRelation\n ? selectedRelation.targetEntity === 'Resource'\n ? DocsViewAdapter\n : ListView\n : () => <React.Fragment />\n\n const RelationBoxes = relations.map(relation => (\n <RelationBox key={`relation-${relation.relationName}`} relation={relation} entityName={entityName} {...props} />\n ))\n\n return (\n <>\n <StyledRelationsViewWrapper isCollapsed={isCollapsed}>\n <StyledToggleCollapse>\n <StyledToggleCollapseButton icon=\"chevron-right\" onClick={toggleCollapse} />\n </StyledToggleCollapse>\n <StyledRelationBoxes>{RelationBoxes}</StyledRelationBoxes>\n {selectedRelation && (\n <StyledPreviewBox>\n <Typography.H4>\n {selectedRelation.relationDisplay.label}\n <StyledPreviewLink\n aria-label={msg('client.admin.entities.relationsView.relationLinkView')}\n to={match.url.replace(/(relations|detail)$/, selectedRelation.relationName)}\n >\n <Icon icon=\"arrow-right\" />\n </StyledPreviewLink>\n {hasCreateRights(selectedRelation.relationName) && selectedRelation.targetEntity !== 'Resource' && (\n <StyledPreviewLink\n aria-label={msg('client.admin.entities.relationsView.relationLinkCreate')}\n to={match.url.replace(/(relations|detail)$/, selectedRelation.relationName) + '/create'}\n >\n <Icon icon=\"plus\" />\n </StyledPreviewLink>\n )}\n </Typography.H4>\n <RelationPreview\n selectedRelation={selectedRelation}\n match={match}\n history={history}\n currentViewInfo={currentViewInfo}\n emitAction={emitAction}\n />\n </StyledPreviewBox>\n )}\n </StyledRelationsViewWrapper>\n <StyledPlaceHolder onClick={toggleCollapse} isCollapsed={isCollapsed}>\n <StyledToggleCollapseButton icon={'chevron-left'} isCollapsed={isCollapsed} />\n </StyledPlaceHolder>\n </>\n )\n}\n\nRelationsView.propTypes = {\n history: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n currentViewInfo: currentViewPropType,\n relations: PropTypes.array,\n relationsInfo: PropTypes.objectOf(\n PropTypes.shape({\n count: PropTypes.number,\n createPermission: PropTypes.bool\n })\n ),\n emitAction: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n isCollapsed: PropTypes.bool,\n toggleCollapse: PropTypes.func.isRequired,\n selectRelation: PropTypes.func.isRequired,\n selectedRelation: PropTypes.object\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(RelationsView, areEqual)\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport {selectRelation} from '../../modules/path/actions'\nimport RelationsView from './RelationsView'\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname],\n relations: state.entities.path.relations,\n relationsInfo: state.entities.path.relationsInfo,\n selectedRelation: state.entities.path.selectedRelation\n})\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action),\n selectRelation\n}\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(RelationsView))\n","import RelationsView from './RelationViewContainer'\n\nexport default RelationsView\n","import styled from 'styled-components'\n\nexport const StyledDetailViewContainer = styled.div`\n display: flex;\n flex-direction: row;\n height: 100%;\n\n .react-bs-container-body {\n height: auto !important;\n }\n`\n\nexport const StyledDetailViewLeft = styled.div`\n flex: 1;\n margin-right: 1rem;\n ${({isCollapsed}) =>\n !isCollapsed &&\n ` @media(max - width: 1024px) {\n flex: none;\n width: 40%;\n }`}\n`\n\nexport const StyledDetailViewRight = styled.div`\n flex: ${({isCollapsed}) => (isCollapsed ? '0' : '1')};\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useEffect} from 'react'\n\nimport {currentViewPropType} from '../../utils/propTypes'\nimport EditView from '../EditView'\nimport RelationsView from '../RelationsView'\nimport {StyledDetailViewContainer, StyledDetailViewLeft, StyledDetailViewRight} from './StyledComponents'\n\nconst DetailView = ({match, history, currentViewInfo, relationViewCollapsed, saveUserPreferences}) => {\n const [isCollapsed, setIsCollapsed] = useState(false)\n const toggleCollapse = () => {\n setIsCollapsed(!isCollapsed)\n onSearchFormCollapsedChange(!isCollapsed)\n }\n\n useEffect(() => {\n setIsCollapsed(relationViewCollapsed)\n }, [relationViewCollapsed])\n\n const onSearchFormCollapsedChange = collapsed => {\n saveUserPreferences({'admin.detail.relationViewCollapsed': collapsed})\n }\n\n return (\n <StyledDetailViewContainer>\n <StyledDetailViewLeft isCollapsed={isCollapsed}>\n <EditView match={match} history={history} />\n </StyledDetailViewLeft>\n <StyledDetailViewRight isCollapsed={isCollapsed}>\n <RelationsView match={match} history={history} isCollapsed={isCollapsed} toggleCollapse={toggleCollapse} />\n </StyledDetailViewRight>\n </StyledDetailViewContainer>\n )\n}\n\nDetailView.propTypes = {\n intl: PropTypes.object,\n match: PropTypes.object,\n history: PropTypes.object,\n currentViewInfo: currentViewPropType,\n relationViewCollapsed: PropTypes.bool,\n saveUserPreferences: PropTypes.func.isRequired\n}\n\nexport default DetailView\n","import _get from 'lodash/get'\nimport {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {saveUserPreferences} from '../../../../modules/preferences/actions'\nimport DetailView from './DetailView'\nconst mapActionCreators = {\n saveUserPreferences\n}\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname],\n relationViewCollapsed: _get(state.preferences.userPreferences, 'admin.detail.relationViewCollapsed', false)\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(DetailView))\n","/* eslint-disable max-len */\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport {Redirect, Route, Switch} from 'react-router-dom'\n\nimport Action from '../../subroutes/action'\nimport Detail from '../../subroutes/detail'\nimport Edit from '../../subroutes/edit'\nimport Entity from '../../subroutes/entity'\nimport Relations from '../../subroutes/relations'\n\nfunction wordCount(str, word) {\n return str.split(word).length - 1\n}\n\nconst EntityRecordRoute = ({match}) => {\n const count = wordCount(match.path, ':relation')\n\n return (\n <Switch>\n <Route\n exact\n path={`${match.url}`}\n render={({match}) => <Redirect to={`${match.url.replace(/\\/$/, '')}/detail`} />}\n />\n <Route path={`${match.path}/detail`} component={Detail} />\n <Route path={`${match.path}/edit`} component={Edit} />\n <Route path={`${match.path}/relations`} component={Relations} />\n <Route path={`${match.path}/action`} component={Action} />\n <Route path={`${match.path}/:relation_${count}`} component={Entity} />\n </Switch>\n )\n}\n\nEntityRecordRoute.propTypes = {\n match: PropTypes.object.isRequired\n}\n\nexport default EntityRecordRoute\n","import EntityRecordRoute from './EntityRecordRoute'\n\nexport default EntityRecordRoute\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Redirect, Route, Switch} from 'react-router-dom'\n\nimport Action from '../../subroutes/action'\nimport Create from '../../subroutes/create'\nimport List from '../../subroutes/list'\nimport Record from '../../subroutes/record'\n\nconst EntityRoute = ({match}) => (\n <Switch>\n <Route exact path={match.url} render={({match}) => <Redirect to={`${match.url.replace(/\\/$/, '')}/list`} />} />\n <Route path={`${match.path}/action/:id`} component={Action} />\n <Route path={`${match.path}/list`} component={List} />\n <Route path={`${match.path}/create`} component={Create} />\n <Route path={`${match.path}/:key`} component={Record} />\n </Switch>\n)\n\nEntityRoute.propTypes = {\n match: PropTypes.object.isRequired\n}\n\nexport default EntityRoute\n","import EntityRoute from './EntityRoute'\n\nexport default EntityRoute\n","import React from 'react'\nimport {AdminLink as StyledLink, Typography} from 'tocco-ui'\n\nconst EntitiesOverview = props => {\n return (\n <div>\n <Typography.H2>Entities Overview</Typography.H2>\n <Typography.Span>List of all available Entities</Typography.Span>\n <ul>\n <li>\n <StyledLink to=\"/e/User\">User</StyledLink>\n </li>\n <li>\n <StyledLink to=\"/e/Address\">Address</StyledLink>\n </li>\n </ul>\n </div>\n )\n}\n\nEntitiesOverview.propTypes = {}\n\nexport default EntitiesOverview\n","import EntitiesOverview from './EntitiesOverview'\n\nexport default EntitiesOverview\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {Breadcrumbs} from 'tocco-ui'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = (state, props) => ({\n pathPrefix: '/e',\n breadcrumbsInfo: state.entities.path.breadcrumbsInfo,\n currentView: state.entities.path.currentViewTitle\n ? {\n display: state.entities.path.currentViewTitle,\n title: state.entities.path.currentViewTitle\n }\n : null\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Breadcrumbs))\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\n\nimport ErrorView from '../../../../components/ErrorView'\nimport {currentViewPropType} from '../../utils/propTypes'\n\nconst EntityErrorView = ({currentViewInfo}) => {\n const prefix = 'client.admin.entity.errorView.'\n const title = currentViewInfo.type === 'detail' ? 'detailTitle' : 'defaultTitle'\n\n const description =\n currentViewInfo.type === 'detail'\n ? 'detailDescription'\n : currentViewInfo.type === 'list' && currentViewInfo.error.relationName\n ? 'relationDescription'\n : 'listDescription'\n\n return (\n <ErrorView\n title={<FormattedMessage id={prefix + title} />}\n message={<FormattedMessage id={prefix + description} values={currentViewInfo.error} />}\n />\n )\n}\n\nEntityErrorView.propTypes = {\n currentViewInfo: currentViewPropType\n}\n\nexport default EntityErrorView\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport EntityErrorView from './EntityErrorView'\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname]\n})\n\nexport default connect(mapStateToProps)(injectIntl(EntityErrorView))\n","import PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {Route, Switch} from 'react-router-dom'\nimport styled from 'styled-components'\n\nimport Action from '../../subroutes/action'\nimport Entity from '../../subroutes/entity'\nimport Overview from '../../subroutes/overview'\nimport {currentViewPropType} from '../../utils/propTypes'\nimport Breadcrumbs from '../Breadcrumbs'\nimport ErrorView from '../ErrorView'\n\nconst StyledWrapper = styled.div`\n display: grid;\n grid-template-rows: auto 1fr;\n grid-template-areas:\n 'breadcrumbs'\n 'content';\n height: 100%;\n width: 100%;\n`\n\nconst StyledContent = styled.div`\n grid-area: content;\n overflow: hidden;\n`\n\nconst StyledBreadcrumbs = styled.div`\n grid-area: breadcrumbs;\n`\n\nconst EntitiesRoute = ({match, history, loadCurrentRoute, currentViewInfo}) => {\n const location = history.location\n\n useEffect(() => {\n loadCurrentRoute(location)\n }, [location, loadCurrentRoute])\n\n const content =\n currentViewInfo && currentViewInfo.error ? (\n <ErrorView history={history} />\n ) : (\n <Switch>\n <Route path={`${match.url}/action/:actionId`} component={Action} />\n <Route path={`${match.url}/:entity`} component={Entity} />\n <Route exact path={match.url} component={Overview} />\n </Switch>\n )\n\n return (\n <StyledWrapper>\n <StyledBreadcrumbs>\n <Breadcrumbs />\n </StyledBreadcrumbs>\n <StyledContent>{content}</StyledContent>\n </StyledWrapper>\n )\n}\n\nEntitiesRoute.propTypes = {\n loadCurrentRoute: PropTypes.func.isRequired,\n history: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n currentViewInfo: currentViewPropType\n}\n\nexport default EntitiesRoute\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {loadCurrentRoute} from '../../modules/path/actions'\nimport EntitiesRoute from './EntitiesRoute'\n\nconst mapActionCreators = {\n loadCurrentRoute\n}\n\nconst mapStateToProps = (state, props) => ({\n currentViewInfo: state.entities.path.currentViewInfos[props.history.location.pathname]\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(EntitiesRoute))\n","import EntitiesRoute from './EntitiesRouteContainer'\n\nexport default EntitiesRoute\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nexport const setCurrentViewInfo = (state, {payload: {location, currentViewInfo}}) => ({\n ...state,\n currentViewInfos: {\n ...state.currentViewInfos,\n [location]: {\n ...state.currentViewInfos[location],\n ...currentViewInfo\n }\n }\n})\n\nexport const updateBreadcrumbsInfo = (state, {payload: {path, breadcrumbsInfo}}) => ({\n ...state,\n breadcrumbsInfo: state.breadcrumbsInfo.map(info => (info.path === path ? {...info, ...breadcrumbsInfo} : info))\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_CURRENT_VIEW_INFO]: setCurrentViewInfo,\n [actions.SET_BREADCRUMBS_INFO]: reducerUtil.singleTransferReducer('breadcrumbsInfo'),\n [actions.UPDATE_BREADCRUMBS_INFO]: updateBreadcrumbsInfo,\n [actions.SET_RELATIONS]: reducerUtil.singleTransferReducer('relations'),\n [actions.SET_RELATIONS_INFO]: reducerUtil.singleTransferReducer('relationsInfo'),\n [actions.SET_CURRENT_VIEW_TITLE]: reducerUtil.singleTransferReducer('currentViewTitle'),\n [actions.SELECT_RELATION]: reducerUtil.singleTransferReducer('selectedRelation')\n}\n\nconst initialState = {\n currentViewInfos: {},\n breadcrumbsInfo: [],\n relations: null,\n relationsInfo: {},\n selectedRelation: 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 {route} from 'tocco-util'\n\nconst entityUrlRegex = '/e/:entity/:key?/:relation*/:view(list|detail|edit|create|relations|action)/:actionId?'\nconst actionUrlRegex = '/e/action/:actionId'\n\n/**\n * Returns an object with actionId, entity, key, relation and view for given url\n *\n * @param pathname {String} url / path starting with /e/\n */\nexport const getPathInfo = pathname => {\n const entityParams = route.extractParamsFromPath(entityUrlRegex, pathname)\n const actionParams = route.extractParamsFromPath(actionUrlRegex, pathname)\n\n return entityParams || actionParams\n}\n","import _omit from 'lodash/omit'\nimport _pick from 'lodash/pick'\nimport _pickBy from 'lodash/pickBy'\nimport {all, call, put, select, spawn, takeLatest} from 'redux-saga/effects'\nimport {rest} from 'tocco-app-extensions'\nimport {viewPersistor, consoleLogger} from 'tocco-util'\n\nimport {getPathInfo} from '../../utils/url'\nimport * as actions from './actions'\n\nexport const entitiesPathSelector = state => state.entities.path\n\nconst relationPathRegex = /[^/]+\\/?[^/]+/g\nconst isEven = n => n % 2 === 0\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.LOAD_CURRENT_ROUTE, loadRoute),\n takeLatest(actions.PROPAGATE_REFRESH, reloadRelationsInfo),\n takeLatest(actions.INVALIDATE_LAST_BREADCRUMB, invalidateLastBreadcrumb)\n ])\n}\n\nexport function* loadRoute({payload: {location}}) {\n const {pathname} = location\n\n const routeInfo = yield call(loadRouteInfo, pathname)\n\n if (routeInfo.length > 0) {\n const currentViewInfo = yield call(updateCurrentViewInfo, pathname, routeInfo)\n yield call(updateBreadcrumbsInfo, routeInfo)\n\n if (currentViewInfo.type === 'detail' && !currentViewInfo.error) {\n yield spawn(initMultiRelations, currentViewInfo.model, currentViewInfo.key)\n }\n\n yield call(viewPersistor.clearPersistedViews, currentViewInfo.level + 1)\n }\n}\n\nfunction* updateCurrentViewInfo(pathname, routeInfo) {\n const currentViewInfo = yield call(deriveCurrentViewInfo, pathname, routeInfo)\n yield put(actions.setCurrentViewInfo(pathname, currentViewInfo))\n return currentViewInfo\n}\n\nfunction* updateBreadcrumbsInfo(routeInfo) {\n const breadcrumbs = yield call(deriveBreadcrumbs, routeInfo)\n yield put(actions.setBreadcrumbsInfo(breadcrumbs))\n return breadcrumbs\n}\n\nexport function* loadRouteInfo(pathname) {\n const path = yield call(getPathInfo, pathname)\n const routeInfos = []\n\n if (path === null) {\n return routeInfos\n }\n\n if (path.entity) {\n let baseModel\n try {\n baseModel = yield call(rest.fetchModel, path.entity)\n routeInfos.push({\n type: 'list',\n model: baseModel\n })\n } catch (e) {\n routeInfos.push({\n type: 'list',\n error: {\n entityName: path.entity\n }\n })\n return routeInfos\n }\n\n if (path.key) {\n const entityExists = yield call(rest.entityExists, baseModel.name, path.key)\n\n if (entityExists) {\n const display = yield call(rest.fetchDisplay, baseModel.name, path.key)\n routeInfos.push({\n type: 'detail',\n key: path.key,\n model: baseModel,\n display\n })\n } else {\n routeInfos.push({\n type: 'detail',\n error: {\n entityName: baseModel.label,\n key: path.key\n }\n })\n\n return routeInfos\n }\n\n if (path.relation) {\n const splittedRelation = path.relation.split('/')\n\n for (let i = 0; i < splittedRelation.length; i++) {\n const relationStringPart = splittedRelation[i]\n\n const parent = routeInfos[routeInfos.length - 1]\n if (isEven(i)) {\n const relationName = relationStringPart\n const relation = parent.model.paths[relationName]\n if (!relation) {\n routeInfos.push({\n type: 'list',\n error: {\n relationName: relationName,\n entityName: parent.model.name\n }\n })\n return routeInfos\n }\n const targetEntity = relation.targetEntity\n\n const relationModel = yield call(rest.fetchModel, targetEntity)\n\n routeInfos.push({\n type: 'list',\n model: relationModel,\n relationName,\n parent\n })\n } else {\n const key = relationStringPart\n const model = parent.model\n const entityExists = yield call(rest.entityExists, model.name, key)\n\n if (entityExists) {\n const display = yield call(rest.fetchDisplay, model.name, key)\n routeInfos.push({\n type: 'detail',\n model,\n key,\n display,\n relationName: parent.relationName,\n parent: parent.parent\n })\n } else {\n routeInfos.push({\n type: 'detail',\n error: {\n entityName: model.name,\n key\n }\n })\n return routeInfos\n }\n }\n }\n }\n }\n\n if (path.view === 'create') {\n const entity = routeInfos[routeInfos.length - 1]\n const parent = routeInfos[routeInfos.length - 2]\n routeInfos.push({\n type: 'create',\n model: entity.model,\n parent,\n relationName: entity.relationName\n })\n } else if (path.actionId) {\n routeInfos.push({\n type: 'action',\n actionId: path.actionId\n })\n }\n } else if (path.actionId) {\n routeInfos.push({\n type: 'action',\n actionId: path.actionId\n })\n }\n\n return routeInfos\n}\n\nexport const deriveCurrentViewInfo = (pathname, routeInfo) => {\n const lastEntry = routeInfo[routeInfo.length - 1]\n const parent = lastEntry.parent\n\n return {\n ..._omit(lastEntry, ['parent']),\n pathname,\n level: routeInfo.length - 1,\n ...(parent &&\n lastEntry.relationName && {\n parentKey: parent.key,\n reverseRelation: parent.model.paths[lastEntry.relationName].reverseRelationName,\n parentModel: parent.model\n })\n }\n}\n\nexport const deriveBreadcrumbs = routeInfos => {\n let path = ''\n return routeInfos\n .map(routeInfo => {\n if (routeInfo.error) {\n return {type: 'error'}\n }\n if (routeInfo.type === 'action') {\n return null\n }\n path = (path ? path + '/' : '') + (routeInfo.key ? routeInfo.key : routeInfo.relationName || routeInfo.model.name)\n return {\n type: routeInfo.type,\n display: routeInfo.display || routeInfo.model.label,\n path: path + '/' + routeInfo.type\n }\n })\n .filter(e => e)\n}\n\nexport function* initMultiRelations(model, key) {\n const relations = _pickBy(model.paths, (value, key) => value.relationDisplay && value.relationDisplay.show)\n\n const relationsTransformed = Object.keys(relations)\n .map(k =>\n _pick(relations[k], [\n 'relationName',\n 'reverseRelationName',\n 'targetEntity',\n 'relationDisplay.label',\n 'relationDisplay.order'\n ])\n )\n .sort((a, b) => (a.relationDisplay.order > b.relationDisplay.order ? 1 : -1))\n\n yield put(actions.selectRelation(null))\n yield put(actions.setRelations(relationsTransformed))\n yield call(loadRelationInfos, model.name, key)\n}\n\nexport function* reloadRelationsInfo({payload: {location}}) {\n const {pathname} = location\n const {currentViewInfos} = yield select(entitiesPathSelector)\n const currentViewInfo = currentViewInfos[pathname]\n if (currentViewInfo.type === 'detail' && !currentViewInfo.error) {\n yield spawn(loadRelationInfos, currentViewInfo.model.name, currentViewInfo.key)\n yield put(actions.selectRelation(null))\n }\n}\n\nexport function* invalidateLastBreadcrumb({payload: {location}}) {\n const {pathname} = location\n\n const path = yield call(getPathInfo, pathname)\n\n if (path?.entity && path?.key) {\n try {\n const lastEntity = yield call(getLastEntityInPath, path)\n if (lastEntity) {\n const {entityName, key} = lastEntity\n yield call(rest.invalidateDisplay, entityName, key)\n const display = yield call(rest.fetchDisplay, entityName, key)\n\n yield put(actions.setCurrentViewInfo(pathname, {display}))\n\n const breadcrumbsPath = yield call(getLastBreadcrumbsPath, pathname)\n yield put(actions.updateBreadcrumbsInfo(breadcrumbsPath, {display}))\n }\n } catch (e) {\n // could not load model or delete cache\n consoleLogger.logError('breadcrumbs invalidation failed', e)\n }\n }\n}\n\nfunction* getLastBreadcrumbsPath(pathname) {\n const path = yield call(getPathInfo, pathname)\n\n if (path === null || !path.entity) {\n return ''\n }\n\n // concatenates defined path segments separated with a slash => ${entity}/${key}/${relation}/${view}\n return [path.entity, path.key, path.relation, path.view].filter(Boolean).join('/')\n}\n\nfunction* getLastEntityInPath(path) {\n if (!path || !path.entity || !path.key || path.view === 'action') {\n return null\n }\n\n const baseModel = yield call(rest.fetchModel, path.entity)\n\n if (!path.relation) {\n // no relations => base entity is the last entity\n return {entityName: baseModel.name, key: path.key}\n }\n\n const splittedEntities = path.relation.match(relationPathRegex)\n if (splittedEntities.length < 1) {\n return null\n }\n\n let parentModel = baseModel\n let lastEntity = null\n\n for (let i = 0; i < splittedEntities.length; i++) {\n const [relationName, key] = splittedEntities[i].split('/')\n const relation = parentModel.paths[relationName]\n\n if (!relation || !key) {\n // no key = no entity (e.g. list or create view)\n return null\n }\n\n parentModel = yield call(rest.fetchModel, relation.targetEntity)\n lastEntity = {entityName: parentModel.name, key}\n }\n\n return lastEntity\n}\n\nexport function* loadRelationInfos(model, key) {\n const resource = `client/entities/${model}/${key}/relations`\n const relationInfoResponse = yield call(rest.requestSaga, resource)\n const relationsInfo = relationInfoResponse.body.relations\n yield put(actions.setRelationsInfo(relationsInfo))\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport reducer from './reducer'\nimport moduleSagas from './sagas'\n\nexport function* sagas() {\n yield all([fork(moduleSagas)])\n}\n\nexport default reducer\n","import {combineReducers} from 'redux'\n\nimport EntitiesRoute from './components/EntitiesRoute'\nimport path from './modules/path'\nimport sagas from './modules/path/sagas'\n\nexport default {\n container: EntitiesRoute,\n reducers: {\n entities: combineReducers({path})\n },\n sagas: [sagas]\n}\n","export const LOAD_BREADCRUMBS = 'docs/path/LOAD_BREADCRUMBS'\nexport const SET_BREADCRUMBS = 'docs/path/SET_BREADCRUMBS'\nexport const SET_SEARCH_MODE = 'docs/path/SET_SEARCH_MODE'\n\nexport const loadBreadcrumbs = location => ({\n type: LOAD_BREADCRUMBS,\n payload: {\n location\n }\n})\n\nexport const setBreadcrumbs = breadcrumbs => ({\n type: SET_BREADCRUMBS,\n payload: {\n breadcrumbs\n }\n})\n\nexport const setSearchMode = searchMode => ({\n type: SET_SEARCH_MODE,\n payload: {\n searchMode\n }\n})\n","const ROOT_PATH_REGEX = /^\\/docs\\/?$/\n\nconst isRootLocation = pathname => ROOT_PATH_REGEX.test(pathname)\n\nexport default isRootLocation\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {withTheme} from 'styled-components'\nimport {Breadcrumbs, theme as themeUtil} from 'tocco-ui'\n\nconst DocsBrowserBreadcrumbs = ({embedded, resetSearchMode, theme, pathPrefix, breadcrumbsInfo}) => {\n const handleBreadcrumbsClick = breadcrumbsItem => {\n if (breadcrumbsItem.path === '') {\n resetSearchMode()\n }\n }\n\n return (\n <Breadcrumbs\n {...(embedded ? {backgroundColor: themeUtil.color('paper')({theme})} : {})}\n onClick={handleBreadcrumbsClick}\n pathPrefix={pathPrefix}\n breadcrumbsInfo={breadcrumbsInfo}\n />\n )\n}\n\nDocsBrowserBreadcrumbs.propTypes = {\n embedded: PropTypes.bool,\n resetSearchMode: PropTypes.func,\n pathPrefix: PropTypes.string,\n breadcrumbsInfo: PropTypes.array,\n theme: PropTypes.object\n}\n\nexport default withTheme(DocsBrowserBreadcrumbs)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {withTheme} from 'styled-components'\nimport {Breadcrumbs, theme as themeUtil} from 'tocco-ui'\n\nconst BreadcrumbLink = props => {\n return <span {...props}></span>\n}\n\nconst DocsBrowserBreadcrumbs = ({embedded, navigate, resetSearchMode, theme, pathPrefix, breadcrumbsInfo}) => {\n const handleBreadcrumbsClick = breadcrumbsItem => {\n if (breadcrumbsItem.path === '') {\n resetSearchMode()\n }\n navigate(`/docs/${breadcrumbsItem.path}`)\n }\n\n return (\n <Breadcrumbs\n {...(embedded ? {backgroundColor: themeUtil.color('paper')({theme})} : {})}\n onClick={handleBreadcrumbsClick}\n linkComp={BreadcrumbLink}\n pathPrefix={pathPrefix}\n breadcrumbsInfo={breadcrumbsInfo}\n />\n )\n}\n\nDocsBrowserBreadcrumbs.propTypes = {\n embedded: PropTypes.bool,\n resetSearchMode: PropTypes.func,\n navigate: PropTypes.func,\n pathPrefix: PropTypes.string,\n breadcrumbsInfo: PropTypes.array,\n theme: PropTypes.object\n}\n\nexport default withTheme(DocsBrowserBreadcrumbs)\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {withRouterTypeCompProvider} from '../../../utils/withRouterTypeCompProvider'\nimport Breadcrumbs from './Breadcrumbs'\nimport RouterlessBreadcrumbsComp from './RouterlessBreadcrumbs'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = state => ({\n pathPrefix: '/docs',\n breadcrumbsInfo: state.docs.path.breadcrumbs,\n embedded: state.input.embedded\n})\n\nconst RouterBreadcumbs = connect(mapStateToProps, mapActionCreators)(injectIntl(Breadcrumbs))\nconst RouterlessBreadcrumbs = connect(mapStateToProps, mapActionCreators)(injectIntl(RouterlessBreadcrumbsComp))\n\nexport default withRouterTypeCompProvider({routerless: RouterlessBreadcrumbs, router: RouterBreadcumbs})\n","export const CHANGE_LIST_PARENT = 'docs/list/CHANGE_LIST_PARENT'\nexport const CHANGE_SELECTION = 'docs/list/CHANGE_SELECTION'\nexport const CHANGE_SEARCH_FORM_COLLAPSED = 'docs/list/CHANGE_SEARCH_FORM_COLLAPSED'\nexport const SET_SEARCH_FORM_COLLAPSED = 'docs/list/SET_SEARCH_FORM_COLLAPSED'\nexport const SET_SCROLL_BEHAVIOUR = 'docs/list/SET_SCROLL_BEHAVIOUR'\n\nexport const changeListParent = parent => ({\n type: CHANGE_LIST_PARENT,\n payload: {\n parent\n }\n})\n\nexport const changeSelection = selection => ({\n type: CHANGE_SELECTION,\n payload: {\n selection\n }\n})\n\nexport const changeSearchFormCollapsed = collapsed => ({\n type: CHANGE_SEARCH_FORM_COLLAPSED,\n payload: {\n collapsed\n }\n})\n\nexport const setSearchFormCollapsed = searchFormCollapsed => ({\n type: SET_SEARCH_FORM_COLLAPSED,\n payload: {\n searchFormCollapsed\n }\n})\n\nexport const setScrollBehaviour = scrollBehaviour => ({\n type: SET_SCROLL_BEHAVIOUR,\n payload: {\n scrollBehaviour\n }\n})\n","import PropTypes from 'prop-types'\nimport React, {lazy, Suspense} from 'react'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\nimport {LoadMask} from 'tocco-ui'\nimport {consoleLogger} from 'tocco-util'\n\nconst actions = {\n 'dms-create-folder': lazy(() => import(/* webpackChunkName: \"docs-actions\" */ './actions/CreateFolder')),\n 'dms-create-domain': lazy(() => import(/* webpackChunkName: \"docs-actions\" */ './actions/CreateDomain')),\n 'dms-edit': lazy(() => import(/* webpackChunkName: \"docs-actions\" */ './actions/Edit')),\n 'dms-move': lazy(() => import(/* webpackChunkName: \"docs-actions\" */ './actions/MoveContainer')),\n delete: lazy(() => import(/* webpackChunkName: \"docs-actions\" */ './actions/Delete'))\n}\n\nconst renderLoader = () => <LoadMask />\n\nconst LazyAction = props => {\n const {appId} = props\n const LazyAction = actions[appId]\n\n if (!LazyAction) {\n consoleLogger.logError(`no action found with id: ${appId}`)\n return null\n }\n\n const ActionComponent = connect(null, {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n })(LazyAction)\n\n return (\n <Suspense fallback={renderLoader()}>\n <ActionComponent {...props} />\n </Suspense>\n )\n}\n\nLazyAction.propTypes = {\n appId: PropTypes.string.isRequired\n}\n\nexport default LazyAction\n","import PropTypes from 'prop-types'\nimport React, {useRef, useEffect} from 'react'\nimport {react} from 'tocco-util'\n\nconst FileInput = ({instanceCount, directory, onChange, path}) => {\n const fileInput = useRef()\n\n const prevInstanceCount = react.usePrevious(instanceCount)\n\n useEffect(() => {\n if (fileInput.current && instanceCount > prevInstanceCount) {\n fileInput.current.click()\n }\n })\n\n const handleChange = e => {\n const files = e.target.files\n if (files && files.length > 0 && onChange) {\n onChange(path, files, directory)\n }\n e.target.value = null\n }\n\n return (\n <input\n type=\"file\"\n ref={fileInput}\n style={{display: 'none'}}\n onChange={handleChange}\n multiple\n {...(directory ? {webkitdirectory: 'true', directory: 'true'} : {})}\n />\n )\n}\n\nFileInput.propTypes = {\n instanceCount: PropTypes.number.isRequired,\n directory: PropTypes.bool,\n onChange: PropTypes.func,\n path: PropTypes.string\n}\n\nexport default FileInput\n","import {connect} from 'react-redux'\n\nimport {filesSelected} from '../../modules/create/actions'\nimport {withRouterTypeCompProvider} from '../../utils/withRouterTypeCompProvider'\nimport FileInput from './FileInput'\n\nconst mapActionCreators = {\n onChange: filesSelected\n}\n\nconst mapStateToProps = state => ({\n instanceCount: state.docs.create.dialog.instanceCount,\n directory: state.docs.create.dialog.directory\n})\n\nexport default withRouterTypeCompProvider(connect(mapStateToProps, mapActionCreators)(FileInput))\n","export const OPEN_DIALOG = 'docs/create/OPEN_DIALOG'\nexport const FILES_SELECTED = 'docs/create/FILES_SELECTED'\n\nexport const openDialog = (directory, onSuccess, onError) => ({\n type: OPEN_DIALOG,\n payload: {\n directory,\n onSuccess,\n onError\n }\n})\n\nexport const filesSelected = (location, files, isDirectory) => ({\n type: FILES_SELECTED,\n payload: {\n location,\n files,\n isDirectory\n }\n})\n","import styled from 'styled-components'\nimport {scale} from 'tocco-ui'\n\nexport const StyledContentWrapper = styled.div`\n display: flex;\n align-items: center;\n`\n\nexport const StyledIconWrapper = styled.span`\n font-size: ${scale.font(1)};\n display: inline-block;\n margin-right: ${scale.space(-2)};\n`\n","import PropTypes from 'prop-types'\nimport React, {Suspense, useEffect, useMemo, useReducer, useRef, useState} from 'react'\nimport {searchFormTypePropTypes, selectionStylePropType} from 'tocco-entity-list/src/main'\nimport {Icon, LoadMask, scrollBehaviourPropType} from 'tocco-ui'\nimport {viewPersistor} from 'tocco-util'\n\nimport isRootLocation from '../../utils/isRootLocation'\nimport Action from '../Action'\nimport FileInput from '../FileInput'\nimport {StyledContentWrapper, StyledIconWrapper} from './StyledComponents'\n\nexport const getParent = params => {\n if (params && params.model) {\n const model = params.model.charAt(0).toUpperCase() + params.model.slice(1)\n const key = params.key\n const fullKey = `${model}/${key}`\n return {\n model: 'Docs_list_item',\n key: fullKey // e.g. \"Domain/118\"\n }\n }\n return null\n}\n\nexport const getTql = domainTypes =>\n Array.isArray(domainTypes) && domainTypes.length > 0\n ? `exists(relDomain_type where IN(unique_id, ${domainTypes.map(type => `\"${type}\"`).join(',')}))`\n : null\n\nexport const getFormName = (parent, keys) =>\n parent ? 'Docs_list_item' : keys ? 'Root_docs_list_item_specific' : 'Root_docs_list_item'\n\nexport const getDefaultLocation = (model, key) => {\n switch (model) {\n case 'Domain':\n return `/docs/domain/${key}/list`\n case 'Folder':\n return `/docs/folder/${key}/list`\n case 'Resource':\n return `/docs/doc/${key}/detail`\n default:\n throw new Error(`Unexpected model: ${model}`)\n }\n}\n\nconst LazyListApp = React.lazy(() => import('./LazyListApp'))\n\nconst DocsView = props => {\n const {\n domainTypes,\n rootNodes,\n navigationStrategy,\n changeListParent,\n onSearchChange,\n emitAction,\n openFileDialog,\n limit,\n searchFormType,\n selectionStyle,\n getCustomLocation,\n disableViewPersistor,\n getListFormName,\n domainDetailFormName,\n folderDetailFormName,\n showActions,\n scrollBehaviour,\n sortable,\n searchMode,\n openResource,\n searchFormCollapsed,\n locale,\n changeSelection,\n changeSearchFormCollapsed,\n params,\n navigate,\n path\n } = props\n // eslint-disable-next-line no-unused-vars\n const [entityListNumber, forceEntityListUpdate] = useReducer(x => x + 1, 0)\n\n const entityListKey = `entity-list-${entityListNumber}`\n\n const [selection, setSelection] = useState([])\n const parent = useMemo(() => getParent(params), [params])\n\n const keys = !parent && rootNodes ? rootNodes.map(node => `${node.entityName}/${node.key}`) : null\n const formName = useMemo(\n () => (getListFormName ? getListFormName(parent, keys) : getFormName(parent, keys)),\n [parent, keys, getListFormName]\n )\n\n const mounted = useRef(false)\n const searchModeRef = useRef(searchMode)\n\n searchModeRef.current = searchMode\n\n useEffect(() => {\n mounted.current = true\n return () => (mounted.current = false)\n })\n\n useEffect(() => {\n changeListParent(parent)\n setSelection([])\n }, [parent, changeListParent])\n\n const onSelectChange = selection => {\n setSelection(selection)\n changeSelection(selection)\n }\n\n const handleRowClick = ({id}) => {\n onSelectChange([id])\n\n if (searchModeRef.current && isRootLocation(path)) {\n if (!viewPersistor.viewInfoSelector('search').store) {\n // persist search store to allow a \"go back to search\"\n const searchStore = viewPersistor.viewInfoSelector(entityListKey).store\n viewPersistor.persistViewInfo('search', {store: searchStore})\n }\n forceEntityListUpdate()\n }\n\n const [model, key] = id.split('/')\n const location = getCustomLocation ? getCustomLocation(model, key) : getDefaultLocation(model, key)\n\n if (location) {\n if (openResource && model === 'Resource') {\n openResource(location)\n } else {\n navigate(location)\n }\n }\n }\n\n const tql = !parent && !keys ? getTql(domainTypes) : null\n\n const handleUploadDocument = function* (definition, selection, parent, params, config, onSuccess, onError) {\n const directory = false\n openFileDialog(directory, onSuccess, onError)\n }\n\n const handleUploadDirectory = function* (definition, selection, parent, params, config, onSuccess, onError) {\n const directory = true\n openFileDialog(directory, onSuccess, onError)\n }\n\n const handleSearch = e => {\n if (mounted.current) {\n onSearchChange(e)\n }\n }\n\n const store = disableViewPersistor\n ? undefined\n : isRootLocation(path)\n ? viewPersistor.viewInfoSelector('search').store\n : null\n\n const handleStoreCreation = store => {\n if (!disableViewPersistor) {\n viewPersistor.persistViewInfo(entityListKey, {store})\n }\n return null\n }\n\n return (\n <>\n <Suspense fallback={<LoadMask />}>\n <LazyListApp\n key={entityListKey}\n id=\"documents\"\n entityName=\"Docs_list_item\"\n formName={formName}\n limit={limit || 25}\n onRowClick={handleRowClick}\n searchFormPosition=\"left\"\n searchFormType={searchFormType || 'admin'}\n parent={parent}\n onSearchChange={handleSearch}\n store={store}\n onStoreCreate={handleStoreCreation(store)}\n cellRenderers={{\n 'dms-label-with-icon': (rowData, column, cellRenderer) => (\n <StyledContentWrapper>\n <StyledIconWrapper>\n <Icon icon={rowData.icon} />\n </StyledIconWrapper>\n <span>{cellRenderer(column.children[0])}</span>\n </StyledContentWrapper>\n ),\n 'dms-actions': (rowData, column, cellRenderer) => (\n <StyledContentWrapper>\n {column.children\n .filter(c => !c.dmsEntityModel || c.dmsEntityModel === rowData.type)\n .map(c => cellRenderer(c))}\n </StyledContentWrapper>\n )\n }}\n emitAction={emitAction}\n actionAppComponent={Action}\n contextParams={{\n detailFormNames: {\n Domain: domainDetailFormName,\n Folder: folderDetailFormName\n }\n }}\n customActions={{\n 'upload-document': handleUploadDocument,\n 'upload-directory': handleUploadDirectory\n }}\n navigationStrategy={navigationStrategy}\n tql={tql}\n keys={keys}\n selectionStyle={selectionStyle || 'multi_explicit'}\n onSelectChange={onSelectChange}\n selection={selection}\n showActions={showActions}\n sortable={sortable}\n searchFormCollapsed={searchFormCollapsed}\n scrollBehaviour={scrollBehaviour}\n onSearchFormCollapsedChange={changeSearchFormCollapsed}\n locale={locale}\n />\n </Suspense>\n <FileInput />\n </>\n )\n}\n\nDocsView.propTypes = {\n navigationStrategy: PropTypes.object,\n domainTypes: PropTypes.arrayOf(PropTypes.string),\n rootNodes: PropTypes.arrayOf(\n PropTypes.shape({\n entityName: PropTypes.string,\n key: PropTypes.string\n })\n ),\n path: PropTypes.string.isRequired,\n params: PropTypes.object.isRequired,\n navigate: PropTypes.func.isRequired,\n changeListParent: PropTypes.func.isRequired,\n onSearchChange: PropTypes.func.isRequired,\n emitAction: PropTypes.func.isRequired,\n openFileDialog: PropTypes.func.isRequired,\n limit: PropTypes.number,\n searchFormType: searchFormTypePropTypes,\n selectionStyle: selectionStylePropType,\n getCustomLocation: PropTypes.func,\n disableViewPersistor: PropTypes.bool,\n getListFormName: PropTypes.func,\n domainDetailFormName: PropTypes.string,\n folderDetailFormName: PropTypes.string,\n showActions: PropTypes.bool,\n sortable: PropTypes.bool,\n searchMode: PropTypes.bool,\n openResource: PropTypes.func,\n searchFormCollapsed: PropTypes.bool,\n scrollBehaviour: scrollBehaviourPropType,\n locale: PropTypes.string,\n changeSelection: PropTypes.func.isRequired,\n changeSearchFormCollapsed: PropTypes.func.isRequired\n}\n\nexport default DocsView\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\n\nimport {changeListParent, changeSearchFormCollapsed, changeSelection} from '../../modules/list/actions'\nimport {withRouterTypeCompProvider} from '../../utils/withRouterTypeCompProvider'\nimport DocsView from './DocsView'\n\nconst mapStateToProps = state => ({\n domainTypes: state.input.domainTypes,\n rootNodes: state.input.rootNodes,\n limit: state.input.listLimit,\n searchFormType: state.input.searchFormType,\n selectionStyle: state.input.selectionStyle,\n getCustomLocation: state.input.getCustomLocation,\n disableViewPersistor: state.input.disableViewPersistor,\n getListFormName: state.input.getListFormName,\n domainDetailFormName: state.input.domainDetailFormName,\n folderDetailFormName: state.input.folderDetailFormName,\n showActions: state.input.showActions,\n sortable: state.input.sortable,\n openResource: state.input.openResource,\n searchFormCollapsed: state.docs.list.searchFormCollapsed,\n scrollBehaviour: state.docs.list.scrollBehaviour,\n locale: state.intl.locale\n})\n\nconst mapActionCreators = {\n changeListParent,\n changeSelection,\n changeSearchFormCollapsed\n}\n\nexport default withRouterTypeCompProvider(connect(mapStateToProps, mapActionCreators)(injectIntl(DocsView)))\n","import styled from 'styled-components'\nimport {theme, scale} from 'tocco-ui'\n\nexport const StyledDocumentViewWrapper = styled.div`\n height: 100%;\n background-color: ${theme.color('paper')};\n padding-left: ${scale.space(0.5)};\n overflow-y: hidden;\n`\n","import PropTypes from 'prop-types'\nimport React, {Suspense} from 'react'\nimport {LoadMask} from 'tocco-ui'\n\nimport Action from '../Action/'\nimport {StyledDocumentViewWrapper} from './StyledComponents'\n\nconst LazyDetailApp = React.lazy(() => import('./LazyDetailApp'))\n\nconst DocumentView = ({breadcrumbs, formName, navigationStrategy, locale, emitAction, navigate, params}) => {\n const handleEntityDeleted = () => {\n const lastList = breadcrumbs\n .slice()\n .reverse()\n .find(breadcrumb => breadcrumb.type === 'list')\n const lastListUrl = `/docs/${lastList.path}`\n navigate(lastListUrl)\n }\n\n return (\n <StyledDocumentViewWrapper>\n <Suspense fallback={<LoadMask />}>\n <LazyDetailApp\n entityName=\"Resource\"\n entityId={params.key}\n formName={formName || 'DmsResource'}\n mode=\"update\"\n actionAppComponent={Action}\n navigationStrategy={navigationStrategy}\n emitAction={emitAction}\n onEntityDeleted={handleEntityDeleted}\n locale={locale}\n />\n </Suspense>\n </StyledDocumentViewWrapper>\n )\n}\n\nDocumentView.propTypes = {\n breadcrumbs: PropTypes.arrayOf(\n PropTypes.shape({\n path: PropTypes.string.isRequired,\n type: PropTypes.string.isRequired\n })\n ).isRequired,\n formName: PropTypes.string,\n navigationStrategy: PropTypes.object,\n locale: PropTypes.string,\n emitAction: PropTypes.func.isRequired,\n navigate: PropTypes.func,\n params: PropTypes.object\n}\n\nexport default DocumentView\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport {withRouterTypeCompProvider} from '../../utils/withRouterTypeCompProvider'\nimport DocumentView from './DocumentView'\n\nconst mapStateToProps = state => ({\n breadcrumbs: state.docs.path.breadcrumbs,\n formName: state.input.documentDetailFormName,\n locale: state.intl.locale\n})\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nexport default withRouterTypeCompProvider(connect(mapStateToProps, mapActionCreators)(injectIntl(DocumentView)))\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport DocsView from '../../DocsView'\nimport DocumentView from '../../DocumentView'\n\nconst RouterlessContent = ({\n params,\n navigationStrategy,\n handleSearchChange,\n emitAction,\n openFileDialog,\n searchMode,\n docsKey\n}) => {\n const {model, view} = params\n\n if (model === 'doc' && view === 'detail') {\n return <DocumentView navigationStrategy={navigationStrategy} />\n }\n\n return (\n <DocsView\n key={docsKey}\n navigationStrategy={navigationStrategy}\n onSearchChange={handleSearchChange}\n emitAction={emitAction}\n openFileDialog={openFileDialog}\n searchMode={searchMode}\n />\n )\n}\n\nRouterlessContent.propTypes = {\n params: PropTypes.object,\n emitAction: PropTypes.func.isRequired,\n handleSearchChange: PropTypes.func.isRequired,\n openFileDialog: PropTypes.func.isRequired,\n searchMode: PropTypes.bool.isRequired,\n navigationStrategy: PropTypes.object,\n docsKey: PropTypes.string\n}\n\nexport default RouterlessContent\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Route, Switch} from 'react-router-dom'\n\nimport DocsView from '../../DocsView'\nimport DocumentView from '../../DocumentView'\n\nconst RoutesContent = ({navigationStrategy, handleSearchChange, emitAction, openFileDialog, searchMode, docsKey}) => (\n <Switch>\n <Route\n exact\n path={'/docs/doc/:key/detail'}\n render={() => <DocumentView navigationStrategy={navigationStrategy} />}\n />\n <Route\n exact\n path={['/docs/:model/:key/list', '/docs']}\n render={() => (\n <DocsView\n key={docsKey}\n navigationStrategy={navigationStrategy}\n onSearchChange={handleSearchChange}\n emitAction={emitAction}\n openFileDialog={openFileDialog}\n searchMode={searchMode}\n />\n )}\n />\n </Switch>\n)\n\nRoutesContent.propTypes = {\n params: PropTypes.object,\n emitAction: PropTypes.func.isRequired,\n handleSearchChange: PropTypes.func.isRequired,\n openFileDialog: PropTypes.func.isRequired,\n searchMode: PropTypes.bool.isRequired,\n navigationStrategy: PropTypes.object,\n docsKey: PropTypes.string\n}\n\nexport default RoutesContent\n","import {withRouterTypeCompProvider} from '../../../utils/withRouterTypeCompProvider'\nimport RouterlessContent from './RouterlessContent'\nimport RoutesContent from './RoutesContent'\n\nexport default withRouterTypeCompProvider({routerless: RouterlessContent, router: RoutesContent})\n","import styled from 'styled-components'\nimport {StyledScrollbar} from 'tocco-ui'\n\nexport const StyledWrapper = styled.div`\n display: grid;\n grid-template-rows: auto 1fr;\n grid-template-areas:\n 'breadcrumbs'\n 'content';\n ${({scrollBehaviour}) => scrollBehaviour === 'inline' && 'height: 100%;'}\n width: 100%;\n`\n\nexport const StyledContent = styled.div`\n grid-area: content;\n ${({scrollBehaviour}) => scrollBehaviour === 'inline' && 'overflow-x: hidden;'}\n ${StyledScrollbar}\n`\n\nexport const StyledBreadcrumbs = styled.div`\n grid-area: breadcrumbs;\n ${({noLeftPadding}) =>\n noLeftPadding &&\n `\n > div {\n padding-left: 0;\n }\n `}\n`\n","import PropTypes from 'prop-types'\nimport React, {useEffect, useReducer, useRef} from 'react'\nimport {scrollBehaviourPropType} from 'tocco-ui'\nimport {viewPersistor} from 'tocco-util'\n\nimport isRootLocation from '../../utils/isRootLocation'\nimport Breadcrumbs from './Breadcrumbs'\nimport Content from './Content'\nimport {StyledWrapper, StyledBreadcrumbs, StyledContent} from './StyledComponents'\n\nconst DocsBrowser = ({\n navigate,\n path,\n searchMode,\n navigationStrategy,\n setSearchMode,\n loadBreadcrumbs,\n emitAction,\n openFileDialog,\n noLeftPadding,\n scrollBehaviour\n}) => {\n // eslint-disable-next-line no-unused-vars\n const [docsViewNumber, forceDocsViewUpdate] = useReducer(x => x + 1, 0)\n\n const searchModeRef = useRef(searchMode)\n searchModeRef.current = searchMode\n\n useEffect(() => {\n loadBreadcrumbs(path)\n })\n\n const resetSearchMode = () => {\n if (searchModeRef.current) {\n viewPersistor.clearPersistedViews()\n setSearchMode(false)\n loadBreadcrumbs(path)\n forceDocsViewUpdate()\n }\n }\n\n const handleSearchChange = e => {\n const hasUserChanges = e.query && e.query.hasUserChanges\n if (hasUserChanges) {\n setSearchMode(true)\n navigate('/docs/')\n loadBreadcrumbs(path)\n } else if (isRootLocation(path)) {\n resetSearchMode()\n }\n }\n\n const key = `docs-view-${docsViewNumber}`\n\n return (\n <StyledWrapper scrollBehaviour={scrollBehaviour}>\n <StyledBreadcrumbs noLeftPadding={noLeftPadding}>\n <Breadcrumbs resetSearchMode={resetSearchMode} />\n </StyledBreadcrumbs>\n <StyledContent scrollBehaviour={scrollBehaviour}>\n <Content\n navigationStrategy={navigationStrategy}\n handleSearchChange={handleSearchChange}\n emitAction={emitAction}\n openFileDialog={openFileDialog}\n searchMode={searchMode}\n docsKey={key}\n />\n </StyledContent>\n </StyledWrapper>\n )\n}\n\nDocsBrowser.propTypes = {\n loadBreadcrumbs: PropTypes.func.isRequired,\n setSearchMode: PropTypes.func.isRequired,\n emitAction: PropTypes.func.isRequired,\n openFileDialog: PropTypes.func.isRequired,\n navigate: PropTypes.func.isRequired,\n path: PropTypes.string.isRequired,\n searchMode: PropTypes.bool.isRequired,\n navigationStrategy: PropTypes.object,\n noLeftPadding: PropTypes.bool,\n scrollBehaviour: scrollBehaviourPropType\n}\n\nexport default DocsBrowser\n","import {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport {actionEmitter} from 'tocco-app-extensions'\n\nimport {openDialog} from '../../modules/create/actions'\nimport {loadBreadcrumbs, setSearchMode} from '../../modules/path/actions'\nimport {withRouterTypeCompProvider} from '../../utils/withRouterTypeCompProvider'\nimport DocsBrowser from './DocsBrowser'\n\nconst mapStateToProps = state => ({\n searchMode: state.docs.path.searchMode,\n navigationStrategy: state.input.navigationStrategy,\n noLeftPadding: state.input.noLeftPadding,\n scrollBehaviour: state.docs.list.scrollBehaviour\n})\n\nconst mapActionCreators = {\n loadBreadcrumbs,\n setSearchMode,\n emitAction: action => actionEmitter.dispatchEmittedAction(action),\n openFileDialog: openDialog\n}\n\nexport default withRouterTypeCompProvider(connect(mapStateToProps, mapActionCreators)(injectIntl(DocsBrowser)))\n","import PropTypes from 'prop-types'\nimport React, {useEffect} from 'react'\nimport {notification} from 'tocco-app-extensions'\nimport {GlobalStyles} from 'tocco-ui'\n\nimport {withInternalRouter} from '../../utils/withRouter'\nimport DocsBrowser from '../DocsBrowser'\n\nconst RouterlessApp = ({handleNotifications, rootPath, navigate, path}) => {\n useEffect(() => {\n const isRoot = !path || path === '/' || path === '/docs'\n if (isRoot && rootPath !== path) {\n navigate(rootPath)\n }\n }, [rootPath, path, navigate])\n\n return (\n <>\n {handleNotifications && <notification.Notifications />}\n <GlobalStyles />\n <DocsBrowser />\n </>\n )\n}\n\nRouterlessApp.propTypes = {\n handleNotifications: PropTypes.bool,\n rootPath: PropTypes.string,\n navigate: PropTypes.func.isRequired,\n path: PropTypes.string\n}\n\nexport default withInternalRouter(RouterlessApp)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Redirect, Route} from 'react-router-dom'\nimport {notification} from 'tocco-app-extensions'\nimport {GlobalStyles} from 'tocco-ui'\n\nimport DocsBrowser from '../DocsBrowser'\n\nconst InheritedApp = ({rootPath, handleNotifications}) => (\n <>\n {handleNotifications && <notification.Notifications />}\n <GlobalStyles />\n <DocsBrowser />\n <Route exact path=\"/\">\n <Redirect to={rootPath} />\n </Route>\n {rootPath !== '/docs' && (\n <Route exact path=\"/docs\">\n <Redirect to={rootPath} />\n </Route>\n )}\n </>\n)\n\nInheritedApp.propTypes = {\n handleNotifications: PropTypes.bool,\n rootPath: PropTypes.string\n}\n\nexport default InheritedApp\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Redirect, Route, Router as ReactRouter} from 'react-router'\nimport {notification} from 'tocco-app-extensions'\nimport {GlobalStyles} from 'tocco-ui'\n\nimport DocsBrowser from '../DocsBrowser'\n\nconst StandaloneApp = ({rootPath, handleNotifications, history}) => (\n <ReactRouter history={history}>\n {handleNotifications && <notification.Notifications />}\n <GlobalStyles />\n\n <DocsBrowser />\n <Route exact path=\"/\">\n <Redirect to={rootPath} />\n </Route>\n {rootPath !== '/docs' && (\n <Route exact path=\"/docs\">\n <Redirect to={rootPath} />\n </Route>\n )}\n </ReactRouter>\n)\n\nStandaloneApp.propTypes = {\n history: PropTypes.object,\n handleNotifications: PropTypes.bool,\n rootPath: PropTypes.string\n}\n\nexport default StandaloneApp\n","import {setScrollBehaviour, setSearchFormCollapsed} from './modules/list/actions'\n\nconst isDefined = value => value !== undefined\n\nexport const getDispatchActions = input =>\n actionSettings.reduce((acc, actionSetting) => {\n if (isDefined(input[actionSetting.name])) {\n acc.push(actionSetting.action(...actionSetting.argsFactory(input)))\n }\n return acc\n }, [])\n\nconst actionSettings = [\n {\n name: 'searchFormCollapsed',\n action: setSearchFormCollapsed,\n argsFactory: input => [input.searchFormCollapsed]\n },\n {\n name: 'scrollBehaviour',\n action: setScrollBehaviour,\n argsFactory: input => [input.scrollBehaviour]\n }\n]\n","import * as actions from './actions'\n\nconst openDialog = (state, {payload: {directory, onSuccess, onError}}) => ({\n ...state,\n dialog: {\n instanceCount: state.dialog.instanceCount + 1,\n directory,\n onSuccess,\n onError\n }\n})\n\nconst ACTION_HANDLERS = {\n [actions.OPEN_DIALOG]: openDialog\n}\n\nconst initialState = {\n dialog: {\n instanceCount: 0,\n directory: false,\n onSuccess: null,\n onError: null\n }\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 {all, takeEvery, call, put, select} from 'redux-saga/effects'\nimport {rest, notification} from 'tocco-app-extensions'\nimport {consoleLogger} from 'tocco-util'\nimport {v4 as uuid} from 'uuid'\n\nimport getNode from '../../utils/getNode'\nimport * as actions from './actions'\n\nexport const dialogSelector = state => state.docs.create.dialog\nexport const textResourceSelector = (state, key) => state.intl.messages[key]\n\nconst CREATED_STATUS = 201\n\nexport function* handleFilesSelected({payload: {location, files, isDirectory}}) {\n const blockingInfoId = yield call(uuid)\n yield put(\n notification.blockingInfo(\n blockingInfoId,\n isDirectory\n ? 'client.docs-browser.uploadInProgressDirectory'\n : files.length > 1\n ? 'client.docs-browser.uploadInProgressMultiple'\n : 'client.docs-browser.uploadInProgress',\n null\n )\n )\n\n const {onSuccess, onError} = yield select(dialogSelector)\n\n try {\n const response = yield call(createDocuments, location, files)\n\n if (response.status === 403) {\n yield put(notification.removeBlockingInfo(blockingInfoId))\n onError({\n title: yield select(textResourceSelector, 'client.entity-detail.saveAbortedTitle'),\n message: yield select(textResourceSelector, 'client.docs-browser.failedNoPermission')\n })\n } else {\n const remoteEvents = [\n {\n type: 'entity-create-event',\n payload: {\n entities: response.body.items\n .filter(item => item.status === CREATED_STATUS)\n .map(item => ({\n entityName: item.bean.model,\n key: item.bean.key\n }))\n }\n }\n ]\n\n yield put(notification.removeBlockingInfo(blockingInfoId))\n\n const msgId = isDirectory\n ? 'client.docs-browser.uploadSuccessfulDirectory'\n : 'client.docs-browser.uploadSuccessful'\n onSuccess({\n title: yield select(textResourceSelector, msgId),\n remoteEvents\n })\n }\n } catch (e) {\n consoleLogger.logError('Failed to upload files', e)\n yield put(notification.removeBlockingInfo(blockingInfoId))\n onError({\n title: yield select(textResourceSelector, 'client.docs-browser.uploadFailed')\n })\n }\n}\n\nexport function* createDocuments(location, files) {\n const node = getNode(location)\n\n if (!node) {\n return\n }\n\n const formData = new FormData()\n for (const file of files) {\n formData.append('files', file)\n }\n\n const resource = `documents/${node.model}/${node.key}`\n const options = {\n method: 'POST',\n body: formData,\n acceptedStatusCodes: [403]\n }\n\n return yield call(rest.requestSaga, resource, options)\n}\n\nexport default function* mainSagas() {\n yield all([takeEvery(actions.FILES_SELECTED, handleFilesSelected)])\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport reducer from './reducer'\nimport moduleSagas from './sagas'\n\nexport function* sagas() {\n yield all([fork(moduleSagas)])\n}\n\nexport default reducer\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_SEARCH_FORM_COLLAPSED]: reducerUtil.singleTransferReducer('searchFormCollapsed'),\n [actions.SET_SCROLL_BEHAVIOUR]: reducerUtil.singleTransferReducer('scrollBehaviour')\n}\n\nconst initialState = {\n searchFormCollapsed: null,\n scrollBehaviour: 'inline'\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\n\nexport default reducer\n","import {all, put, takeLatest} from 'redux-saga/effects'\nimport {externalEvents} from 'tocco-app-extensions'\n\nimport * as actions from './actions'\n\nexport function* changeListParent({payload}) {\n yield put(externalEvents.fireExternalEvent('onListParentChange', payload.parent))\n}\n\nexport function* changeSelection({payload}) {\n yield put(externalEvents.fireExternalEvent('onSelectChange', payload.selection))\n}\n\nexport function* changeSearchFormCollapsed({payload}) {\n yield put(externalEvents.fireExternalEvent('onSearchFormCollapsedChange', payload.collapsed))\n}\n\nexport default function* mainSagas() {\n yield all([\n takeLatest(actions.CHANGE_LIST_PARENT, changeListParent),\n takeLatest(actions.CHANGE_SELECTION, changeSelection),\n takeLatest(actions.CHANGE_SEARCH_FORM_COLLAPSED, changeSearchFormCollapsed)\n ])\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst initialize = (state, {payload: {selection, onSuccess, onError}}) => ({\n ...state,\n input: {\n selection,\n onSuccess,\n onError\n }\n})\n\nconst close = () => ({\n ...initialState\n})\n\nconst ACTION_HANDLERS = {\n [actions.INITIALIZE]: initialize,\n [actions.SET_WAITING]: reducerUtil.singleTransferReducer('isWaiting'),\n [actions.CLOSE]: close\n}\n\nconst initialState = {\n isWaiting: false,\n input: {\n selection: null,\n onSuccess: null,\n onError: null\n }\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {notification, rest} from 'tocco-app-extensions'\nimport {validation} from 'tocco-util'\n\nimport * as actions from './actions'\n\nexport const inputSelector = state => state.docs.move.input\nexport const textResourceSelector = (state, key) => state.intl.messages[key]\n\nexport function* moveElements({payload}) {\n const resource = 'documents/move'\n const options = {\n method: 'POST',\n acceptedStatusCodes: [400, 403],\n body: {\n targetEntityKey: payload.target,\n selectedEntityKeys: payload.selected\n }\n }\n\n yield put(actions.setWaiting(true))\n const response = yield call(rest.requestSaga, resource, options)\n\n if (response.status === 204) {\n yield call(setDone)\n } else {\n yield put(actions.setWaiting(false))\n let message = 'client.actions.dms-move.failed.message'\n if (response.body?.errorCode === 'VALIDATION_FAILED') {\n message = validation.getErrorCompact(response.body.errors)\n }\n if (response.status === 403) {\n message = 'client.docs-browser.failedNoPermission'\n }\n yield put(notification.toaster({type: 'error', title: 'client.actions.dms-move.failed.title', body: message}))\n }\n}\n\nexport function* setDone() {\n const {selection, onSuccess} = yield select(inputSelector)\n\n const remoteEvents = [\n {\n type: 'entity-update-event',\n payload: {\n entities: selection.ids.map(id => ({\n entityName: 'Docs_list_item',\n key: id\n }))\n }\n }\n ]\n\n onSuccess({\n title: yield select(textResourceSelector, 'client.docs-browser.moveSuccessful'),\n remoteEvents\n })\n\n yield put(actions.close())\n}\n\nexport default function* mainSagas() {\n yield all([takeLatest(actions.MOVE_ELEMENTS, moveElements)])\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport reducer from './reducer'\nimport moduleSagas from './sagas'\n\nexport function* sagas() {\n yield all([fork(moduleSagas)])\n}\n\nexport default reducer\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_BREADCRUMBS]: reducerUtil.singleTransferReducer('breadcrumbs'),\n [actions.SET_SEARCH_MODE]: reducerUtil.singleTransferReducer('searchMode')\n}\n\nconst initialState = {\n breadcrumbs: [],\n searchMode: 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 {takeLatest, all, call, put, select} from 'redux-saga/effects'\nimport {rest} from 'tocco-app-extensions'\n\nimport getNode from '../../utils/getNode'\nimport * as actions from './actions'\n\nexport const textResourceSelector = (state, key) => state.intl.messages[key] || key\nexport const docsPathSelector = state => state.docs.path\nexport const rootNodesSelector = state => state.input.rootNodes\n\nexport function* getSearchBreadcrumbs() {\n return [\n {\n display: yield select(textResourceSelector, 'client.docs-browser.breadcrumbs.start'),\n path: '',\n type: 'list'\n },\n {\n display: yield select(textResourceSelector, 'client.docs-browser.breadcrumbs.searchResults'),\n path: '',\n type: 'list'\n }\n ]\n}\n\nexport function* loadBreadcrumbs({payload: {location}}) {\n const node = getNode(location)\n const pathState = yield select(docsPathSelector)\n\n let breadcrumbs\n\n if (pathState.searchMode && !node) {\n breadcrumbs = yield call(getSearchBreadcrumbs)\n } else {\n const url = node ? `documents/${node.model}/${node.key}/breadcrumbs` : 'documents/breadcrumbs'\n const options = {\n queryParams: {\n rootnodes: yield call(getRootNodesParam)\n }\n }\n const result = yield call(rest.requestSaga, url, options)\n breadcrumbs = result.body.breadcrumbs\n }\n\n yield put(actions.setBreadcrumbs(breadcrumbs))\n}\n\nfunction* getRootNodesParam() {\n const rootNodes = yield select(rootNodesSelector)\n return Array.isArray(rootNodes) && rootNodes.length > 0\n ? rootNodes.map(node => `${node.entityName}/${node.key}`).join(',')\n : null\n}\n\nexport default function* mainSagas() {\n yield all([takeLatest(actions.LOAD_BREADCRUMBS, loadBreadcrumbs)])\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport reducer from './reducer'\nimport moduleSagas from './sagas'\n\nexport function* sagas() {\n yield all([fork(moduleSagas)])\n}\n\nexport default reducer\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.NAVIGATE]: reducerUtil.singleTransferReducer('path'),\n [actions.SET_PARAMS]: reducerUtil.singleTransferReducer('params')\n}\n\nconst initialState = {\n path: '',\n params: {}\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import {takeLatest, all, put} from 'redux-saga/effects'\nimport {route} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst pathRegex = '/docs/:model/:key/:view(list|detail)'\n\nexport function* setParams({payload: {path}}) {\n const params = route.extractParamsFromPath(pathRegex, path) || {}\n\n yield put(actions.setParams(params))\n}\n\nexport default function* mainSagas() {\n yield all([takeLatest(actions.NAVIGATE, setParams)])\n}\n","import {fork, all} from 'redux-saga/effects'\n\nimport reducer from './reducer'\nimport moduleSagas from './sagas'\n\nexport function* sagas() {\n yield all([fork(moduleSagas)])\n}\n\nexport default reducer\n","import {combineReducers} from 'redux'\n\nimport create, {sagas as createSagas} from './create'\nimport list, {sagas as listSagas} from './list'\nimport move, {sagas as moveSagas} from './move'\nimport path, {sagas as pathSagas} from './path'\nimport routing, {sagas as routingSagas} from './routing'\n\nexport default {\n docs: combineReducers({path, create, list, move, routing})\n}\n\nexport const sagas = [pathSagas, createSagas, listSagas, moveSagas, routingSagas]\n","import createHashHistory from 'history/createHashHistory'\nimport _isEmpty from 'lodash/isEmpty'\nimport _isEqual from 'lodash/isEqual'\nimport _pickBy from 'lodash/pickBy'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport {actionEmitter, appFactory, cache, errorLogging, externalEvents, notification} from 'tocco-app-extensions'\nimport {searchFormTypePropTypes, selectionStylePropType} from 'tocco-entity-list/src/main'\nimport {scrollBehaviourPropType} from 'tocco-ui'\nimport {react, reducer as reducerUtil, env} from 'tocco-util'\n\nimport {InheritedApp, RouterlessApp, StandaloneApp} from './components/App'\nimport {getDispatchActions} from './input'\nimport chooseDocument from './modules/chooseDocument'\nimport reducers, {sagas} from './modules/reducers'\nimport {navigate} from './modules/routing/actions'\n\nconst packageName = 'docs-browser'\n\nconst EXTERNAL_EVENTS = ['onListParentChange', 'openResource', 'onSelectChange', 'onSearchFormCollapsedChange']\n\nconst textResourceSelector = (state, key) => state.intl.messages[key] || key\n\nconst createHistory = store => {\n return createHashHistory({\n getUserConfirmation: (message, confirmCallback) => {\n const state = store.getState()\n\n const okText = textResourceSelector(state, 'client.common.ok')\n const cancelText = textResourceSelector(state, 'client.common.cancel')\n\n const action = notification.confirm(\n '',\n message,\n okText,\n cancelText,\n () => confirmCallback(true),\n () => confirmCallback(false)\n )\n store.dispatch(action)\n }\n })\n}\n\nconst getContent = ({routerType, store, rootPath, handleNotifications}) => {\n if (routerType === 'routerless') {\n return <RouterlessApp rootPath={rootPath} handleNotifications={handleNotifications} />\n }\n\n if (routerType === 'inherit') {\n return <InheritedApp rootPath={rootPath} handleNotifications={handleNotifications} />\n }\n\n // only create new histroy object for standalone docs-browser (e.g. Widget)\n const history = createHistory(store)\n return <StandaloneApp history={history} rootPath={rootPath} handleNotifications={handleNotifications} />\n}\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n\n if (input.backendUrl) {\n env.setBackendUrl(input.backendUrl)\n }\n\n if (input.businessUnit) {\n env.setBusinessUnit(input.businessUnit)\n }\n\n externalEvents.addToStore(store, events)\n actionEmitter.addToStore(store)\n errorLogging.addToStore(store, true, ['console', 'remote', 'notification'])\n const handleNotifications = !events.emitAction\n notification.addToStore(store, handleNotifications)\n cache.addToStore(store)\n\n const singleRootNode =\n Array.isArray(input.rootNodes) && input.rootNodes.length === 1 && input.rootNodes[0].entityName !== 'Resource'\n ? input.rootNodes[0]\n : null\n\n const rootPath = singleRootNode\n ? `/docs/${singleRootNode.entityName.toLowerCase()}/${singleRootNode.key}/list`\n : '/docs'\n\n const content = getContent({\n routerType: input.routerType,\n store,\n rootPath,\n handleNotifications\n })\n\n return appFactory.createApp(packageName, content, store, {\n input,\n events,\n actions: [...getDispatchActions(input), navigate(input.initialLocation)],\n publicPath,\n textResourceModules: ['component', 'common', 'actions', 'entity-list', 'entity-detail', packageName]\n })\n}\n\n;(() => {\n if (__PACKAGE_NAME__ === packageName) {\n appFactory.registerAppInRegistry(packageName, initApp)\n\n if (__DEV__) {\n const input = require('./dev/input.json')\n\n if (!__NO_MOCK__) {\n const fetchMock = require('fetch-mock').default\n fetchMock.config.overwriteRoutes = false\n const setupFetchMocks = require('./dev/fetchMocks').default\n setupFetchMocks(packageName, fetchMock)\n fetchMock.spy()\n }\n\n const app = initApp(packageName, input)\n\n if (module.hot) {\n module.hot.accept('./modules/reducers', () => {\n const reducers = require('./modules/reducers').default\n reducerUtil.hotReloadReducers(app.store, reducers)\n })\n }\n\n appFactory.renderApp(app.component)\n }\n }\n})()\n\nconst DocsBrowserApp = props => {\n const {component, store} = appFactory.useApp({initApp, props, packageName, externalEvents: EXTERNAL_EVENTS})\n\n const prevProps = react.usePrevious(props)\n react.useDidUpdate(() => {\n const changedProps = _pickBy(props, (value, key) => !_isEqual(value, prevProps[key]))\n if (!_isEmpty(changedProps)) {\n getDispatchActions(changedProps).forEach(action => {\n store.dispatch(action)\n })\n }\n }, [props])\n\n return component\n}\n\nDocsBrowserApp.propTypes = {\n routerType: PropTypes.oneOf(['standalone', 'inherit', 'routerless']),\n navigationStrategy: PropTypes.object,\n domainTypes: PropTypes.arrayOf(PropTypes.string),\n rootNodes: PropTypes.arrayOf(\n PropTypes.shape({\n entityName: PropTypes.string,\n key: PropTypes.string\n })\n ),\n initialLocation: PropTypes.string,\n listLimit: PropTypes.number,\n documentDetailFormName: PropTypes.string,\n searchFormType: searchFormTypePropTypes,\n selectionStyle: selectionStylePropType,\n scrollBehaviour: scrollBehaviourPropType,\n getListFormName: PropTypes.func,\n disableViewPersistor: PropTypes.bool,\n getCustomLocation: PropTypes.func,\n businessUnit: PropTypes.string,\n searchFormCollapsed: PropTypes.bool,\n backendUrl: PropTypes.string,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {})\n}\n\nexport default DocsBrowserApp\nexport {chooseDocument}\n","export const INITIALIZE = 'docs/move/INITIALIZE'\nexport const INVALID_SELECTION = 'docs/move/INVALID_SELECTION'\nexport const MOVE_ELEMENTS = 'docs/move/MOVE_ELEMENTS'\nexport const SET_WAITING = 'docs/move/SET_WAITING'\nexport const SET_DONE = 'docs/move/SET_DONE'\nexport const CLOSE = 'docs/move/CLOSE'\n\nexport const initialize = (selection, onSuccess, onError) => ({\n type: INITIALIZE,\n payload: {\n selection,\n onSuccess,\n onError\n }\n})\n\nexport const invalidSelection = () => ({\n type: INVALID_SELECTION\n})\n\nexport const moveElements = (target, selected) => ({\n type: MOVE_ELEMENTS,\n payload: {\n target,\n selected\n }\n})\n\nexport const setWaiting = (isWaiting = true) => ({\n type: SET_WAITING,\n payload: {\n isWaiting\n }\n})\n\nexport const close = () => ({\n type: CLOSE\n})\n","export const NAVIGATE = 'docs/routing/NAVIGATE'\nexport const SET_PARAMS = 'docs/routing/SET_PARAMS'\n\nexport const navigate = path => ({\n type: NAVIGATE,\n payload: {\n path: path || \"\"\n }\n})\n\nexport const setParams = params => ({\n type: SET_PARAMS,\n payload: {\n params\n }\n})\n","const DOC_PATH_REGEX = /^\\/docs\\/doc\\/(\\d+)\\/detail$/\nconst PARENT_PATH_REGEX = /^\\/docs\\/(domain|folder)\\/(\\d+)\\/list$/\n\nconst getResourceNode = pathname => {\n const docMatches = DOC_PATH_REGEX.exec(pathname)\n return docMatches && docMatches.length >= 2\n ? {\n model: 'Resource',\n key: docMatches[1]\n }\n : null\n}\n\nconst getParentNode = pathname => {\n const parentMatches = PARENT_PATH_REGEX.exec(pathname)\n if (parentMatches && parentMatches.length >= 3) {\n const model = parentMatches[1].charAt(0).toUpperCase() + parentMatches[1].slice(1)\n const key = parentMatches[2]\n return {\n model,\n key\n }\n }\n return null\n}\n\nconst getNode = pathname => getResourceNode(pathname) || getParentNode(pathname)\n\nexport default getNode\n","import React from 'react'\nimport {connect} from 'react-redux'\nimport {useHistory, useLocation, useParams} from 'react-router-dom'\n\nimport {navigate} from '../modules/routing/actions'\n\nconst mapActionCreators = {\n navigate\n}\n\nconst mapStateToProps = state => ({\n path: state.docs.routing.path,\n params: state.docs.routing.params\n})\n\nexport const withInternalRouter = connect(mapStateToProps, mapActionCreators)\n\nexport const withReactRouter = WrappedComponent => props => {\n const location = useLocation()\n const history = useHistory()\n const params = useParams()\n\n return <WrappedComponent {...props} path={location.pathname} navigate={history.push} params={params} />\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {connect} from 'react-redux'\n\nimport {withInternalRouter, withReactRouter} from './withRouter'\n\nconst mapStateToProps = state => ({\n compProviderRouterType: state.input.routerType\n})\n\n/**\n * Handles different router types:\n * - enhance component with `path`, `params` and `navigate`\n * - renders either internal routing or react router wrapper\n *\n * Example with one component for all router types:\n * ```\n * const MyComp = ({path, params, navigate}) => {}\n *\n * export default withRouterTypeCompProvider(MyComp)\n * ```\n *\n * Example with two component for routerless vs router type:\n * ```\n * const MyRouterlessComp = ({path, params, navigate}) => {}\n * const MyRouterComp = ({path, params, navigate}) => {}\n *\n * export default withRouterTypeCompProvider({routerless: MyRouterlessComp, router: MyRouterComp})\n * ```\n *\n * @param {object} config\n */\nexport const withRouterTypeCompProvider = config => {\n const {routerless, router} = config\n\n const RouterlessComp = routerless ? withInternalRouter(routerless) : withInternalRouter(config)\n const RouterComp = router ? withReactRouter(router) : withReactRouter(config)\n\n const ComponentProvider = ({compProviderRouterType, ...props}) => {\n if (compProviderRouterType === 'routerless') {\n return <RouterlessComp {...props} />\n }\n\n // inherit & standalone are both using router lib\n return <RouterComp {...props} />\n }\n\n ComponentProvider.propTypes = {\n compProviderRouterType: PropTypes.oneOf(['routerless', 'inherit', 'standalone'])\n }\n\n return connect(mapStateToProps)(ComponentProvider)\n}\n"],"sourceRoot":""}
|