tocco-admin 0.5.22 → 0.5.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///./packages/app-extensions/src/actions/actionComponentTypes.js","webpack:///./packages/app-extensions/src/actions/actions.js","webpack:///./packages/app-extensions/src/actions/modules/reducer.js","webpack:///./packages/app-extensions/src/actions/modules/actions.js","webpack:///./packages/app-extensions/src/actions/actionTypes.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/simpleAction.js","webpack:///./packages/app-extensions/src/actions/containers/simpleFormConnector.js","webpack:///./packages/app-extensions/src/actions/utils/report.js","webpack:///./packages/app-extensions/src/actions/components/StyledReportSettings.js","webpack:///./packages/app-extensions/src/actions/components/ReportSettings.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/report.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/customAction.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/legacyAction.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/index.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/preCheckHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/confirmHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/initialFormHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/largeSelectionHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/prepare.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/index.js","webpack:///./packages/app-extensions/src/actions/modules/sagas.js","webpack:///./packages/app-extensions/src/actions/components/selectionHelper.js","webpack:///./packages/app-extensions/src/actions/components/ActionGroup.js","webpack:///./packages/app-extensions/src/actions/components/SingleAction.js","webpack:///./packages/app-extensions/src/actions/components/Action.js","webpack:///./packages/app-extensions/src/actions/containers/ActionContainer.js","webpack:///./packages/app-extensions/src/actions/index.js","webpack:///./packages/app-extensions/src/actions/addToStore.js","webpack:///./packages/app-extensions/src/actions/utils/selection.js","webpack:///./packages/tocco-ui/src/Range/StyledRange.js","webpack:///./packages/tocco-ui/src/Range/rangeTypeMappings.js","webpack:///./packages/tocco-ui/src/Range/Range.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/decimal.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/document.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/integer.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/location.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/number.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/remote.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/select.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/boolean.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/index.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/duration.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/html.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/moneyamount.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/phone.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/searchFilter.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/percent.js","webpack:///./packages/app-extensions/src/field/editableValueFactory.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/document.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/remote.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/index.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/description.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/number.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/moneyamount.js","webpack:///./packages/app-extensions/src/field/formattedValueFactory.js","webpack:///./packages/app-extensions/src/field/mappings.js","webpack:///./packages/app-extensions/src/field/fieldFactory.js","webpack:///./packages/app-extensions/src/field/index.js","webpack:///./packages/app-extensions/src/form/formErrors.js","webpack:///./packages/tocco-ui/src/Layout/LayoutBox.js","webpack:///./packages/tocco-ui/src/Layout/StyledLayoutContainer.js","webpack:///./packages/tocco-ui/src/Layout/LayoutContainer.js","webpack:///./packages/tocco-ui/src/Layout/index.js","webpack:///./packages/app-extensions/src/formField/formField.js","webpack:///./packages/app-extensions/src/formField/index.js","webpack:///./packages/app-extensions/src/form/ReduxFormFieldAdapter.js","webpack:///./packages/app-extensions/src/form/enums/componentTypes.js","webpack:///./packages/app-extensions/src/form/formDefinition.js","webpack:///./packages/app-extensions/src/form/reduxForm.js","webpack:///./packages/app-extensions/src/form/enums/layoutTypes.js","webpack:///./packages/app-extensions/src/form/StyledFormBuilder.js","webpack:///./packages/app-extensions/src/form/FormBuilder.js","webpack:///./packages/app-extensions/src/form/validators/syncValidators.js","webpack:///./packages/app-extensions/src/form/validators/asyncValidators.js","webpack:///./packages/app-extensions/src/form/validators/index.js","webpack:///./packages/app-extensions/src/form/validators/mandatory.js","webpack:///./packages/app-extensions/src/form/asyncValidation.js","webpack:///./packages/app-extensions/src/form/enums/scopes.js","webpack:///./packages/app-extensions/src/form/transformInputValues.js","webpack:///./packages/app-extensions/src/form/index.js","webpack:///./packages/app-extensions/src/form/syncValidation.js","webpack:///./packages/app-extensions/src/formData/relationEntities/actions.js","webpack:///./packages/app-extensions/src/formData/relationEntities/reducer.js","webpack:///./packages/app-extensions/src/formData/tooltips/actions.js","webpack:///./packages/app-extensions/src/formData/tooltips/reducer.js","webpack:///./packages/app-extensions/src/formData/relationEntities/sagas.js","webpack:///./packages/app-extensions/src/formData/tooltips/sagas.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/actions.js","webpack:///./packages/app-extensions/src/formData/values/actions.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/StyledAdvancedSearch.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/AdvancedSearch.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/AdvancedSearchContainer.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/utils.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/sagas.js","webpack:///./packages/app-extensions/src/formData/values/sagas.js","webpack:///./packages/app-extensions/src/formData/upload/documents.js","webpack:///./packages/app-extensions/src/formData/upload/sagas.js","webpack:///./packages/app-extensions/src/formData/upload/actions.js","webpack:///./packages/app-extensions/src/formData/searchFilters/actions.js","webpack:///./packages/app-extensions/src/formData/searchFilters/reducer.js","webpack:///./packages/app-extensions/src/formData/searchFilters/utils.js","webpack:///./packages/app-extensions/src/formData/searchFilters/sagas.js","webpack:///./packages/app-extensions/src/formData/locations/actions.js","webpack:///./packages/app-extensions/src/formData/locations/utils.js","webpack:///./packages/app-extensions/src/formData/locations/sagas.js","webpack:///./packages/app-extensions/src/formData/locations/reducer.js","webpack:///./packages/app-extensions/src/formData/navigationStrategy/reducer.js","webpack:///./packages/app-extensions/src/formData/navigationStrategy/actions.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/actions.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/RemoteCreate.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/RemoteCreateContainer.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/sagas.js","webpack:///./packages/app-extensions/src/formData/formData.js","webpack:///./packages/app-extensions/src/formData/FormDataContainer.js","webpack:///./packages/app-extensions/src/formData/index.js","webpack:///./packages/app-extensions/src/remoteEvents/index.js","webpack:///./packages/app-extensions/src/remoteEvents/actions.js","webpack:///./packages/entity-list/src/modules/entityList/actions.js","webpack:///./packages/entity-list/src/util/searchFormTypes.js","webpack:///./packages/entity-list/src/modules/entityList/reducer.js","webpack:///./packages/entity-list/src/modules/entityList/index.js","webpack:///./packages/entity-list/src/modules/list/actions.js","webpack:///./packages/entity-list/src/modules/searchForm/actions.js","webpack:///./packages/entity-list/src/modules/preferences/actions.js","webpack:///./packages/entity-list/src/modules/entityList/sagas.js","webpack:///./packages/entity-list/src/modules/list/reducer.js","webpack:///./packages/entity-list/src/modules/list/index.js","webpack:///./packages/entity-list/src/util/api/fetchOptions.js","webpack:///./packages/entity-list/src/modules/selection/actions.js","webpack:///./packages/entity-list/src/modules/searchForm/StyledComponents.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/LazyDataEnhancer.js","webpack:///./packages/entity-list/src/util/lazyLoading.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/LazyDataEnhancerContainer.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/index.js","webpack:///./packages/entity-list/src/util/fieldFactory.js","webpack:///./packages/entity-list/src/util/StyledComponents.js","webpack:///./packages/entity-list/src/util/cellRenderer.js","webpack:///./packages/entity-list/src/util/api/forms.js","webpack:///./packages/entity-list/src/util/searchFormValidation.js","webpack:///./packages/entity-list/src/components/ColumnPicker/StyledColumnPicker.js","webpack:///./packages/entity-list/src/components/ColumnPicker/ColumnPicker.js","webpack:///./packages/entity-list/src/components/ColumnPicker/ColumnPickerContainer.js","webpack:///./packages/entity-list/src/components/ColumnPicker/index.js","webpack:///./packages/entity-list/src/modules/searchForm/sagas.js","webpack:///./packages/entity-list/src/util/api/entities.js","webpack:///./packages/entity-list/src/modules/list/sagas.js","webpack:///./packages/entity-list/src/modules/searchForm/reducer.js","webpack:///./packages/entity-list/src/modules/searchForm/index.js","webpack:///./packages/entity-list/src/modules/selection/reducer.js","webpack:///./packages/entity-list/src/modules/selection/index.js","webpack:///./packages/entity-list/src/util/selectionStyles.js","webpack:///./packages/entity-list/src/util/selection.js","webpack:///./packages/entity-list/src/modules/selection/sagas.js","webpack:///./packages/entity-list/src/modules/preferences/reducer.js","webpack:///./packages/entity-list/src/modules/preferences/index.js","webpack:///./packages/entity-list/src/util/preferences.js","webpack:///./packages/entity-list/src/modules/preferences/sagas.js","webpack:///./packages/entity-list/src/modules/reducers.js","webpack:///./packages/entity-list/src/components/FullTextSearchForm/FullTextSearchForm.js","webpack:///./packages/entity-list/src/components/FullTextSearchForm/index.js","webpack:///./packages/entity-list/src/containers/FullTextSearchFormContainer.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/StyledBasicSearchForm.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/BasicSearchForm.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/index.js","webpack:///./packages/entity-list/src/containers/BasicSearchFormContainer.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/StyedComponents.js","webpack:///./packages/entity-list/src/components/SearchFilterList/utils.js","webpack:///./packages/entity-list/src/components/SearchFilterList/StyledComponents.js","webpack:///./packages/entity-list/src/components/SearchFilterList/SearchFilterList.js","webpack:///./packages/entity-list/src/components/SearchFilterList/SearchFilterListContainer.js","webpack:///./packages/entity-list/src/components/SearchFilterList/index.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/AdminSearchForm.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/AdminSearchFormContainer.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/index.js","webpack:///./packages/entity-list/src/components/SearchView/StyledComponents.js","webpack:///./packages/entity-list/src/components/SearchView/SearchView.js","webpack:///./packages/entity-list/src/components/SearchView/index.js","webpack:///./packages/entity-list/src/containers/SearchViewContainer.js","webpack:///./packages/entity-list/src/components/SelectionController/StyledSelectionController.js","webpack:///./packages/entity-list/src/components/SelectionController/SelectionController.js","webpack:///./packages/entity-list/src/components/SelectionController/index.js","webpack:///./packages/entity-list/src/containers/SelectionControllerContainer.js","webpack:///./packages/entity-list/src/components/Table/NavigationCellHeader.js","webpack:///./packages/entity-list/src/components/Table/navigationCell.js","webpack:///./packages/entity-list/src/components/Table/StyledComponents.js","webpack:///./packages/entity-list/src/components/Table/markingCell.js","webpack:///./packages/entity-list/src/components/Table/Table.js","webpack:///./packages/entity-list/src/components/Table/index.js","webpack:///./packages/entity-list/src/containers/TableContainer.js","webpack:///./packages/entity-list/src/util/actions.js","webpack:///./packages/entity-list/src/containers/ActionContainer.js","webpack:///./packages/entity-list/src/components/ListView/StyledComponents.js","webpack:///./packages/entity-list/src/components/ListView/ListView.js","webpack:///./packages/entity-list/src/components/ListView/index.js","webpack:///./packages/entity-list/src/containers/ListViewContainer.js","webpack:///./packages/entity-list/src/components/EntityList/StyledComponents.js","webpack:///./packages/entity-list/src/components/EntityList/EntityList.js","webpack:///./packages/entity-list/src/components/EntityList/EntityListContainer.js","webpack:///./packages/entity-list/src/components/EntityList/index.js","webpack:///./packages/entity-list/src/input.js","webpack:///./packages/entity-list/src/customActions.js","webpack:///./packages/entity-list/src/main.js","webpack:///./packages/simple-form/src/modules/simpleForm/actions.js","webpack:///./packages/simple-form/src/modules/simpleForm/reducer.js","webpack:///./packages/simple-form/src/modules/simpleForm/index.js","webpack:///./packages/simple-form/src/modules/simpleForm/sagas.js","webpack:///./packages/simple-form/src/modules/reducers.js","webpack:///./packages/simple-form/src/components/Form/StyledComponents.js","webpack:///./packages/simple-form/src/components/Form/Form.js","webpack:///./packages/simple-form/src/components/Form/index.js","webpack:///./packages/simple-form/src/containers/FormContainer.js","webpack:///./packages/simple-form/src/main.js","webpack:///./packages/tocco-ui/src/Layout/StyledLayoutBox.js","webpack:///./packages/tocco-ui/src/MultiCheckbox/MultiCheckbox.js","webpack:///./packages/tocco-ui/src/MultiCheckbox/index.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanel.js","webpack:///./packages/tocco-ui/src/Panel/Panel.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelGroup.js","webpack:///./packages/tocco-ui/src/Panel/PanelGroup.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelBody.js","webpack:///./packages/tocco-ui/src/Panel/PanelBody.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelHeaderFooter.js","webpack:///./packages/tocco-ui/src/Panel/PanelHeaderFooter.js","webpack:///./packages/tocco-ui/src/Panel/index.js","webpack:///./packages/tocco-ui/src/Table/ResizingController.js","webpack:///./packages/tocco-ui/src/Table/StyledTable.js","webpack:///./packages/tocco-ui/src/Pagination/StyledComponents.js","webpack:///./packages/tocco-ui/src/Pagination/Pagination.js","webpack:///./packages/tocco-ui/src/Pagination/index.js","webpack:///./packages/tocco-ui/src/Table/selection/useSelection.js","webpack:///./packages/tocco-ui/src/Table/selection/selectionStyles.js","webpack:///./packages/tocco-ui/src/Table/selection/SingleSelectCell.js","webpack:///./packages/tocco-ui/src/Table/selection/MultiSelectCell.js","webpack:///./packages/tocco-ui/src/Table/selection/MultiSelectHeader.js","webpack:///./packages/tocco-ui/src/Table/selection/selectionColumnEnhancer.js","webpack:///./packages/tocco-ui/src/Table/SortingState.js","webpack:///./packages/tocco-ui/src/Table/TableHeader.js","webpack:///./packages/tocco-ui/src/Table/useResize.js","webpack:///./packages/tocco-ui/src/Table/StaticCell.js","webpack:///./packages/tocco-ui/src/Table/TableBody.js","webpack:///./packages/tocco-ui/src/Table/Table.js","webpack:///./packages/tocco-util/src/api/entities.js","webpack:///./packages/tocco-util/src/api/table.js","webpack:///./packages/tocco-util/src/api/index.js","webpack:///./packages/tocco-util/src/api/display.js","webpack:///./packages/tocco-util/src/tqlBuilder/tqlBuilder.js","webpack:///./packages/tocco-util/src/tqlBuilder/index.js","webpack:///./packages/tocco-util/src/useDnD/useDnD.js","webpack:///./packages/tocco-util/src/useDnD/index.js"],"names":["Object","freeze","ACTION","REPORT","ACTION_GROUP","ACTION_BAR","isAction","componentType","values","componentTypes","indexOf","modeFitsScopes","mode","scopes","length","includes","ACTION_HANDLERS","initialState","reducer","state","action","handler","type","ACTION_INVOKE","ACTION_IN_PROGRESS","ACTION_INVOKED","actionInvoke","definition","selection","parent","payload","actionInvoked","response","CUSTOM","SIMPLE","DIVIDER","LEGACY","invokeActionAsync","invokeActionSync","invokeRequest","showToaster","params","runAsync","runInBackgroundTask","invokeFnc","call","rest","endpoint","method","body","entity","entityName","background","formProperties","properties","acceptedErrorCodes","headers","success","put","notification","title","message","randomId","uuid","progressMsg","remoteEvents","entities","errorCode","validation","errors","downloadUrl","fileResponse","download","filename","errorLogging","key","notificationKey","TOASTER_KEY_PREFIX","undefined","mapActionCreators","emitAction","actionEmitter","connect","DISPLAY","DOWNLOAD","getFormDefinition","settingsDefinition","intl","msg","id","formatMessage","extractFields","name","map","field","children","dataType","defaultValue","label","description","path","targetEntity","hidden","readonly","disabled","modelid","layoutType","PropTypes","customSettings","form","generalSettings","recipient","StyledReportSettings","styled","StyledStickyButtons","scale","theme","StyledButton","injectIntl","formApp","onSubmit","listApp","customSettingsDefined","useState","valid","customSettingsValid","settings","setSettings","settingsRef","useRef","current","SimpleFormContainer","useMemo","simpleFormConnector","noButtons","onChange","Button","ink","onClick","transform","groupedValues","groupValues","reduce","result","getGroupedValues","v","_reduce","value","Array","isArray","look","displayReportSettings","awaitSettingsSubmit","actionDefinition","config","channel","answerChannel","settingsModalId","options","queryParams","model","keys","ids","join","resource","reportId","formValues","take","recipientSettings","customSettingsEntity","api","__model","additionalProperties","formData","handleCustomActionModal","handleFullScreenActions","handleAppActionsFallback","handleAnswer","appId","fullscreen","customActions","consoleLogger","appComponent","actionStatus","ActionComponent","close","context","actionProperties","navigationStrategy","onSuccess","status","onError","onCancel","loadSequentially","readRemoteEvents","registerRemoteEventsListener","handleNotification","readNotifications","registerNotificationsListener","initLegacyActionsEnv","getSelection","getScope","loadScript","src","Promise","resolve","reject","s","document","createElement","onload","onerror","head","appendChild","loadCss","getElementsByTagName","link","rel","href","media","sources","currentEnv","window","legacyActionEnv","serverSettings","source","envs","niceRevision","f","channelFeedingCallback","arg","remoteEventsChannel","event","app","getDataRegistry","dataRegistry","setNewClientCallback","callback","spawn","replace","level","newNotification","Error","notificationsChannel","getGui","gui","getNotifier","notifier","legacyActionsEnvInitialized","setUpLegacyActionsEnv","listSelector","list","entityListSelector","entityList","entityDetailSelector","entityDetail","getManualQuery","listState","nice2","netui","ManualQuery","queryWhere","query","where","queryOrderBy","sortingArray","sorting","getListFormId","FormIdentifier","scope","formName","formDefinition","legacySelection","selectedEntities","selectionType","select","manualQuery","listForm","searchFilters","filter","detail","actions","ClientActionDefinition","setEnabled","readOnly","_isPlainObject","setPropertyEffects","entries","setProperty","all","entityExplorer","modules","NewClientLegacyActionsModule","init","panel","NewClientLegacyActionsPanel","ctx","entityexplorer","EntityExplorerActionContext","getRecord","situation","NetuiActionRegistry","newActionFromDefinition","getSelectionNumber","perform","actionTypes","handleSimpleAction","handleReportAction","handleCustomAction","handleLegacyAction","preCheckHandler","preparationResponse","preCheck","abort","abortMessage","confirmHandler","promptConfirm","confirmMessage","confirmResponse","onYes","initialFormHandler","handleInitialForm","initialFormValues","defaultValues","formTitle","formMessage","Date","valueOf","onSend","paths","largeSelectionHandler","threshold","confirmationThreshold","count","doRequest","run","getHandlers","handlers","i","handlerResponse","sagas","invokeAction","takeEvery","prepare","actionHandler","actionHandlers","actionType","remoteEvent","isValidSelection","selectedCount","minSelection","maxSelection","notEnough","tooMany","selectionText","props","hasDefaultAction","defaultAction","onClickHandler","actionId","ButtonMenu","buttonProps","data-cy","childDefinition","idx","getChildMenuItems","input","validSelection","isActionGroup","MenuItem","icon","child","e","stopPropagation","useLabel","ActionVisual","customRenderedActions","ActionType","ActionGroup","SingleAction","_omit","Action","addToStore","store","reducerUtil","sagaMiddleware","sagasUtil","errorLoging","getSingleEntitySelection","StyledInputWrapper","StyledInputItemWrapper","StyledIconWrapper","StyledRange","StyledInput","StyledExtender","datetimeFormat","datetime","toRange","from","moment","utc","format","to","add","isRangeValue","fromRange","local","getToOptions","fromValue","flatpickrOptions","minDate","getFromOptions","toValue","maxDate","date","events","hasRangeValue","exactEvents","toEvents","fromEvents","typeMapping","rangeTypeMappings","baseType","EditableValue","Ball","getFromOrTo","getRangeValue","getOptions","formField","postPointDigits","_get","prePointDigits","minValue","maxValue","allowNegative","upload","uploadDocument","uploadText","uploadingText","downloadText","deleteText","fixLabel","dataContainerProps","relationEntities","tooltips","moreOptionsAvailable","isLoading","fetchOptions","loadRelationEntities","forceReload","limit","order","formBase","searchOptions","searchTerm","openAdvancedSearch","loadTooltip","noResultsText","moreOptionsAvailableText","DetailLink","entityKey","createPermission","entityModel","relationName","openRemoteCreate","boolean","number","decimal","hoursLabel","minutesLabel","integer","hasValue","locationMapping","city","postcode","getValue","filteredLocationData","renamedLocationData","locKey","filteredLocDataKey","getEvents","locationObject","changeFieldValue","onBlur","touchField","locations","fields","isDirty","fetchSuggestions","country","loadLocationsSuggestions","suggestions","mapButtonTitle","fixedDecimalScale","remote","customPhoneRegex","defaultCountry","isMulti","multiple","loadSearchFilters","group","EditableValueFactory","range","info","formType","editableTypeConfigs","currentValue","Component","Range","fromText","toText","downloadTitle","text","FormattedValueFactory","breakWords","fieldType","formattedTypeConfigs","overwrittenValue","FormattedValue","editableMapping","editableValueFactory","formattedValueFactory","readOnlyMapping","editable","binary","image","search","birthdate","updatets","createts","moneyamount","percent","long","counter","time","factory","mappingType","mappings","getFieldErrors","formErrors","fieldErrors","getGeneralErrors","hasFieldErrors","getValidatorErrors","hasValidatorErrors","hasRelatedEntityErrors","hasOutdatedError","getFirstErrorField","getRelatedEntityErrorsCompact","relatedEntityErrors","relatedEntityError","entityValidatorErrors","r","_forOwn","fieldName","errorKey","push","addErrors","outdatedResponseToFormError","_pick","sameEntity","getOutdatedError","LayoutBox","StyledLayoutBox","memo","containerWidth","occupiesRemainingHeight","Box","Container","ref","setContainerWidth","setPixelWidth","offsetWidth","useEffect","addEventListener","removeEventListener","FormFieldWrapper","hasValueOverwrite","typeEditable","StatedValue","dirty","error","React","displayFieldTypes","multiTypes","isMultipleFields","displayFieldAsDisplayOnly","parentReadOnly","Typography","MultiSeparator","ValueField","fieldMappingType","Field","prev","curr","data","resources","requestedFromData","formDefinitionField","entityField","touched","submitting","mandatory","isDisplay","immutable","mandatoryTitle","exception","ReduxFormFieldAdapter","meta","extractEventsFromInput","fomFieldData","propTypes","isRequired","FIELD_SET","FIELD","LAYOUT","TABLE","SUB_TABLE","getFieldId","validFieldTypes","getFieldsOfChildren","ignoreCopy","typePathsHandlers","location","fieldDefinition","validationErrorToFormError","forEach","prototype","hasOwnProperty","transformFieldName","transformFieldNameBack","formValuesToFlattenEntity","acc","val","getDirtyFields","initialValues","isCreate","dirtyFields","_isEqual","VERTICAL_BOX","HORIZONTAL_BOX","StyledActionsWrapper","FormBuilder","componentMapping","beforeRenderField","modeFitsScope","formTraverser","createLayoutComponent","createAction","createFieldSet","createCustomComponent","fieldSet","find","split","writable","hasEmptyValue","shouldRenderField","component","elements","Boolean","content","Panel","isFramed","isOpen","LayoutComponent","layoutTypes","Layout","areEqual","prevProps","nextProps","js","minLength","maxLength","maxNumber","toString","prePoint","pattern","RegExp","test","isEmail","isUrl","require_tld","syncValidators","asyncValidators","phone","phoneValidation","libphone","isValidCustomRegex","customRegex","match","isValidPhoneNumber","isValidNumber","defaultRegion","mandatoryError","valueDefined","hasError","localeValidation","fieldDefinitions","validators","asyncValidatorKey","_has","validatorValue","validator","validatorErrors","validateRequest","flattenEntity","_validate","then","resp","asyncValidation","localeValidationErrors","validateRequestErrors","CREATE","UPDATE","loadDisplays","transformInputValues","displayRequest","fieldModel","arrayValue","relationFieldTransformer","displays","display","fieldTypeTransformer","multi","formErrorsUtil","getFieldDefinitions","getDefaultValues","valueObj","getUsedPaths","_uniq","accumulator","entityToFormValues","syncValidation","syncValidatorKey","submitValidation","SubmissionError","isValueEmpty","setRelationEntityLoading","setRelationEntities","moreEntitiesAvailable","setToolTip","tooltip","enhanceEntitiesWithDisplays","loadRelationEntity","requestedDisplays","fieldDataSelector","fieldData","dataLoaded","relationEntitiesActions","getQuery","requestOptions","splice","loadToolTip","tooltipSelector","tooltipActions","advancedSearchUpdate","StyledAdvancedSearch","StyledAdvancedSearchButtonWrapper","listFormDefinition","onSelectionChange","onOkClick","ListApp","showSearchForm","onSelectChange","selectionStyle","selectOnRowClick","disableSelectionController","showActions","AdvancedSearch","getAdvancedSearchComponent","fieldId","AdvancedSearchContainer","closeAdvancedSearch","textResourceSelector","messages","fieldFormBase","remoteFieldFormName","modalId","advancedSearchTitle","advancedSearchComponent","advancedSearchActions","modalOpen","valueActions","changeValue","formActions","UPLOAD_ENDPOINT_URL","__BACKEND_URL__","uploadRequest","file","FormData","append","fetch","credentials","json","documentToFormValueTransformer","uploadResponse","responseAttributes","mimeType","contentType","binaryLink","preview","thumbnailLink","startsWith","documentFormValue","JSON","stringify","timestamp","now","setSearchFilter","filters","searchFilterResponseTransformer","searchFilterResponse","uniqueId","takeLatest","searchFiltersSelector","setLocationSuggestions","setLocationSuggestionsLoading","getCountryCodeByKey","loadCountries","requestSuggestions","getCountry","countryCache","prop","countryCode","suggestion","allCountries","allCountriesUniq","notLoaded","conditions","countriesResponse","transformToSuggestions","countries","fieldCountries","loadLocations","searchInput","countryValue","suggestionsResponse","handleEntityCreated","DetailApp","onEntityCreated","RemoteCreate","detailApp","buildCreateForm","combineReducers","relationEntitiesSagas","tooltipsSaga","advancedSearchSagas","valueSagas","uploadSagas","searchFilterSagas","locationSagas","remoteCreateSagas","dispatch","relationEntitiesData","FormDataContainer","isDirtySelector","_merge","getFormSubmitErrors","getFormSyncErrors","getFormAsyncErrors","areStatePropsEqual","REMOTE_EVENT","setSearchFormType","searchFormType","searchFormTypes","NONE","BASIC","ADMIN","newSearchFormType","enumV","initialized","searchFormPosition","searchFormCollapsed","initialize","setEntities","addEntitiesToStore","page","setEntityCount","entityCount","setFormDefinition","setSorting","setInProgress","inProgress","setEndpoint","setSearchEndpoint","searchEndpoint","setConstriction","constriction","setLazyData","navigateToAction","toggleMarkings","setDisablePreferencesMenu","disablePreferencesMenu","setInitialized","executeSearch","submitSearchForm","setFormFieldsFlat","formFieldsFlat","setSearchFilters","setSearchFilterActive","searchFilterId","active","exclusive","loadPreferences","setPositions","positions","setColumns","columns","resetSorting","reloadData","appFactory","externalEvents","collapsed","getOpposite","contains","currentSorting","entityStore","lazyData","currentPage","formSelectable","formClickable","showLink","sortable","inputTql","inputKeys","inputSearchFilters","getFilterArray","getFetchOptionsFromSearchForm","searchFormValues","formFields","addition","tql","tqlBuilder","setSelection","isSelected","setTableSelectionStyle","tableSelectionStyle","setQuery","multiRelationHandler","singleRelationHandler","typeHandlers","typeHandler","infos","LazyDataEnhancer","FormattedValueWrapper","modelField","StyledActionWrapper","getAction","isMultiType","pathValue","style","marginRight","__key","fieldFactory","getDisplayExpression","definitionCache","getTable","getSorting","table","getSelectable","selectable","getClickable","clickable","getDisablePreferencesMenu","getEndpoint","getSearchEndpoint","getConstriction","isDisplayableChild","getSortingAttributes","column","findIndex","sortRank","rightAlignedTypes","getColumnDefinition","columnDisplayPreferences","cellRenderers","reverseRelationName","c","shrinkToContent","resizable","widthFixed","rightAligned","CellRenderer","rowData","clientRenderer","cellRenderer","getFields","relationFields","displayExpressionFields","getFormFieldFlat","searchChildren","node","changeParentFieldType","formElement","parentPath","containsParentField","some","getTableColumns","validateSearchFields","fieldDefinitionCache","get","getFieldDefinition","validateField","typeValidator","typeValidators","StyledUl","StyledLabel","StyledCheckbox","StyledButtonWrapper","StyledId","StyledItem","StyledLi","isDraggedOver","colors","secondary","draggable","lighten","secondaryLight","onOk","dndEnabled","initialColumns","setSearchTerm","useDnD","currentlyDragging","currentlyDragOver","currentlyDraggingItem","dndEvents","dndState","items","checked","target","for","SearchBox","placeholder","onSearch","ColumnPicker","getListFormDefinition","setInitialFormValues","transformFieldNames","submitSearchFrom","loadSearchFilter","setSimpleForm","loadSearchForm","getEntityModel","resetSearchFilters","resetSearch","getSearchFormValues","saveSearchFilter","saveNewSearchFilter","deleteSearchFilter","saveDefaultSearchFilter","resetDefaultSearchFilter","displaySearchFieldsModal","saveSearchFields","resetSearchFields","inputSelector","searchFormSelector","searchForm","listFromDefinitionSelector","searchValuesSelector","getFormValues","formActionTypes","searchFormVisible","preselectedSearchFields","preselectedValues","fromDefaultValues","transformedFromValues","oldValues","valuesInitialized","listHasNoParent","searchFilter","defaultFilter","txtFulltext","forceLoad","searchValues","setName","searchFilterName","getBasicQuery","createdSearchFilter","primaryKey","ActionAppComponent","actionAppComponent","modelName","flatMap","columnsSorted","hiddenFields","displayedFields","entitiesListTransformer","queryChanged","loadData","prepareEndpointUrl","countEntities","changePage","refreshData","getSearchFilter","hasActiveSearchFilterOrderBy","loadDisplayExpressions","loadRelationDisplays","loadMarkings","setMarked","setLazyDataMarked","fetchEntitiesAndAddToStore","requestEntities","delayedPreloadNextPage","preloadNextPage","displayEntity","getPreferencesSorting","loadFormDefinition","extractFormInformation","loadEntityModel","onRowClick","navigateToCreate","selectionSelector","preferencesSelector","preferences","selectionActions","fork","regardSelection","showSelectedRecords","searchFormSearchFilter","searchFormFetchOptions","relevantSearchFormFetchOptions","getTql","hasUserChanges","parentKey","selectedEndpoint","preparedEndpoint","queryCount","searchInputsFilters","adminSearchFormFilters","activeSearchFormFilters","_union","orderBy","searchTql","request","markable","marked","oldMarkings","setToMarked","newMarkings","markings","currentEntityMarkings","newEntityMarkings","columnPreferences","basicQuery","delay","nextPage","setCountAction","tableSorting","preferencesSorting","activeSearchFilterHasOrderBy","fetchedFormDefinition","selected","navigateToCreateRelative","navigateToActionRelative","containsEntityOfModel","deletedEntityKeys","fieldArray","simpleSearchFields","trim","showExtendedSearchForm","disableSimpleSearch","comparator","a","b","sort","showSelectionController","selectionStyles","SINGLE","MULTI","MULTI_EXPLICIT","showSelectionComponent","inputSelectionStyle","getTableSelectionStyle","fromSelectable","ascendingNumberComparator","combineSelection","currentSelection","newSelection","slice","k","clearSelection","setTableStyle","selectionMode","selectionControllerVisible","preferencesLoaded","getPositions","endsWith","Number","getPositionsFromColumns","fixedPosition","changePosition","fieldAfterPosition","getPositionsPreferencesToSave","keyRegex","transformSortingKey","index","keyMatch","transformSortingField","parseInt","toLowerCase","getSortingPreferencesToSave","getAdditionalSortingPreferencesToSave","getColumns","getColumnPreferencesToSave","saveSorting","resetPreferences","displayColumnModal","saveColumnPreferences","resetColumns","listSagas","util","afterFieldPosition","newPositions","positionPreferences","sortings","sortingPreferences","preferencesColumns","formColumns","item","diffColumns","columnName","entityListReducer","listReducer","searchFormReducer","selectionReducer","preferencesReducer","entityListSagas","searchFormSagas","selectionSagas","preferencesSaga","reduxForm","destroyOnUnmount","liveSearch","preventDefault","FullTextSearchForm","StyledBasicSearchForm","StyledScrollbar","StyledSearchFormButtons","searchFormDefinition","setShowExtendedSearchForm","hasExtendedOnlySearchFields","every","isHidden","searchInputs","BasicSearchForm","StyledSplit","Split","StyledSplitWrapper","StyledHeader","Menu","AdminSearchGrid","isCollapsed","StyledPlaceHolder","StyledToggleCollapseButton","StyledGutter","searchFilterCompare","SearchFilterListWrapper","StyledSpanSearchFilter","StyledSpan","StyledAddRemoveButton","StyledMenuWrapper","StyleButtonWrapper","StyledSearchFilterButton","StyledItemLabel","StyledMessageWrapper","EllipsisMenu","canEdit","canDelete","openDetail","BallMenu","SearchFilterButton","setActive","dense","editAllowed","deleteAllowed","SearchFilterList","tabIndex","BasicSearchFormContainer","withTheme","searchFormDirty","toggleCollapse","splitWrapperEl","size","setSize","searchFilterExpanded","setSearchFilterExpanded","showExpandSearchFilter","setShowExpandSearchFilter","searchFilterHeight","splitWrapperHeight","clientHeight","searchFilterHeightPercentage","Math","ceil","isSingleSearchFilterActive","Popover","direction","gutterSize","sizes","minSize","gutter","gutterEl","ReactDOM","AdminSearchForm","StyledAdminSearchFormWrapper","isToggleable","SearchView","toggleShowSelectedRecords","selectionPossible","StyledSelectionController","SelectionController","showNavigation","DetailLinkRelative","relation","StyledMarkingWrapper","declareFont","MarkingCellRenderer","mouseOver","setMouseOver","onMouseEnter","onMouseLeave","Table","showNavigationLink","showPreferencesMenu","width","dynamic","HeaderRenderer","NavigationCellHeader","columnDefinitions","dataLoadingInProgress","paginationInfo","totalCount","recordsPerPage","onPageChange","onSortingChange","setSortingInteractive","onColumnPositionChange","diff","deriveSelectionFromState","StyledListWrapper","StyledListView","SelectionControllerContainer","ListView","List","columnsDefinitions","TableContainer","ActionBar","actionBar","getActionBar","ActionContainer","LoadMask","required","loadingText","currentPageIds","TopPositioning","LeftPositioning","SearchGrid","ListGrid","ListViewContainer","setSearchFormCollapsed","PositioningContainer","SearchViewContainer","initializeSearchForm","EntityList","getDispatchActions","actionSettings","actionSetting","argsFactory","reloadOptions","reload","setListFormDefinition","new","mark","EXTERNAL_EVENTS","initApp","publicPath","allCustomActions","viewName","contextParams","reducers","SimpleFormApp","EntityListApp","textResourceModules","changedProps","_pickBy","this","_isEmpty","reloadOption","res","aS","setFieldDefinitions","submit","cancel","change","getValues","CHANGE","UPDATE_SYNC_ERRORS","INITIALIZE","inputDefaultValues","formUtil","isValid","simpleForm","formReducer","formSagas","StyledButtonsWrapper","initializeForm","handleSubmitProp","handleSubmit","submitText","cancelText","ms","setTimeout","pending","validate","Form","FormContainer","checkboxValues","inputEl","useLayoutEffect","indeterminate","aria-checked","aria-label","controlledIsOpen","isOpenInitial","onToggle","setIsOpen","controlled","toggleOpenState","StyledPanel","PanelGroup","openPanelIndex","open","setState","bind","cssShared","shadeColor","PanelHeaderFooter","showToggler","collapseButtonText","unfoldButtonText","defaultProps","Body","Footer","Group","Header","Wrapper","StyledResizeHandle","startResize","onMouseDown","borderColor","basePadding","StyledTableCell","StyledDnD","isDragged","StyledTableHeaderCell","fontWeight","isResizing","generateShades","paper","resizingColumn","PaginationContainer","css","StyledSortingSpan","StyledFullRowProgress","StyledFullRow","StyledTableHead","StyledTableRow","StyledTableBody","StyledTable","StretchingTableContainer","StyledTableWrapper","StyledDraggable","StyledPagination","StyledPaginationButton","totalPages","start","ButtonGroup","total","removeAllTextSelections","removeAllRanges","selectionChange","rowIdx","shiftKey","MultiCheckbox","rowSelectionState","rowSelectionChange","allKeys","allRowsSelectionState","getSingleSelectionCell","getMultiSelectionCell","ThContent","dangerouslySetInnerHTML","__html","tableEl","resizeCallback","tableElRef","lastPositionX","tmpColResizing","setResizingColumn","onMouseUp","onMouseMove","requestAnimationFrame","clientX","thEl","querySelector","max","useResize","thOnClick","StaticCell","textAlign","InProgressRow","NoDataRow","className","metaKey","ctrlKey","currentKeys","lastSelected","setLastSelected","shiftSelection","idxLastSelection","idxSelection","min","useSelection","selectionColumn","getSelectionCell","showPagination","columnId","metaFields","KEY","MODEL","VERSION","relevantRelationAttributes","typeValueExtractor","childValue","flattenPaths","currentPath","pathId","subPaths","flatten","combinedArrayVales","acc2","isRightAligned","relationFieldTypes","getFlattenEntity","version","toEntity","dirtyField","ignoredPath","t","_set","valueSimplifier","_isObject","getPathDisplayRequest","relationPaths","fieldValue","alreadyLoaded","alreadyInRequest","getDisplayRequest","args","isDefined","handleRangeValue","rangeMappings","momentValue","comp","guessType","onDragStart","onDragEnter","onDragOver","onDrop","onDragEnd"],"mappings":"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","file":"chunk-230.640bf63742a9b86e250e.js","sourcesContent":["export default Object.freeze({\n ACTION: 'action',\n REPORT: 'report',\n ACTION_GROUP: 'action-group',\n ACTION_BAR: 'action-bar'\n})\n","import componentTypes from './actionComponentTypes'\n\nexport const isAction = componentType => !!componentType && Object.values(componentTypes).indexOf(componentType) >= 0\n\nexport const modeFitsScopes = (mode, scopes) => (!mode || !scopes || scopes.length < 0 || scopes.includes(mode))\n","const ACTION_HANDLERS = {\n\n}\n\nconst initialState = {\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","export const ACTION_INVOKE = 'actions/ACTION_INVOKE'\nexport const ACTION_IN_PROGRESS = 'actions/ACTION_IN_PROGRESS'\nexport const ACTION_INVOKED = 'actions/ACTION_INVOKED'\n\nexport const actionInvoke = (definition, selection, parent) => ({\n type: ACTION_INVOKE,\n payload: {\n definition,\n selection,\n parent\n }\n})\n\nexport const actionInvoked = (definition, selection, response) => ({\n type: ACTION_INVOKED,\n payload: {\n definition,\n selection,\n response\n }\n})\n","export default Object.freeze({\n CUSTOM: 'custom',\n SIMPLE: 'simple',\n REPORT: 'report',\n DIVIDER: 'divider',\n LEGACY: 'legacy'\n})\n","import {put, call} from 'redux-saga/effects'\nimport {download, validation} from 'tocco-util'\nimport {v4 as uuid} from 'uuid'\n\nimport errorLogging from '../../../errorLogging'\nimport rest from '../../../rest'\nimport notification from '../../../notification'\nimport {TOASTER_KEY_PREFIX} from '../../../notification/modules/socket/socket'\n\nexport default function* (definition, selection, parent, params) {\n const runAsync = definition.runInBackgroundTask\n const invokeFnc = runAsync ? invokeActionAsync : invokeActionSync\n\n return yield call(invokeFnc, definition, selection, parent, params)\n}\n\nexport function* invokeActionAsync(definition, selection, parent, params) {\n const response = yield call(rest.requestSaga, definition.endpoint, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n params: {\n background: true\n },\n formProperties: definition.properties\n },\n acceptedErrorCodes: ['VALIDATION_FAILED'],\n headers: {\n 'X-Enable-Notifications': true\n }\n })\n\n if (response.body && response.body.success === false) {\n yield put(notification.toaster({\n type: 'error',\n title: 'client.common.unexpectedError',\n body: response.body.message || 'client.component.actions.errorText'\n }))\n } else {\n yield call(showToaster, response, 'info')\n }\n}\n\nexport function* invokeActionSync(definition, selection, parent, params) {\n const randomId = uuid()\n const title = definition.progressMsg || 'client.component.actions.defaultProgressMessage'\n yield put(notification.blockingInfo(randomId, title))\n const response = yield call(invokeRequest, definition, selection, parent, params)\n yield put(notification.removeBlockingInfo(randomId))\n\n return {\n ...response,\n remoteEvents: [\n ...(response && response.success\n ? [{\n type: 'entity-update-event',\n payload: {\n parent,\n entities: [{entityName: selection.entityName}]\n }\n }]\n : []\n )\n ]\n }\n}\n\nexport function* invokeRequest(definition, selection, parent, params) {\n try {\n const response = yield call(rest.requestSaga, definition.endpoint, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n formProperties: definition.properties\n },\n acceptedErrorCodes: ['VALIDATION_FAILED'],\n headers: {\n 'X-Enable-Notifications': true\n }\n })\n if (response.body && response.body.errorCode === 'VALIDATION_FAILED') {\n yield put(\n notification.toaster({\n type: 'error',\n title: 'client.component.actions.validationError',\n body: validation.getErrorCompact(response.body.errors)\n })\n )\n } else if (response.body && response.body.params && response.body.params.downloadUrl) {\n const fileResponse = yield call(rest.requestBytesSaga, response.body.params.downloadUrl, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n formProperties: definition.properties\n }\n })\n yield call(download.downloadReadableStream, fileResponse.body, response.body.params.filename)\n } else {\n yield call(showToaster, response, response.body.success === true ? 'success' : 'warning')\n }\n\n return response.body\n } catch (error) {\n if (!(error instanceof rest.ClientQuestionCancelledException)) {\n yield put(errorLogging.logError(\n 'client.common.unexpectedError',\n 'client.component.actions.errorText',\n error\n ))\n }\n }\n}\n\nexport function* showToaster(response, type) {\n const title = response.body.message || 'client.component.actions.successDefault'\n const key = response.body.notificationKey ? `${TOASTER_KEY_PREFIX}${response.body.notificationKey}` : undefined\n yield put(notification.toaster({type, title, key}))\n}\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nexport default connect(null, mapActionCreators)\n","import PropTypes from 'prop-types'\nimport _reduce from 'lodash/reduce'\n\nconst GROUP_GENERAL = 'generalSettings'\nconst GROUP_RECIPIENT = 'recipientSettings'\n\nexport const submitActions = Object.freeze({\n DISPLAY: 'display',\n DOWNLOAD: 'download'\n})\n\nexport const getGroupedValues = (settingsDefinition, values) => {\n const groupValues = name => (\n {\n [name]: (settingsDefinition[name] || []).reduce((result, field) => (\n {...result, [field.id]: values[field.id]}\n ), {})\n }\n )\n\n return {\n ...groupValues(GROUP_GENERAL),\n ...groupValues(GROUP_RECIPIENT)\n }\n}\n\nexport const transformValues = values => {\n const transform = v => {\n return v.key ? v.key : v\n }\n\n return _reduce(values, (result, value, key) => (\n {\n ...result,\n [key]: Array.isArray(value) ? value.map(transform) : transform(value)\n }\n ), {})\n}\n\nexport const getFormDefinition = (settingsDefinition, intl) => {\n const msg = id => intl.formatMessage({id})\n\n const extractFields = name =>\n (settingsDefinition[name] || []).map(field => (\n {\n children: [\n {\n componentType: 'field',\n dataType: field.dataType,\n defaultValue: field.defaultValue,\n id: field.id,\n label: field.label || field.description,\n path: field.id,\n ...(field.targetEntity ? {targetEntity: field.targetEntity} : {}),\n ...(field.validation ? {validation: field.validation} : {})\n }\n ],\n componentType: 'field-set',\n hidden: false,\n id: field.id,\n label: field.label || field.description,\n readonly: field.disabled,\n scopes: []\n }\n ))\n\n return {\n componentType: 'form',\n label: null,\n modelid: 'Bill_report_settings',\n readonly: false,\n children: [\n {\n componentType: 'layout',\n id: 'generalSettings',\n label: msg('client.common.report.generalSettings'),\n layoutType: 'vertical-box',\n children: extractFields(GROUP_GENERAL)\n },\n {\n componentType: 'layout',\n id: 'recipientSettings',\n label: msg('client.common.report.recipientSettings'),\n layoutType: 'vertical-box',\n children: extractFields(GROUP_RECIPIENT)\n }\n ]\n }\n}\n\nexport const reportSettingsDefinitionPropType = PropTypes.shape({\n customSettings: PropTypes.shape({\n form: PropTypes.object,\n entity: PropTypes.object\n }),\n generalSettings: PropTypes.array,\n recipient: PropTypes.array,\n description: PropTypes.shape({\n name: PropTypes.string.isRequired\n })\n})\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\n\nexport const StyledReportSettings = styled.div`\n && {\n > div:first-of-type {\n margin-bottom: 10px;\n }\n }\n`\n\nexport const StyledStickyButtons = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n z-index: 1;\n display: flex;\n justify-content: flex-end;\n\n ${/* sc-selector */StyledButton}:last-child {\n margin-right: 0;\n }\n`\n","import React, {useState, useMemo, useRef} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button} from 'tocco-ui'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport simpleFormConnector from '../containers/simpleFormConnector'\nimport {\n getFormDefinition,\n getGroupedValues,\n reportSettingsDefinitionPropType,\n transformValues\n} from '../utils/report'\nimport {StyledStickyButtons, StyledReportSettings} from './StyledReportSettings'\n\nexport const ReportSettings = ({settingsDefinition, formApp, onSubmit, listApp, intl}) => {\n const customSettingsDefined = settingsDefinition.customSettings && settingsDefinition.customSettings.entity\n const [settings, setSettings] = useState({\n valid: false,\n customSettingsValid: !customSettingsDefined\n })\n const settingsRef = useRef()\n settingsRef.current = settings // workaround to read current state in static callbacks (because of memo hook)\n\n const SimpleFormContainer = useMemo(() => simpleFormConnector(formApp), [formApp])\n\n const handleSettingsChange = ({values, valid}) => {\n setSettings({\n ...settingsRef.current,\n values,\n valid\n })\n }\n\n const handleCustomSettingsChange = ({values, valid}) => {\n setSettings({\n ...settingsRef.current,\n customSettings: values,\n customSettingsValid: valid\n })\n }\n\n const handleButtonClick = () => {\n const groupedValues = {\n ...getGroupedValues(settingsDefinition, transformValues(settings.values)),\n customSettings: settings.customSettings\n }\n\n onSubmit(groupedValues)\n }\n\n return (\n <StyledReportSettings>\n <SimpleFormContainer\n listApp={listApp}\n form={getFormDefinition(settingsDefinition, intl)}\n noButtons\n onChange={handleSettingsChange}\n mode=\"create\"\n />\n {customSettingsDefined\n && <SimpleFormContainer\n listApp={listApp}\n form={settingsDefinition.customSettings.form.form}\n noButtons\n onChange={handleCustomSettingsChange}\n mode=\"create\"\n />\n }\n <StyledStickyButtons>\n <Button\n ink=\"primary\"\n disabled={!settings.customSettingsValid || !settings.valid}\n onClick={handleButtonClick}\n look=\"raised\"\n >\n <FormattedMessage id=\"client.common.report.generate\"/>\n </Button>\n </StyledStickyButtons>\n </StyledReportSettings>\n )\n}\n\nReportSettings.propTypes = {\n intl: PropTypes.object.isRequired,\n onSubmit: PropTypes.func.isRequired,\n listApp: PropTypes.func.isRequired,\n formApp: PropTypes.func.isRequired,\n settingsDefinition: reportSettingsDefinitionPropType.isRequired\n}\n\nexport default injectIntl(ReportSettings)\n","import React from 'react'\nimport {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport {api} from 'tocco-util'\nimport {call, put, take} from 'redux-saga/effects'\n\nimport rest from '../../../rest'\nimport notification from '../../../notification'\nimport ReportSettings from '../../components/ReportSettings'\nimport {invokeActionAsync} from './simpleAction'\n\nexport default function* (actionDefinition, selection, parent, params, config) {\n const answerChannel = yield call(channel)\n const settingsModalId = yield call(displayReportSettings, actionDefinition, selection, answerChannel, config)\n yield call(awaitSettingsSubmit, actionDefinition, answerChannel, settingsModalId, selection)\n}\n\nexport function* displayReportSettings(actionDefinition, selection, answerChannel, config) {\n const options = {\n queryParams: {\n model: selection.entityName,\n ...(selection.mode === 'ID' ? {keys: selection.ids.join(',')} : {})\n }\n }\n\n const resource = `report/${actionDefinition.reportId}/settings`\n const {body: settingsDefinition} = yield call(rest.requestSaga, resource, options)\n const onSubmit = formValues => answerChannel.put({\n formValues,\n settingsDefinition\n })\n const settingsModalId = yield call(uuid)\n\n yield put(notification.modal(\n settingsModalId,\n settingsDefinition.description.name,\n null,\n () => (\n <ReportSettings\n listApp={config.listApp}\n formApp={config.formApp}\n onSubmit={onSubmit}\n settingsDefinition={settingsDefinition}\n />\n ),\n true\n ))\n\n return settingsModalId\n}\n\nexport function* awaitSettingsSubmit(definition, answerChannel, settingsModalId, selection) {\n while (true) {\n const {\n formValues: {customSettings, generalSettings, recipientSettings},\n settingsDefinition\n } = yield take(answerChannel)\n\n definition.endpoint = 'report/generations'\n const customSettingsEntity = settingsDefinition.customSettings\n ? api.toEntity({\n __model: settingsDefinition.customSettings.entity.name,\n ...customSettings\n })\n : null\n const params = {\n additionalProperties: {\n reportId: definition.reportId,\n generalSettings,\n recipientSettings\n },\n formData: customSettingsEntity\n }\n\n yield call(invokeActionAsync, definition, selection, null, params)\n yield put(notification.removeModal(settingsModalId))\n }\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport React from 'react'\nimport {consoleLogger} from 'tocco-util'\nimport {channel} from 'redux-saga'\n\nimport notification from '../../../notification'\n\nexport default function* (definition, selection, parent, params, config) {\n if (definition.appId) {\n if (definition.fullscreen) {\n if (config.customActions && config.customActions.fullscreen) {\n yield call(handleFullScreenActions, {definition, selection, config})\n } else {\n yield call(consoleLogger.logError, 'Unable to render custom action: No fullscreen handler provided')\n }\n } else {\n if (config.appComponent) {\n return yield call(handleCustomActionModal, {definition, config, selection})\n } else {\n yield call(consoleLogger.logError, 'Unable to render custom action: No appComponent provided')\n }\n }\n } else {\n const handler = config && config.customActions && config.customActions[definition.id]\n if (handler) {\n return yield call(handleAppActionsFallback, {definition, selection, parent, params, config, handler})\n } else {\n yield call(consoleLogger.logError, `Unable to load custom action with id ${definition.id}`)\n }\n }\n}\n\nconst actionStatus = {\n OK: 'ok',\n NOT_OK: 'not_ok',\n CANCEL: 'cancel'\n}\n\nexport function* handleCustomActionModal({definition, selection, config}) {\n const answerChannel = yield call(channel)\n\n const ActionComponent = config.appComponent\n yield put(notification.modal(\n `action-${definition.appId}`,\n `client.actions.${definition.appId}.title`,\n null,\n ({close}) => {\n const onSuccess = ({message, remoteEvents}) => {\n close()\n answerChannel.put({status: actionStatus.OK, message, remoteEvents})\n }\n\n const onError = ({message}) => {\n close()\n answerChannel.put({status: actionStatus.NOT_OK, message})\n }\n\n const onCancel = () => {\n close()\n answerChannel.put({status: actionStatus.CANCEL})\n }\n\n return <ActionComponent\n appId={definition.appId}\n context={config.context}\n actionProperties={definition.properties}\n selection={selection}\n navigationStrategy={config.navigationStrategy || {}}\n onSuccess={onSuccess}\n onError={onError}\n onCancel={onCancel}\n />\n },\n true\n ))\n const response = yield take(answerChannel)\n if (response.status === actionStatus.CANCEL) {\n return null\n }\n\n const success = response.status === actionStatus.OK\n if (response.message !== null) {\n const type = success ? 'success' : 'warning'\n const title = response.message || 'client.component.actions.successDefault'\n\n yield put(notification.toaster({type, title}))\n }\n return {success: success, remoteEvents: response.remoteEvents}\n}\n\nexport function* handleFullScreenActions({definition, selection, config}) {\n yield call(config.customActions.fullscreen, definition, selection)\n}\n\nexport function* handleAppActionsFallback({definition, selection, config, parent, params, handler}) {\n const answerChannel = yield call(channel)\n const onSuccess = ({message, remoteEvents}) => {\n answerChannel.put({status: actionStatus.OK, message, remoteEvents})\n }\n const onError = ({message}) => {\n answerChannel.put({status: actionStatus.NOT_OK, message})\n }\n const onCancel = () => {\n answerChannel.put({status: actionStatus.CANCEL})\n }\n\n yield call(handler, definition, selection, parent, params, config, onSuccess, onError, onCancel)\n\n return yield call(handleAnswer, answerChannel)\n}\n\nexport function* handleAnswer(answerChannel) {\n const response = yield take(answerChannel)\n if (response.status === actionStatus.CANCEL) {\n return null\n }\n\n const success = response.status === actionStatus.OK\n\n if (response.message) {\n const type = success ? 'success' : 'warning'\n const title = response.message === 'default' ? 'client.component.actions.successDefault' : response.message\n\n yield put(notification.toaster({type, title}))\n }\n\n return {success: success, remoteEvents: response.remoteEvents}\n}\n","import _isPlainObject from 'lodash/isPlainObject'\nimport {channel} from 'redux-saga'\nimport {call, all, put, spawn, take, select} from 'redux-saga/effects'\n\nimport newNotification from '../../../notification'\nimport remoteEvents from '../../../remoteEvents'\nimport rest from '../../../rest'\n\nexport const loadScript = src => new Promise((resolve, reject) => {\n const s = document.createElement('script')\n s.src = src\n s.onload = resolve\n s.onerror = reject\n document.head.appendChild(s)\n})\n\nexport const loadCss = src => new Promise((resolve, reject) => {\n const head = document.getElementsByTagName('head')[0]\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = 'text/css'\n link.href = src\n link.media = 'all'\n link.onload = resolve\n link.onerror = reject\n head.appendChild(link)\n})\n\nexport function* loadSequentially(sources) {\n const currentEnv = window.legacyActionEnv || 'new'\n const serverSettings = yield call(rest.fetchServerSettings)\n for (const source of sources) {\n if (source.envs.includes(currentEnv)) {\n yield call(source.handler, `${source.src}?v=${serverSettings.niceRevision}`)\n }\n }\n}\n\nexport const sources = [\n {src: '/nice2/javascript/lang.release.js', handler: loadScript, envs: ['new']},\n {src: '/nice2/javascript/nice2-ext-newclient-actions.release.js', handler: loadScript, envs: ['new']},\n {src: '/nice2/javascript/nice2-admin.release.js', handler: loadScript, envs: ['new']},\n {\n src: '/nice2/javascript/nice2-newclient-actions-public.release.js',\n handler: loadScript,\n envs: ['legacy-public']\n },\n {\n src: '/nice2/javascript/nice2-newclient-actions-setup.release.js',\n handler: loadScript,\n envs: ['legacy-public', 'legacy-admin', 'new']\n },\n {src: '/nice2/dwr-all.js', handler: loadScript, envs: ['new']},\n {src: '/js/ext-extensions/ckeditor/ckeditor/ckeditor.js', handler: loadScript, envs: ['new']},\n {src: '/css/themes/blue-medium.css', handler: loadCss, envs: ['new']},\n {src: '/css/nice2-admin.css', handler: loadCss, envs: ['new']},\n {src: '/css/nice2-new-client-legacy-actions.css', handler: loadCss, envs: ['new']}\n]\n\nexport const channelFeedingCallback = channel => arg => {\n channel.put(arg)\n}\n\nexport function* readRemoteEvents(remoteEventsChannel) {\n while (true) {\n const event = yield take(remoteEventsChannel)\n const action = remoteEvents.remoteEvent(event)\n yield put(action)\n }\n}\n\nexport function* registerRemoteEventsListener() {\n const dataRegistry = yield call([window.app, window.app.getDataRegistry])\n if (dataRegistry.setNewClientCallback) {\n const remoteEventsChannel = yield call(channel)\n const callback = yield call(channelFeedingCallback, remoteEventsChannel)\n yield call([dataRegistry, dataRegistry.setNewClientCallback], callback)\n yield spawn(readRemoteEvents, remoteEventsChannel)\n }\n}\n\nexport function* handleNotification(notification) {\n const message = notification.message.replace(/&nbsp;/g, ' ')\n\n let action\n\n switch (notification.level) {\n case 'ERROR':\n action = newNotification.toaster({type: 'error', title: message})\n break\n case 'INFO':\n action = newNotification.toaster({type: 'info', title: message})\n break\n default:\n throw new Error(`Unsupported notification level: ${notification.level}`)\n }\n\n if (action) {\n yield put(action)\n }\n}\n\nexport function* readNotifications(notificationsChannel) {\n while (true) {\n const notification = yield take(notificationsChannel)\n yield call(handleNotification, notification)\n }\n}\n\nexport function* registerNotificationsListener() {\n const gui = yield call([window.app, window.app.getGui])\n const notifier = yield call([gui, gui.getNotifier])\n if (notifier.setNewClientCallback) {\n const notificationsChannel = yield call(channel)\n const callback = yield call(channelFeedingCallback, notificationsChannel)\n yield call([notifier, notifier.setNewClientCallback], callback)\n yield spawn(readNotifications, notificationsChannel)\n }\n}\n\nexport function* initLegacyActionsEnv() {\n if (window.legacyActionsEnvInitialized !== true) {\n yield call(loadSequentially, sources)\n yield call(window.setUpLegacyActionsEnv)\n }\n yield call(registerRemoteEventsListener)\n yield call(registerNotificationsListener)\n}\n\nexport const listSelector = state => state.list\n\nexport const entityListSelector = state => state.entityList\nexport const entityDetailSelector = state => state.entityDetail\n\nexport const getOrderByString = sortingArray => sortingArray && sortingArray.length > 0\n ? rest.createSortingString(sortingArray)\n : null\n\nexport const getManualQuery = (selection, listState) => ({\n ...new window.nice2.netui.ManualQuery(),\n entityName: selection.entityName,\n queryWhere: selection.query.where,\n queryOrderBy: getOrderByString(listState.sorting)\n})\n\nexport const getListFormId = listState => ({\n ...new window.form.FormIdentifier(),\n scope: 'list',\n formName: listState.formDefinition.id\n})\n\nexport function* getSelection(selection) {\n const legacySelection = {\n entityName: selection.entityName\n }\n\n if (selection.type === 'ID') {\n legacySelection.selectedEntities = selection.ids\n legacySelection.selectionType = 'SELECTION'\n } else if (selection.type === 'QUERY') {\n const listState = yield select(listSelector)\n\n legacySelection.selectionType = 'NEW_CLIENT_QUERY'\n legacySelection.manualQuery = getManualQuery(selection, listState)\n legacySelection.listForm = getListFormId(listState)\n legacySelection.searchFilters = selection.query.filter\n } else {\n throw new Error(`Unsupported selection type: ${selection.type}`)\n }\n\n return legacySelection\n}\n\nexport function* getScope() {\n const list = yield select(entityListSelector)\n const detail = yield select(entityDetailSelector)\n\n if (list && detail) {\n throw new Error('Unable to get form scope. Unexpected state: entityList and entityDetail exist')\n }\n\n if (list) {\n return 'list'\n }\n\n if (detail) {\n if (detail.mode === 'update') {\n return 'detail'\n } else if (detail.mode === 'create') {\n return 'create'\n } else {\n throw new Error(`Unable to get form scope. Unexpected detail mode: ${detail.mode}`)\n }\n }\n\n throw new Error('Unable to get form scope. Expected to find either entityList or entityDetail in state')\n}\n\nexport default function* (definition, selection, parent, params, config) {\n yield call(initLegacyActionsEnv)\n\n const actionDefinition = new window.nice2.netui.actions.model.ClientActionDefinition(definition.path, definition.id)\n actionDefinition.setEnabled(!definition.readOnly)\n if (_isPlainObject(definition.properties)) {\n const setPropertyEffects = Object.entries(definition.properties)\n .map(([key, value]) => call([actionDefinition, actionDefinition.setProperty], key, value))\n yield all(setPropertyEffects)\n }\n\n const entityExplorer = new window.nice2.modules.NewClientLegacyActionsModule({\n entityName: selection.entityName,\n formName: selection.entityName\n })\n entityExplorer.init()\n\n const panel = new window.nice2.modules.NewClientLegacyActionsPanel({\n entityName: selection.entityName\n })\n\n const ctx = new window.nice2.modules.entityexplorer.EntityExplorerActionContext(entityExplorer, panel)\n if (selection.type === 'ID' && selection.ids.length === 1) {\n ctx.getRecord = () => ({id: selection.ids[0]})\n }\n\n const situation = {\n entityName: selection.entityName,\n scope: definition.scope || (yield call(getScope))\n }\n\n const action = window.NetuiActionRegistry.newActionFromDefinition(actionDefinition, situation, ctx)\n\n const legacySelection = yield call(getSelection, selection)\n\n action.getSelectionNumber = () => selection.type === 'ID' ? selection.ids.length : 0\n action.getSelection = () => legacySelection\n\n action.perform()\n}\n","import actionTypes from '../../actionTypes'\nimport handleSimpleAction from './simpleAction'\nimport handleReportAction from './report'\nimport handleCustomAction from './customAction'\nimport handleLegacyAction from './legacyAction'\n\nexport default {\n [actionTypes.SIMPLE]: handleSimpleAction,\n [actionTypes.REPORT]: handleReportAction,\n [actionTypes.CUSTOM]: handleCustomAction,\n [actionTypes.LEGACY]: handleLegacyAction\n}\n","export default function* preCheckHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.preCheck && preparationResponse.preCheck.success === false) {\n return {\n abort: true,\n abortMessage: preparationResponse.preCheck.message || 'client.component.actions.errorText'\n }\n }\n\n return {\n abort: false\n }\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\nimport React from 'react'\n\nimport notification from '../../../notification'\n\nexport default function* confirmHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.preCheck && preparationResponse.preCheck.confirmMessage) {\n const confirmResponse = yield call(promptConfirm, preparationResponse.preCheck.confirmMessage)\n return {abort: !confirmResponse}\n }\n\n return {abort: false}\n}\n\nexport function* promptConfirm(message) {\n const answerChannel = yield call(channel)\n const onYes = () => answerChannel.put(true)\n const onCancel = () => answerChannel.put(false)\n\n yield put(\n notification.confirm(\n 'client.component.actions.confirmTitle',\n <FormattedMessage id={message}/>,\n <FormattedMessage id=\"client.common.yes\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n onYes,\n onCancel\n )\n )\n return yield take(answerChannel)\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport React from 'react'\n\nimport simpleFormConnector from '../../containers/simpleFormConnector'\nimport notification from '../../../notification'\n\nexport default function* initialFormHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.initialFormValues) {\n const formValues = yield call(handleInitialForm, preparationResponse.initialFormValues, config)\n\n return {\n abort: formValues === null,\n params: {formData: formValues}\n }\n }\n return {\n abort: false\n }\n}\n\nexport const formValues = formValues => ({formValues})\n\nexport function* handleInitialForm({formDefinition, defaultValues, formTitle, formMessage}, config) {\n const answerChannel = yield call(channel)\n\n const id = new Date().valueOf()\n const onSend = ({values}) => answerChannel.put(formValues(values))\n const onCancel = () => answerChannel.put(formValues(null))\n const SimpleFormContainer = simpleFormConnector(config.formApp)\n yield put(notification.modal(id, formTitle, formMessage, () =>\n <SimpleFormContainer\n form={formDefinition.form}\n listApp={config.listApp}\n onSubmit={onSend}\n onCancel={onCancel}\n defaultValues={defaultValues}\n mode=\"create\"\n />\n ))\n\n const response = yield take(answerChannel)\n yield put(notification.removeModal(id))\n return response.formValues ? {model: formDefinition.model, paths: response.formValues} : null\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\nimport React from 'react'\n\nimport notification from '../../../notification'\n\nconst SELECTION_THRESHOLD_DEFAULT = 100\n\nexport default function* largeSelectionHandler(preparationResponse, params, definition, selection, config) {\n const threshold = definition.confirmationThreshold === null || definition.confirmationThreshold === undefined\n ? SELECTION_THRESHOLD_DEFAULT\n : definition.confirmationThreshold\n\n if (threshold !== -1 && selection && selection.count > threshold) {\n const confirmResponse = yield call(promptConfirm, selection.count)\n return {abort: !confirmResponse}\n }\n\n return {abort: false}\n}\n\nexport function* promptConfirm(count) {\n const answerChannel = yield call(channel)\n const onYes = () => answerChannel.put(true)\n const onCancel = () => answerChannel.put(false)\n\n yield put(\n notification.confirm(\n <FormattedMessage id=\"client.component.actions.confirmTitle\"/>,\n <FormattedMessage id=\"client.component.actions.largeSelectionConfirm\" values={{count}}/>,\n <FormattedMessage id=\"client.common.yes\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n onYes,\n onCancel\n )\n )\n return yield take(answerChannel)\n}\n","import {call} from 'redux-saga/effects'\n\nimport rest from '../../../rest'\nimport preCheckHandler from './preCheckHandler'\nimport confirmHandler from './confirmHandler'\nimport initialFormHandler from './initialFormHandler'\nimport largeSelectionHandler from './largeSelectionHandler'\n\nexport function* doRequest(definition, selection, parent) {\n const response = yield call(rest.requestSaga, definition.endpoint + '/check', {\n method: 'POST',\n body: {\n selection,\n parent\n }\n })\n return response.body\n}\n\nexport const getHandlers = () => [largeSelectionHandler, preCheckHandler, confirmHandler, initialFormHandler]\n\nexport default function* run(definition, selection, parent, config) {\n let abort = false\n let abortMessage = null\n let params = {}\n\n const preparationResponse = definition.endpoint\n ? yield call(doRequest, definition, selection, parent)\n : {}\n const handlers = yield call(getHandlers)\n\n let i = 0\n\n while (!abort && handlers[i]) {\n const handler = handlers[i]\n const handlerResponse = yield call(handler, preparationResponse, params, definition, selection, config)\n\n abort = handlerResponse.abort\n params = {...params, ...handlerResponse.params}\n if (handlerResponse.abortMessage) {\n abortMessage = handlerResponse.abortMessage\n }\n\n i++\n }\n\n return {abort, abortMessage, params}\n}\n","import prepare from './prepare'\n\nexport default prepare\n","import {takeEvery, all, call, put} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport actionHandlers from './actionHandlers'\nimport remoteEvents from '../../remoteEvents'\nimport prepare from './prepare'\nimport notification from '../../notification'\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(actions.ACTION_INVOKE, invokeAction, config)\n ])\n}\n\nexport function* invokeAction(config, {payload}) {\n const {definition, selection, parent} = payload\n\n const {abort, abortMessage, params} = yield call(prepare, definition, selection, parent, config)\n\n if (!abort) {\n const actionHandler = actionHandlers[definition.actionType]\n const response = yield call(actionHandler, definition, selection, parent, params, config)\n\n if (response && response.remoteEvents) {\n yield all(response.remoteEvents.map(remoteEvent => put(remoteEvents.remoteEvent(remoteEvent))))\n }\n\n if (response && response.success) {\n yield put(actions.actionInvoked(definition, selection, response))\n }\n } else if (abortMessage) {\n yield put(notification.toaster({type: 'info', title: abortMessage}))\n }\n}\n","export const isValidSelection = (selectedCount, {minSelection, maxSelection}) =>\n !(notEnough(selectedCount, minSelection) || tooMany(selectedCount, maxSelection))\n\nexport const selectionText = (selectedCount, {minSelection, maxSelection}, intl) => {\n if (notEnough(selectedCount, minSelection)) {\n return intl.formatMessage({id: 'client.component.actions.notEnoughSelected'}, {minSelection})\n }\n\n if (tooMany(selectedCount, maxSelection)) {\n return intl.formatMessage({id: 'client.component.actions.tooManySelected'}, {maxSelection})\n }\n\n return null\n}\n\nconst notEnough = (selectedCount, minSelection) => minSelection && selectedCount < minSelection\nconst tooMany = (selectedCount, maxSelection) => maxSelection && selectedCount > maxSelection\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {injectIntl} from 'react-intl'\nimport {ButtonMenu, MenuItem, Icon} from 'tocco-ui'\n\nimport {isValidSelection, selectionText} from './selectionHelper'\n\nconst getChildMenuItems = input => {\n const {onClick, definition, selectedCount, intl} = input\n const validSelection = isValidSelection(selectedCount, definition)\n const disabled = definition.readonly === true || !validSelection\n const title = selectionText(selectedCount, definition, intl)\n const isActionGroup = definition.componentType === 'action-group'\n return <MenuItem\n {...(!isActionGroup && !disabled && {onClick: () => onClick(definition)})}\n disabled={disabled}\n title={title}\n key={`MenuItem-${definition.id}`}\n >\n <span>{definition.icon && <Icon icon={definition.icon}/>} {definition.label}</span>\n {\n definition.componentType === 'action-group'\n && definition.children.map(child => getChildMenuItems({...input, definition: child}))\n }\n </MenuItem>\n}\n\nconst ActionGroup = props => {\n const {definition, onClick} = props\n const hasDefaultAction = (definition.defaultAction && Object.keys(definition.defaultAction).length > 0)\n\n const label = hasDefaultAction ? definition.defaultAction.label : definition.label\n const onClickHandler = hasDefaultAction\n ? () => {\n onClick(definition.defaultAction)\n }\n : null\n const actionId = hasDefaultAction ? definition.defaultAction.id : definition.id\n return <ButtonMenu\n buttonProps={{look: 'raised'}}\n label={label}\n data-cy={`action-${actionId}`}\n onClick={onClickHandler}>\n {\n definition.children.map((childDefinition, idx) => getChildMenuItems({...props, definition: childDefinition}))\n }\n </ButtonMenu>\n}\n\nActionGroup.propTypes = {\n intl: PropTypes.object.isRequired,\n definition: PropTypes.object.isRequired,\n onClick: PropTypes.func.isRequired,\n selectedCount: PropTypes.number,\n disabled: PropTypes.bool\n}\n\nexport default injectIntl(ActionGroup)\n","\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport {Button} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {selectionText, isValidSelection} from './selectionHelper'\n\nexport const SingleAction = ({definition, onClick, selectedCount, disabled, intl}) => {\n const validSelection = isValidSelection(selectedCount, definition)\n const title = selectionText(selectedCount, definition, intl)\n return (\n <Button\n data-cy={`action-${definition.id}`}\n look=\"raised\"\n onClick={e => {\n onClick(definition)\n e.stopPropagation()\n }}\n icon={definition.icon}\n {...definition.label && definition.useLabel === 'NO' ? {title: definition.label} : {label: definition.label}}\n {...(definition.readonly === true || !validSelection || disabled) && {disabled: true}}\n title={title}\n />\n )\n}\n\nSingleAction.propTypes = {\n intl: PropTypes.object.isRequired,\n definition: PropTypes.object.isRequired,\n onClick: PropTypes.func,\n selectedCount: PropTypes.number,\n disabled: PropTypes.bool\n}\n\nexport default injectIntl(SingleAction)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport _omit from 'lodash/omit'\n\nimport componentTypes from '../actionComponentTypes'\nimport {modeFitsScopes} from '../actions'\nimport ActionGroup from './ActionGroup'\nimport SingleAction from './SingleAction'\n\nconst ActionVisual = ({definition, onClick, selection, parent, mode, callback, disabled, customRenderedActions}) => {\n if (customRenderedActions && customRenderedActions[definition.id]) {\n return customRenderedActions[definition.id]()\n }\n\n if (!modeFitsScopes(mode, definition.scopes)) {\n return null\n }\n\n const ActionType = definition.componentType === componentTypes.ACTION_GROUP ? ActionGroup : SingleAction\n\n return (\n <ActionType\n definition={definition}\n onClick={definition => {\n onClick(_omit(definition, ['label']), selection, parent, callback)\n }}\n selectedCount={selection.count}\n disabled={disabled}\n />\n )\n}\n\nActionVisual.propTypes = {\n /**\n * Object as derived from the form definition.\n */\n definition: PropTypes.shape({\n id: PropTypes.string,\n type: PropTypes.string,\n useLabel: PropTypes.string,\n icon: PropTypes.string,\n label: PropTypes.string,\n config: PropTypes.object,\n scopes: PropTypes.arrayOf(PropTypes.string),\n componentType: PropTypes.string,\n children: PropTypes.Array\n }).isRequired,\n selection: PropTypes.shape({\n entityName: PropTypes.string.isRequired,\n ids: (props, propName, componentName) => {\n if (props.selection && props.selection.type === 'ID' && !props.selection[propName]) {\n return new Error(`Selection.ids prop not defined. Component: ${componentName}'.`)\n }\n },\n query: (props, propName, componentName) => {\n if (props.selection && props.selection.type === 'QUERY' && !props.selection[propName]) {\n return new Error(`Selection.query prop not defined. Component: ${componentName}'.`)\n }\n },\n type: PropTypes.oneOf(['ID', 'QUERY']).isRequired,\n count: PropTypes.number\n }).isRequired,\n onClick: PropTypes.func.isRequired,\n callback: PropTypes.func,\n /**\n * Used to render action conditionally if mode fits definition mode.\n */\n mode: PropTypes.oneOf(['create', 'update']),\n /**\n * Depending on the context a parent entity of the current entity can be passed. This information\n * can be important when an action is executed.\n */\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string\n }),\n disabled: PropTypes.bool,\n /**\n * Used if a custom Rendering is desired. E.g. save button\n */\n customRenderedActions: PropTypes.objectOf(PropTypes.func)\n}\n\nconst Action = props => {\n if (props.definition.componentType === componentTypes.ACTION_BAR) {\n return props.definition.children.map(child => (\n <ActionVisual key={`action-${props.definition.id}-${child.id}`} {...props} definition={child}/>\n )\n )\n }\n\n return <ActionVisual {...props}/>\n}\n\nAction.propTypes = {\n definition: PropTypes.shape({\n id: PropTypes.string,\n componentType: PropTypes.string,\n children: PropTypes.Array\n }).isRequired\n}\n\nexport default Action\n","import {connect} from 'react-redux'\n\nimport {actionInvoke} from '../modules/actions'\nimport Action from '../components/Action'\n\nconst mapActionCreators = {\n onClick: actionInvoke\n}\n\nexport default connect(null, mapActionCreators)(Action)\n","import {isAction} from './actions'\nimport addToStore from './addToStore'\nimport * as actions from './modules/actions'\nimport Action from './containers/ActionContainer'\nimport {getSingleEntitySelection} from './utils/selection'\n\nexport default {\n isAction,\n Action,\n addToStore,\n actions,\n getSingleEntitySelection\n}\n","import {saga as sagasUtil, reducer as reducerUtil} from 'tocco-util'\n\nimport errorLoging from '../errorLogging'\nimport reducer from './modules/reducer'\nimport sagas from './modules/sagas'\n\nexport default (store, config) => {\n reducerUtil.injectReducers(store, {actions: reducer})\n store.sagaMiddleware.run(sagasUtil.autoRestartSaga(sagas, config, errorLoging.logError))\n}\n","export const getSingleEntitySelection = (entityName, key) => ({\n entityName,\n type: 'ID',\n ids: [key],\n count: 1\n})\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nexport const StyledInputWrapper = styled.div`\n width: calc(100% - 20px); // subtract extender width\n`\nexport const StyledInputItemWrapper = styled.div`\n display: inline-block;\n width: 50%;\n\n * {\n line-height: unset !important;\n text-align: center;\n }\n`\n\nexport const StyledIconWrapper = styled.div`\n font-size: ${scale.font(-2.7)};\n display: flex;\n align-items: center;\n`\n\nexport const StyledRange = styled.div`\n display: flex;\n`\n\nexport const StyledInput = styled.div`\n flex: 1;\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n width: inherit;\n`\n\nexport const StyledExtender = styled.div`\n display: flex;\n align-items: center;\n position: relative;\n left: 2px;\n z-index: 1;\n`\n","import moment from 'moment'\n\nconst datetimeFormat = 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\nconst dateFormat = 'YYYY-MM-DD'\n\nconst rangeTypeMappings = {\n datetime: {\n type: 'date',\n toRange: value => {\n const fromValue = value ? moment(value).utc().format(datetimeFormat) : null\n const toValue = value ? moment(value).utc().add(1, 'd').format(datetimeFormat) : null\n return {from: fromValue, to: toValue, isRangeValue: true}\n },\n fromRange: value => {\n if (value && value.from) {\n return moment.utc(value.from, datetimeFormat).local().format(dateFormat)\n }\n if (value && value.to) {\n return moment.utc(value.to, datetimeFormat).local().format(dateFormat)\n }\n return null\n },\n getToOptions: (options, fromValue) => ({...options, flatpickrOptions: {minDate: fromValue}}),\n getFromOptions: (options, toValue) => ({...options, flatpickrOptions: {maxDate: toValue}})\n },\n date: {\n getToOptions: (options, fromValue) => ({...options, flatpickrOptions: {minDate: fromValue}}),\n getFromOptions: (options, toValue) => ({...options, flatpickrOptions: {maxDate: toValue}})\n }\n}\n\nexport default rangeTypeMappings\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport _omit from 'lodash/omit'\n\nimport {\n StyledRange,\n StyledInputWrapper,\n StyledInputItemWrapper,\n StyledIconWrapper,\n StyledInput,\n StyledExtender\n} from './StyledRange'\nimport EditableValue from '../EditableValue'\nimport Ball from '../Ball'\nimport Icon from '../Icon'\nimport rangeTypeMappings from './rangeTypeMappings'\n\n/**\n * Allows to render EditableValues as a range. The value can be switched between a range or single value.\n */\nconst Range = props => {\n const {value, events, readOnly, type, options} = props\n const hasRangeValue = typeof value === 'object' && value && value.isRangeValue\n\n const exactEvents = useMemo(() => ({\n ...events,\n onChange: value => {\n events.onChange(value)\n }\n }))\n\n const toEvents = useMemo(() => ({\n onChange: toValue => {\n events.onChange({\n ...value,\n to: toValue\n })\n }\n }))\n\n const fromEvents = useMemo(() => ({\n onChange: fromValue => {\n events.onChange({\n ...value,\n from: fromValue\n })\n }\n }))\n\n const typeMapping = rangeTypeMappings[type]\n\n const getToOptions = (options, fromValue) =>\n typeMapping && typeMapping.getToOptions\n ? typeMapping.getToOptions(options, fromValue)\n : options\n\n const getFromOptions = (options, toValue) =>\n typeMapping && typeMapping.getFromOptions\n ? typeMapping.getFromOptions(options, toValue)\n : options\n\n const getFromOrTo = value =>\n typeMapping && typeMapping.fromRange\n ? typeMapping.fromRange(value)\n : value && value.from ? value.from : value && value.to ? value.to : null\n\n const getRangeValue = value =>\n typeMapping && typeMapping.toRange\n ? typeMapping.toRange(value)\n : {from: value, to: value, isRangeValue: true}\n\n const baseType = typeMapping && typeMapping.type ? typeMapping.type : type\n\n return <StyledRange>\n <StyledInputWrapper>\n {!hasRangeValue\n ? <EditableValue\n type={baseType}\n {..._omit(props, ['type'])}\n events={exactEvents}\n />\n : <StyledInput>\n <StyledInputItemWrapper>\n <EditableValue\n {...props}\n options={getFromOptions(options, value.to)}\n value={value && value.from ? value.from : null}\n events={fromEvents}\n />\n </StyledInputItemWrapper>\n <StyledIconWrapper>\n <Icon icon=\"horizontal-rule\"/>\n </StyledIconWrapper>\n <StyledInputItemWrapper>\n <EditableValue\n {...props}\n options={getToOptions(options, value.from)}\n value={value && value.to ? value.to : null}\n events={toEvents}\n />\n </StyledInputItemWrapper>\n </StyledInput>}\n </StyledInputWrapper>\n <StyledExtender>\n <Ball disabled={readOnly} icon={hasRangeValue ? 'chevron-left' : 'chevron-down'} onClick={() => {\n if (hasRangeValue) {\n events.onChange(getFromOrTo(value))\n } else {\n events.onChange(getRangeValue(value))\n }\n }}>\n </Ball>\n </StyledExtender>\n </StyledRange>\n}\n\nRange.propTypes = {\n /**\n * EditableValue type\n */\n type: PropTypes.string,\n /**\n * The Range Component can either handle a single value or and object with the following three\n * attributes: isRangeValue (true), from, to. The later two are single values.\n * example:\n * {\n * isRangeValue: true,\n * from: 1,\n * to: 2\n * }\n */\n value: PropTypes.any,\n /**\n * See EditableValue\n */\n events: PropTypes.shape({\n onChange: PropTypes.func\n }).isRequired,\n /**\n * See EditableValue\n */\n readOnly: PropTypes.bool,\n /**\n * See EditableValue\n */\n options: PropTypes.object,\n /**\n * Shown above \"from\" input\n */\n fromText: PropTypes.string,\n /**\n * Shown above \"to\" input\n */\n toText: PropTypes.string\n}\n\nexport default Range\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true\n })\n}\n","export default {\n getOptions: ({formField, formName, formData}) => ({\n upload: document => {\n formData.uploadDocument(formName, formField.id, document)\n },\n uploadText: formData.intl.formatMessage({id: 'client.component.upload.upload'}),\n uploadingText: formData.intl.formatMessage({id: 'client.component.upload.uploading'}),\n downloadText: formData.intl.formatMessage({id: 'client.component.upload.downloadTitle'}),\n deleteText: formData.intl.formatMessage({id: 'client.component.upload.deleteTitle'})\n }),\n fixLabel: () => true\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null)\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n hasValue: (value, formField) => {\n const locationMapping = formField.locationMapping\n return !!(value[locationMapping.city] || value[locationMapping.postcode])\n },\n getValue: ({formField, formData}) => {\n const locationMapping = formField.locationMapping\n const filteredLocationData = formData.formValues\n\n let renamedLocationData = {}\n for (const locKey in locationMapping) {\n for (const filteredLocDataKey in filteredLocationData) {\n if (locationMapping[locKey] === filteredLocDataKey) {\n renamedLocationData = {...renamedLocationData, [locKey]: filteredLocationData[filteredLocDataKey]}\n }\n }\n }\n return renamedLocationData\n },\n getEvents: ({formField, formName, formData, events}) => {\n const locationMapping = formField.locationMapping || {}\n const onChange = locationObject => {\n for (const key in locationMapping) {\n if (locationMapping[key] && locationObject[key] !== undefined) {\n formData.changeFieldValue(formName, locationMapping[key], locationObject[key])\n }\n }\n }\n return {\n ...events,\n onChange,\n onBlur: () => {\n formData.touchField(formName, formField.id)\n }\n }\n },\n dataContainerProps: ({formField, formName}) => ({\n locations: [formField.id],\n formValues: {\n formName: formName,\n fields: formField.locationMapping ? Object.values(formField.locationMapping) : {}\n },\n isDirty: {\n formName: formName,\n fields: formField.locationMapping\n ? [formField.locationMapping.city, formField.locationMapping.postcode]\n : []\n },\n errors: {\n formName: formName,\n fields: [formField.locationMapping.city, formField.locationMapping.postcode]\n }\n }),\n getOptions: ({formField, formData}) => ({\n fetchSuggestions: (searchTerm, country) =>\n formData.loadLocationsSuggestions(formField.id, searchTerm, country, _get(formField, 'countries')),\n isLoading: _get(formData, ['locations', formField.id, 'isLoading'], false),\n suggestions: _get(formData, ['locations', formField.id, 'suggestions'], null),\n mapButtonTitle: formData.intl.formatMessage({id: 'client.component.location.mapButtonTitle'})\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true\n })\n}\n","import _get from 'lodash/get'\nimport React from 'react'\n\nconst settings = {\n SEARCH_RESULT_LIMIT: 50,\n SUGGESTION_LIMIT: 10,\n SUGGESTION_ORDER_FIELD: 'update_timestamp'\n}\n\nexport default {\n dataContainerProps: ({formField}) => ({\n relationEntities: [formField.id],\n tooltips: [formField.targetEntity],\n navigationStrategy: true\n }),\n getOptions: ({formField, formName, formData}) => ({\n options: _get(formData, ['relationEntities', formField.id, 'data'], []),\n moreOptionsAvailable: _get(formData, ['relationEntities', formField.id, 'moreEntitiesAvailable'], false),\n isLoading: _get(formData, ['relationEntities', formField.id, 'isLoading'], false),\n fetchOptions: () => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n forceReload: true,\n limit: settings.SUGGESTION_LIMIT,\n sorting: [{field: settings.SUGGESTION_ORDER_FIELD, order: 'desc'}],\n formBase: formField.formBase\n }),\n searchOptions: searchTerm => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n searchTerm,\n limit: settings.SEARCH_RESULT_LIMIT,\n forceReload: true,\n formBase: formField.formBase\n }),\n openAdvancedSearch: value => formData.openAdvancedSearch(formName, formField, value),\n tooltips: _get(formData.tooltips, formField.targetEntity, null),\n loadTooltip: id => formData.loadTooltip(formField.targetEntity, id),\n noResultsText: formData.intl.formatMessage(\n {id: 'client.component.remoteselect.noResultsText'}\n ),\n moreOptionsAvailableText: formData.intl.formatMessage(\n {id: 'client.component.remoteselect.moreOptionsAvailableText'}\n ),\n DetailLink: formData.navigationStrategy && formData.navigationStrategy.DetailLink\n ? ({entityKey, children}) =>\n <formData.navigationStrategy.DetailLink\n entityName={formField.targetEntity}\n entityKey={entityKey}\n >\n {children}\n </formData.navigationStrategy.DetailLink>\n : null,\n createPermission: formData.entityModel\n && formField.relationName\n && formData.entityModel.paths[formField.relationName].createPermission,\n openRemoteCreate: () => formData.openRemoteCreate(formField, formName, formData)\n })\n}\n","import _get from 'lodash/get'\n\nconst settings = {\n LIMIT: 10000\n}\n\nexport default {\n dataContainerProps: ({formField}) => ({\n relationEntities: [formField.id],\n tooltips: [formField.targetEntity]\n }),\n getOptions: ({formField, formData}) => ({\n options: _get(formData, ['relationEntities', formField.id, 'data'], []),\n isLoading: _get(formData, ['relationEntities', formField.id, 'isLoading'], false),\n tooltips: _get(formData.tooltips, formField.targetEntity, null),\n loadTooltip: id => formData.loadTooltip(formField.targetEntity, id),\n noResultsText: formData.intl.formatMessage({id: 'client.component.remoteselect.noResultsText'}),\n fetchOptions: () => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n forceReload: false,\n limit: settings.LIMIT\n })\n })\n}\n","export default {\n fixLabel: () => true\n}\n","import decimal from './decimal'\nimport document from './document'\nimport duration from './duration'\nimport integer from './integer'\nimport location from './location'\nimport moneyamount from './moneyamount'\nimport number from './number'\nimport phone from './phone'\nimport remote from './remote'\nimport select from './select'\nimport searchFilter from './searchFilter'\nimport html from './html'\nimport boolean from './boolean'\nimport percent from './percent'\n\nexport default {\n 'binary': document,\n 'boolean': boolean,\n 'counter': number,\n 'data-amount': number,\n 'decimal': decimal,\n 'document': document,\n 'double': decimal,\n 'duration': duration,\n 'html': html,\n 'image': document,\n 'integer': integer,\n 'location': location,\n 'long': integer,\n 'moneyamount': moneyamount,\n 'marking': boolean,\n 'multi-remote-field': remote,\n 'multi-select-box': select,\n 'named-upload': document,\n 'number': number,\n 'phone': phone,\n 'search-filter': searchFilter,\n 'single-remote-field': remote,\n 'single-select-box': select,\n 'sorting': number,\n 'percent': percent\n}\n","export default {\n getOptions: ({formData}) => ({\n hoursLabel: formData.intl.formatMessage({id: 'client.component.duration.hoursLabel'}),\n minutesLabel: formData.intl.formatMessage({id: 'client.component.duration.minutesLabel'})\n })\n}\n","export default {\n fixLabel: () => true\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', 2),\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true,\n fixedDecimalScale: true\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n customPhoneRegex: _get(formField, 'validation.phone.customRegex', null),\n defaultCountry: _get(formField, 'validation.phone.defaultRegion', null)\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n dataContainerProps: ({formField}) => ({\n searchFilters: [formField.model]\n }),\n getOptions: ({formField, formData}) => ({\n isMulti: formField.multiple,\n options: _get(formData.searchFilters, formField.model, null),\n fetchOptions: () => formData.loadSearchFilters(formField.model, formField.group),\n noResultsText: formData.intl.formatMessage({id: 'client.component.searchfilter.noResultsText'})\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: false\n })\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {EditableValue, Range} from 'tocco-ui'\n\nimport editableTypeConfigs from './editableTypeConfigs'\n\nconst getEvents = (type, formField, formName, formData, events) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getEvents\n ? editableTypeConfigs[type].getEvents({formField, formName, formData, events})\n : events\n\nconst getValue = (type, formField, formName, formData, currentValue) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getValue\n ? editableTypeConfigs[type].getValue({formField, formName, formData, currentValue})\n : currentValue\n\nconst getOptions = (type, formField, formName, formData) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getOptions\n ? editableTypeConfigs[type].getOptions({formField, formName, formData})\n : {}\n\nconst EditableValueFactory = ({type, range, formField, formName, value, info, events, formData}) => {\n const formType = formField.dataType || formField.componentType\n const options = getOptions(formType, formField, formName, formData)\n\n events = getEvents(formType, formField, formName, formData, events)\n value = getValue(formType, formField, formName, formData, value)\n\n const Component = range ? Range : EditableValue\n\n return (\n <Component\n type={type}\n events={events}\n value={value}\n {...info}\n options={options}\n {...(range && {\n fromText: formData.intl.formatMessage({id: 'client.component.range.from'}),\n toText: formData.intl.formatMessage({id: 'client.component.range.to'})\n })}\n />\n )\n}\n\nEditableValueFactory.propTypes = {\n type: PropTypes.string,\n range: PropTypes.bool,\n formName: PropTypes.string,\n formField: PropTypes.shape({\n dataType: PropTypes.string,\n componentType: PropTypes.string\n }),\n value: PropTypes.any,\n info: PropTypes.object,\n events: PropTypes.object,\n formData: PropTypes.object\n}\n\nexport default (type, range) => props => <EditableValueFactory type={type} range={range} {...props}/>\n","export default {\n getOptions: ({formData}) => ({\n downloadTitle: formData.intl.formatMessage({id: 'client.component.upload.downloadTitle'})\n })\n}\n","import React from 'react'\nexport default {\n getOptions: ({formField, formData}) => ({\n DetailLink: formData.navigationStrategy && formData.navigationStrategy.DetailLink\n ? ({entityKey, children}) =>\n <formData.navigationStrategy.DetailLink\n entityName={formField.targetEntity}\n entityKey={entityKey}\n >\n {children}\n </formData.navigationStrategy.DetailLink>\n : null\n })\n\n}\n","import document from './document'\nimport remote from './remote'\nimport description from './description'\nimport number from './number'\nimport moneyamount from './moneyamount'\n\nexport default {\n 'document-compact': document,\n 'multi-remote-field': remote,\n 'single-remote-field': remote,\n 'description': description,\n 'number': number,\n 'moneyamount': moneyamount\n}\n","export default {\n getOptions: ({formField}) => ({\n mode: formField.mode,\n title: formField.title\n }),\n getValue: ({formField}) => formField.text\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null)\n })\n}\n","\nimport _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', 2)\n })\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedValue} from 'tocco-ui'\n\nimport formattedTypeConfigs from './formattedTypeConfigs'\n\nconst getOptions = (fieldType, formField, formData) =>\n formattedTypeConfigs[fieldType] && formattedTypeConfigs[fieldType].getOptions\n ? formattedTypeConfigs[fieldType].getOptions({formField, formData})\n : {}\n\nconst getValue = (fieldType, formField, formData, value) =>\n formattedTypeConfigs[fieldType] && formattedTypeConfigs[fieldType].getValue\n ? formattedTypeConfigs[fieldType].getValue({formField, formData})\n : value\n\nconst FormattedValueFactory = ({type, formField, value, formData, key, breakWords}) => {\n const fieldType = formField.dataType || formField.componentType\n const options = getOptions(fieldType, formField, formData, value)\n const overwrittenValue = getValue(fieldType, formField, formData, value)\n\n return <FormattedValue key={key} type={type} value={overwrittenValue} options={options} breakWords={breakWords}/>\n}\n\nFormattedValueFactory.propTypes = {\n type: PropTypes.string,\n formField: PropTypes.shape({\n dataType: PropTypes.string,\n componentType: PropTypes.string\n }),\n value: PropTypes.any,\n formData: PropTypes.object,\n key: PropTypes.string,\n breakWords: PropTypes.bool\n}\n\nexport default type => props => <FormattedValueFactory {...props} type={type}/>\n","import editableValueFactory from './editableValueFactory'\nimport formattedValueFactory from './formattedValueFactory'\n\nconst editableMapping = {\n 'binary': editableValueFactory('document'),\n 'birthdate': editableValueFactory('date'),\n 'boolean': editableValueFactory('boolean'),\n 'char': editableValueFactory('string'),\n 'code': editableValueFactory('text'),\n 'count': editableValueFactory('string'),\n 'counter': editableValueFactory('integer'),\n 'createts': editableValueFactory('datetime'),\n 'createuser': editableValueFactory('string'),\n 'compressed-text': editableValueFactory('text'),\n 'date': editableValueFactory('date'),\n 'datetime': editableValueFactory('datetime'),\n 'decimal': editableValueFactory('number'),\n 'display': formattedValueFactory('html'),\n 'description': formattedValueFactory('description'),\n 'document': editableValueFactory('document'),\n 'double': editableValueFactory('number'),\n 'duration': editableValueFactory('duration'),\n 'email': editableValueFactory('string'),\n 'fulltext-search': editableValueFactory('string'),\n 'html': editableValueFactory('html'),\n 'image': editableValueFactory('document'),\n 'identifier': editableValueFactory('string'),\n 'integer': editableValueFactory('integer'),\n 'ipaddress': editableValueFactory('string'),\n 'latitude': editableValueFactory('string'),\n 'location': editableValueFactory('location'),\n 'login': editableValueFactory('string'),\n 'long': editableValueFactory('integer'),\n 'longitude': editableValueFactory('string'),\n 'marking': editableValueFactory('boolean'),\n 'moneyamount': editableValueFactory('number'),\n 'multi-remote-field': editableValueFactory('multi-remote'),\n 'multi-select-box': editableValueFactory('multi-select'),\n 'named-upload': editableValueFactory('document'),\n 'percent': editableValueFactory('number'),\n 'phone': editableValueFactory('phone'),\n 'postcode': editableValueFactory('string'),\n 'pulldown-date': editableValueFactory('date'),\n 'search-filter': editableValueFactory('search-filter'),\n 'serial': editableValueFactory('string'),\n 'single-remote-field': editableValueFactory('remote'),\n 'single-select-box': editableValueFactory('single-select'),\n 'sorting': editableValueFactory('integer'),\n 'string': editableValueFactory('string'),\n 'text': editableValueFactory('text'),\n 'text-area': editableValueFactory('text'),\n 'time': editableValueFactory('time'),\n 'updatets': editableValueFactory('datetime'),\n 'updateuser': editableValueFactory('string'),\n 'upload': editableValueFactory('document'),\n 'url': editableValueFactory('url'),\n 'uuid': editableValueFactory('string'),\n 'version': editableValueFactory('string')\n}\nconst readOnlyMapping = {\n 'binary': formattedValueFactory('document'),\n 'birthdate': formattedValueFactory('date'),\n 'boolean': formattedValueFactory('boolean'),\n 'code': formattedValueFactory('text'),\n 'char': formattedValueFactory('string'),\n 'counter': formattedValueFactory('integer'),\n 'createuser': formattedValueFactory('string'),\n 'createts': formattedValueFactory('datetime'),\n 'compressed-text': formattedValueFactory('text'),\n 'data-amount': formattedValueFactory('number'),\n 'date': formattedValueFactory('date'),\n 'datetime': formattedValueFactory('datetime'),\n 'decimal': formattedValueFactory('number'),\n 'display': formattedValueFactory('html'),\n 'description': formattedValueFactory('description'),\n 'duration': formattedValueFactory('duration'),\n 'document': formattedValueFactory('document'),\n 'double': formattedValueFactory('number'),\n 'email': formattedValueFactory('string'),\n 'html': formattedValueFactory('html'),\n 'image': formattedValueFactory('document'),\n 'ipaddress': formattedValueFactory('string'),\n 'identifier': formattedValueFactory('string'),\n 'latitude': formattedValueFactory('string'),\n 'login': formattedValueFactory('string'),\n 'long': formattedValueFactory('integer'),\n 'longitude': formattedValueFactory('string'),\n 'moneyamount': formattedValueFactory('number'),\n 'multi-remote-field': formattedValueFactory('multi-remote'),\n 'multi-select-box': formattedValueFactory('multi-select'),\n 'named-upload': formattedValueFactory('document'),\n 'integer': formattedValueFactory('integer'),\n 'percent': formattedValueFactory('number'),\n 'phone': formattedValueFactory('phone'),\n 'postcode': formattedValueFactory('string'),\n 'pulldown-date': formattedValueFactory('date'),\n 'remote': formattedValueFactory('remote'),\n 'search-filter': formattedValueFactory('search-filter'),\n 'serial': formattedValueFactory('string'),\n 'single-remote-field': formattedValueFactory('remote'),\n 'single-select-box': formattedValueFactory('single-select'),\n 'sorting': formattedValueFactory('integer'),\n 'string': formattedValueFactory('string'),\n 'text': formattedValueFactory('text'),\n 'text-area': formattedValueFactory('text'),\n 'time': formattedValueFactory('time'),\n 'updatets': formattedValueFactory('datetime'),\n 'updateuser': formattedValueFactory('string'),\n 'upload': formattedValueFactory('document'),\n 'url': formattedValueFactory('url'),\n 'uuid': formattedValueFactory('string'),\n 'version': formattedValueFactory('string')\n}\n\nconst listMapping = {\n ...readOnlyMapping,\n binary: formattedValueFactory('document-compact'),\n document: formattedValueFactory('document-compact'),\n image: formattedValueFactory('document-compact')\n}\n\nconst searchMapping = {\n ...editableMapping,\n text: editableValueFactory('string'),\n birthdate: editableValueFactory('date', true),\n date: editableValueFactory('date', true),\n updatets: editableValueFactory('datetime', true),\n createts: editableValueFactory('datetime', true),\n datetime: editableValueFactory('datetime', true),\n moneyamount: editableValueFactory('number', true),\n percent: editableValueFactory('number', true),\n long: editableValueFactory('integer', true),\n integer: editableValueFactory('integer', true),\n decimal: editableValueFactory('number', true),\n counter: editableValueFactory('integer', true),\n time: editableValueFactory('time', true)\n}\n\nexport default {\n editable: editableMapping,\n readOnly: readOnlyMapping,\n list: listMapping,\n search: searchMapping\n}\n","import React from 'react'\nimport {consoleLogger} from 'tocco-util'\n\nimport mappings from './mappings'\n\nexport default (mappingType, type) => {\n if (!mappings[mappingType] || !mappings[mappingType][type]) {\n consoleLogger.log(`Unable to display field: unknown mapping type combination (${mappingType} / ${type})`)\n return () => <span/>\n }\n\n return mappings[mappingType][type]\n}\n","import factory from './fieldFactory'\nimport editableTypeConfigs from './editableTypeConfigs'\n\nexport default {factory, editableTypeConfigs}\n","import _forOwn from 'lodash/forOwn'\nimport _reduce from 'lodash/reduce'\nimport _pick from 'lodash/pick'\n\nexport const generalErrorField = '_error'\nexport const entityValidatorErrorsField = 'entityValidatorErrors'\nexport const relatedEntityErrorsField = 'relatedEntityErrors'\nexport const outdatedErrorField = 'outdatedError'\n\nconst getFieldErrors = formErrors => {\n const fieldErrors = {...formErrors}\n delete fieldErrors[generalErrorField]\n return fieldErrors\n}\n\nconst hasFieldErrors = formErrors => (\n Object.keys(getFieldErrors(formErrors)).length >= 1\n)\n\nconst hasValidatorErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[entityValidatorErrorsField] && Object.keys(errors[entityValidatorErrorsField]).length >= 1)\n}\n\nconst getValidatorErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return _reduce(errors[entityValidatorErrorsField], (result, value) => [...result, ...value], [])\n}\n\nconst hasRelatedEntityErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[relatedEntityErrorsField] && errors[relatedEntityErrorsField].length >= 1)\n}\n\nconst getGeneralErrors = formErrors => (\n formErrors[generalErrorField]\n)\n\nconst getFirstErrorField = formErrors => (\n Object.keys(getFieldErrors(formErrors))[0]\n)\n\nconst hasOutdatedError = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[outdatedErrorField] && Object.keys(errors[outdatedErrorField]).length >= 1)\n}\n\nconst outdatedResponseToFormError = (response, entity) => ({\n [generalErrorField]: {\n [outdatedErrorField]: {\n ..._pick(response, ['updateTimestamp', 'updateUser', 'key', 'model']),\n sameEntity: entity.model === response.model && entity.key === response.key\n }\n }\n})\n\nconst getOutdatedError = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return errors[outdatedErrorField]\n}\n\nconst getRelatedEntityErrorsCompact = formErrors => {\n const relatedEntityErrors = getGeneralErrors(formErrors).relatedEntityErrors\n\n return _reduce(relatedEntityErrors, (result, relatedEntityError) => {\n const {key, model, paths, entityValidatorErrors} = relatedEntityError\n\n const r = [...result]\n _forOwn(paths, (values, fieldName) => {\n _forOwn(values, (errors, errorKey) => {\n r.push(...(errors.map(e => `${e} (${fieldName}, ${model}, ${key})`)))\n })\n })\n\n if (entityValidatorErrors && Object.keys(entityValidatorErrors).length >= 1) {\n r.push(...(\n _reduce(\n entityValidatorErrors,\n (result, value) => [...result, ...(value.map(e => `${e} (${model}, ${key})`))],\n []))\n )\n }\n\n return r\n }, [])\n}\n\nconst addErrors = (errors, field, fieldErrors) => (\n {\n ...errors,\n [field]:\n {\n ...(errors[field] || {}),\n ...(fieldErrors || {})\n }\n }\n)\n\nexport default {\n hasFieldErrors,\n getFieldErrors,\n getValidatorErrors,\n hasValidatorErrors,\n hasRelatedEntityErrors,\n hasOutdatedError,\n getFirstErrorField,\n getRelatedEntityErrorsCompact,\n addErrors,\n outdatedResponseToFormError,\n getOutdatedError\n}\n","import PropTypes from 'prop-types'\nimport React, {memo} from 'react'\n\nimport StyledLayoutBox from './StyledLayoutBox'\n\n/**\n * Wrap as many <Layout.Box/> into a <Layout.Container> to layout them.\n */\nconst LayoutBox = ({children}) => (\n <StyledLayoutBox>\n {children}\n </StyledLayoutBox>\n)\n\nLayoutBox.propTypes = {\n children: PropTypes.node\n}\n\nexport default memo(LayoutBox)\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nconst StyledLayoutContainer = styled.div`\n display: grid;\n padding-right: ${scale.space(0)};\n ${({containerWidth, theme}) => containerWidth < 600\n? 'grid-template-columns: 100%;'\n : `grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n grid-gap: ${scale.space(0.25)({theme})}`\n };\n ${({occupiesRemainingHeight}) => occupiesRemainingHeight && `\n flex: 1;\n `};\n`\n\nexport default StyledLayoutContainer\n","import PropTypes from 'prop-types'\nimport React, {useRef, useState, useEffect} from 'react'\n\nimport StyledLayoutContainer from './StyledLayoutContainer'\n\nconst LayoutContainer = ({children, occupiesRemainingHeight}) => {\n const ref = useRef(null)\n const [containerWidth, setContainerWidth] = useState(0)\n\n const setPixelWidth = () => {\n setContainerWidth(ref.current.offsetWidth)\n }\n\n useEffect(() => {\n setPixelWidth()\n window.addEventListener('resize', setPixelWidth)\n return () => window.removeEventListener('resize', setPixelWidth)\n }, [])\n\n return (\n <StyledLayoutContainer\n ref={ref}\n containerWidth={containerWidth}\n occupiesRemainingHeight={occupiesRemainingHeight}>\n {children}\n </StyledLayoutContainer>\n )\n}\n\nLayoutContainer.propTypes = {\n children: PropTypes.node,\n occupiesRemainingHeight: PropTypes.bool\n}\n\nexport default LayoutContainer\n","import Box from './LayoutBox'\nimport Container from './LayoutContainer'\nimport StyledLayoutBox from './StyledLayoutBox'\nimport StyledLayoutContainer from './StyledLayoutContainer'\nimport {StyledScrollbar} from './StyledScrollbar'\n\nexport {\n StyledLayoutBox,\n StyledLayoutContainer,\n StyledScrollbar\n}\n\nexport default {\n Box,\n Container\n}\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport _get from 'lodash/get'\nimport {StatedValue, Typography} from 'tocco-ui'\nimport {consoleLogger} from 'tocco-util'\n\nimport field from '../field'\nimport fromData from '../formData'\n\nconst FormFieldWrapper = props => {\n const hasValueOverwrite = props.typeEditable && props.typeEditable.hasValue\n && props.typeEditable.hasValue(props.formData.formValues, props.formField)\n\n return <StatedValue\n {...props}\n dirty={props.formData.isDirty || props.dirty}\n error={props.formData.errors || props.error}\n hasValue={hasValueOverwrite || props.hasValue}\n >\n {React.cloneElement(props.children, {formData: props.formData})}\n </StatedValue>\n}\n\nFormFieldWrapper.propTypes = {\n typeEditable: PropTypes.object,\n children: PropTypes.node,\n formData: PropTypes.object,\n formField: PropTypes.object,\n dirty: PropTypes.bool,\n error: PropTypes.object,\n hasValue: PropTypes.bool\n}\n\nconst displayFieldTypes = ['display', 'description']\nconst multiTypes = ['multi-select-box', 'multi-remote-field', 'search-filter']\n\nconst isMultipleFields = (value, dataType) =>\n Array.isArray(value) && !multiTypes.includes(dataType)\n\nconst displayFieldAsDisplayOnly = (value, componentType, dataType, parentReadOnly) => {\n if (parentReadOnly) {\n return true\n }\n\n if (displayFieldTypes.includes(componentType)) {\n return true\n }\n\n if (isMultipleFields(value, dataType)) {\n return true\n }\n\n return false\n}\n\nexport const formFieldFactory = (fieldMappingType, data, resources = {}) => {\n try {\n const {\n formDefinitionField,\n entityField,\n id,\n value,\n dirty,\n touched,\n events,\n error,\n submitting,\n parentReadOnly,\n formName,\n mode\n } = data\n\n const {\n componentType,\n dataType,\n readonly\n } = formDefinitionField\n\n const readOnly = (\n parentReadOnly\n || readonly\n || submitting\n || !_get(entityField, 'writable', true)\n )\n\n const mandatory = !readOnly && _get(formDefinitionField, 'validation.mandatory', false) && mode !== 'search'\n const hasValue = value !== null\n && value !== undefined\n && value !== false\n && (value.length === undefined || value.length > 0)\n const isDisplay = displayFieldAsDisplayOnly(value, componentType, dataType, parentReadOnly)\n\n const type = formDefinitionField.dataType || formDefinitionField.componentType\n let requestedFromData\n\n const typeEditable = field.editableTypeConfigs[type]\n\n if (typeEditable && typeEditable.dataContainerProps) {\n requestedFromData = typeEditable.dataContainerProps({formField: formDefinitionField, formName})\n }\n\n const fixLabel = typeEditable && typeEditable.fixLabel && typeEditable.fixLabel()\n\n return (\n <fromData.FormDataContainer {...requestedFromData}>\n <FormFieldWrapper\n typeEditable={typeEditable}\n dirty={dirty}\n error={error}\n hasValue={hasValue}\n id={id}\n immutable={readOnly}\n isDisplay={isDisplay}\n key={id}\n label={formDefinitionField.label}\n mandatory={mandatory}\n mandatoryTitle={resources.mandatoryTitle}\n touched={touched}\n fixLabel={fixLabel}\n formField={formDefinitionField}\n >\n <ValueField\n fieldMappingType={isDisplay ? 'readOnly' : fieldMappingType}\n formName={formName}\n formField={formDefinitionField}\n value={value}\n info={{id, readOnly, mandatory}}\n events={events}\n />\n </FormFieldWrapper>\n </fromData.FormDataContainer>\n )\n } catch (exception) {\n consoleLogger.logError('Error creating formField', exception)\n return <span/>\n }\n}\n\nexport const MultiSeparator = () => (<Typography.Span>, </Typography.Span>)\n\nconst ValueField = ({\n fieldMappingType,\n formName,\n formField,\n value,\n info,\n events,\n formData\n}) => {\n const Field = useMemo(() =>\n field.factory(fieldMappingType, formField.dataType || formField.componentType), []\n )\n\n if (isMultipleFields(value, formField.dataType)) {\n return value\n .map((v, idx) => <Field\n formField={formField}\n formName={formName}\n value={v}\n info={info}\n events={events}\n formData={formData}\n key={'valueField-' + formField.id + idx}\n />)\n .reduce((prev, curr, idx) => [prev, <MultiSeparator key={'sep' + idx}/>, curr])\n }\n\n return <Field\n formField={formField}\n formName={formName}\n value={value}\n info={info}\n events={events}\n formData={formData}\n />\n}\n\nValueField.propTypes = {\n events: PropTypes.objectOf(PropTypes.func),\n fieldMappingType: PropTypes.string.isRequired,\n formData: PropTypes.object,\n formField: PropTypes.object,\n formName: PropTypes.string,\n info: PropTypes.object,\n value: PropTypes.any\n}\n","import {formFieldFactory} from './formField'\n\nexport default {formFieldFactory}\n","import PropTypes from 'prop-types'\nimport _omit from 'lodash/omit'\nimport {injectIntl} from 'react-intl'\n\nimport formField from '../formField'\n\nconst extractEventsFromInput = input => (\n _omit(input, ['name', 'value'])\n)\n\nconst ReduxFormFieldAdapter = props => {\n const {\n input,\n meta: {dirty, touched, error, submitting},\n id,\n formDefinitionField,\n entityField,\n parentReadOnly,\n formName,\n mode\n } = props\n\n const events = extractEventsFromInput(input)\n\n const fomFieldData = {\n formDefinitionField,\n id,\n formName,\n value: input.value,\n dirty,\n touched,\n submitting,\n events,\n error,\n entityField,\n parentReadOnly,\n mode\n }\n const resources = {\n mandatoryTitle: props.intl.formatMessage({id: 'client.component.form.mandatoryFieldTitle'})\n }\n\n return formField.formFieldFactory(props.fieldMappingType, fomFieldData, resources)\n}\n\nReduxFormFieldAdapter.propTypes = {\n intl: PropTypes.object.isRequired,\n id: PropTypes.string,\n input: PropTypes.shape({\n value: PropTypes.any,\n name: PropTypes.string,\n onChange: PropTypes.func\n }).isRequired,\n meta: PropTypes.shape({\n touched: PropTypes.bool,\n error: PropTypes.objectOf(\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.node, PropTypes.string]))\n ),\n dirty: PropTypes.bool,\n submitting: PropTypes.bool\n }).isRequired,\n formDefinitionField: PropTypes.object.isRequired,\n entityField: PropTypes.object,\n parentReadOnly: PropTypes.bool,\n fieldMappingType: PropTypes.string.isRequired,\n mode: PropTypes.string\n}\n\nexport default injectIntl(ReduxFormFieldAdapter)\n","export default Object.freeze({\n FIELD_SET: 'field-set',\n FIELD: 'field',\n ACTION: 'action',\n ACTION_BAR: 'action-bar',\n LAYOUT: 'layout',\n TABLE: 'table',\n SUB_TABLE: 'sub-table',\n DISPLAY: 'display'\n})\n","import _uniq from 'lodash/uniq'\n\nimport componentTypes from './enums/componentTypes'\nexport const getFieldId = (formName, fieldName) => (\n `input-${formName}-${fieldName}`\n)\n\nexport const getFieldDefinitions = formDefinition => {\n return getFieldsOfChildren(formDefinition)\n}\n\nconst validFieldTypes = [\n componentTypes.FIELD,\n componentTypes.DISPLAY\n]\n\nconst getFieldsOfChildren = definition => {\n const result = []\n\n for (let i = 0; i < definition.children.length; i++) {\n if (definition.children[i].children) {\n result.push(...getFieldsOfChildren(definition.children[i]))\n }\n\n const componentType = definition.children[i].componentType\n if (validFieldTypes.includes(componentType) && definition.hidden !== true) {\n result.push({\n ...definition.children[i],\n readonly: definition.readonly,\n ignoreCopy: definition.ignoreCopy\n })\n }\n }\n\n return result\n}\n\nexport const getDefaultValues = fieldDefinitions =>\n fieldDefinitions\n .filter(f => f.defaultValue)\n .reduce((valueObj, field) => ({\n ...valueObj,\n [field.path || field.id]: field.defaultValue\n }), {})\n\nconst typePathsHandlers = {\n location: fieldDefinition => Object.values(fieldDefinition.locationMapping).filter(v => v)\n}\n\nexport const getUsedPaths = fieldDefinitions =>\n _uniq(\n fieldDefinitions\n .filter(field => field.componentType === componentTypes.FIELD)\n .reduce((accumulator, field) =>\n [\n ...accumulator,\n ...(typePathsHandlers[field.dataType] ? typePathsHandlers[field.dataType](field) : [field.path || field.id])\n ],\n [])\n )\n","import _forOwn from 'lodash/forOwn'\nimport _isEqual from 'lodash/isEqual'\nimport _reduce from 'lodash/reduce'\n\nimport {generalErrorField, entityValidatorErrorsField, relatedEntityErrorsField} from './formErrors'\n\nexport const validationErrorToFormError = (entity, errors) => {\n let result = {[generalErrorField]: {[relatedEntityErrorsField]: []}}\n\n if (!errors) {\n return result\n }\n errors.forEach(error => {\n if (error.model === entity.model && ((!entity.key && !error.key) || error.key === entity.key)) {\n result = {...result, ...error.paths}\n if (Object.prototype.hasOwnProperty.call(error, entityValidatorErrorsField)) {\n result[generalErrorField][entityValidatorErrorsField] = error[entityValidatorErrorsField]\n }\n } else {\n result[generalErrorField][relatedEntityErrorsField].push(error)\n }\n })\n return result\n}\n\n// workaround: redux-forms can't get the value of a field if the field-name contains a dot.\nexport const transformFieldName = fieldName => (fieldName.replace(/\\./g, '--'))\nexport const transformFieldNameBack = fieldName => (fieldName.replace(/--/g, '.'))\n\nexport const entityToFormValues = entity => {\n return _reduce(entity, (acc, val, key) => ({...acc, [transformFieldName(key)]: val}), {})\n}\n\nexport const formValuesToFlattenEntity = entity => {\n return _reduce(entity, (acc, val, key) => ({...acc, [transformFieldNameBack(key)]: val}), {})\n}\n\nexport const getDirtyFields = (initialValues, values, isCreate) => {\n const dirtyFields = []\n\n _forOwn(values, (value, key) => {\n if (isCreate || !_isEqual(value, initialValues[key])) {\n dirtyFields.push(key)\n }\n })\n\n return dirtyFields\n}\n\nexport const isValueEmpty = v =>\n v === null\n || v === undefined\n || v === ''\n || (Array.isArray(v) && v.length === 0)\n || (typeof v === 'object' && Object.keys(v).length === 0)\n","export default Object.freeze({\n VERTICAL_BOX: 'vertical-box',\n HORIZONTAL_BOX: 'horizontal-box'\n})\n","import styled from 'styled-components'\nimport {scale, theme} from 'tocco-ui'\n\nexport const StyledActionsWrapper = styled.div`\n background-color: ${theme.color('paper')};\n padding-bottom: ${scale.space(-0.5)};\n display: flex;\n flex-wrap: wrap;\n z-index: 2; // Higher than StyledIndicatorsContainerWrapper\n position: sticky;\n top: 0;\n\n & > * {\n margin-top: ${scale.space(-0.5)};\n }\n`\n","/* eslint-disable react/prop-types */\n// propTypes are not recognized properly in this file\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport {Field} from 'redux-form'\nimport _get from 'lodash/get'\nimport _pick from 'lodash/pick'\nimport {Layout, Panel, Typography} from 'tocco-ui'\nimport {consoleLogger, js} from 'tocco-util'\n\nimport ReduxFormFieldAdapter from './ReduxFormFieldAdapter'\nimport {getFieldId} from './formDefinition'\nimport {transformFieldName} from './reduxForm'\nimport actions from '../actions'\nimport componentTypes from './enums/componentTypes'\nimport layoutTypes from './enums/layoutTypes'\nimport {isAction} from '../actions/actions'\nimport {StyledActionsWrapper} from './StyledFormBuilder'\n\nconst FormBuilder = props => {\n const {\n componentMapping,\n entity,\n mode,\n beforeRenderField,\n formDefinition,\n formValues,\n formName,\n fieldMappingType,\n customRenderedActions\n } = props\n\n const modeFitsScope = (mode, scopes) => (\n !mode || !scopes || scopes.length === 0 || scopes.includes(mode)\n )\n\n const formTraverser = (children, parentReadOnly = false) => {\n const result = []\n for (const child of children) {\n if (child.componentType === componentTypes.LAYOUT) {\n result.push(createLayoutComponent(child, child.layoutType, parentReadOnly))\n } else if (isAction(child.componentType)) {\n result.push(createAction(child))\n } else if (child.componentType === componentTypes.FIELD_SET) {\n result.push(createFieldSet(child, parentReadOnly))\n } else if (componentMapping && componentMapping[child.componentType]) {\n return createCustomComponent(child)\n }\n }\n return result\n }\n\n const createFieldSet = (fieldSet, parentReadOnly) => {\n const fieldDefinition = fieldSet.children.find(child => !isAction(child.componentType))\n\n if (!fieldDefinition) {\n return null\n }\n\n const formDefinitionField = {\n ...fieldDefinition,\n ..._pick(fieldSet, ['label', 'hidden', 'readonly', 'scopes'])\n }\n\n const fieldName = formDefinitionField.path || formDefinitionField.id\n const entityField = _get(entity, 'paths.' + fieldName.split('.').join('.value.paths.'))\n\n const shouldRenderField = (formDefinitionField, entityField) => {\n if (!modeFitsScope(mode, formDefinitionField.scopes)) {\n return false\n }\n\n if (formDefinitionField.hidden) {\n return false\n }\n\n if (beforeRenderField && !beforeRenderField(fieldName)) {\n return false\n }\n\n if (fieldMappingType === 'search') {\n return true\n }\n\n const hasEmptyValue = (fieldName, formValues) => {\n if (!Object.prototype.hasOwnProperty.call(formValues || {}, fieldName)) {\n return true\n } else {\n const value = formValues[fieldName]\n return (value == null || value === '' || (Array.isArray(value) && value.length === 0))\n }\n }\n\n const readOnly = (\n parentReadOnly\n || formDefinition.readonly\n || (entityField && entityField.writable === false)\n || (mode !== 'create' && !entityField && formDefinitionField.componentType !== 'description'\n && formDefinitionField.dataType !== 'location')\n || formDefinitionField.readonly || formDefinitionField.componentType === 'display'\n )\n\n return !(readOnly && hasEmptyValue(transformFieldName(fieldName), formValues))\n }\n\n if (shouldRenderField(formDefinitionField, entityField)) {\n return <Field\n key={`field-${fieldName}`}\n parentReadOnly={parentReadOnly}\n name={transformFieldName(fieldName)}\n id={getFieldId(formName, fieldName)}\n formName={formName}\n component={ReduxFormFieldAdapter}\n formDefinitionField={formDefinitionField}\n entityField={entityField}\n fieldMappingType={fieldMappingType}\n format={null}\n mode={mode}\n />\n }\n\n return null\n }\n\n const createAction = action => {\n const entityName = _get(props, 'entity.model')\n const entityKey = _get(props, 'entity.key')\n\n return <StyledActionsWrapper\n key={`action-${action.id}`}\n >\n <actions.Action\n definition={action}\n selection={actions.getSingleEntitySelection(entityName, entityKey)}\n mode={mode}\n customRenderedActions={customRenderedActions}\n />\n </StyledActionsWrapper>\n }\n\n const createLayoutComponent = (field, type, parentReadOnly) => {\n let elements = formTraverser(field.children, parentReadOnly || field.readonly)\n\n if (Array.isArray(elements)) {\n elements = elements.filter(Boolean)\n }\n\n if (!elements || (Array.isArray(elements) && elements.length === 0)) {\n return null\n }\n\n const content = field.label\n ? <Panel.Wrapper isFramed={true} isOpen={true}>\n <Panel.Header><Typography.H4>{field.label}</Typography.H4></Panel.Header>\n <Panel.Body>{elements}</Panel.Body>\n </Panel.Wrapper>\n : elements\n\n const layoutMap = {\n [layoutTypes.HORIZONTAL_BOX]: Layout.Container,\n [layoutTypes.VERTICAL_BOX]: Layout.Box\n }\n\n const LayoutComponent = layoutMap[type]\n const key = `layoutcomponent-${field.id}-${field.layoutType}`\n\n if (LayoutComponent) {\n return <LayoutComponent\n key={key}\n occupiesRemainingHeight={field.occupiesRemainingHeight}>\n {content}\n </LayoutComponent>\n } else {\n consoleLogger.logWarning(`Layout type \"${type}\" for box \"${field.id}\" is unknown.`)\n return null\n }\n }\n\n const createCustomComponent = field => {\n if (!modeFitsScope(mode, field.scopes)) {\n return null\n }\n\n const key = `custom-component-${field.id}-${field.layoutType}`\n const component = componentMapping[field.componentType]\n\n return component(field, key)\n }\n\n return formTraverser(formDefinition.children, formDefinition.readonly)\n}\n\nFormBuilder.propTypes = {\n entity: PropTypes.object,\n formName: PropTypes.string.isRequired,\n formDefinition: PropTypes.object.isRequired,\n formValues: PropTypes.object,\n mode: PropTypes.string,\n componentMapping: PropTypes.objectOf(PropTypes.func),\n beforeRenderField: PropTypes.func,\n customRenderedActions: PropTypes.objectOf(PropTypes.func)\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(FormBuilder, areEqual)\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport isEmail from 'validator/lib/isEmail'\nimport isUrl from 'validator/lib/isURL'\n\nexport const minLengthValidator = (value, minLength) =>\n value.length < minLength\n ? {\n minLength: [\n <FormattedMessage\n key=\"syncValidationMinLength\"\n id=\"client.component.form.syncValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n : null\n\nexport const minNumberValidator = (value, minValue) =>\n value < minValue\n ? {\n maxNumber: [\n <FormattedMessage\n key=\"syncValidationMaxNumber\"\n id=\"client.component.form.syncValidationMinNumber\"\n values={{minValue}}\n />\n ]\n }\n : null\n\nexport const maxLengthValidator = (value, maxLength) =>\n value.length > maxLength\n ? {\n maxLength: [\n <FormattedMessage\n key=\"syncValidationMaxLength\"\n id=\"client.component.form.syncValidationMaxLength\"\n values={{maxLength}}\n />\n ]\n }\n : null\n\nexport const maxNumberValidator = (value, maxValue) =>\n value > maxValue\n ? {\n maxNumber: [\n <FormattedMessage\n key=\"syncValidationMaxNumber\"\n id=\"client.component.form.syncValidationMaxNumber\"\n values={{maxValue}}\n />\n ]\n }\n : null\n\nexport const postPointValidator = (value, limit) =>\n value.toString().includes('.') && value.toString().split('.')[1].length > limit\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationPrePoint\"\n id=\"client.component.form.syncValidationPrePoint\"\n values={{limit}}\n />\n ]\n }\n : null\n\nexport const prePointValidator = (value, limit) =>\n limit > 0 && value.toString().split('.')[0].length > limit\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationPrePoint\"\n id=\"client.component.form.syncValidationPrePoint\"\n values={{limit}}\n />\n ]\n }\n : null\n\nexport const regexValidator = (value, pattern) =>\n !RegExp(pattern).test(value)\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationRegexPattern\"\n id=\"client.component.form.syncValidationRegexPattern\"\n values={{pattern}}\n />\n ]\n }\n : null\n\nexport const emailValidator = value =>\n !isEmail(value)\n ? {\n format: [<FormattedMessage\n key=\"invalidEmail\"\n id=\"client.component.form.invalidEmail\"\n />\n ]\n\n }\n : null\n\nexport const urlValidator = value =>\n !isUrl(value) && !(value.includes('localhost') && isUrl(value, {require_tld: false}))\n ? {\n format: [<FormattedMessage\n key=\"invalidUrl\"\n id=\"client.component.form.invalidUrl\"\n />\n ]\n }\n : null\n\nexport default {\n 'length.fromIncluding': minLengthValidator,\n 'length.toIncluding': maxLengthValidator,\n 'numberRange.fromIncluding': minNumberValidator,\n 'numberRange.toIncluding': maxNumberValidator,\n 'decimalDigits.postPointDigits': postPointValidator,\n 'decimalDigits.prePointDigits': prePointValidator,\n 'regex.pattern': regexValidator,\n 'email': emailValidator,\n 'url': urlValidator\n}\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\n\nconst DEFAULT_DEFAULT_REGION = 'CH'\nexport const phoneValidator = async(value, phoneValidation = {}) => {\n const libphone = await import(/* webpackChunkName: \"vendor-libphonenumber-js\" */ 'libphonenumber-js')\n const isValidCustomRegex = phoneValidation.customRegex && value.match(phoneValidation.customRegex)\n const isValidPhoneNumber = libphone.isValidNumber(\n value,\n (phoneValidation.defaultRegion) || DEFAULT_DEFAULT_REGION\n )\n\n return (isValidCustomRegex || isValidPhoneNumber)\n ? null\n : {\n phone: [<FormattedMessage\n key=\"invalidPhoneNumber\"\n id=\"client.component.form.invalidPhoneNumber\"\n />\n ]\n }\n}\n\nexport default {\n phone: phoneValidator\n}\n","import syncValidators from './syncValidators'\nimport asyncValidators from './asyncValidators'\nimport {mandatoryError, valueDefined} from './mandatory'\n\nexport default {syncValidators, asyncValidators, mandatoryError, valueDefined}\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\n\nexport const valueDefined = value => !(\n value === null\n || value === undefined\n || value === ''\n || (Array.isArray(value) && value.length === 0)\n || (typeof value === 'object' && Object.keys(value).length === 0)\n)\n\nexport const mandatoryError = {\n mandatory: [\n <FormattedMessage\n key=\"syncValidationRequired\"\n id=\"client.component.form.syncValidationRequired\"\n />\n ]\n}\n","import {SubmissionError} from 'redux-form/es/SubmissionError'\nimport {api} from 'tocco-util'\nimport _has from 'lodash/has'\nimport _get from 'lodash/get'\n\nimport rest from '../rest'\nimport validators from './validators'\nimport formErrors from './formErrors'\nimport {formValuesToFlattenEntity, getDirtyFields, validationErrorToFormError} from './reduxForm'\n\nconst OUTDATED_ENTITY_ERROR_CODE = 'OUTDATED_ENTITY'\n\nconst hasError = errors => (\n errors && Object.keys(errors).length > 0\n)\n\nconst localeValidation = async(values, fieldDefinitions) => {\n let errors = {}\n for (const fieldDefinition of fieldDefinitions) {\n const value = values[fieldDefinition.path]\n if (validators.valueDefined(value)) {\n for (const asyncValidatorKey in validators.asyncValidators) {\n if (_has(fieldDefinition, ['validation', asyncValidatorKey])) {\n const validatorValue = _get(fieldDefinition, ['validation', asyncValidatorKey])\n const validator = validators.asyncValidators[asyncValidatorKey]\n const validatorErrors = await validator(value, validatorValue)\n if (validatorErrors) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validatorErrors)\n }\n }\n }\n }\n }\n return errors\n}\n\nconst validateRequest = (formValues, initialValues, mode) => {\n const dirtyFields = getDirtyFields(initialValues, formValues)\n const flattenEntity = formValuesToFlattenEntity(formValues)\n const entity = api.toEntity(flattenEntity, dirtyFields)\n const options = {\n queryParams: {_validate: true},\n method: mode === 'create' ? 'POST' : 'PATCH',\n headers: {'X-Client-Questions': 'false'},\n body: entity,\n acceptedErrorCodes: [OUTDATED_ENTITY_ERROR_CODE]\n }\n\n return rest.simpleRequest(`entities/2.0/${entity.model}${entity.key ? `/${entity.key}` : ''}`, options)\n .then(resp => resp.body)\n .then(body => {\n if (body.valid) {\n return {}\n }\n\n if (body.errorCode === OUTDATED_ENTITY_ERROR_CODE) {\n return formErrors.outdatedResponseToFormError(body, entity)\n }\n\n return validationErrorToFormError(entity, body.errors)\n })\n}\n\nexport const submitValidation = (formValues, initialValues, mode) =>\n validateRequest(formValues, initialValues, mode)\n .then(errors => {\n if (hasError(errors)) {\n throw new SubmissionError(errors)\n }\n })\n\nexport const asyncValidation = async(formValues, initialValues, fieldDefinitions, mode) => {\n const localeValidationErrors = await localeValidation(formValues, fieldDefinitions)\n if (hasError(localeValidationErrors)) {\n throw localeValidationErrors\n }\n\n const validateRequestErrors = await validateRequest(formValues, initialValues, mode)\n if (hasError(validateRequestErrors)) {\n throw validateRequestErrors\n }\n}\n","export default Object.freeze({\n CREATE: 'create',\n UPDATE: 'update'\n})\n","import _get from 'lodash/get'\nimport {call} from 'redux-saga/effects'\n\nimport rest from '../rest'\n\nfunction* loadDisplays(fields, entityModel) {\n const displayRequest = fields.reduce((acc, field) => {\n const {id, value} = field\n const fieldModel = _get(entityModel, ['paths', id])\n if (fieldModel && fieldModel.type === 'relation') {\n const targetEntity = fieldModel.targetEntity\n const arrayValue = Array.isArray(value) ? value : [value]\n\n return {\n ...acc,\n [targetEntity]: [\n ...(acc[targetEntity] || []),\n ...arrayValue\n ]\n }\n }\n return acc\n }\n , {})\n\n if (Object.keys(displayRequest).length === 0) {\n return null\n }\n\n return yield call(rest.fetchDisplays, displayRequest)\n}\n\nexport const NOT_FOUND_DISPLAY = '??'\nconst relationFieldTransformer = (value, displays, targetEntity) =>\n ({key: value, display: _get(displays, [targetEntity, value], NOT_FOUND_DISPLAY)})\n\nconst fieldTypeTransformer = (value, fieldModel, displays) => {\n if (fieldModel && fieldModel.type === 'relation') {\n const {targetEntity} = fieldModel\n\n if (fieldModel.multi) {\n return value.map(v => relationFieldTransformer(v, displays, targetEntity))\n } else {\n return relationFieldTransformer(value, displays, targetEntity)\n }\n }\n\n return value\n}\n\n/**\n * Takes an array of values and transforms it into usable form values and load displays where needed.\n *\n * @param {array} fields Input array with schema [{id: 'firstname', value: 'Donald'}, {id: 'relGender', value: '1'}]\n * @param {entityModel} entityModel\n *\n * @return {object} With schema {firstname: 'Donald', relGender: {key: '1', display: 'Male'}}\n */\nexport default function* transformInputValues(fields, entityModel) {\n const displays = yield call(loadDisplays, fields, entityModel)\n\n return fields.reduce((acc, field) => {\n const {id, value} = field\n const fieldModel = _get(entityModel, ['paths', id])\n\n return {\n ...acc,\n [id]: fieldTypeTransformer(value, fieldModel, displays)\n }\n }, {})\n}\n","import formErrorsUtil from './formErrors'\nimport FormBuilder from './FormBuilder'\nimport {getFieldId, getFieldDefinitions, getDefaultValues, getUsedPaths} from './formDefinition'\nimport syncValidation from './syncValidation'\nimport {asyncValidation, submitValidation} from './asyncValidation'\nimport {\n formValuesToFlattenEntity,\n entityToFormValues,\n getDirtyFields,\n validationErrorToFormError,\n transformFieldName,\n transformFieldNameBack,\n isValueEmpty\n} from './reduxForm'\nimport componentTypes from './enums/componentTypes'\nimport layoutTypes from './enums/layoutTypes'\nimport scopes from './enums/scopes'\nimport validators from './validators'\nimport transformInputValues from './transformInputValues'\n\nexport default {\n formErrorsUtil,\n FormBuilder,\n getFieldId,\n getFieldDefinitions,\n getDefaultValues,\n getUsedPaths,\n formValuesToFlattenEntity,\n entityToFormValues,\n getDirtyFields,\n validationErrorToFormError,\n transformFieldName,\n transformFieldNameBack,\n syncValidation,\n componentTypes,\n layoutTypes,\n scopes,\n validators,\n transformInputValues,\n asyncValidation,\n submitValidation,\n isValueEmpty\n}\n","import _has from 'lodash/has'\nimport _get from 'lodash/get'\n\nimport validators from './validators'\nimport formErrors from './formErrors'\n\nexport default fieldDefinitions => values => {\n let errors = {}\n\n fieldDefinitions.forEach(fieldDefinition => {\n const value = values[fieldDefinition.path]\n\n if (validators.valueDefined(value)) {\n Object.keys(validators.syncValidators).forEach(syncValidatorKey => {\n if (_has(fieldDefinition, ['validation', ...syncValidatorKey.split('.')])) {\n const validatorValue = _get(fieldDefinition, ['validation', ...syncValidatorKey.split('.')])\n const validator = validators.syncValidators[syncValidatorKey]\n const validatorErrors = validator(value, validatorValue)\n if (validatorErrors) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validatorErrors)\n }\n }\n })\n } else {\n if (fieldDefinition.validation && fieldDefinition.validation.mandatory) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validators.mandatoryError)\n }\n }\n })\n\n return errors\n}\n","export const LOAD_RELATION_ENTITIES = 'formData/LOAD_RELATION_ENTITIES'\nexport const SET_RELATION_ENTITIES = 'formData/SET_RELATION_ENTITIES'\nexport const SET_RELATION_ENTITIES_LOADING = 'formData/SET_RELATION_ENTITIES_LOADING'\n\nexport const loadRelationEntities = (fieldName, entityName, options) => ({\n type: LOAD_RELATION_ENTITIES,\n payload: {\n fieldName,\n entityName,\n options\n }\n})\n\nexport const setRelationEntityLoading = fieldName => ({\n type: SET_RELATION_ENTITIES_LOADING,\n payload: {\n fieldName\n }\n})\n\nexport const setRelationEntities = (fieldName, entities, moreEntitiesAvailable = false) => ({\n type: SET_RELATION_ENTITIES,\n payload: {\n fieldName,\n entities,\n moreEntitiesAvailable\n }\n})\n","import * as actions from './actions'\n\nexport const setRelationEntities = (state, {payload: {fieldName, entities, moreEntitiesAvailable}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [fieldName]: {\n data: entities,\n isLoading: false,\n moreEntitiesAvailable\n }\n }\n }\n)\n\nexport const setRelationEntitiesLoading = (state, {payload: {fieldName}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [fieldName]: {\n isLoading: true,\n data: []\n }\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_RELATION_ENTITIES]: setRelationEntities,\n [actions.SET_RELATION_ENTITIES_LOADING]: setRelationEntitiesLoading\n}\n\nconst initialState = {\n data: {}\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","export const LOAD_TOOLTIP = 'formData/LOAD_TOOLTIP'\nexport const SET_TOOLTIP = 'formData/SET_TOOLTIP'\n\nexport const loadTooltip = (entity, id) => ({\n type: LOAD_TOOLTIP,\n payload: {\n entity,\n id\n }\n})\n\nexport const setToolTip = (entity, id, tooltip) => ({\n type: SET_TOOLTIP,\n payload: {\n entity,\n id,\n tooltip\n }\n})\n","import * as actions from './actions'\n\nexport const setToolTip = (state, {payload: {entity, id, tooltip}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [entity]: {\n ...state.data[entity],\n [id]: tooltip\n }\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_TOOLTIP]: setToolTip\n}\n\nconst initialState = {\n data: {}\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, call, put, select, takeEvery} from 'redux-saga/effects'\nimport _pick from 'lodash/pick'\nimport {api} from 'tocco-util'\n\nimport * as relationEntitiesActions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeEvery(relationEntitiesActions.LOAD_RELATION_ENTITIES, loadRelationEntity)\n ])\n}\n\nexport function* enhanceEntitiesWithDisplays(entities) {\n const requestedDisplays = yield call(api.getDisplayRequest, entities)\n const displays = yield call(rest.fetchDisplays, requestedDisplays)\n return entities.map(entity => ({...entity, display: displays[entity.model][entity.key]}))\n}\n\nexport function* loadRelationEntity({payload: {fieldName, entityName, options = {}}}) {\n const fieldData = yield select(fieldDataSelector, fieldName)\n if (!dataLoaded(fieldData) || options.forceReload) {\n yield put(relationEntitiesActions.setRelationEntityLoading(fieldName))\n const query = yield call(getQuery, options)\n const requestOptions = {\n method: 'GET'\n }\n\n let entities = yield call(rest.fetchEntities, entityName, query, requestOptions)\n entities = yield call(enhanceEntitiesWithDisplays, entities)\n entities = entities.map(entity => _pick(entity, api.relevantRelationAttributes))\n const moreEntitiesAvailable = options.limit ? entities.length > options.limit : false\n yield put(\n relationEntitiesActions.setRelationEntities(\n fieldName, options.limit ? entities.splice(0, options.limit) : entities, moreEntitiesAvailable)\n )\n }\n}\n\nexport const fieldDataSelector = (state, fieldName) => state.formData.relationEntities.data[fieldName]\n\nconst dataLoaded = fieldData => !!(fieldData && fieldData.data && fieldData.data.length > 0)\n\nexport const getQuery = options => (\n {\n ...(options.limit ? {limit: options.limit + 1} : {}),\n ...(options.searchTerm ? {search: options.searchTerm} : {}),\n ...(options.sorting ? {sorting: options.sorting} : {})\n }\n)\n","import _get from 'lodash/get'\nimport {all, call, put, select, takeEvery} from 'redux-saga/effects'\n\nimport * as tooltipActions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeEvery(tooltipActions.LOAD_TOOLTIP, loadToolTip)\n ])\n}\n\nexport const tooltipSelector = (state, entityName, id) =>\n _get(state, `formData.tooltips.data.${entityName}.${id}`, null)\n\nexport function* loadToolTip({payload: {entity, id}}) {\n if (entity) {\n const tooltip = yield select(tooltipSelector, entity, id)\n\n if (tooltip == null) {\n const display = yield call(rest.fetchDisplay, entity, id, 'tooltip')\n yield put(tooltipActions.setToolTip(entity, id, display))\n }\n }\n}\n","export const OPEN_ADVANCED_SEARCH = 'formData/OPEN_ADVANCED_SEARCH'\nexport const ADVANCED_SEARCH_UPDATE = 'formData/ADVANCED_SEARCH_UPDATE'\nexport const ADVANCED_SEARCH_CLOSE = 'formData/ADVANCED_SEARCH_CLOSE'\n\nexport const openAdvancedSearch = (formName, formField, value) => ({\n type: OPEN_ADVANCED_SEARCH,\n payload: {\n formName,\n formField,\n value\n }\n})\n\nexport const advancedSearchUpdate = ids => ({\n type: ADVANCED_SEARCH_UPDATE,\n payload: {\n ids\n }\n})\n\nexport const advancedSearchClose = () => ({\n type: ADVANCED_SEARCH_CLOSE\n})\n","export const CHANGE_FIELD_VALUE = 'formData/CHANGE_FIELD_VALUE'\nexport const TOUCH_FIELD = 'formData/TOUCH_FIELD'\n\nexport const changeFieldValue = (formName, fieldName, value) => ({\n type: CHANGE_FIELD_VALUE,\n payload: {\n formName,\n fieldName,\n value\n }\n})\n\nexport const touchField = (formName, fieldName) => ({\n type: TOUCH_FIELD,\n payload: {\n formName,\n fieldName\n }\n})\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\n\nexport const StyledAdvancedSearch = styled.div`\n && {\n > *:not(:last-child) {\n margin-bottom: ${scale.space(-1)};\n }\n }\n`\n\nexport const StyledAdvancedSearchButtonWrapper = styled.div`\n background: ${theme.color('paper')};\n padding-top: ${scale.space(0.5)};\n z-index: 1;\n position: sticky;\n bottom: 0;\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Button} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport {v4 as uuid} from 'uuid'\n\nimport {StyledAdvancedSearch, StyledAdvancedSearchButtonWrapper} from './StyledAdvancedSearch'\n\nconst AdvancedSearch = ({\n entityName,\n formName,\n listFormDefinition,\n onSelectionChange,\n selection,\n emitAction,\n multi,\n onOkClick,\n ListApp\n}) => (\n <StyledAdvancedSearch>\n <ListApp\n id={`advancedSearch-${uuid()}`}\n entityName={entityName}\n formName={formName}\n listFormDefinition={listFormDefinition}\n limit={15}\n showSearchForm={true}\n onSelectChange={selection => {\n onSelectionChange(selection)\n }}\n selection={selection}\n emitAction={emitAction}\n selectionStyle={multi ? 'multi' : 'single'}\n selectOnRowClick={true}\n disableSelectionController={true}\n showActions={false}\n />\n <StyledAdvancedSearchButtonWrapper>\n <Button look=\"raised\" onClick={onOkClick}>\n <FormattedMessage id=\"client.common.ok\"/>\n </Button>\n </StyledAdvancedSearchButtonWrapper>\n </StyledAdvancedSearch>\n)\n\nAdvancedSearch.propTypes = {\n ListApp: PropTypes.func.isRequired,\n entityName: PropTypes.string.isRequired,\n formName: PropTypes.string.isRequired,\n listFormDefinition: PropTypes.shape({\n children: PropTypes.arrayOf(PropTypes.object)\n }),\n emitAction: PropTypes.func.isRequired,\n selection: PropTypes.array,\n field: PropTypes.string,\n onSelectionChange: PropTypes.func,\n onOkClick: PropTypes.func,\n appId: PropTypes.string,\n showSearchForm: PropTypes.bool,\n multi: PropTypes.bool\n}\n\nexport default AdvancedSearch\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\nimport AdvancedSearch from './AdvancedSearch'\n\nconst mapActionCreators = {\n emitAction: actionEmitter.dispatchEmittedAction\n}\n\nexport default connect(null, mapActionCreators)(AdvancedSearch)\n","import React from 'react'\n\nimport AdvancedSearchContainer from './AdvancedSearchContainer'\n\nexport const getSelection = (value, multi) => value ? multi ? value.map(v => v.key) : [value.key] : []\n\nexport const getValue = (entities, multi) =>\n multi\n ? entities\n : (entities.length > 0\n ? {\n key: entities[0].key,\n display: entities[0].display\n }\n : null)\n\nexport const getAdvancedSearchComponent\n = (listApp, entity, formName, listFormDefinition, selection, onSelectionChange, onOkClick, fieldId, multi) =>\n () =>\n <AdvancedSearchContainer\n ListApp={listApp}\n entityName={entity}\n formName={formName}\n listFormDefinition={listFormDefinition}\n selection={selection}\n onSelectionChange={onSelectionChange}\n onOkClick={onOkClick}\n field={fieldId}\n multi={multi}\n />\n","import {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport {all, call, put, takeEvery, take, spawn, select} from 'redux-saga/effects'\nimport {api} from 'tocco-util'\n\nimport notification from './../../notification'\nimport rest from '../../rest'\nimport * as advancedSearchActions from './actions'\nimport * as valueActions from '../values/actions'\nimport {getSelection, getValue, getAdvancedSearchComponent} from './utils'\n\nexport const textResourceSelector = (state, key) => state.intl.messages[key] || key\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(advancedSearchActions.OPEN_ADVANCED_SEARCH, openAdvancedSearch, config)\n ])\n}\n\nexport function* openAdvancedSearch(config, {payload}) {\n const {listApp} = config\n const {formName, formField, value} = payload\n\n const {id: fieldId, label, formBase: fieldFormBase, targetEntity: entity, dataType} = formField\n const multi = dataType === 'multi-remote-field'\n const remoteFieldFormName = fieldFormBase || entity\n const listFormDefinition = yield call(rest.fetchForm, remoteFieldFormName, 'remotefield')\n const answerChannel = yield call(channel)\n const modalId = yield call(uuid)\n const advancedSearchTitle = yield select(textResourceSelector, 'client.common.advancedSearch')\n const selection = yield call(getSelection, value, multi)\n\n const advancedSearchComponent = getAdvancedSearchComponent(\n listApp,\n entity,\n remoteFieldFormName,\n listFormDefinition,\n selection,\n ids => {\n answerChannel.put(advancedSearchActions.advancedSearchUpdate(ids))\n },\n () => {\n answerChannel.put(advancedSearchActions.advancedSearchClose())\n },\n fieldId,\n multi)\n\n yield put(notification.modal(modalId, `${label}: ${advancedSearchTitle}`, null, advancedSearchComponent, true))\n yield spawn(closeAdvancedSearch, answerChannel, modalId, fieldId, formName, entity, multi)\n}\n\nexport function* enhanceEntitiesWithDisplays(entities) {\n const requestedDisplays = yield call(api.getDisplayRequest, entities)\n const displays = yield call(rest.fetchDisplays, requestedDisplays)\n return entities.map(entity => ({...entity, display: displays[entity.model][entity.key]}))\n}\n\nexport function* closeAdvancedSearch(answerChannel, modalId, fieldId, formName, entity, multi) {\n let modalOpen = true\n while (modalOpen) {\n const {payload, type} = yield take(answerChannel)\n if (type === advancedSearchActions.ADVANCED_SEARCH_UPDATE) {\n if (payload.ids && payload.ids.length > 0) {\n const query = {\n keys: payload.ids\n }\n let entities = yield call(rest.fetchEntities, entity, query)\n entities = yield call(enhanceEntitiesWithDisplays, entities)\n const value = yield call(getValue, entities, multi)\n yield call(advancedSearchUpdate, formName, fieldId, value)\n } else {\n yield call(advancedSearchUpdate, formName, fieldId, [])\n }\n if (!multi) {\n yield put(notification.removeModal(modalId))\n modalOpen = false\n }\n } else if (type === advancedSearchActions.ADVANCED_SEARCH_CLOSE) {\n yield put(notification.removeModal(modalId))\n modalOpen = false\n }\n }\n}\n\nexport function* advancedSearchUpdate(formName, field, ids) {\n yield put(valueActions.changeFieldValue(formName, field, ids))\n}\n","import {actions as formActions} from 'redux-form'\nimport {all, put, takeEvery} from 'redux-saga/effects'\n\nimport form from '../../form'\nimport * as tooltipActions from './actions'\n\nexport default function* sagas() {\n yield all([\n takeEvery(tooltipActions.CHANGE_FIELD_VALUE, changeValue),\n takeEvery(tooltipActions.TOUCH_FIELD, touchField)\n ])\n}\n\nexport function* changeValue({payload: {formName, fieldName, value}}) {\n yield put(formActions.change(formName, form.transformFieldName(fieldName), value))\n}\n\nexport function* touchField({payload: {formName, fieldName}}) {\n yield put(formActions.touch(formName, form.transformFieldName(fieldName)))\n}\n","import _pick from 'lodash/pick'\n\nconst UPLOAD_ENDPOINT_URL = `${__BACKEND_URL__}/nice2/upload`\n\n/**\n * Upload a file.\n *\n * @param file {File} File to upload\n *\n * @returns {Object} An object which contains the following options:\n * - contentType {String}\n * - fileName {String}\n * - id {String}\n * - size {String}\n * - sizeInBytes {Number}\n * - success {bool}\n * - binaryLink {string}\n * - thumbnailLink {string}\n */\nexport const uploadRequest = file => {\n const data = new FormData()\n data.append('file', file)\n\n const fetchOptions = {\n method: 'POST',\n credentials: 'include',\n body: data\n }\n\n return fetch(UPLOAD_ENDPOINT_URL, fetchOptions)\n .then(response => response.json())\n}\n\nexport const documentToFormValueTransformer = (uploadResponse, file) => {\n const responseAttributes = _pick(uploadResponse, ['id', 'fileName'])\n const mimeType = uploadResponse.contentType\n\n return {\n ...responseAttributes,\n binaryLink: file.preview,\n thumbnailLink: mimeType.startsWith('image') ? file.preview : null\n }\n}\n","import {actions as formActions} from 'redux-form'\nimport {all, call, put, takeEvery} from 'redux-saga/effects'\n\nimport {documentToFormValueTransformer, uploadRequest} from './documents'\nimport * as actions from './actions'\nimport errorLogging from '../../errorLogging'\nimport form from '../../form'\n\nexport default function* sagas() {\n yield all([\n takeEvery(actions.UPLOAD_DOCUMENT, uploadDocument)\n ])\n}\n\nexport function* uploadDocument({payload}) {\n const {formName, file, field} = payload\n\n try {\n const uploadResponse = yield call(uploadRequest, file)\n\n if (uploadResponse.success) {\n const documentFormValue = yield call(documentToFormValueTransformer, uploadResponse, file)\n yield put(formActions.change(formName, form.transformFieldName(field), documentFormValue))\n } else {\n throw new Error(`upload not successful: ${JSON.stringify(uploadResponse)}`)\n }\n } catch (error) {\n // timestamp is needed as workaround, so that Upload component rerenders\n yield put(formActions.change(formName, field, {id: null, timestamp: Date.now()}))\n yield put(errorLogging.logError(\n 'client.component.form.uploadFailedTitle',\n 'client.component.form.uploadFailedMessage',\n error\n ))\n }\n}\n","export const UPLOAD_DOCUMENT = 'formData/UPLOAD_DOCUMENT'\n\nexport const uploadDocument = (formName, field, file) => ({\n type: UPLOAD_DOCUMENT,\n payload: {\n formName,\n file,\n field\n }\n})\n","export const LOAD_SEARCH_FILTERS = 'formData/LOAD_SEARCH_FILTERS'\nexport const SET_SEARCH_FILTER = 'formData/SET_SEARCH_FILTER'\n\nexport const loadSearchFilters = (entity, group) => ({\n type: LOAD_SEARCH_FILTERS,\n payload: {\n entity,\n group\n }\n})\n\nexport const setSearchFilter = (entity, filters) => ({\n type: SET_SEARCH_FILTER,\n payload: {\n entity,\n filters\n }\n})\n","import * as actions from './actions'\n\nconst setSearchFilter = (state, {payload: {entity, filters}}) => ({...state, [entity]: filters})\n\nconst ACTION_HANDLERS = {\n [actions.SET_SEARCH_FILTER]: setSearchFilter\n}\n\nconst initialState = {}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","export const searchFilterResponseTransformer = searchFilterResponse =>\n searchFilterResponse.body.filters.map(f => ({uniqueId: f.uniqueId, display: f.label, key: f.key}))\n","import {all, call, put, select, takeLatest} from 'redux-saga/effects'\n\nimport {searchFilterResponseTransformer} from './utils'\nimport * as actions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_SEARCH_FILTERS, loadSearchFilters)\n ])\n}\n\nexport const searchFiltersSelector = state => state.formData.searchFilters\n\nexport function* loadSearchFilters({payload}) {\n const {entity, group} = payload\n const searchFilter = yield select(searchFiltersSelector)\n\n if (!searchFilter[entity]) {\n const searchFilterResponse = yield call(\n rest.requestSaga, `client/searchfilters/${entity}${group ? `?group=${group}` : ''}`\n )\n const searchFilters = yield call(searchFilterResponseTransformer, searchFilterResponse)\n\n yield put(actions.setSearchFilter(entity, searchFilters))\n }\n}\n","export const LOAD_LOCATION_SUGGESTIONS = 'formData/LOAD_LOCATION_SUGGESTIONS'\nexport const SET_LOCATION_SUGGESTIONS = 'formData/SET_LOCATION_SUGGESTIONS'\nexport const SET_LOCATION_SUGGESTIONS_LOADING = 'formData/SET_LOCATION_SUGGESTIONS_LOADING'\n\nexport const loadLocationsSuggestions = (field, searchInput, countryValue, fieldCountries) => ({\n type: LOAD_LOCATION_SUGGESTIONS,\n payload: {\n field,\n searchInput,\n countryValue,\n fieldCountries\n }\n})\n\nexport const setLocationSuggestions = (field, suggestions) => ({\n type: SET_LOCATION_SUGGESTIONS,\n payload: {\n field,\n suggestions\n }\n})\n\nexport const setLocationSuggestionsLoading = field => ({\n type: SET_LOCATION_SUGGESTIONS_LOADING,\n payload: {\n field\n }\n})\n","import _uniq from 'lodash/uniq'\nimport _get from 'lodash/get'\nimport {all, call} from 'redux-saga/effects'\nimport {api} from 'tocco-util'\n\nimport rest from '../../rest'\n\nconst LOCATION_ENDPOINT = 'location/suggestions'\nconst countryCodeField = 'iso2'\n\n// Caches country response to reduce resolving of key or ISO code.\n// e.g. {'CH': {key: '22', display: 'Switzerland'}\nlet countryCache = {}\n\nexport const setCountryCache = newCountryCache => {\n countryCache = newCountryCache\n}\n\nexport const getCountryCache = () => countryCache\n\nexport function* getCountryCodeByKey(key) {\n for (const prop in countryCache) {\n if (countryCache[prop].key === key) {\n return prop\n }\n }\n\n const entity = yield call(rest.fetchEntity, 'Country', key, {paths: [countryCodeField]})\n const display = yield call(rest.fetchDisplay, 'Country', key)\n const countryCode = _get(entity, ['paths', countryCodeField, 'value'])\n countryCache = {\n ...countryCache,\n [countryCode]: {key: entity.key, display}\n }\n\n return countryCode\n}\n\nexport function* loadCountries(suggestions) {\n const allCountries = yield all(suggestions.map(suggestion => suggestion.country))\n\n const allCountriesUniq = yield call(_uniq, allCountries)\n\n const notLoaded = yield all(\n allCountriesUniq.reduce(\n (accumulator, currentValue) => [...accumulator, ...(countryCache[currentValue] ? [] : [currentValue])],\n []\n ))\n\n if (notLoaded.length > 0) {\n const query = {\n conditions: {\n [countryCodeField]: notLoaded\n },\n paths: [countryCodeField]\n }\n\n const countriesResponse = yield call(rest.fetchEntities, 'Country', query, {method: 'GET'})\n const displays = yield call(rest.fetchDisplays, api.getDisplayRequest(countriesResponse))\n\n countryCache = {\n ...countryCache,\n ...(countriesResponse.reduce(\n (acc, value) =>\n ({\n ...acc,\n [_get(value, ['paths', countryCodeField, 'value'])]: {\n key: value.key,\n display: _get(displays, ['Country', value.key])\n }\n }),\n {}\n ))\n }\n }\n\n return countryCache\n}\n\nexport const transformToSuggestions = (suggestions, countries) =>\n suggestions.map(suggestion => ({\n ...suggestion,\n country: countries[suggestion.country]\n }))\n\nexport function* requestSuggestions(city, postcode, country) {\n const options = {\n queryParams: {\n ...(city ? {city} : {}),\n ...(postcode ? {postcode} : {}),\n ...(country ? {country} : {})\n },\n method: 'GET'\n }\n\n const response = yield call(rest.requestSaga, LOCATION_ENDPOINT, options)\n return response.body.data\n}\n\nexport function* getCountry(country, fieldCountries) {\n return country\n ? yield call(getCountryCodeByKey, country.key)\n : fieldCountries\n}\n","import {all, call, put, takeLatest} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport {loadCountries, transformToSuggestions, requestSuggestions, getCountry} from './utils'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_LOCATION_SUGGESTIONS, loadLocations)\n ])\n}\n\nexport function* loadLocations({payload: {field, searchInput, countryValue, fieldCountries}}) {\n yield put(actions.setLocationSuggestionsLoading(field))\n\n const {city, postcode} = searchInput\n const country = yield call(getCountry, countryValue, fieldCountries)\n const suggestionsResponse = yield call(requestSuggestions, city, postcode, country)\n\n const countries = yield call(loadCountries, suggestionsResponse)\n const suggestions = yield call(transformToSuggestions, suggestionsResponse, countries)\n\n yield put(actions.setLocationSuggestions(field, suggestions))\n}\n","import * as actions from './actions'\n\nexport const setLocationSuggestions = (state, {payload: {field, suggestions}}) => (\n {\n ...state,\n [field]: {\n suggestions\n }\n }\n)\n\nexport const setLocationSuggestionsLoading = (state, {payload: {field}}) => (\n {\n ...state,\n [field]: {\n isLoading: true\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_LOCATION_SUGGESTIONS]: setLocationSuggestions,\n [actions.SET_LOCATION_SUGGESTIONS_LOADING]: setLocationSuggestionsLoading\n}\n\nconst initialState = {}\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 * as actions from './actions'\n\nexport const setNavigationStrategy = (state, {payload: {navigationStrategy}}) => {\n return {\n ...state,\n navigationStrategy\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_NAVIGATION_STRATEGY]: setNavigationStrategy\n}\n\nconst initialState = {\n navigationStrategy: 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","export const SET_NAVIGATION_STRATEGY = 'formData/SET_NAVIGATION_STRATEGY'\n\nexport const setNavigationStrategy = navigationStrategy => ({\n type: SET_NAVIGATION_STRATEGY,\n payload: {\n navigationStrategy\n }\n})\n","export const OPEN_REMOTE_CREATE = 'formData/OPEN_REMOTE_CREATE'\nexport const FINISH_CREATION = 'formData/FINISH_CREATION'\n\nexport const openRemoteCreate = (formField, formName) => ({\n type: OPEN_REMOTE_CREATE,\n payload: {\n formField,\n formName\n }\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst handleEntityCreated = (close, answerChannel) => result => {\n close()\n answerChannel.put(result)\n}\n\nconst RemoteCreate = ({\n DetailApp,\n targetEntity,\n answerChannel,\n close,\n emitAction\n}) => {\n return <DetailApp\n entityName={targetEntity}\n formName={targetEntity}\n mode={'create'}\n onEntityCreated={handleEntityCreated(close, answerChannel)}\n emitAction={emitAction}\n />\n}\n\nRemoteCreate.propTypes = {\n DetailApp: PropTypes.func.isRequired,\n targetEntity: PropTypes.string.isRequired,\n answerChannel: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired,\n close: PropTypes.func.isRequired\n}\n\nexport default RemoteCreate\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\nimport RemoteCreate from './RemoteCreate'\n\nconst mapActionCreators = {\n emitAction: actionEmitter.dispatchEmittedAction\n}\n\nexport default connect(null, mapActionCreators)(RemoteCreate)\n","import {all, call, put, take, takeEvery} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport React from 'react'\n\nimport * as actions from './actions'\nimport * as valueActions from '../values/actions'\nimport rest from '../../rest'\nimport notification from '../../notification'\nimport RemoteCreate from './RemoteCreateContainer'\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(actions.OPEN_REMOTE_CREATE, openRemoteCreate, config)\n ])\n}\n\nexport function* openRemoteCreate({detailApp}, {payload: {formName, formField}}) {\n const answerChannel = yield call(channel)\n const modalId = yield call(uuid)\n const buildCreateForm = ({close}) => <RemoteCreate\n targetEntity={formField.targetEntity}\n answerChannel={answerChannel}\n close={close}\n DetailApp={detailApp}/>\n yield put(notification.modal(modalId, formField.label, null, buildCreateForm, true))\n\n const {id} = yield take(answerChannel)\n const display = yield call(rest.fetchDisplay, formField.targetEntity, id)\n yield put(valueActions.changeFieldValue(formName, formField.path, {key: id, display}))\n}\n","import {combineReducers} from 'redux'\nimport PropTypes from 'prop-types'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport _get from 'lodash/get'\n\nimport relationEntities from './relationEntities/reducer'\nimport tooltips from './tooltips/reducer'\nimport relationEntitiesSagas from './relationEntities/sagas'\nimport tooltipsSaga from './tooltips/sagas'\nimport advancedSearchSagas from './advancedSearch/sagas'\nimport valueSagas from './values/sagas'\nimport uploadSagas from './upload/sagas'\nimport searchFilters from './searchFilters/reducer'\nimport searchFilterSagas from './searchFilters/sagas'\nimport {setRelationEntities} from './relationEntities/actions'\nimport locationSagas from './locations/sagas'\nimport locations from './locations/reducer'\nimport navigationStrategy from './navigationStrategy/reducer'\nimport {setNavigationStrategy} from './navigationStrategy/actions'\nimport remoteCreateSagas from './remoteCreate/sagas'\n\nexport const relationEntitiesSelector = store => store.formData.relationEntities.data\nexport const tooltipSelector = store => store.formData.tooltips.data\nexport const locationSuggestionsSelector = store => store.formData.locations\n\nexport const addToStore = (store, config) => {\n reducerUtil.injectReducers(store, {\n formData: combineReducers({\n relationEntities,\n tooltips,\n searchFilters,\n locations,\n navigationStrategy\n })\n })\n\n store.sagaMiddleware.run(relationEntitiesSagas)\n store.sagaMiddleware.run(tooltipsSaga)\n store.sagaMiddleware.run(advancedSearchSagas, config)\n store.sagaMiddleware.run(valueSagas)\n store.sagaMiddleware.run(uploadSagas)\n store.sagaMiddleware.run(searchFilterSagas)\n store.sagaMiddleware.run(locationSagas)\n store.sagaMiddleware.run(remoteCreateSagas, config)\n\n if (config.navigationStrategy) {\n store.dispatch(setNavigationStrategy(config.navigationStrategy))\n }\n\n const relationEntitiesData = _get(config, 'data.relationEntities', null)\n if (relationEntitiesData !== null) {\n Object.keys(relationEntitiesData).forEach(field => {\n store.dispatch(setRelationEntities(field, relationEntitiesData[field], false))\n })\n }\n}\n\nexport const formDataPropType = PropTypes.shape({\n relationEntities: PropTypes.objectOf(PropTypes.array)\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport _isEqual from 'lodash/isEqual'\nimport _reduce from 'lodash/reduce'\nimport _get from 'lodash/get'\nimport _pick from 'lodash/pick'\nimport _merge from 'lodash/merge'\nimport {\n isDirty as isDirtySelector,\n getFormSyncErrors,\n getFormAsyncErrors,\n getFormSubmitErrors\n} from 'redux-form'\n\nimport {loadRelationEntities} from './relationEntities/actions'\nimport {loadTooltip} from './tooltips/actions'\nimport {openAdvancedSearch} from './advancedSearch/actions'\nimport {changeFieldValue, touchField} from './values/actions'\nimport {uploadDocument} from './upload/actions'\nimport {loadSearchFilters} from './searchFilters/actions'\nimport {loadLocationsSuggestions} from './locations/actions'\nimport {openRemoteCreate} from './remoteCreate/actions'\n\nconst FormData = props =>\n <React.Fragment>{React.cloneElement(props.children, {formData: props})}</React.Fragment>\n\nFormData.propTypes = {\n children: PropTypes.node\n}\n\nconst mapStateToProps = (\n state,\n {formValues, tooltips, locations, relationEntities, searchFilters, isDirty, errors, navigationStrategy}\n) => ({\n ...(relationEntities ? {relationEntities: _pick(state.formData.relationEntities.data, relationEntities)} : {}),\n ...(tooltips ? {tooltips: _pick(state.formData.tooltips.data, tooltips)} : {}),\n ...(searchFilters ? {searchFilters: _pick(state.formData.searchFilters, searchFilters)} : {}),\n ...(locations ? {locations: _pick(state.formData.locations, locations)} : {}),\n ...(formValues && state.form[formValues.formName]\n ? {formValues: _pick(state.form[formValues.formName].values, formValues.fields)}\n : {}),\n ...(isDirty && state.form[isDirty.formName]\n ? {isDirty: isDirtySelector(isDirty.formName)(state, ...isDirty.fields)}\n : {}),\n ...(errors && state.form[errors.formName]\n ? {\n errors: _reduce(\n _merge(\n _pick(getFormSubmitErrors(errors.formName)(state), errors.fields),\n _pick(getFormSyncErrors(errors.formName)(state), errors.fields),\n _pick(getFormAsyncErrors(errors.formName)(state), errors.fields)\n ),\n (result, value) => ({...result, ...value}), null)\n }\n : null),\n ...(navigationStrategy && state.formData.navigationStrategy\n ? {navigationStrategy: state.formData.navigationStrategy.navigationStrategy}\n : {}\n ),\n entityModel: _get(state, 'entityDetail.entityModel')\n})\n\nconst mapActionCreators = {\n loadRelationEntities: loadRelationEntities,\n loadTooltip: loadTooltip,\n openAdvancedSearch: openAdvancedSearch,\n uploadDocument: uploadDocument,\n changeFieldValue: changeFieldValue,\n touchField: touchField,\n loadSearchFilters: loadSearchFilters,\n loadLocationsSuggestions: loadLocationsSuggestions,\n openRemoteCreate: openRemoteCreate\n}\n\nconst FormDataContainer = connect(\n mapStateToProps,\n mapActionCreators,\n null,\n {\n areStatePropsEqual: _isEqual\n }\n)(injectIntl(FormData))\n\nexport default FormDataContainer\n","import {addToStore} from './formData'\nimport FormDataContainer from './FormDataContainer'\n\nexport default {\n addToStore,\n FormDataContainer\n}\n","import {\n REMOTE_EVENT,\n remoteEvent\n} from './actions'\n\nexport default {\n REMOTE_EVENT,\n remoteEvent\n}\n","export const REMOTE_EVENT = 'remoteEvents/REMOTE_EVENT'\n\nexport const remoteEvent = event => ({\n type: REMOTE_EVENT,\n payload: {\n event\n }\n})\n","export const SET_INITIALIZED = 'entityList/SET_INITIALIZED'\nexport const INITIALIZE = 'entityList/INITIALIZE'\nexport const SET_SEARCH_FORM_TYPE = 'entityList/SET_SEARCH_FORM_TYPE'\nexport const SET_ENTITY_NAME = 'entityList/SET_ENTITY_NAME'\nexport const SET_PARENT = 'entityList/SET_PARENT'\nexport const SET_SEARCH_FORM_POSITION = 'entityList/SET_SEARCH_FORM_POSITION'\nexport const SET_FORM_NAME = 'entityList/SET_FORM_NAME'\nexport const RELOAD_ALL = 'entityList/RELOAD_ALL'\nexport const RELOAD_DATA = 'entityList/RELOAD_DATA'\nexport const SET_SEARCH_FORM_COLLAPSED = 'entityList/SET_SEARCH_FORM_COLLAPSED'\nexport const SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE = 'entityList/SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE'\n\nexport const setInitialized = (initialized = true) => ({\n type: SET_INITIALIZED,\n payload: {\n initialized\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setSearchFormType = searchFormType => ({\n type: SET_SEARCH_FORM_TYPE,\n payload: {\n searchFormType\n }\n})\n\nexport const setEntityName = entityName => ({\n type: SET_ENTITY_NAME,\n payload: {\n entityName\n }\n})\n\nexport const setParent = parent => ({\n type: SET_PARENT,\n payload: {\n parent\n }\n})\n\nexport const setSearchFormPosition = searchFormPosition => ({\n type: SET_SEARCH_FORM_POSITION,\n payload: {\n searchFormPosition\n }\n})\n\nexport const setFormName = formName => ({\n type: SET_FORM_NAME,\n payload: {\n formName\n }\n})\n\nexport const reloadData = () => ({\n type: RELOAD_DATA\n})\n\nexport const reloadAll = () => ({\n type: RELOAD_ALL\n})\n\nexport const setSearchFormCollapsed = searchFormCollapsed => ({\n type: SET_SEARCH_FORM_COLLAPSED,\n payload: {\n searchFormCollapsed\n }\n})\n\nexport const setSearchFormCollapsedInitialValue = searchFormCollapsed => ({\n type: SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE,\n payload: {\n searchFormCollapsed\n }\n})\n","import PropTypes from 'prop-types'\nconst searchFormTypes = {\n NONE: 'none',\n SIMPLE: 'simple',\n BASIC: 'basic',\n ADMIN: 'admin'\n}\n\nexport const searchFormTypePropTypes = PropTypes.oneOf(Object.values(searchFormTypes))\n\nexport default searchFormTypes\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\nimport searchFormTypes from '../../util/searchFormTypes'\n\nconst setSearchFormType = (state, {payload}) => {\n const {searchFormType: newSearchFormType} = payload\n\n const searchFormType = Object.values(searchFormTypes).find(enumV => enumV === newSearchFormType)\n || searchFormTypes.BASIC\n\n return {...state, searchFormType}\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_INITIALIZED]: reducerUtil.singleTransferReducer('initialized'),\n [actions.SET_ENTITY_NAME]: reducerUtil.singleTransferReducer('entityName'),\n [actions.SET_FORM_NAME]: reducerUtil.singleTransferReducer('formName'),\n [actions.SET_SEARCH_FORM_TYPE]: setSearchFormType,\n [actions.SET_SEARCH_FORM_POSITION]: reducerUtil.singleTransferReducer('searchFormPosition'),\n [actions.SET_PARENT]: reducerUtil.singleTransferReducer('parent'),\n [actions.SET_SEARCH_FORM_COLLAPSED]: reducerUtil.singleTransferReducer('searchFormCollapsed'),\n [actions.SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE]: reducerUtil.singleTransferReducer('searchFormCollapsed')\n}\n\nconst initialState = {\n initialized: false,\n entityName: '',\n formName: '',\n searchFormType: searchFormTypes.BASIC,\n searchFormPosition: 'top',\n parent: null,\n searchFormCollapsed: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","export const INITIALIZE = 'list/INITIALIZE'\nexport const REQUEST_ENTITIES = 'list/REQUEST_ENTITIES'\nexport const SET_ENTITIES = 'list/SET_ENTITIES'\nexport const SET_FORM_DEFINITION = 'list/SET_FORM_DEFINITION'\nexport const SET_ENTITY_MODEL = 'list/SET_ENTITY_MODEL'\nexport const SET_SORTING = 'list/SET_SORTING'\nexport const SET_LIMIT = 'list/SET_LIMIT'\nexport const SET_CURRENT_PAGE = 'list/SET_CURRENT_PAGE'\nexport const SET_ENTITY_COUNT = 'list/SET_ENTITY_COUNT'\nexport const ADD_ENTITIES_TO_STORE = 'list/ADD_ENTITIES_TO_STORE'\nexport const CLEAR_ENTITY_STORE = 'list/CLEAR_ENTITIES_CACHE'\nexport const SET_IN_PROGRESS = 'list/SET_IN_PROGRESS'\nexport const CHANGE_PAGE = 'list/CHANGE_PAGE'\nexport const REFRESH = 'list/REFRESH'\nexport const SET_SHOW_SEARCH_FORM = 'list/SET_SEARCH_FORM'\nexport const SET_SEARCH_FILTERS = 'list/SET_SEARCH_FILTERS'\nexport const SET_SIMPLE_SEARCH_FIELDS = 'list/SET_SIMPLE_SEARCH_FIELDS'\nexport const ON_ROW_CLICK = 'list/ON_ROW_CLICK'\nexport const NAVIGATE_TO_CREATE = 'entityList/NAVIGATE_TO_CREATE'\nexport const SET_FORM_SELECTABLE = 'list/SET_FORM_SELECTABLE'\nexport const SET_FORM_CLICKABLE = 'list/SET_FORM_CLICKABLE'\nexport const SET_ENDPOINT = 'list/SET_ENDPOINT'\nexport const SET_SEARCH_ENDPOINT = 'list/SET_SEARCH_ENDPOINT'\nexport const SET_CONSTRICTION = 'list/SET_CONSTRICTION'\nexport const QUERY_CHANGED = 'list/QUERY_CHANGED'\nexport const SET_SHOW_LINK = 'list/SET_SHOW_LINK'\nexport const SET_LAZY_DATA = 'list/SET_LAZY_DATA'\nexport const NAVIGATE_TO_ACTION = 'list/NAVIGATE_TO_ACTION'\nexport const SET_SORTING_INTERACTIVE = 'list/SET_SORTING_INTERACTIVE'\nexport const DEFINE_SORTING = 'list/DEFINE_SORTING'\nexport const SET_INPUT_TQL = 'list/SET_INPUT_TQL'\nexport const SET_INPUT_KEYS = 'list/SET_INPUT_KEYS'\nexport const SET_INPUT_SEARCH_FILTERS = 'list/SET_INPUT_SEARCH_FILTERS'\nexport const SET_INITIALIZED = 'list/SET_INITIALIZED'\nexport const SET_SORTABLE = 'list/SET_SORTABLE'\nexport const SET_MARKED = 'list/SET_MARKED'\nexport const TOGGLE_MARKINGS = 'list/TOGGLE_MARKINGS'\nexport const SET_DISABLE_PREFERENCES_MENU = 'list/SET_DISABLE_PREFERENCES_MENU'\r\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const requestEntities = (page, show) => ({\n type: REQUEST_ENTITIES,\n payload: {\n page,\n show\n }\n})\n\nexport const setEntities = entities => ({\n type: SET_ENTITIES,\n payload: {\n entities\n }\n})\n\nexport const addEntitiesToStore = (page, entities) => ({\n type: ADD_ENTITIES_TO_STORE,\n payload: {\n page,\n entities\n }\n})\n\nexport const clearEntityStore = () => ({\n type: CLEAR_ENTITY_STORE\n})\n\nexport const setEntityCount = entityCount => ({\n type: SET_ENTITY_COUNT,\n payload: {\n entityCount\n }\n})\n\nexport const setFormDefinition = formDefinition => ({\n type: SET_FORM_DEFINITION,\n payload: {\n formDefinition\n }\n})\n\nexport const setEntityModel = entityModel => ({\n type: SET_ENTITY_MODEL,\n payload: {\n entityModel\n }\n})\n\nexport const setSorting = sorting => ({\n type: SET_SORTING,\n payload: {\n sorting\n }\n})\n\nexport const setLimit = limit => ({\n type: SET_LIMIT,\n payload: {\n limit\n }\n})\n\nexport const setCurrentPage = currentPage => ({\n type: SET_CURRENT_PAGE,\n payload: {\n currentPage\n }\n})\n\nexport const setInProgress = inProgress => ({\n type: SET_IN_PROGRESS,\n payload: {\n inProgress\n }\n})\n\nexport const changePage = page => ({\n type: CHANGE_PAGE,\n payload: {\n page\n }\n})\n\nexport const refresh = () => ({\n type: REFRESH\n})\n\nexport const setShowSearchForm = showSearchForm => ({\n type: SET_SHOW_SEARCH_FORM,\n payload: {\n showSearchForm\n }\n})\n\nexport const setSearchFilters = searchFilters => ({\n type: SET_SEARCH_FILTERS,\n payload: {\n searchFilters\n }\n})\n\nexport const onRowClick = id => ({\n type: ON_ROW_CLICK,\n payload: {\n id\n }\n})\n\nexport const navigateToCreate = relationName => ({\n type: NAVIGATE_TO_CREATE,\n payload: {\n relationName\n }\n})\n\nexport const setFormSelectable = formSelectable => ({\n type: SET_FORM_SELECTABLE,\n payload: {\n formSelectable\n }\n})\n\nexport const setFormClickable = formClickable => ({\n type: SET_FORM_CLICKABLE,\n payload: {\n formClickable\n }\n})\n\nexport const setEndpoint = endpoint => ({\n type: SET_ENDPOINT,\n payload: {\n endpoint\n }\n})\n\nexport const setSearchEndpoint = searchEndpoint => ({\n type: SET_SEARCH_ENDPOINT,\n payload: {\n searchEndpoint\n }\n})\n\nexport const setConstriction = constriction => ({\n type: SET_CONSTRICTION,\n payload: {\n constriction\n }\n})\n\nexport const queryChanged = query => ({\n type: QUERY_CHANGED,\n payload: {\n query\n }\n})\n\nexport const setShowLink = showLink => ({\n type: SET_SHOW_LINK,\n payload: {\n showLink\n }\n})\n\nexport const setLazyData = (type, id, values) => ({\n type: SET_LAZY_DATA,\n payload: {\n type,\n id,\n values\n }\n})\n\nexport const navigateToAction = (definition, selection) => ({\n type: NAVIGATE_TO_ACTION,\n payload: {\n definition,\n selection\n }\n})\n\nexport const setSortingInteractive = (field, add) => ({\n type: SET_SORTING_INTERACTIVE,\n payload: {\n field,\n add\n }\n})\n\nexport const defineSorting = () => ({\n type: DEFINE_SORTING\n})\n\nexport const setInputTql = inputTql => ({\n type: SET_INPUT_TQL,\n payload: {\n inputTql\n }\n})\n\nexport const setInputKeys = inputKeys => ({\n type: SET_INPUT_KEYS,\n payload: {\n inputKeys\n }\n})\n\nexport const setInputSearchFilters = inputSearchFilters => ({\n type: SET_INPUT_SEARCH_FILTERS,\n payload: {\n inputSearchFilters\n }\n})\n\nexport const setInitialized = () => ({\n type: SET_INITIALIZED\n})\n\nexport const setSortable = sortable => ({\n type: SET_SORTABLE,\n payload: {\n sortable\n }\n})\n\nexport const setMarked = (entityName, entityKey, marked) => ({\n type: SET_MARKED,\n payload: {\n entityName,\n entityKey,\n marked\n }\n})\n\nexport const toggleMarkings = selection => ({\n type: TOGGLE_MARKINGS,\n payload: {\n selection\n }\n})\n\nexport const setDisablePreferencesMenu = disablePreferencesMenu => ({\n type: SET_DISABLE_PREFERENCES_MENU,\n payload: {\n disablePreferencesMenu\n }\n})\n","export const SET_INITIALIZED = 'searchForm/SET_INITIALIZED'\nexport const INITIALIZE = 'searchForm/INITIALIZE'\nexport const SET_FORM_DEFINITION = 'searchForm/SET_FORM_DEFINITION'\nexport const EXECUTE_SEARCH = 'searchForm/EXECUTE_SEARCH'\nexport const RESET_SEARCH = 'searchForm/RESET_SEARCH'\nexport const SET_SHOW_EXTENDED_SEARCH_FORM = 'searchForm/SET_SHOW_EXTENDED_SEARCH_FORM'\nexport const SET_SIMPLE_SEARCH_FIELDS = 'searchForm/SET_SIMPLE_SEARCH_FIELDS'\nexport const SET_DISABLE_SIMPLE_SEARCH = 'searchForm/SET_DISABLE_SIMPLE_SEARCH'\nexport const SET_SEARCH_FORM_NAME = 'searchForm/SET_SEARCH_FORM_NAME'\nexport const SUBMIT_SEARCH_FORM = 'searchForm/SUBMIT_SEARCH_FORM'\nexport const SET_VALUES_INITIALIZED = 'searchForm/SET_VALUES_INITIALIZED'\nexport const ADVANCED_SEARCH_UPDATE = 'searchForm/ADVANCED_SEARCH_UPDATE'\nexport const SET_FORM_FIELDS_FLAT = 'searchForm/SET_FORM_FIELDS_FLAT'\nexport const SET_SEARCH_FILTERS = 'searchForm/SET_SEARCH_FILTERS'\nexport const SET_SEARCH_FILTER_ACTIVE = 'searchForm/SET_SEARCH_FILTER_ACTIVE'\nexport const DELETE_SEARCH_FILTER = 'searchForm/DELETE_SEARCH_FILTER'\nexport const SAVE_SEARCH_FILTER = 'searchForm/SAVE_SEARCH_FILTER'\nexport const SAVE_DEFAULT_SEARCH_FILTER = 'searchForm/SAVE_DEFAULT_SEARCH_FILTER'\nexport const RESET_DEFAULT_SEARCH_FILTER = 'searchForm/RESET_DEFAULT_SEARCH_FILTER'\nexport const DISPLAY_SEARCH_FIELDS_MODAL = 'searchForm/DISPLAY_SEARCH_FIELDS_MODAL'\nexport const RESET_SEARCH_FIELDS = 'searchForm/resetSearchFields'\n\nexport const setInitialized = (initialized = true) => ({\n type: SET_INITIALIZED,\n payload: {\n initialized\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setFormDefinition = formDefinition => ({\n type: SET_FORM_DEFINITION,\n payload: {\n formDefinition\n }\n})\n\nexport const executeSearch = () => ({\n type: EXECUTE_SEARCH\n})\n\nexport const resetSearch = () => ({\n type: RESET_SEARCH\n})\n\nexport const setShowExtendedSearchForm = showExtendedSearchForm => ({\n type: SET_SHOW_EXTENDED_SEARCH_FORM,\n payload: {\n showExtendedSearchForm\n }\n})\n\nexport const setSimpleSearchFields = simpleSearchFields => ({\n type: SET_SIMPLE_SEARCH_FIELDS,\n payload: {\n simpleSearchFields\n }\n})\n\nexport const setDisableSimpleSearch = disableSimpleSearch => ({\n type: SET_DISABLE_SIMPLE_SEARCH,\n payload: {\n disableSimpleSearch\n }\n})\n\nexport const submitSearchForm = () => ({\n type: SUBMIT_SEARCH_FORM\n})\n\nexport const setValuesInitialized = valuesInitialized => ({\n type: SET_VALUES_INITIALIZED,\n payload: {\n valuesInitialized\n }\n})\n\nexport const setFormFieldsFlat = formFieldsFlat => ({\n type: SET_FORM_FIELDS_FLAT,\n payload: {\n formFieldsFlat\n }\n})\n\nexport const setSearchFilters = searchFilters => ({\n type: SET_SEARCH_FILTERS,\n payload: {\n searchFilters\n }\n})\n\nexport const setSearchFilterActive = (searchFilterId, active, exclusive) => ({\n type: SET_SEARCH_FILTER_ACTIVE,\n payload: {\n searchFilterId,\n active,\n exclusive\n }\n})\n\nexport const deleteSearchFilter = primaryKey => ({\n type: DELETE_SEARCH_FILTER,\n payload: {\n primaryKey\n }\n})\n\nexport const saveSearchFilter = () => ({\n type: SAVE_SEARCH_FILTER\n})\n\nexport const saveDefaultSearchFilter = () => ({\n type: SAVE_DEFAULT_SEARCH_FILTER\n})\n\nexport const resetDefaultSearchFilter = () => ({\n type: RESET_DEFAULT_SEARCH_FILTER\n})\n\nexport const displaySearchFieldsModal = () => ({\n type: DISPLAY_SEARCH_FIELDS_MODAL\n})\n\nexport const resetSearchFields = () => ({\n type: RESET_SEARCH_FIELDS\n})\n","export const LOAD_PREFERENCES = 'preferences/LOAD_PREFERENCES'\nexport const SET_POSITIONS = 'preferences/SET_POSITIONS'\nexport const CHANGE_POSITION = 'preferences/CHANGE_POSITION'\nexport const SET_SORTING = 'preferences/SET_SORTING'\nexport const SET_COLUMNS = 'preferences/SET_COLUMNS'\nexport const RESET_SORTING = 'preferences/RESET_SORTING'\nexport const RESET_COLUMNS = 'preferences/RESET_COLUMNS'\nexport const RESET_PREFERENCES = 'preferences/RESET_PREFERENCES'\nexport const DISPLAY_COLUMN_MODAL = 'preferences/DISPLAY_COLUMN_MODAL'\nexport const SET_PREFERENCES_LOADED = 'preferences/SET_PREFERENCES_LOADED'\n\nexport const loadPreferences = () => ({\n type: LOAD_PREFERENCES\n})\n\nexport const setPreferencesLoaded = preferencesLoaded => ({\n type: SET_PREFERENCES_LOADED,\n payload: {\n preferencesLoaded\n }\n})\n\nexport const setPositions = positions => ({\n type: SET_POSITIONS,\n payload: {\n positions\n }\n})\n\nexport const changePosition = (field, afterFieldPosition, columns) => ({\n type: CHANGE_POSITION,\n payload: {\n field,\n afterFieldPosition,\n columns\n }\n})\n\nexport const setSorting = sorting => ({\n type: SET_SORTING,\n payload: {\n sorting\n }\n})\n\nexport const setColumns = columns => ({\n type: SET_COLUMNS,\n payload: {\n columns\n }\n})\n\nexport const resetSorting = () => ({\n type: RESET_SORTING,\n payload: {}\n})\n\nexport const resetPreferences = () => ({\n type: RESET_PREFERENCES,\n payload: {}\n})\n\nexport const displayColumnModal = () => ({\n type: DISPLAY_COLUMN_MODAL,\n payload: {}\n})\n\nexport const resetColumns = () => ({\n type: RESET_COLUMNS,\n payload: {}\n})\n","import {put, call, all, take, takeLatest} from 'redux-saga/effects'\nimport {appFactory, externalEvents} from 'tocco-app-extensions'\n\nimport * as actions from './../entityList/actions'\nimport * as listActions from './../list/actions'\nimport * as searchFormActions from './../searchForm/actions'\nimport * as preferenceActions from './../preferences/actions'\n\nexport const entityListSelector = state => state.entityList\n\nexport default function* sagas() {\n yield all([\n call(initialize),\n takeLatest(actions.RELOAD_DATA, reloadData),\n takeLatest(actions.RELOAD_ALL, initialize, false),\n takeLatest(actions.SET_SEARCH_FORM_COLLAPSED, searchFormCollapsed)\n ])\n}\n\nexport function* initialize(waitForInputDispatch = true) {\n if (waitForInputDispatch) {\n yield take(appFactory.inputDispatchActionType)\n }\n yield put(listActions.initialize())\n yield put(preferenceActions.loadPreferences())\n yield put(searchFormActions.initialize())\n yield all([\n take(listActions.SET_INITIALIZED),\n take(searchFormActions.SET_INITIALIZED),\n take(preferenceActions.SET_PREFERENCES_LOADED)\n ])\n yield put(listActions.defineSorting())\n yield take(listActions.SET_SORTING)\n yield put(searchFormActions.executeSearch())\n}\n\nexport function* reloadData() {\n yield put(searchFormActions.initialize())\n yield all([\n take(searchFormActions.SET_INITIALIZED)\n ])\n yield put(searchFormActions.executeSearch())\n}\n\nexport function* searchFormCollapsed({payload: {searchFormCollapsed}}) {\n yield put(externalEvents.fireExternalEvent('onSearchFormCollapsedChange', {collapsed: searchFormCollapsed}))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\nimport _get from 'lodash/get'\n\nimport * as actions from './actions'\n\nconst addEntityToStore = (state, {payload}) => ({\n ...state,\n entityStore: {\n ...state.entityStore,\n [payload.page]: payload.entities\n }\n})\n\nconst setLazyData = (state, {payload: {type, id, values}}) => ({\n ...state,\n lazyData: {\n ...state.lazyData,\n [type]: {\n ...state.lazyData[type],\n [id]: {..._get(state, ['lazyData', type, id], {}), ...values}\n }\n }\n})\n\nconst clearEntityStore = state => ({\n ...state,\n entityStore: {}\n})\n\nconst defaultOrder = 'asc'\nconst getOpposite = order => order === 'asc' ? 'desc' : 'asc'\nconst setSortingInteractive = (state, {payload: {field, add}}) => {\n if (!add) {\n const currentSorting = state.sorting\n const order = (currentSorting.length > 0 && currentSorting[0].field === field\n ? getOpposite(currentSorting[0].order)\n : defaultOrder)\n return {\n ...state,\n sorting: [{field, order}]\n }\n } else {\n const contains = state.sorting.filter(s => s.field === field)\n const order = contains.length > 0 ? getOpposite(contains[0].order) : defaultOrder\n\n return {\n ...state,\n sorting: [...state.sorting.filter(s => s.field !== field), {field, order}]\n }\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_ENTITIES]: reducerUtil.singleTransferReducer('entities'),\n [actions.SET_FORM_DEFINITION]: reducerUtil.singleTransferReducer('formDefinition'),\n [actions.SET_ENTITY_MODEL]: reducerUtil.singleTransferReducer('entityModel'),\n [actions.SET_LIMIT]: reducerUtil.singleTransferReducer('limit'),\n [actions.SET_CURRENT_PAGE]: reducerUtil.singleTransferReducer('currentPage'),\n [actions.SET_SORTING]: reducerUtil.singleTransferReducer('sorting'),\n [actions.SET_SORTING_INTERACTIVE]: setSortingInteractive,\n [actions.SET_ENTITY_COUNT]: reducerUtil.singleTransferReducer('entityCount'),\n [actions.ADD_ENTITIES_TO_STORE]: addEntityToStore,\n [actions.SET_LAZY_DATA]: setLazyData,\n [actions.CLEAR_ENTITY_STORE]: clearEntityStore,\n [actions.SET_IN_PROGRESS]: reducerUtil.singleTransferReducer('inProgress'),\n [actions.SET_SHOW_SEARCH_FORM]: reducerUtil.singleTransferReducer('showSearchForm'),\n [actions.SET_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('searchFilters'),\n [actions.SET_FORM_SELECTABLE]: reducerUtil.singleTransferReducer('formSelectable'),\n [actions.SET_FORM_CLICKABLE]: reducerUtil.singleTransferReducer('formClickable'),\n [actions.SET_ENDPOINT]: reducerUtil.singleTransferReducer('endpoint'),\n [actions.SET_SEARCH_ENDPOINT]: reducerUtil.singleTransferReducer('searchEndpoint'),\n [actions.SET_CONSTRICTION]: reducerUtil.singleTransferReducer('constriction'),\n [actions.SET_SHOW_LINK]: reducerUtil.singleTransferReducer('showLink'),\n [actions.SET_SORTABLE]: reducerUtil.singleTransferReducer('sortable'),\n [actions.SET_INPUT_TQL]: reducerUtil.singleTransferReducer('inputTql'),\n [actions.SET_INPUT_KEYS]: reducerUtil.singleTransferReducer('inputKeys'),\n [actions.SET_INPUT_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('inputSearchFilters'),\n [actions.SET_DISABLE_PREFERENCES_MENU]: reducerUtil.singleTransferReducer('disablePreferencesMenu')\n}\n\nconst initialState = {\n entityModel: {},\n entities: [],\n limit: 10,\n currentPage: 1,\n sorting: [],\n formDefinition: null,\n entityCount: null,\n entityStore: {},\n inProgress: true,\n showSearchForm: true,\n searchFilters: [],\n createPermission: false,\n formSelectable: false,\n formClickable: false,\n showLink: false,\n sortable: true,\n lazyData: {},\n endpoint: null,\n searchEndpoint: null,\n constriction: null,\n inputTql: null,\n inputKeys: null,\n inputSearchFilters: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import _reduce from 'lodash/reduce'\nimport {tqlBuilder} from 'tocco-util'\n\nconst getFilterArray = v =>\n Array.isArray(v) ? v.map(e => e.uniqueId) : [v.uniqueId]\n\nexport const getFetchOptionsFromSearchForm = (searchFormValues, formFields = {}) => (\n _reduce(searchFormValues, (acc, value, path) => {\n const addition = {}\n if (path === 'searchFilter') {\n if (value) {\n addition.filters = getFilterArray(value)\n }\n } else {\n const fieldType = formFields[path]\n const tql = tqlBuilder.getTql(path, value, fieldType)\n addition.tql = [...(acc.tql ? [acc.tql] : []), tql].filter(Boolean).join(' and ')\n }\n\n return {...acc, ...addition}\n }, {})\n)\n","export const ON_SELECT_CHANGE = 'list/ON_ROW_SELECT'\nexport const SET_SELECTION = 'list/SET_SELECTION'\nexport const CLEAR_SELECTION = 'selection/CLEAR_SELECTION'\nexport const SET_SHOW_SELECTION_CONTROLLER = 'selection/SET_SHOW_SELECTION_CONTROLLER'\nexport const SET_TABLE_SELECTION_STYLE = 'selection/SET_TABLE_SELECTION_STYLE'\nexport const SET_QUERY = 'selection/SET_QUERY'\nexport const SET_QUERY_COUNT = 'selection/SET_QUERY_COUNT'\nexport const TOGGLE_SHOW_SELECTED_RECORDS = 'selection/TOOGLE_SHOW_SELECTED_RECORDS'\nexport const RELOAD_DATA = 'selection/RELOAD_DATA'\n\nexport const setSelection = selection => ({\n type: SET_SELECTION,\n payload: {\n selection\n }\n})\n\nexport const onSelectChange = (keys, isSelected) => ({\n type: ON_SELECT_CHANGE,\n payload: {\n keys,\n isSelected\n }\n})\n\nexport const clearSelection = () => ({\n type: CLEAR_SELECTION\n})\n\nexport const setShowSelectionController = showSelectionController => ({\n type: SET_SHOW_SELECTION_CONTROLLER,\n payload: {\n showSelectionController\n }\n})\n\nexport const setTableSelectionStyle = tableSelectionStyle => ({\n type: SET_TABLE_SELECTION_STYLE,\n payload: {\n tableSelectionStyle\n }\n})\n\nexport const setQuery = query => ({\n type: SET_QUERY,\n payload: {\n query\n }\n})\n\nexport const setQueryCount = queryCount => ({\n type: SET_QUERY_COUNT,\n payload: {\n queryCount\n }\n})\n\nexport const toggleShowSelectedRecords = () => ({\n type: TOGGLE_SHOW_SELECTED_RECORDS\n})\n\nexport const reloadData = () => ({\n type: RELOAD_DATA\n})\n","import styled from 'styled-components'\nimport {Button, scale} from 'tocco-ui'\n\nexport const StyledButton = styled(Button)`\n float: right;\n margin-top: ${scale.space(0)};\n margin-right: 0;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst LazyDataEnhancer = ({value, children}) => React.cloneElement(children, {value})\n\nLazyDataEnhancer.propTypes = {\n children: PropTypes.node,\n value: PropTypes.any\n}\n\nexport default LazyDataEnhancer\n","import _get from 'lodash/get'\n\nconst multiRelationHandler = (value, lazyData) => {\n if (!value) {\n return value\n }\n\n return value.map(value => {\n const display = _get(lazyData, ['defaultDisplays', value.model, value.key], '')\n return {...value, display}\n })\n}\n\nconst singleRelationHandler = (value, lazyData) => {\n if (!value) {\n return value\n }\n const display = _get(lazyData, ['defaultDisplays', value.model, value.key], '')\n return {...value, display}\n}\n\nconst displayExpressionHandler = (value, lazyData, info) => (\n _get(lazyData, ['displayExpressions', info.formName, info.key, info.path], '')\n)\n\nconst typeHandlers = {\n 'multi-select-box': multiRelationHandler,\n 'multi-remote-field': multiRelationHandler,\n 'single-select-box': singleRelationHandler,\n 'single-remote-field': singleRelationHandler,\n 'displayExpression': displayExpressionHandler\n}\n\nexport const lazyValueEnhancer = (value, type, lazyData, info) => {\n const typeHandler = typeHandlers[type]\n\n if (!typeHandler) {\n return value\n }\n\n return typeHandler(value, lazyData, info)\n}\n","import {connect} from 'react-redux'\n\nimport LazyDataEnhancer from './LazyDataEnhancer'\nimport {lazyValueEnhancer} from '../../util/lazyLoading'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = (state, props) => {\n const infos = {\n path: props.path,\n formName: state.entityList.formName,\n key: props.entityKey\n }\n\n return {\n value: lazyValueEnhancer(props.value, props.type, state.list.lazyData, infos)\n }\n}\n\nexport default connect(mapStateToProps, mapActionCreators)(LazyDataEnhancer)\n","import LazyDataEnhancerContainer from './LazyDataEnhancerContainer'\n\nexport default LazyDataEnhancerContainer\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography} from 'tocco-ui'\nimport {formData, field} from 'tocco-app-extensions'\nimport {js} from 'tocco-util'\n\nimport LazyDataEnhancer from '../components/LazyDataEnhancer'\n\nexport const MultiSeparator = () => (<Typography.Span>, </Typography.Span>)\n\nconst multiTypes = ['multi-select-box', 'multi-remote-field']\n\nexport default (fieldDefinition, entity, intl) => {\n const {id, path, dataType} = fieldDefinition\n const isMultiType = multiTypes.includes(dataType)\n const pathValue = entity[path]\n const values = !isMultiType && Array.isArray(pathValue) ? pathValue : [pathValue]\n return <span key={id} style={{marginRight: '2px'}}>\n {values.map((v, idx) =>\n <formData.FormDataContainer key={`formDataContainer-${entity.__key}-${path}-${idx}`} navigationStrategy={true}>\n <FormattedValueWrapper type={dataType} value={v} intl={intl} formField={fieldDefinition}/>\n </formData.FormDataContainer>\n ).reduce((prev, curr, idx) => [prev, <MultiSeparator key={'sep' + idx}/>, curr])\n }\n </span>\n}\n\nconst FormattedValueWrapper = ({value, type, formData, intl, formField}) => {\n const modelField = {\n targetEntity: value && js.getOrFirst(value).model\n }\n\n const Field = useMemo(() => field.factory('list', type), [])\n\n return <LazyDataEnhancer value={value} type={type}>\n <Field\n type={type}\n formField={formField}\n modelField={modelField}\n value={value}\n formData={formData}\n breakWords={false}\n />\n </LazyDataEnhancer>\n}\n\nFormattedValueWrapper.propTypes = {\n value: PropTypes.any,\n type: PropTypes.string.isRequired,\n formData: PropTypes.shape({\n navigationStrategy: PropTypes.object\n }),\n intl: PropTypes.object.isRequired,\n formField: PropTypes.object.isRequired\n}\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui'\n\nexport const StyledActionWrapper = styled.div`\n ${StyledButton} {\n width: 100%;\n max-width: fit-content;\n justify-content: center;\n box-sizing: border-box;\n\n > * {\n overflow: hidden;\n }\n }\n`\n","import React from 'react'\nimport {actions, form} from 'tocco-app-extensions'\nimport {FormattedValue} from 'tocco-ui'\n\nimport fieldFactory from './fieldFactory'\nimport LazyDataCell from '../components/LazyDataEnhancer'\nimport {StyledActionWrapper} from './StyledComponents'\n\nexport default (field, entity, parent, intl) => {\n const {componentType} = field\n\n if (actions.isAction(componentType)) {\n return getAction(field, entity, parent)\n } else if (componentType === form.componentTypes.FIELD) {\n return fieldFactory(field, entity, intl)\n } else if (componentType === form.componentTypes.DISPLAY) {\n return getDisplayExpression(field, entity)\n }\n}\n\nconst getDisplayExpression = (field, entity) =>\n <LazyDataCell\n key={'action-' + field.id}\n path={field.id}\n entityKey={entity.__key}\n type={'displayExpression'}\n value={null}\n >\n <FormattedValue type=\"html\" breakWords={false} value={entity[field.id]}/>\n </LazyDataCell>\n\nconst getAction = (field, entity, parent) =>\n <StyledActionWrapper\n key={'action-' + field.id}\n onClick={e => {\n e.stopPropagation()\n }}\n >\n <actions.Action\n key={'tableAction' + field.id}\n definition={field}\n selection={actions.getSingleEntitySelection(entity.__model, entity.__key)}\n parent={parent}\n />\n </StyledActionWrapper>\n","import _uniq from 'lodash/uniq'\nimport {actions, form} from 'tocco-app-extensions'\nimport {api} from 'tocco-util'\n\nimport cellRenderer from '../cellRenderer'\n\nexport const getTable = formDefinition =>\n formDefinition.children.find(child => child.componentType === form.componentTypes.TABLE)\n\nexport const getActionBar = formDefinition =>\n formDefinition.children.find(child => child.componentType === form.componentTypes.ACTION_BAR)\n\nexport const getSorting = formDefinition => {\n const table = getTable(formDefinition)\n return table.sorting ? table.sorting : []\n}\n\nexport const getSelectable = formDefinition => {\n const table = getTable(formDefinition)\n return table.selectable !== false\n}\n\nexport const getClickable = formDefinition => {\n const table = getTable(formDefinition)\n return table.clickable !== false\n}\n\nexport const getDisablePreferencesMenu = formDefinition =>\n formDefinition.disablePreferencesMenu === true\n\nexport const getEndpoint = formDefinition => {\n const table = getTable(formDefinition)\n return table.endpoint || null\n}\n\nexport const getSearchEndpoint = formDefinition => {\n const table = getTable(formDefinition)\n return table.searchEndpoint || null\n}\n\nexport const getConstriction = formDefinition => {\n const table = getTable(formDefinition)\n return table.constriction || null\n}\n\nconst isDisplayableChild = child => !child.hidden\n\nconst getSortingAttributes = (column, sorting) => {\n const idx = sorting && sorting.findIndex(s => s.field === column.id)\n return idx >= 0\n ? {\n sortRank: idx + 1,\n order: sorting[idx].order\n }\n : null\n}\n\nconst rightAlignedTypes = ['counter', 'decimal', 'double', 'integer', 'latitude', 'long', 'longitude', 'moneyamount',\n 'percent', 'serial', 'sorting', 'version']\n\nconst isRightAligned = column =>\n column.children && column.children.length === 1 && rightAlignedTypes.includes(column.children[0].dataType)\n\nexport const getColumnDefinition = ({\n table,\n sorting,\n sortable = true,\n parent,\n intl,\n columnDisplayPreferences = {},\n cellRenderers = {}\n}\n\n) => table.children\n .filter(column => Object.prototype.hasOwnProperty.call(columnDisplayPreferences, column.id)\n ? columnDisplayPreferences[column.id]\n : !column.hidden)\n .filter(column => !parent || column.children.length !== 1 || column.children[0].path !== parent.reverseRelationName)\n .filter(column => column.children.filter(isDisplayableChild).length > 0)\n .map(c => (\n {\n id: c.id,\n label: c.label,\n sorting: {\n sortable: sortable && c.sortable,\n ...getSortingAttributes(c, sorting)\n },\n shrinkToContent: c.shrinkToContent || false,\n children: c.children.filter(isDisplayableChild),\n resizable: !c.widthFixed,\n rightAligned: isRightAligned(c),\n CellRenderer: ({rowData, column}) =>\n c.clientRenderer && cellRenderers[c.clientRenderer]\n ? cellRenderers[c.clientRenderer](rowData, column, child => cellRenderer(child, rowData, parent, intl))\n : column.children.map(child => cellRenderer(child, rowData, parent, intl))\n }\n ))\n\nexport const getFields = (formDefinition, columnDisplayPreferences) => {\n const relationFields = []\n const displayExpressionFields = []\n const columns = getColumnDefinition({table: getTable(formDefinition), columnDisplayPreferences})\n\n const fields = columns.reduce((accumulator, current) => (\n [\n ...accumulator,\n ...current.children\n .filter(child => !actions.isAction(child.componentType))\n .map(child => {\n if (api.relationFieldTypes.includes(child.dataType)) {\n relationFields.push(child.path)\n } else if (child.componentType === 'display') {\n displayExpressionFields.push(child.id)\n return null\n }\n\n return child.path\n }).filter(f => f)]\n ), [])\n\n return {paths: _uniq(fields), relationFields, displayExpressionFields}\n}\n\nexport const getFormFieldFlat = formDefinition =>\n searchChildren(formDefinition)\n\nconst searchChildren = node => {\n if (node.componentType === 'field-set') {\n return node.children.reduce((acc, value) => ({...acc, [value.path || value.id]: value.dataType}), {})\n } else if (node.children) {\n return node.children.reduce((acc, value) => ({\n ...acc,\n ...searchChildren(value)\n }), {})\n }\n}\n\n/**\n * If the search form contains a field pointing to the parent entity this must not be a full-text\n * search field and should be readonly. This function will search for the correct field and replace its\n * type and change the readonly attribute.\n */\nexport const changeParentFieldType = (formElement, parentPath) => {\n if (formElement.componentType === 'field-set') {\n const containsParentField = formElement.children.some(child => child.path === parentPath)\n\n return {\n ...formElement,\n ...(containsParentField && {readonly: true}),\n children: formElement.children.map(child =>\n child.path === parentPath\n ? {...child, dataType: 'single-select-box'}\n : child)\n }\n }\n if (formElement.children) {\n return {\n ...formElement,\n children: formElement.children.map(child => changeParentFieldType(child, parentPath))\n }\n }\n\n return formElement\n}\n\nexport const getTableColumns = (formDefinition, columnDisplayPreferences = {}, parent) =>\n getTable(formDefinition)\n .children\n .filter(column => !parent || column.children.length !== 1 || column.children[0].path !== parent.reverseRelationName)\n .map(column => ({\n ...column,\n hidden: Object.prototype.hasOwnProperty.call(columnDisplayPreferences, column.id)\n ? !columnDisplayPreferences[column.id]\n : column.hidden\n }))\n","import React from 'react'\nimport _forOwn from 'lodash/forOwn'\nimport {FormattedMessage} from 'react-intl'\nimport {form} from 'tocco-app-extensions'\n\nexport const validateSearchFields = (values, formDefinition) => {\n const errors = {}\n\n _forOwn(values, (value, fieldName) => {\n let fieldDefinition = fieldDefinitionCache.get(fieldName)\n if (!fieldDefinition) {\n fieldDefinition = getFieldDefinition(form.transformFieldNameBack(fieldName), formDefinition)\n fieldDefinitionCache.add(fieldName, fieldDefinition)\n }\n\n if (fieldDefinition) {\n const fieldErrors = validateField(value, fieldDefinition)\n if (fieldErrors) {\n errors[fieldName] = fieldErrors\n }\n }\n })\n\n return errors\n}\n\nconst validateField = (value, definition) => {\n const type = definition.dataType\n const typeValidator = typeValidators[type]\n\n if (typeValidator) {\n return typeValidator(value)\n }\n return null\n}\n\nconst fieldDefinitionCache = (() => {\n const definitionCache = {}\n\n const addToCache = (name, definition) => {\n definitionCache[name] = definition\n }\n const getFromCache = name => definitionCache[name]\n\n return {\n add: addToCache,\n get: getFromCache\n }\n})()\n\nconst getFieldDefinition = (fieldName, fieldDefinition) => {\n if (fieldDefinition.id === fieldName) {\n return fieldDefinition.children[0]\n }\n\n let result = null\n if (fieldDefinition.children) {\n fieldDefinition.children.forEach(child => {\n const fieldDefinition = getFieldDefinition(fieldName, child)\n if (fieldDefinition) {\n result = fieldDefinition\n }\n })\n }\n\n return result\n}\n\nconst typeValidators = {\n 'string': value => {\n const minLength = 2\n if (value.length > 0 && value.length < minLength) {\n return {\n minLength: [\n <FormattedMessage\n key=\"minLength\"\n id=\"client.entity-list.searchFormValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n }\n },\n 'fulltext-search': value => {\n const minLength = 2\n if (value.length > 0 && value.length < minLength) {\n return {\n minLength: [\n <FormattedMessage\n key=\"minLength\"\n id=\"client.entity-list.searchFormValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n }\n }\n}\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\nimport {StyledLabel, StyledLi} from 'tocco-ui/src/Typography'\nimport {lighten} from 'polished'\n\nexport const StyledUl = styled.ul`\n list-style-type: none;\n margin-top: ${scale.space(-0.5)} !important; // Nice2 Reset\n padding-left: ${scale.space(-0.5)} !important; // Nice2 Reset\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n\n ${StyledLabel} {\n padding: 0 !important; // Nice2 Reset\n }\n`\n\nexport const StyledCheckbox = styled.input`\n vertical-align: top;\n margin-right: ${scale.space(-1)} !important; // Nice2 Reset\n\n &:hover {\n cursor: pointer;\n }\n`\n\nexport const StyledButtonWrapper = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n\nexport const StyledId = styled.span`\n color: ${theme.color('text')};\n font-style: italic;\n`\n\nexport const StyledItem = styled(StyledLi)`\n border-right: ${({isDraggedOver, theme}) => isDraggedOver ? `3px solid ${theme.colors.secondary}` : 'none'};\n ${({draggable, theme}) => draggable && `\n &:hover {\n background-color: ${lighten(0.25, theme.colors.secondaryLight)};\n\n &,\n label {\n cursor: pointer;\n }\n }\n `\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useMemo} from 'react'\nimport {useDnD} from 'tocco-util'\nimport {Button, SearchBox, Typography} from 'tocco-ui'\n\nimport {\n StyledCheckbox,\n StyledUl,\n StyledButtonWrapper,\n StyledId,\n StyledItem\n} from './StyledColumnPicker'\n\nconst ColumnPicker = ({onOk, dndEnabled, initialColumns, intl}) => {\n const [columns, setColumns] = useState(initialColumns)\n const [searchTerm, setSearchTerm] = useState(null)\n const changeColumnPosition = (currentlyDragging, currentlyDragOver, columns) => {\n if (currentlyDragging !== currentlyDragOver) {\n const currentlyDraggingItem = columns.find(c => c.id === currentlyDragging)\n setColumns(columns\n .filter(c => c !== currentlyDraggingItem)\n .reduce((acc, key) => [\n ...acc,\n key,\n ...(key.id === currentlyDragOver ? [currentlyDraggingItem] : [])\n ], []))\n }\n }\n const {dndEvents, dndState} = useDnD(changeColumnPosition, columns)\n\n const items = useMemo(() => columns\n .filter(column => searchTerm === null || column.label.match(new RegExp(searchTerm, 'i')))\n .map(column => <StyledItem\n key={column.id}\n draggable={dndEnabled}\n isDraggedOver={dndState.currentlyDragOver === column.id && dndState.currentlyDragging !== column.id}\n {...(dndEnabled && {...dndEvents(column.id)})}>\n <StyledCheckbox\n type={'checkbox'}\n id={column.id}\n checked={!column.hidden}\n onChange={value => setColumns(columns\n .map(c => c.id === column.id\n ? ({\n ...c,\n hidden: !value.target.checked\n })\n : c))}\n />\n <Typography.Label for={column.id}>\n {column.label || <StyledId>{column.id}</StyledId>}\n </Typography.Label>\n </StyledItem>), [searchTerm, columns, dndState])\n\n return (\n <div>\n <SearchBox\n placeholder={intl.formatMessage({id: 'client.entity-list.preferences.columns.search'})}\n onSearch={setSearchTerm}/>\n <StyledUl>{items}</StyledUl>\n <StyledButtonWrapper>\n <Button onClick={() => onOk(columns)} look={'raised'}>\n {intl.formatMessage({id: 'client.entity-list.preferences.columns.okButton'})}\n </Button>\n </StyledButtonWrapper>\n </div>\n )\n}\n\nColumnPicker.propTypes = {\n initialColumns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n label: PropTypes.string,\n hidden: PropTypes.bool.isRequired\n })).isRequired,\n onOk: PropTypes.func.isRequired,\n dndEnabled: PropTypes.bool.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nexport default ColumnPicker\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport ColumnPicker from './ColumnPicker'\n\nconst mapStateToProps = (state, props) => ({\n columns: props.columns,\n onOk: props.onOk\n})\n\nexport default connect(mapStateToProps)(injectIntl(ColumnPicker))\n","import ColumnPicker from './ColumnPickerContainer'\n\nexport default ColumnPicker\n","import {form, rest, notification} from 'tocco-app-extensions'\nimport React, {useState} from 'react'\nimport _reduce from 'lodash/reduce'\nimport {\n actions as formActions,\n getFormValues,\n isDirty\n} from 'redux-form'\nimport * as formActionTypes from 'redux-form/es/actionTypes'\nimport {call, put, select, takeLatest, take, all} from 'redux-saga/effects'\nimport {EditableValue, StatedValue} from 'tocco-ui'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButton} from './StyledComponents'\nimport * as actions from './actions'\nimport {getFormFieldFlat, getEndpoint, changeParentFieldType} from '../../util/api/forms'\nimport {setSearchFormType} from '../entityList/actions'\nimport {validateSearchFields} from '../../util/searchFormValidation'\nimport {SET_ENTITY_MODEL, SET_FORM_DEFINITION} from '../list/actions'\nimport {getBasicQuery} from '../list/sagas'\nimport searchFormTypes from '../../util/searchFormTypes'\nimport ColumnPicker from '../../components/ColumnPicker'\n\nexport const inputSelector = state => state.input\nexport const searchFormSelector = state => state.searchForm\nexport const listSelector = state => state.list\nexport const entityListSelector = state => state.entityList\nexport const listFromDefinitionSelector = state => state.list.formDefinition\nexport const searchValuesSelector = getFormValues('searchForm')\nexport const isDirtySelector = isDirty('searchForm')\n\nconst FORM_ID = 'searchForm'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(formActionTypes.CHANGE, submitSearchFrom),\n takeLatest(actions.SUBMIT_SEARCH_FORM, submitSearchFrom),\n takeLatest(actions.RESET_SEARCH, resetSearch),\n takeLatest(actions.SAVE_SEARCH_FILTER, saveSearchFilter),\n takeLatest(actions.DELETE_SEARCH_FILTER, deleteSearchFilter),\n takeLatest(actions.SAVE_DEFAULT_SEARCH_FILTER, saveDefaultSearchFilter),\n takeLatest(actions.RESET_DEFAULT_SEARCH_FILTER, resetDefaultSearchFilter),\n takeLatest(actions.DISPLAY_SEARCH_FIELDS_MODAL, displaySearchFieldsModal),\n takeLatest(actions.RESET_SEARCH_FIELDS, resetSearchFields)\n ])\n}\n\nexport function* initialize() {\n const {searchFormType, entityName} = yield select(entityListSelector)\n const searchFormVisible = searchFormType !== searchFormTypes.NONE\n\n const formDefinition = searchFormVisible ? yield call(loadSearchForm) : null\n yield call(setInitialFormValues, searchFormVisible, formDefinition)\n if (searchFormType === searchFormTypes.ADMIN) {\n yield call(loadSearchFilter, entityName)\n }\n\n yield put(actions.setInitialized())\n}\n\nexport function* getListFormDefinition() {\n const formDefinition = yield select(listFromDefinitionSelector)\n if (!formDefinition) {\n const action = yield take(SET_FORM_DEFINITION)\n return action.payload.formDefinition\n }\n\n return formDefinition\n}\n\nexport function* setInitialFormValues(searchFormVisible, formDefinition) {\n const {preselectedSearchFields} = yield select(inputSelector)\n const {parent} = yield select(entityListSelector)\n let formValues = {}\n if (preselectedSearchFields) {\n const model = yield call(getEntityModel)\n const preselectedValues = searchFormVisible\n ? yield call(form.transformInputValues, preselectedSearchFields, model)\n : preselectedSearchFields\n\n formValues = {...formValues, ...preselectedValues}\n }\n\n if (parent && !Object.prototype.hasOwnProperty.call(formValues, parent.reverseRelationName)) {\n const listFormDefinition = yield call(getListFormDefinition)\n const endpoint = yield call(getEndpoint, listFormDefinition)\n if (!endpoint) {\n const display = yield call(rest.fetchDisplay, parent.model, parent.key)\n formValues[parent.reverseRelationName] = {key: parent.key, display}\n }\n }\n\n if (searchFormVisible && formDefinition) {\n const fieldDefinitions = yield call(form.getFieldDefinitions, formDefinition)\n const fromDefaultValues = yield call(form.getDefaultValues, fieldDefinitions)\n formValues = {...fromDefaultValues, ...formValues}\n }\n\n const transformedFromValues = yield call(transformFieldNames, formValues)\n const oldValues = yield select(getFormValues(FORM_ID))\n\n yield put(formActions.initialize(FORM_ID, transformedFromValues))\n if (oldValues) {\n yield all(Object.keys(oldValues).map(fieldId =>\n put(formActions.change(FORM_ID, fieldId, oldValues[fieldId]))\n ))\n }\n yield put(actions.setValuesInitialized(true))\n}\n\nexport function* transformFieldNames(formValues) {\n return _reduce(formValues, (acc, val, key) => (\n {...acc, [form.transformFieldName(key)]: val}\n ), {})\n}\n\nexport function* submitSearchFrom() {\n const values = yield select(getFormValues(FORM_ID))\n const {formDefinition} = yield select(searchFormSelector)\n const errors = yield call(validateSearchFields, values, formDefinition)\n\n if (Object.keys(errors).length === 0) {\n yield put(actions.executeSearch())\n }\n}\n\nexport function* loadSearchFilter(entityName) {\n const searchFilters = yield call(rest.fetchSearchFilters, entityName)\n\n const {parent} = yield select(entityListSelector)\n const listHasNoParent = !parent\n yield put(actions.setSearchFilters(searchFilters.map(searchFilter =>\n ({...searchFilter, ...(listHasNoParent && searchFilter.defaultFilter && {active: true})}))\n ))\n}\n\nexport function* setSimpleForm() {\n const formDefinition = {txtFulltext: 'fulltext-search'}\n yield put(actions.setFormFieldsFlat(formDefinition))\n}\n\nexport function* loadSearchForm(forceLoad = false) {\n const {searchFormType, formName} = yield select(entityListSelector)\n if (searchFormType === searchFormTypes.SIMPLE) {\n yield call(setSimpleForm)\n return null\n }\n\n let formDefinition = yield call(rest.fetchForm, formName, 'search', true, forceLoad)\n\n if (formDefinition) {\n const {parent} = yield select(inputSelector)\n if (parent && parent.reverseRelationName) {\n formDefinition = yield call(changeParentFieldType, formDefinition, parent.reverseRelationName)\n }\n\n yield put(actions.setFormDefinition(formDefinition))\n yield put(actions.setFormFieldsFlat(getFormFieldFlat(formDefinition)))\n return formDefinition\n } else {\n yield put(setSearchFormType(searchFormTypes.SIMPLE))\n yield call(setSimpleForm)\n return null\n }\n}\n\nexport function* getEntityModel() {\n const entityList = yield select(listSelector)\n if (Object.keys(entityList.entityModel).length === 0) {\n yield take(SET_ENTITY_MODEL)\n }\n\n const {entityModel} = yield select(listSelector)\n return entityModel\n}\n\nexport function* resetSearchFilters() {\n const {searchFilters} = yield select(searchFormSelector)\n\n yield put(actions.setSearchFilters(searchFilters.map(searchFilter =>\n ({...searchFilter, active: searchFilter.defaultFilter})\n )))\n}\n\nexport function* resetSearch() {\n yield call(resetSearchFilters)\n yield put(formActions.reset('searchForm'))\n yield call(submitSearchFrom)\n}\n\nexport function* getSearchFormValues() {\n const {valuesInitialized} = yield select(searchFormSelector)\n\n if (!valuesInitialized) {\n yield take(actions.SET_VALUES_INITIALIZED)\n }\n\n const searchValues = yield select(searchValuesSelector)\n\n return _reduce(searchValues, (result, value, key) => (\n {\n ...result,\n ...(!Array.isArray(value) || value.length) ? {[form.transformFieldNameBack(key)]: value} : {}\n }\n ), {})\n}\n\nexport function* saveSearchFilter() {\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'filter-save',\n 'client.entity-list.search.settings.saveAsFilter',\n null,\n ({close}) => {\n const onSave = value => {\n close()\n answerChannel.put(value)\n }\n const [name, setName] = useState('')\n return <>\n <StatedValue label={'Name'}>\n <EditableValue type={'string'} value={name} events={{onChange: setName}}/>\n </StatedValue>\n <StyledButton onClick={() => onSave(name)} look={'raised'} ink={'primary'} disabled={!name}>\n <FormattedMessage id=\"client.entity-list.search.settings.saveAsFilter.button\"/>\n </StyledButton>\n </>\n },\n true\n ))\n\n const searchFilterName = yield take(answerChannel)\n const {where, filter} = yield call(getBasicQuery, false)\n const {sorting} = yield select(listSelector)\n const {entityName} = yield select(entityListSelector)\n\n const createdSearchFilter = yield call(saveNewSearchFilter, searchFilterName, entityName, where, sorting, filter)\n yield call(loadSearchFilter, entityName)\n yield call(resetSearch)\n yield put(actions.setSearchFilterActive(createdSearchFilter.uniqueId, true, true))\n}\n\nexport function* saveNewSearchFilter(name, entityName, query, sorting, filters) {\n const order = rest.createSortingString(sorting)\n const resource = 'client/searchfilters'\n const body = {\n name,\n query,\n entityName,\n order,\n filters\n }\n const {body: response} = yield call(rest.requestSaga, resource, {method: 'POST', body})\n return response\n}\n\nexport function* deleteSearchFilter({payload: {primaryKey}}) {\n const {actionAppComponent: ActionAppComponent, navigationStrategy} = yield select(inputSelector)\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'filter-delete',\n 'client.actions.delete.title',\n null,\n ({close}) => {\n const onSuccess = () => {\n answerChannel.put(true)\n close()\n }\n\n const onCancel = () => {\n answerChannel.put(false)\n close()\n }\n\n return <ActionAppComponent\n appId={'delete'}\n selection={{\n entityName: 'Search_filter',\n ids: [primaryKey],\n type: 'ID'\n }}\n navigationStrategy={navigationStrategy}\n onSuccess={onSuccess}\n onCancel={onCancel}/>\n },\n true\n ))\n\n const isSearchFilterDeleted = yield take(answerChannel)\n if (isSearchFilterDeleted) {\n const {entityName} = yield select(entityListSelector)\n yield call(loadSearchFilter, entityName)\n yield call(resetSearch)\n }\n}\n\nexport function* saveDefaultSearchFilter() {\n const {searchFilters, formDefinition} = yield select(searchFormSelector)\n const key = `${formDefinition.modelName}.${formDefinition.id}.searchfilter`\n const value = searchFilters.find(s => s.active).key\n yield call(rest.savePreferences, {[key]: value})\n yield put(notification.toaster({\n type: 'success',\n title: 'client.entity-list.search.settings.defaultFilter.save.success'\n }))\n}\n\nexport function* resetDefaultSearchFilter() {\n const {formDefinition} = yield select(searchFormSelector)\n yield call(rest.deleteUserPreferences, `${formDefinition.modelName}.${formDefinition.id}.searchfilter`)\n yield put(notification.toaster({\n type: 'success',\n title: 'client.entity-list.search.settings.defaultFilter.reset.success'\n }))\n}\n\nexport function* displaySearchFieldsModal() {\n const {formDefinition} = yield select(searchFormSelector)\n const columns = formDefinition.children.flatMap(f => f.children).map(f => ({\n id: f.id,\n label: f.label,\n hidden: f.hidden === true\n }))\n const columnsSorted = [\n ...columns.filter(f => !f.hidden),\n ...columns.filter(f => f.hidden)\n ]\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n `${formDefinition.id}-search-fields-selection`,\n 'client.entity-list.search.settings.searchForm.edit',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <ColumnPicker initialColumns={columnsSorted} onOk={onOk} dndEnabled={true}/>\n },\n true\n ))\n\n yield call(saveSearchFields, formDefinition.modelName, answerChannel)\n yield call(loadSearchForm, true)\n yield call(resetSearch)\n}\n\nfunction* saveSearchFields(modelName, answerChannel) {\n const columns = yield take(answerChannel)\n const resource = `forms/${modelName}/search-fields`\n const options = {\n method: 'POST',\n body: {\n hiddenFields: columns.filter(c => c.hidden).map(c => c.id),\n displayedFields: columns.filter(c => !c.hidden).map(c => c.id)\n }\n }\n\n yield call(rest.requestSaga, resource, options)\n}\n\nexport function* resetSearchFields() {\n const {formDefinition} = yield select(searchFormSelector)\n const resource = `forms/${formDefinition.modelName}/search-fields/reset`\n const options = {\n method: 'POST'\n }\n\n yield call(rest.requestSaga, resource, options)\n yield call(loadSearchForm, true)\n yield call(resetSearch)\n}\n","import {api} from 'tocco-util'\n\nexport const entitiesListTransformer = json => {\n return json.data.map(entity => api.getFlattenEntity(entity))\n}\n","import _isEqual from 'lodash/isEqual'\nimport _union from 'lodash/union'\nimport {externalEvents, rest, remoteEvents, actionEmitter} from 'tocco-app-extensions'\nimport _omit from 'lodash/omit'\nimport {call, put, fork, select, spawn, takeEvery, takeLatest, all, take, delay} from 'redux-saga/effects'\nimport {api, consoleLogger} from 'tocco-util'\n\nimport {getFetchOptionsFromSearchForm} from '../../util/api/fetchOptions'\nimport * as actions from './actions'\nimport * as searchFormActions from '../searchForm/actions'\nimport * as selectionActions from '../selection/actions'\nimport {getSearchFormValues} from '../searchForm/sagas'\nimport {\n getSorting,\n getSelectable,\n getClickable,\n getEndpoint,\n getSearchEndpoint,\n getConstriction,\n getFields,\n getDisablePreferencesMenu\n} from '../../util/api/forms'\nimport {entitiesListTransformer} from '../../util/api/entities'\nimport * as preferencesActions from '../preferences/actions'\n\nexport const inputSelector = state => state.input\nexport const entityListSelector = state => state.entityList\nexport const listSelector = state => state.list\nexport const searchFormSelector = state => state.searchForm\nexport const selectionSelector = state => state.selection\nexport const preferencesSelector = state => state.preferences\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(actions.CHANGE_PAGE, changePage),\n takeLatest(searchFormActions.EXECUTE_SEARCH, reloadData),\n takeLatest(searchFormActions.EXECUTE_SEARCH, queryChanged),\n takeLatest(actions.SET_SORTING_INTERACTIVE, reloadData),\n takeLatest(actions.REFRESH, refreshData),\n takeLatest(actions.NAVIGATE_TO_CREATE, navigateToCreate),\n takeLatest(actions.NAVIGATE_TO_ACTION, navigateToAction),\n takeLatest(selectionActions.RELOAD_DATA, reloadData),\n takeLatest(actions.ON_ROW_CLICK, onRowClick),\n takeEvery(remoteEvents.REMOTE_EVENT, remoteEvent),\n takeLatest(searchFormActions.SET_SEARCH_FILTER_ACTIVE, setSorting),\n takeLatest(actions.DEFINE_SORTING, setSorting),\n takeLatest(actions.SET_MARKED, setMarked),\n takeLatest(actions.TOGGLE_MARKINGS, toggleMarkings)\n ])\n}\n\nexport function* initialize() {\n const {entityName, formName} = yield select(entityListSelector)\n yield all([\n call(loadFormDefinition, formName),\n call(loadEntityModel, entityName)\n ])\n\n yield put(actions.setInitialized())\n}\n\nexport function* queryChanged() {\n const query = yield call(getBasicQuery)\n yield put(selectionActions.setQuery(query))\n yield put(externalEvents.fireExternalEvent('onSearchChange', {query: query}))\n}\n\nexport function* loadData(page) {\n yield put(actions.setInProgress(true))\n yield fork(countEntities)\n yield put(actions.clearEntityStore())\n yield call(requestEntities, page)\n yield put(actions.setInProgress(false))\n}\n\nexport function* getBasicQuery(regardSelection = true) {\n const {inputSearchFilters, inputTql, inputKeys, constriction} = yield select(listSelector)\n\n const {showSelectedRecords, selection} = yield select(selectionSelector)\n if (regardSelection && showSelectedRecords) {\n return {\n keys: selection\n }\n }\n\n const {formFieldsFlat, searchFilters: searchFormSearchFilter} = yield select(searchFormSelector)\n const searchFormValues = yield call(getSearchFormValues)\n\n const searchFormFetchOptions = yield call(getFetchOptionsFromSearchForm, searchFormValues, formFieldsFlat)\n\n const relevantSearchFormFetchOptions = _omit(searchFormFetchOptions, ['filters', 'tql'])\n const filter = yield call(getSearchFilter, inputSearchFilters, searchFormFetchOptions.filters, searchFormSearchFilter)\n const where = yield call(getTql, inputTql, searchFormFetchOptions.tql)\n\n const hasUserChanges = Object.keys(relevantSearchFormFetchOptions).length > 0\n || !_isEqual(inputSearchFilters || [], filter)\n || (!!searchFormFetchOptions.tql && searchFormFetchOptions.tql.length > 0)\n\n return {\n ...relevantSearchFormFetchOptions,\n ...(filter && filter.length > 0 ? {filter} : {}),\n ...(where ? {where} : {}),\n ...(constriction && {constriction}),\n ...(inputKeys ? {keys: inputKeys} : {}),\n hasUserChanges\n }\n}\n\nexport function* prepareEndpointUrl(endpoint, searchEndpoint, hasUserChanges) {\n const {parent} = yield select(entityListSelector)\n const parentKey = parent ? parent.key : ''\n const selectedEndpoint = hasUserChanges && searchEndpoint ? searchEndpoint : endpoint\n return selectedEndpoint ? selectedEndpoint.replace('{parentKey}', parentKey) : null\n}\n\nexport function* countEntities() {\n const {entityName} = yield select(inputSelector)\n const {endpoint, searchEndpoint} = yield select(listSelector)\n const {showSelectedRecords, selection} = yield select(selectionSelector)\n\n const regardSelection = !showSelectedRecords\n const query = yield call(getBasicQuery, regardSelection)\n const preparedEndpoint = yield call(prepareEndpointUrl, endpoint, searchEndpoint, query.hasUserChanges)\n\n const requestOptions = {\n method: endpoint ? 'GET' : 'POST',\n ...(preparedEndpoint ? {endpoint: preparedEndpoint} : {})\n }\n const entityCount = yield call(rest.fetchEntityCount, entityName, query, requestOptions)\n\n if (showSelectedRecords) {\n yield put(actions.setEntityCount(selection.length))\n } else {\n yield put(actions.setEntityCount(entityCount))\n }\n\n yield put(selectionActions.setQueryCount(entityCount))\n}\n\nexport function* changePage({payload}) {\n const {page} = payload\n yield put(actions.setInProgress(true))\n yield put(actions.setCurrentPage(page))\n yield call(requestEntities, page)\n yield put(actions.setInProgress(false))\n}\n\nexport function* refreshData() {\n const {currentPage} = yield select(listSelector)\n yield call(loadData, currentPage)\n}\n\nexport function* reloadData() {\n yield call(loadData, 1)\n}\n\nexport function* getSearchFilter(inputSearchFilters, searchInputsFilters, adminSearchFormFilters = []) {\n const activeSearchFormFilters = adminSearchFormFilters && adminSearchFormFilters\n .filter(f => f.active).map(f => f.uniqueId)\n\n return yield call(_union, inputSearchFilters, searchInputsFilters, activeSearchFormFilters)\n}\n\nexport function* hasActiveSearchFilterOrderBy() {\n const {searchFilters} = yield select(searchFormSelector)\n return searchFilters && searchFilters.some(f => f.active && f.orderBy)\n}\n\nexport const getTql = (inputTql, searchTql) => [\n ...(inputTql && inputTql.length > 0 ? [`(${inputTql})`] : []),\n ...(searchTql && searchTql.length > 0 ? [`(${searchTql})`] : [])\n].join(' and ')\n\nexport function* loadDisplayExpressions(formName, paths, entities) {\n if (paths && paths.length > 0 && entities.length > 0) {\n const keys = entities.map(e => e.__key)\n const entityName = entities[0].__model\n const result = yield call(rest.fetchDisplayExpressions, formName, 'list', keys, paths, entityName)\n yield put(actions.setLazyData('displayExpressions', formName, result))\n }\n}\n\nexport function* loadRelationDisplays(relationFields, entities) {\n if (relationFields && relationFields.length > 0) {\n const {lazyData} = yield select(listSelector)\n const request = yield call(api.getPathDisplayRequest, entities, relationFields, lazyData)\n const displays = yield call(rest.fetchDisplays, request)\n yield all(Object.keys(displays).map(entity =>\n put(actions.setLazyData('defaultDisplays', entity, displays[entity]))\n ))\n }\n}\n\nexport function* loadMarkings(entities) {\n const {formDefinition, entityModel} = yield select(listSelector)\n if (entityModel.markable && formDefinition.markable && entities.length > 0) {\n const selection = {\n type: 'ID',\n entityName: entityModel.name,\n ids: entities.map(e => e.__key)\n }\n const result = yield call(rest.fetchMarkings, selection)\n yield call(setLazyDataMarked, entityModel.name, result)\n }\n}\n\nexport function* setMarked({payload: {entityName, entityKey, marked}}) {\n try {\n yield all([\n call(setLazyDataMarked, entityName, {\n [entityKey]: marked\n }),\n call(rest.setMarked, entityName, entityKey, marked)\n ])\n } catch (e) {\n consoleLogger.logError('Failed to set marked', e)\n yield call(setLazyDataMarked, entityName, {\n [entityKey]: !marked\n })\n }\n}\n\nexport function* toggleMarkings({payload: {selection}}) {\n try {\n const oldMarkings = yield call(rest.fetchMarkings, selection)\n const setToMarked = Object.values(oldMarkings).includes(false)\n const newMarkings = yield call(rest.setSelectionMarked, selection, setToMarked)\n yield call(setLazyDataMarked, selection.entityName, newMarkings)\n } catch (e) {\n consoleLogger.logError('Failed to toggle markings', e)\n }\n}\n\nexport function* setLazyDataMarked(entityName, markings) {\n const {lazyData} = yield select(listSelector)\n const currentEntityMarkings = lazyData.markings && lazyData.markings[entityName] ? lazyData.markings[entityName] : {}\n const newEntityMarkings = {\n ...currentEntityMarkings,\n ...markings\n }\n yield put(actions.setLazyData('markings', entityName, newEntityMarkings))\n}\n\nexport function* fetchEntitiesAndAddToStore(page) {\n const {entityName, formName} = yield select(entityListSelector)\n const {columns: columnPreferences} = yield select(preferencesSelector)\n const {entityStore, sorting, limit, formDefinition, endpoint, searchEndpoint} = yield select(listSelector)\n if (!entityStore[page]) {\n const {paths, relationFields, displayExpressionFields} = yield call(getFields, formDefinition, columnPreferences)\n const basicQuery = yield call(getBasicQuery)\n const query = {\n ...basicQuery,\n page,\n sorting,\n limit,\n paths\n }\n const preparedEndpoint = yield call(prepareEndpointUrl, endpoint, searchEndpoint, basicQuery.hasUserChanges)\n const requestOptions = {\n method: endpoint ? 'GET' : 'POST',\n ...(preparedEndpoint ? {endpoint: preparedEndpoint} : {})\n }\n\n const entities = yield call(rest.fetchEntities, entityName, query, requestOptions, entitiesListTransformer)\n\n yield put(actions.addEntitiesToStore(page, entities))\n yield spawn(loadRelationDisplays, relationFields, entities)\n yield spawn(loadDisplayExpressions, formName, displayExpressionFields, entities)\n yield spawn(loadMarkings, entities)\n }\n}\n\nexport function* requestEntities(page) {\n const {entityStore} = yield select(listSelector)\n\n if (!entityStore[page]) {\n yield call(fetchEntitiesAndAddToStore, page)\n }\n\n yield call(displayEntity, page)\n yield spawn(delayedPreloadNextPage, page)\n}\n\nexport function* delayedPreloadNextPage(page) {\n yield delay(2000)\n yield call(preloadNextPage, page)\n}\n\nexport function* preloadNextPage(currentPage) {\n const list = yield select(listSelector)\n const {entityStore, limit} = list\n let {entityCount} = list\n const nextPage = currentPage + 1\n\n if (entityCount === null || entityCount === undefined) {\n const setCountAction = yield take(actions.SET_ENTITY_COUNT)\n entityCount = setCountAction.payload.entityCount\n }\n\n if (currentPage * limit < entityCount && !entityStore[nextPage]) {\n yield call(fetchEntitiesAndAddToStore, nextPage)\n }\n}\n\nexport function* displayEntity(page) {\n const list = yield select(listSelector)\n const entities = list.entityStore[page]\n yield put(actions.setEntities(entities))\n}\n\nfunction* getPreferencesSorting() {\n const preferences = yield select(preferencesSelector)\n if (!preferences.sorting) {\n const {payload} = yield take(preferencesActions.SET_SORTING)\n return payload.sorting\n } else {\n return preferences.sorting\n }\n}\n\nexport const FALLBACK_SORTING_FIELD = 'update_timestamp'\nexport function* setSorting() {\n const {formDefinition, entityModel} = yield select(listSelector)\n const tableSorting = yield call(getSorting, formDefinition)\n const preferencesSorting = yield call(getPreferencesSorting)\n const activeSearchFilterHasOrderBy = yield call(hasActiveSearchFilterOrderBy)\n if (preferencesSorting && preferencesSorting.length > 0) {\n yield put(actions.setSorting(preferencesSorting))\n } else if (tableSorting.length > 0) {\n yield put(actions.setSorting(tableSorting))\n } else if (!activeSearchFilterHasOrderBy && entityModel.paths[FALLBACK_SORTING_FIELD]) {\n yield put(actions.setSorting([{field: FALLBACK_SORTING_FIELD, order: 'desc'}]))\n } else {\n yield put(actions.setSorting([]))\n }\n}\n\nexport function* loadFormDefinition(formName) {\n const fetchedFormDefinition = yield call(rest.fetchForm, formName, 'list')\n yield put(actions.setFormDefinition(fetchedFormDefinition))\n yield call(extractFormInformation, fetchedFormDefinition)\n}\n\nexport function* extractFormInformation(formDefinition) {\n const selectable = yield call(getSelectable, formDefinition)\n yield put(actions.setFormSelectable(selectable))\n const clickable = yield call(getClickable, formDefinition)\n yield put(actions.setFormClickable(clickable))\n const endpoint = yield call(getEndpoint, formDefinition)\n yield put(actions.setEndpoint(endpoint))\n const searchEndpoint = yield call(getSearchEndpoint, formDefinition)\n yield put(actions.setSearchEndpoint(searchEndpoint))\n const constriction = yield call(getConstriction, formDefinition)\n yield put(actions.setConstriction(constriction))\n const disablePreferencesMenu = yield call(getDisablePreferencesMenu, formDefinition)\n yield put(actions.setDisablePreferencesMenu(disablePreferencesMenu))\n}\n\nexport function* loadEntityModel(entityName) {\n const model = yield call(rest.fetchModel, entityName)\n yield put(actions.setEntityModel(model))\n}\n\nexport function* onRowClick({payload}) {\n const {selectOnRowClick} = yield select(inputSelector)\n if (selectOnRowClick === true) {\n const list = yield select(selectionSelector)\n const selected = list.selection.includes(payload.id)\n yield put(selectionActions.onSelectChange([payload.id], !selected))\n }\n yield put(externalEvents.fireExternalEvent('onRowClick', {id: payload.id}))\n}\n\nexport function* navigateToCreate({payload}) {\n const {navigationStrategy} = yield select(inputSelector)\n yield call(navigationStrategy.navigateToCreateRelative, payload.relationName)\n}\n\nexport function* navigateToAction({payload}) {\n const {definition, selection} = payload\n const {navigationStrategy} = yield select(inputSelector)\n yield call(navigationStrategy.navigateToActionRelative, definition, selection)\n}\n\nexport const containsEntityOfModel = (event, entityName) =>\n !!event.payload.entities.find(entity => entity.entityName === entityName)\n\nexport function* remoteEvent(action) {\n const event = action.payload.event\n const {entityModel} = yield select(listSelector)\n if (['entity-create-event', 'entity-delete-event', 'entity-update-event'].includes(event.type)) {\n if (containsEntityOfModel(event, entityModel.name)) {\n yield call(reloadData)\n }\n }\n\n if (event.type === 'entity-delete-event') {\n const deletedEntityKeys = event.payload.entities.filter(e => e.entityName === entityModel.name).map(e => e.key)\n yield put(selectionActions.onSelectChange(deletedEntityKeys, false))\n }\n\n yield put(actionEmitter.emitAction(action))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst simpleSearchFieldsToArray = simpleSearchFields => (\n simpleSearchFields.split(',')\n .filter(s => s)\n .map(s => s.trim())\n)\n\nconst setSimpleSearchFields = (state, {payload}) => {\n const fieldArray = simpleSearchFieldsToArray(payload.simpleSearchFields)\n if (fieldArray.length > 0) {\n return {\n ...state,\n simpleSearchFields: fieldArray\n }\n }\n return state\n}\n\nconst setSearchFilterActive = (state, {payload: {searchFilterId, active, exclusive}}) => ({\n ...state,\n searchFilters: [...state.searchFilters.map(searchFilter =>\n ({...searchFilter, ...(searchFilterId === searchFilter.uniqueId ? {active} : exclusive ? {active: !active} : {})})\n )]\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_INITIALIZED]: reducerUtil.singleTransferReducer('initialized'),\n [actions.SET_SIMPLE_SEARCH_FIELDS]: setSimpleSearchFields,\n [actions.SET_FORM_DEFINITION]: reducerUtil.singleTransferReducer('formDefinition'),\n [actions.SET_SHOW_EXTENDED_SEARCH_FORM]: reducerUtil.singleTransferReducer('showExtendedSearchForm'),\n [actions.SET_DISABLE_SIMPLE_SEARCH]: reducerUtil.singleTransferReducer('disableSimpleSearch'),\n [actions.SET_VALUES_INITIALIZED]: reducerUtil.singleTransferReducer('valuesInitialized'),\n [actions.SET_FORM_FIELDS_FLAT]: reducerUtil.singleTransferReducer('formFieldsFlat'),\n [actions.SET_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('searchFilters'),\n [actions.SET_SEARCH_FILTER_ACTIVE]: setSearchFilterActive\n}\n\nconst initialState = {\n initialized: false,\n formDefinition: {},\n showExtendedSearchForm: false,\n simpleSearchFields: ['txtFulltext'],\n disableSimpleSearch: false,\n valuesInitialized: false,\n searchFilters: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import {reducer as reducerUtil} from 'tocco-util'\nimport _uniq from 'lodash/uniq'\n\nimport * as actions from './actions'\n\nconst comparator = (a, b) => a - b\n\nconst setSelection = (state, {payload}) => ({\n ...state,\n selection: _uniq(payload.selection).sort(comparator)\n})\n\nconst clearSelection = (state, {payload}) => ({\n ...state,\n selection: [],\n showSelectedRecords: false\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_TABLE_SELECTION_STYLE]: reducerUtil.singleTransferReducer('tableSelectionStyle'),\n [actions.TOGGLE_SHOW_SELECTED_RECORDS]: reducerUtil.toggleReducer('showSelectedRecords'),\n [actions.SET_SELECTION]: setSelection,\n [actions.CLEAR_SELECTION]: clearSelection,\n [actions.SET_SHOW_SELECTION_CONTROLLER]: reducerUtil.singleTransferReducer('showSelectionController'),\n [actions.SET_TABLE_SELECTION_STYLE]: reducerUtil.singleTransferReducer('tableSelectionStyle'),\n [actions.SET_QUERY]: reducerUtil.singleTransferReducer('query'),\n [actions.SET_QUERY_COUNT]: reducerUtil.singleTransferReducer('queryCount')\n}\n\nconst initialState = {\n showSelectedRecords: false,\n selection: [],\n showSelectionController: false,\n tableSelectionStyle: 'none',\n query: {},\n queryCount: 0\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import PropTypes from 'prop-types'\n\nconst selectionStyles = {\n SINGLE: 'single',\n MULTI: 'multi',\n MULTI_EXPLICIT: 'multi_explicit',\n NONE: 'none'\n}\n\nconst selectionStylePropType = PropTypes.oneOf(Object.keys(selectionStyles).map(key => selectionStyles[key]))\n\nexport {\n selectionStyles as default,\n selectionStylePropType\n}\n","import _uniq from 'lodash/uniq'\n\nimport selectionStyles from './selectionStyles'\n\nexport const showSelectionComponent = (inputSelectionStyle, disableSelectionController, formSelectable) => {\n return disableSelectionController !== true\n && (!inputSelectionStyle || inputSelectionStyle === selectionStyles.MULTI)\n && formSelectable !== false\n}\n\nexport const getTableSelectionStyle = (inputSelectionStyle, fromSelectable) => {\n if (fromSelectable === false || inputSelectionStyle === selectionStyles.NONE) {\n return selectionStyles.NONE\n }\n\n if (inputSelectionStyle === selectionStyles.SINGLE) {\n return selectionStyles.SINGLE\n }\n\n return selectionStyles.MULTI\n}\n\n/**\n * Comparator function which can be used to sort numerical arrays in ascending order.\n */\nconst ascendingNumberComparator = (a, b) => a - b\n\n/**\n * Takes the existing selection and the new selection which can be either of the type selected or deselected and\n * combines them to a new selection which will be returned.\n */\nexport const combineSelection = (currentSelection, keys, isSelected) => {\n let newSelection = currentSelection.slice()\n for (const key of keys) {\n if (isSelected) {\n newSelection.push(key)\n } else {\n newSelection = newSelection.filter(k => k !== key)\n }\n }\n\n return _uniq(newSelection).sort(ascendingNumberComparator)\n}\n","import {externalEvents} from 'tocco-app-extensions'\nimport {call, put, select, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport selectionStyles from '../../util/selectionStyles'\nimport {SET_FORM_SELECTABLE} from '../list/actions'\nimport {combineSelection, showSelectionComponent, getTableSelectionStyle} from '../../util/selection'\n\nexport const inputSelector = state => state.input\nexport const entityListSelector = state => state.entityList\nexport const selectionSelector = state => state.selection\nexport const listSelector = state => state.list\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.TOGGLE_SHOW_SELECTED_RECORDS, reloadData),\n takeLatest(actions.ON_SELECT_CHANGE, onSelectChange),\n takeLatest(actions.CLEAR_SELECTION, clearSelection),\n takeLatest(SET_FORM_SELECTABLE, initialize)\n ])\n}\n\nexport function* onSelectChange({payload: {keys, isSelected}}) {\n const {selection: currentSelection} = yield select(selectionSelector)\n const {selectionStyle} = yield select(inputSelector)\n\n const newSelection = selectionStyle === selectionStyles.SINGLE\n ? keys\n : yield call(combineSelection, currentSelection, keys, isSelected)\n\n yield put(actions.setSelection(newSelection))\n yield put(externalEvents.fireExternalEvent('onSelectChange', newSelection))\n}\n\nexport function* clearSelection() {\n yield put(externalEvents.fireExternalEvent('onSelectChange', []))\n}\n\nexport function* reloadData() {\n yield put(actions.reloadData())\n}\n\nexport function* initialize() {\n const {formSelectable} = yield select(listSelector)\n const {selectionStyle, disableSelectionController} = yield select(inputSelector)\n const {selectionMode} = yield select(selectionSelector)\n\n const selectionControllerVisible = yield call(\n showSelectionComponent,\n selectionStyle,\n disableSelectionController,\n formSelectable\n )\n yield put(actions.setShowSelectionController(selectionControllerVisible))\n\n yield call(setTableStyle, selectionMode)\n}\n\nexport function* setTableStyle() {\n const {formSelectable} = yield select(listSelector)\n const {selectionStyle} = yield select(inputSelector)\n\n const tableSelectionStyle = yield call(getTableSelectionStyle, selectionStyle, formSelectable)\n yield put(actions.setTableSelectionStyle(tableSelectionStyle))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst resetSorting = state => ({\n ...state,\n sorting: []\n})\n\nconst resetColumns = state => ({\n ...state,\n positions: {},\n columns: {}\n})\n\nconst resetPreferences = state => ({\n ...state,\n positions: {},\n sorting: [],\n columns: {}\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_POSITIONS]: reducerUtil.singleTransferReducer('positions'),\n [actions.SET_SORTING]: reducerUtil.singleTransferReducer('sorting'),\n [actions.SET_COLUMNS]: reducerUtil.singleTransferReducer('columns'),\n [actions.SET_PREFERENCES_LOADED]: reducerUtil.singleTransferReducer('preferencesLoaded'),\n [actions.RESET_SORTING]: resetSorting,\n [actions.RESET_COLUMNS]: resetColumns,\n [actions.RESET_PREFERENCES]: resetPreferences\n}\n\nconst initialState = {\n positions: {},\n sorting: [],\n columns: {},\n preferencesLoaded: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","export const getPositions = preferences =>\n Object.keys(preferences)\n .filter(key => key.endsWith('.position'))\n .reduce((acc, key) => {\n const fieldName = key.match(/.*\\.([^.]+)\\.position$/)\n return {\n ...acc,\n [fieldName[1]]: Number(preferences[key])\n }\n }, {})\n\nexport const getPositionsFromColumns = columns =>\n columns\n .filter(c => !c.fixedPosition)\n .reduce((acc, c, idx) => ({\n ...acc,\n [c.id]: idx\n }), {})\n\nexport const changePosition = (positions, field, fieldAfterPosition) =>\n Object.keys(positions)\n .sort((a, b) => positions[a] - positions[b])\n .filter(key => key !== field)\n .reduce((acc, key) => [\n ...acc,\n key,\n ...(key === fieldAfterPosition ? [field] : [])\n ]\n , [])\n .reduce((acc, key, idx) => ({\n ...acc,\n [key]: idx\n })\n , {})\n\nexport const getPositionsPreferencesToSave = (formName, positions) =>\n Object.keys(positions)\n .reduce((acc, key) => ({\n ...acc,\n [`${formName}.${key}.position`]: positions[key].toString()\n }), {})\n\nexport const getSorting = preferences => {\n const keyRegex = /^.*\\.sorting(Field|Direction)\\.?([1-9]*)$/\n return Object.entries(preferences)\n .filter(([key]) => keyRegex.test(key))\n .map(([key, value]) => [transformSortingKey(key.match(keyRegex)), value])\n .reduce((acc, [key, value]) => {\n acc[key.index] = {\n ...acc[key.index],\n [key.field]: value\n }\n return acc\n }, [])\n}\n\nconst transformSortingKey = keyMatch => ({\n field: transformSortingField(keyMatch[1]),\n index: keyMatch[2] ? parseInt(keyMatch[2]) : 0\n})\n\nconst transformSortingField = field => field === 'Direction' ? 'order' : field.toLowerCase()\n\nexport const getSortingPreferencesToSave = (formName, sorting) => ({\n [`${formName}.sortingField`]: sorting.field,\n [`${formName}.sortingDirection`]: sorting.order\n})\n\nexport const getAdditionalSortingPreferencesToSave = (formName, sorting, index) => ({\n [`${formName}.sortingField.${index}`]: sorting.field,\n [`${formName}.sortingDirection.${index}`]: sorting.order\n})\n\nexport const getColumns = preferences => {\n const keyRegex = /^[^.]+\\.(.+)\\.hidden$/\n return Object.entries(preferences)\n .filter(([key]) => keyRegex.test(key))\n .reduce((acc, [key, value]) => {\n const fieldName = key.match(keyRegex)[1]\n return {\n ...acc,\n // old preferences marked hidden columns as true, now we mark visible columns as true\n [fieldName]: value === 'false'\n }\n }, {})\n}\n\nexport const getColumnPreferencesToSave = (formName, columns) =>\n Object.keys(columns)\n .reduce((acc, key) => ({\n ...acc,\n // old preferences marked hidden columns as true, now we mark visible columns as true\n [`${formName}.${key}.hidden`]: (!columns[key]).toString()\n }), {})\n","import {rest, notification} from 'tocco-app-extensions'\nimport {all, call, put, select, take, takeLatest} from 'redux-saga/effects'\nimport React from 'react'\nimport {channel} from 'redux-saga'\n\nimport * as actions from './actions'\nimport {setPositions, setSorting, setColumns, setPreferencesLoaded} from './actions'\nimport * as listActions from '../list/actions'\nimport * as listSagas from '../list/sagas'\nimport * as util from '../../util/preferences'\nimport ColumnPicker from '../../components/ColumnPicker'\nimport {getTableColumns} from '../../util/api/forms'\n\nexport const inputSelector = state => state.input\n\nexport const preferencesSelector = state => state.preferences\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_PREFERENCES, loadPreferences),\n takeLatest(actions.CHANGE_POSITION, changePosition),\n takeLatest(listActions.SET_SORTING_INTERACTIVE, saveSorting),\n takeLatest(actions.RESET_SORTING, resetSorting),\n takeLatest(actions.RESET_COLUMNS, resetColumns),\n takeLatest(actions.RESET_PREFERENCES, resetPreferences),\n takeLatest(actions.DISPLAY_COLUMN_MODAL, displayColumnModal)\n ])\n}\n\nexport function* loadPreferences() {\n const listState = yield select(listSagas.entityListSelector)\n const formName = `${listState.formName}_list`\n const preferences = yield call(rest.fetchUserPreferences, `${formName}*`)\n yield put(setPositions(util.getPositions(preferences)))\n yield put(setSorting(util.getSorting(preferences)))\n yield put(setColumns(util.getColumns(preferences)))\n yield put(setPreferencesLoaded(true))\n}\n\nexport function* changePosition({payload}) {\n const {field, afterFieldPosition, columns} = payload\n let {positions} = yield select(preferencesSelector)\n\n if (Object.keys(positions).length === 0) {\n positions = yield call(util.getPositionsFromColumns, columns)\n }\n\n const newPositions = yield call(util.changePosition, positions, field, afterFieldPosition)\n yield put(setPositions(newPositions))\n const listState = yield select(listSagas.entityListSelector)\n const formName = `${listState.formName}_list`\n yield call(rest.deleteUserPreferences, `${formName}.*.positions`)\n const positionPreferences = yield call(util.getPositionsPreferencesToSave, formName, newPositions)\n yield call(rest.savePreferences, positionPreferences)\n}\n\nexport function* saveSorting() {\n const {sorting: sortings} = yield select(listSagas.listSelector)\n if (sortings.length > 0) {\n const listState = yield select(listSagas.entityListSelector)\n const formName = `${listState.formName}_list`\n yield all([\n call(rest.deleteUserPreferences, `${formName}.sortingField*`),\n call(rest.deleteUserPreferences, `${formName}.sortingDirection*`)\n ])\n const sortingPreferences = sortings.slice(1)\n .map((sorting, index) => util.getAdditionalSortingPreferencesToSave(formName, sorting, index + 1))\n .reduce((acc, sorting) => ({\n ...acc,\n ...sorting\n }), util.getSortingPreferencesToSave(formName, sortings[0]))\n yield call(rest.savePreferences, sortingPreferences)\n }\n}\n\nexport function* resetSorting() {\n const listState = yield select(listSagas.entityListSelector)\n yield all([\n call(rest.deleteUserPreferences, `${listState.formName}_list.sortingField*`),\n call(rest.deleteUserPreferences, `${listState.formName}_list.sortingDirection*`)\n ])\n yield call(listSagas.setSorting)\n yield call(listSagas.reloadData)\n}\n\nexport function* resetPreferences() {\n const listState = yield select(listSagas.entityListSelector)\n yield call(rest.deleteUserPreferences, `${listState.formName}_list.*`)\n yield call(listSagas.setSorting)\n yield call(listSagas.reloadData)\n}\n\nexport function* displayColumnModal() {\n const {formDefinition} = yield select(listSagas.listSelector)\n const {columns: preferencesColumns} = yield select(preferencesSelector)\n const {parent} = yield select(listSagas.entityListSelector)\n const formColumns = getTableColumns(formDefinition, preferencesColumns, parent)\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n `${formDefinition.id}-column-selection`,\n 'client.entity-list.preferences.columns',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <ColumnPicker initialColumns={formColumns} onOk={onOk} dndEnabled={false}/>\n },\n true\n ))\n\n yield saveColumnPreferences(answerChannel, preferencesColumns, formDefinition)\n}\n\nfunction* saveColumnPreferences(answerChannel, preferencesColumns, formDefinition) {\n const columns = (yield take(answerChannel)).reduce((accumulator, item) => ({\n ...accumulator,\n [item.id]: !item.hidden\n }), {})\n const diffColumns = Object.keys(columns).reduce((accumulator, columnName) => ({\n ...accumulator,\n ...(columns[columnName] !== preferencesColumns[columnName]\n ? {[columnName]: columns[columnName]}\n : {})\n }), {})\n yield put(setColumns(columns))\n if (Object.entries(diffColumns).some(([, value]) => value)) {\n yield put(listActions.refresh())\n }\n const columnPreferences = yield call(util.getColumnPreferencesToSave, formDefinition.id, diffColumns)\n yield call(rest.savePreferences, columnPreferences)\n}\n\nexport function* resetColumns() {\n const listState = yield select(listSagas.entityListSelector)\n yield all([\n call(rest.deleteUserPreferences, `${listState.formName}_list.*.position`),\n call(rest.deleteUserPreferences, `${listState.formName}_list.*.hidden`)\n ])\n yield put(listActions.refresh())\n}\n","import {reducer as form} from 'redux-form'\n\nimport entityListReducer, {sagas as entityListSagas} from './entityList'\nimport listReducer, {sagas as listSagas} from './list'\nimport searchFormReducer, {sagas as searchFormSagas} from './searchForm'\nimport selectionReducer, {sagas as selectionSagas} from './selection'\nimport preferencesReducer, {sagas as preferencesSaga} from './preferences'\n\nexport default {\n entityList: entityListReducer,\n list: listReducer,\n searchForm: searchFormReducer,\n form,\n selection: selectionReducer,\n preferences: preferencesReducer\n}\n\nexport const sagas = [\n entityListSagas,\n listSagas,\n searchFormSagas,\n selectionSagas,\n preferencesSaga\n]\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport {reduxForm, Field} from 'redux-form'\nimport {form} from 'tocco-app-extensions'\nimport {SearchBox} from 'tocco-ui'\n\nconst FullTextSearchForm = props => {\n const {submitSearchForm, intl} = props\n const handleSubmit = e => {\n e.preventDefault()\n e.stopPropagation()\n submitSearchForm()\n }\n\n const msg = id => (intl.formatMessage({id}))\n\n const field = useMemo(() => ({input}) =>\n <SearchBox\n value={input.value}\n liveSearch={true}\n onSearch={value => input.onChange(value)}\n placeholder={msg('client.entity-list.fullTextPlaceholder')}\n />, [])\n\n return (\n <form onSubmit={handleSubmit}>\n <Field name=\"txtFulltext\" component={field}/>\n </form>\n )\n}\n\nFullTextSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n submitSearchForm: PropTypes.func.isRequired,\n input: PropTypes.string\n}\n\nexport default reduxForm({\n form: 'searchForm',\n destroyOnUnmount: false\n})(FullTextSearchForm)\n","import FullTextSearchForm from './FullTextSearchForm'\n\nexport default FullTextSearchForm\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport FullTextSearchForm from '../components/FullTextSearchForm'\nimport {submitSearchForm} from '../modules/searchForm/actions'\n\nconst mapActionCreators = {\n submitSearchForm\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(FullTextSearchForm))\n","import styled from 'styled-components'\nimport {StyledLayoutBox, StyledScrollbar} from 'tocco-ui/src/Layout'\n\nexport const StyledBasicSearchForm = styled.div`\n ${StyledScrollbar}\n\n && {\n ${StyledLayoutBox} {\n padding-bottom: 0;\n }\n }\n`\n\nexport const StyledSearchFormButtons = styled.div`\n && {\n width: 100%;\n text-align: center;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {reduxForm} from 'redux-form'\nimport {Ball} from 'tocco-ui'\nimport {form} from 'tocco-app-extensions'\n\nimport {\n StyledBasicSearchForm,\n StyledSearchFormButtons\n} from './StyledBasicSearchForm'\n\nconst REDUX_FORM_NAME = 'searchForm'\n\nconst BasicSearchForm = ({\n disableSimpleSearch,\n entity,\n form: formName,\n formValues,\n intl,\n preselectedSearchFields,\n searchFormDefinition,\n setShowExtendedSearchForm,\n showExtendedSearchForm,\n simpleSearchFields,\n submitSearchForm\n}) => {\n if (!searchFormDefinition.children) {\n return null\n }\n\n const msg = id => intl.formatMessage({id})\n\n const handleSubmit = e => {\n e.preventDefault()\n e.stopPropagation()\n submitSearchForm()\n }\n\n const isHidden = (preselectedSearchFields, name) => {\n if (!preselectedSearchFields) {\n return false\n }\n const field = preselectedSearchFields.find(f => f.id === name)\n return field && field.hidden\n }\n\n const shouldRenderField = (\n preselectedSearchFields,\n disableSimpleSearch,\n showExtendedSearchForm,\n simpleSearchFields) => name => (\n !isHidden(preselectedSearchFields, name)\n && (\n disableSimpleSearch\n || showExtendedSearchForm\n || simpleSearchFields.includes(name)\n )\n )\n\n const toggleExtendedSearchForm = () => {\n setShowExtendedSearchForm(!showExtendedSearchForm)\n }\n\n const fields = form.getFieldDefinitions(searchFormDefinition)\n const hasExtendedOnlySearchFields = !fields.every(field => simpleSearchFields.includes(field.id))\n\n return (\n <StyledBasicSearchForm>\n <form onSubmit={handleSubmit}>\n {hasExtendedOnlySearchFields && !disableSimpleSearch\n && <StyledSearchFormButtons>\n <Ball\n data-cy=\"extend-search-button\"\n icon={`chevron-${showExtendedSearchForm ? 'up' : 'down'}`}\n onClick={toggleExtendedSearchForm}\n title={msg('client.entity-list.extendedSearch')}\n />\n </StyledSearchFormButtons>\n }\n <form.FormBuilder\n entity={entity}\n formName={formName}\n formDefinition={searchFormDefinition}\n formValues={formValues}\n fieldMappingType=\"search\"\n beforeRenderField={shouldRenderField(\n preselectedSearchFields,\n disableSimpleSearch,\n showExtendedSearchForm,\n simpleSearchFields)\n }\n mode=\"search\"\n />\n </form>\n </StyledBasicSearchForm>\n )\n}\n\nBasicSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n searchFormDefinition: PropTypes.shape({\n children: PropTypes.array\n }).isRequired,\n submitSearchForm: PropTypes.func.isRequired,\n disableSimpleSearch: PropTypes.bool,\n simpleSearchFields: PropTypes.arrayOf(\n PropTypes.string\n ),\n showExtendedSearchForm: PropTypes.bool,\n setShowExtendedSearchForm: PropTypes.func.isRequired,\n preselectedSearchFields: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n hidden: PropTypes.bool\n })\n ),\n entity: PropTypes.object,\n form: PropTypes.string,\n formValues: PropTypes.object\n}\n\nexport default reduxForm({\n form: REDUX_FORM_NAME,\n destroyOnUnmount: false\n})(BasicSearchForm)\n","import BasicSearchForm from './BasicSearchForm'\n\nexport default BasicSearchForm\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport BasicSearchForm from '../components/BasicSearchForm'\nimport {\n submitSearchForm,\n setShowExtendedSearchForm\n} from '../modules/searchForm/actions'\n\nconst mapActionCreators = {\n submitSearchForm,\n setShowExtendedSearchForm\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFormDefinition: state.searchForm.formDefinition,\n entityModel: state.list.entityModel,\n searchInputs: state.searchForm.searchInputs,\n disableSimpleSearch: props.disableSimpleSearch || state.searchForm.disableSimpleSearch,\n simpleSearchFields: state.searchForm.simpleSearchFields,\n showExtendedSearchForm: state.searchForm.showExtendedSearchForm,\n preselectedSearchFields: state.input.preselectedSearchFields\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(BasicSearchForm))\n","import styled from 'styled-components'\nimport {StyledScrollbar, theme, Menu, Button, scale} from 'tocco-ui'\nimport Split from 'react-split'\n\nexport const StyledSplit = styled(Split)``\n\nexport const StyledSplitWrapper = styled.div`\n height: 100%;\n`\n\nexport const StyledHeader = styled.div`\n background-color: ${theme.color('paper')};\n border-bottom: 3px solid ${theme.color('backgroundBody')};\n display: flex;\n justify-content: flex-end;\n padding: 9px;\n position: relative;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n\n ${Menu} {\n z-index: 3; //higher than rest to lay over search filter list\n }\n`\n\nexport const AdminSearchGrid = styled.div`\n display: ${({isCollapsed}) => isCollapsed ? 'none' : 'block'};\n height: 100%;\n overflow: hidden;\n\n ${StyledSplit} {\n height: calc(100% - 40px);\n display: flex;\n flex-direction: column;\n }\n`\n\nexport const StyledPlaceHolder = styled.div`\n display: ${({isCollapsed}) => isCollapsed ? 'flex' : 'none'};\n flex: 1;\n background: ${theme.color('paper')};\n padding-top: ${scale.space(-0.5)};\n padding-left: ${scale.space(-2.5)};\n\n &:hover {\n cursor: pointer;\n }\n`\n\nexport const StyledToggleCollapseButton = styled(Button)`\n font-size: ${scale.font(0)};\n padding: 0;\n margin-right: auto;\n position: relative;\n left: ${({isCollapsed}) => !isCollapsed ? '-5px' : '2.5px'};\n\n &:hover,\n ${/* sc-selector */StyledPlaceHolder}:hover & {\n background-color: transparent;\n color: ${theme.color('secondaryLight')};\n }\n`\n\nexport const Box = styled.div`\n background-color: ${theme.color('paper')};\n overflow-y: auto;\n padding: .6rem 1rem 0 .6rem;\n position: relative;\n\n &:first-of-type {\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n }\n ${StyledScrollbar}\n`\n\nexport const StyledGutter = styled.div`\n background-color: ${theme.color('paper')};\n display: flex;\n padding-top: 3px;\n justify-content: center;\n align-items: center;\n height: calc(100% - 1px); //subtract border height from total height\n font-size: 20px;\n border-top: 1px solid ${theme.color('backgroundBody')};\n position: relative;\n z-index: 2;\n\n &:hover {\n cursor: row-resize;\n }\n`\n","export const searchFilterCompare = (a, b) => {\n return a.defaultFilter || b.defaultFilter\n ? a.defaultFilter ? -1 : 1\n : (a.sorting === null) - (b.sorting === null) || a.sorting - b.sorting\n}\n","/* stylelint-disable no-descending-specificity */\n/* stylelint-disable rule-empty-line-before */\nimport styled from 'styled-components'\nimport {Button, scale, StyledSpan, theme, StyledItemLabel} from 'tocco-ui'\n\nexport const SearchFilterListWrapper = styled.div`\n margin-top: .4rem;\n margin-bottom: .4rem;\n`\n\nexport const StyledSpanSearchFilter = styled(StyledSpan)`\n width: 90%;\n`\n\nexport const StyledAddRemoveButton = styled(Button)`\n && {\n background-color: transparent;\n border: 0;\n height: auto;\n border-radius: 0;\n padding: 0 ${scale.space(-2.5)} 0 0;\n\n &:hover * {\n color: ${({active}) => active ? theme.color('paper') : theme.color('secondary')} !important;\n }\n }\n`\n\nexport const StyledMenuWrapper = styled.div`\n &&& {\n button {\n background-color: transparent;\n padding: 0 ${scale.space(-1)} 0 0;\n }\n\n &:hover button {\n color: ${({active}) => active ? theme.color('paper') : theme.color('secondary')};\n cursor: pointer;\n }\n }\n`\n\nexport const StyleButtonWrapper = styled.div`\n display: flex;\n ${/* sc-selector */StyledMenuWrapper} button,\n ${/* sc-selector */StyledAddRemoveButton} * {\n color: transparent;\n }\n`\n\nexport const StyledSearchFilterButton = styled.div`\n border-radius: ${theme.radii('medium')};\n display: flex;\n padding: .3rem 0 .3rem 1rem;\n margin-bottom: .2rem;\n background-color: ${({active}) => active && theme.color('secondary')};\n justify-content: flex-end;\n\n && {\n *:not(${/* sc-selector */StyledItemLabel}) {\n color: ${({active}) => active && theme.color('paper')};\n }\n }\n\n &:hover {\n ${/* sc-selector */StyledSpanSearchFilter},\n ${/* sc-selector */StyledMenuWrapper} button,\n ${/* sc-selector */StyledAddRemoveButton} * {\n color: ${theme.color('paper')};\n }\n background-color: ${({active}) => !active && theme.color('secondaryLight')};\n cursor: pointer;\n }\n`\n\nexport const StyledMessageWrapper = styled.div`\n padding-left: 8px;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {MenuItem, BallMenu, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {searchFilterCompare} from './utils'\nimport {\n SearchFilterListWrapper,\n StyledSpanSearchFilter,\n StyledAddRemoveButton,\n StyledMenuWrapper,\n StyledSearchFilterButton,\n StyledMessageWrapper,\n StyleButtonWrapper\n} from './StyledComponents'\n\nconst EllipsisMenu = ({canEdit, canDelete, navigationStrategy, deleteSearchFilter, primaryKey, active}) => {\n const entries = []\n\n if (canEdit) {\n entries.push(\n <MenuItem key={'edit-button'} onClick={() => navigationStrategy.openDetail('Search_filter', primaryKey)}>\n <FormattedMessage id=\"client.entity-list.search.settings.editFilter\"/>\n </MenuItem>\n )\n }\n if (canDelete) {\n entries.push(\n <MenuItem key={'delete-button'} onClick={deleteSearchFilter}>\n <FormattedMessage id=\"client.entity-list.search.settings.deleteFilter\"/>\n </MenuItem>\n )\n }\n\n if (entries.length === 0) {\n return null\n }\n\n return (\n <StyledMenuWrapper active={active}>\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n {entries}\n </BallMenu>\n </StyledMenuWrapper>\n )\n}\n\nEllipsisMenu.propTypes = {\n canEdit: PropTypes.bool,\n canDelete: PropTypes.bool,\n primaryKey: PropTypes.string,\n deleteSearchFilter: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n active: PropTypes.bool\n}\n\nconst SearchFilterButton = ({\n setActive,\n active,\n label,\n canEdit,\n canDelete,\n primaryKey,\n navigationStrategy,\n deleteSearchFilter\n}) =>\n <StyledSearchFilterButton active={active} onClick={() => setActive(!active)}>\n <StyledSpanSearchFilter title={label}>{label}</StyledSpanSearchFilter>\n <StyleButtonWrapper>\n <StyledAddRemoveButton\n active={active}\n onClick={e => {\n setActive(false)\n e.stopPropagation()\n }}\n icon={active ? 'minus' : 'plus'}\n dense/>\n <EllipsisMenu\n canEdit={canEdit}\n canDelete={canDelete}\n navigationStrategy={navigationStrategy}\n deleteSearchFilter={deleteSearchFilter}\n primaryKey={primaryKey}\n active={active}\n />\n </StyleButtonWrapper>\n </StyledSearchFilterButton>\n\nSearchFilterButton.propTypes = {\n label: PropTypes.string,\n setActive: PropTypes.func.isRequired,\n active: PropTypes.bool,\n canEdit: PropTypes.bool,\n canDelete: PropTypes.bool,\n primaryKey: PropTypes.string,\n deleteSearchFilter: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func)\n}\n\nconst AdminSearchForm = props => {\n const {searchFilters, setSearchFilterActive, executeSearch, navigationStrategy, deleteSearchFilter} = props\n if (!searchFilters) {\n return null\n }\n\n if (searchFilters.length === 0) {\n return <StyledMessageWrapper>\n <Typography.I>\n <FormattedMessage id=\"client.entity-list.noSearchFilters\"/>\n </Typography.I>\n </StyledMessageWrapper>\n }\n\n return <SearchFilterListWrapper>\n {[...searchFilters]\n .sort(searchFilterCompare)\n .map(searchFilter =>\n <SearchFilterButton\n key={searchFilter.uniqueId}\n primaryKey={searchFilter.key}\n active={searchFilter.active}\n label={searchFilter.label}\n setActive={exclusive => {\n setSearchFilterActive(searchFilter.uniqueId, !searchFilter.active, exclusive)\n executeSearch()\n }}\n canEdit={searchFilter.editAllowed}\n canDelete={searchFilter.deleteAllowed}\n navigationStrategy={navigationStrategy}\n deleteSearchFilter={() => deleteSearchFilter(searchFilter.key)}\n />\n )\n }\n </SearchFilterListWrapper>\n}\n\nAdminSearchForm.propTypes = {\n searchFilters: PropTypes.arrayOf(PropTypes.object),\n setSearchFilterActive: PropTypes.func.isRequired,\n executeSearch: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n deleteSearchFilter: PropTypes.func.isRequired\n}\n\nexport default AdminSearchForm\n","import {connect} from 'react-redux'\n\nimport SearchFilterList from './SearchFilterList'\nimport {setSearchFilterActive, executeSearch, deleteSearchFilter} from '../../modules/searchForm/actions'\n\nconst mapActionCreators = {\n setSearchFilterActive,\n executeSearch,\n deleteSearchFilter\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFilters: state.searchForm.searchFilters,\n navigationStrategy: state.input.navigationStrategy\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(SearchFilterList)\n","import SearchFilterList from './SearchFilterListContainer'\n\nexport default SearchFilterList\n","import React, {useRef, useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport ReactDOM from 'react-dom'\nimport {Icon, Ball, BallMenu, MenuItem, Popover} from 'tocco-ui'\nimport {withTheme} from 'styled-components'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport {\n StyledSplit,\n AdminSearchGrid,\n Box,\n StyledGutter,\n StyledHeader,\n StyledSplitWrapper,\n StyledToggleCollapseButton,\n StyledPlaceHolder\n} from './StyedComponents'\nimport BasicSearchFormContainer from '../../containers/BasicSearchFormContainer'\nimport SearchFilterList from '../SearchFilterList'\n\nconst SEARCH_FILTER_BUTTON_HEIGHT = 28\nconst SEARCH_FILTER_PADDING = 10\nconst MAX_HEIGHT_THRESHOLD = 30\nconst MAX_SIZE_SEARCH_FILTER = 25\n\nconst getGutter = () => () => {\n const gutterEl = document.createElement('div')\n ReactDOM.render(\n <StyledGutter tabIndex={0}>\n <Icon icon=\"horizontal-rule\"/>\n </StyledGutter>, gutterEl\n )\n return gutterEl\n}\n\nconst AdminSearchForm = ({\n resetSearch,\n intl,\n searchFilters,\n saveSearchFilter,\n saveDefaultSearchFilter,\n resetDefaultSearchFilter,\n displaySearchFieldsModal,\n resetSearchFields,\n searchFormDirty,\n isCollapsed,\n toggleCollapse\n}) => {\n const splitWrapperEl = useRef(null)\n const [size, setSize] = useState([MAX_SIZE_SEARCH_FILTER, 100 - MAX_SIZE_SEARCH_FILTER])\n const [searchFilterExpanded, setSearchFilterExpanded] = useState(false)\n const [showExpandSearchFilter, setShowExpandSearchFilter] = useState(false)\n\n const msg = id => intl.formatMessage({id})\n\n useEffect(() => {\n const searchFilterHeight = searchFilters\n ? searchFilters.length * SEARCH_FILTER_BUTTON_HEIGHT + SEARCH_FILTER_PADDING\n : SEARCH_FILTER_BUTTON_HEIGHT\n const splitWrapperHeight = splitWrapperEl.current.clientHeight\n const searchFilterHeightPercentage = Math.ceil(100 / (splitWrapperHeight / searchFilterHeight))\n\n if (!searchFilterExpanded && searchFilterHeightPercentage > MAX_HEIGHT_THRESHOLD) {\n setShowExpandSearchFilter(true)\n setSize([MAX_SIZE_SEARCH_FILTER, 100 - MAX_SIZE_SEARCH_FILTER])\n } else {\n setSize([searchFilterHeightPercentage, 100 - searchFilterHeightPercentage])\n }\n }, [searchFilters, searchFilterExpanded])\n\n const isSingleSearchFilterActive = searchFilters !== null && searchFilters.filter(s => s.active).length === 1\n\n return <>\n <AdminSearchGrid isCollapsed={isCollapsed}>\n <StyledHeader>\n <StyledToggleCollapseButton icon={'chevron-left'} isCollapsed={isCollapsed} onClick={toggleCollapse}/>\n {showExpandSearchFilter && <Ball\n icon={searchFilterExpanded ? 'chevron-up' : 'chevron-down'}\n onClick={() => setSearchFilterExpanded(!searchFilterExpanded)}\n title={searchFilterExpanded ? msg('client.entity-list.contract') : msg('client.entity-list.expand')}\n />}\n <Ball\n data-cy=\"reset-button\"\n icon=\"times\"\n onClick={resetSearch}\n title={msg('client.entity-list.reset')}\n />\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem disabled={!isSingleSearchFilterActive} onClick={saveDefaultSearchFilter}>\n <Popover content={!isSingleSearchFilterActive\n && <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.save.info\"/>\n }>\n <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.save\"/>\n </Popover>\n </MenuItem>\n <MenuItem onClick={resetDefaultSearchFilter}>\n <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.reset\"/>\n </MenuItem>\n <MenuItem onClick={saveSearchFilter} disabled={!searchFormDirty}>\n <FormattedMessage id=\"client.entity-list.search.settings.saveAsFilter\"/>\n </MenuItem>\n <MenuItem onClick={displaySearchFieldsModal}>\n <FormattedMessage id=\"client.entity-list.search.settings.searchForm.edit\"/>\n </MenuItem>\n <MenuItem onClick={resetSearchFields}>\n <FormattedMessage id=\"client.entity-list.search.settings.searchForm.reset\"/>\n </MenuItem>\n </BallMenu>\n </StyledHeader>\n <StyledSplitWrapper ref={splitWrapperEl}>\n <StyledSplit\n direction=\"vertical\"\n gutterSize={20}\n sizes={size}\n minSize={[35, 0]}\n gutter={getGutter()}\n >\n <Box>\n <SearchFilterList/>\n </Box>\n <Box>\n <BasicSearchFormContainer disableSimpleSearch={true}/>\n </Box>\n </StyledSplit>\n </StyledSplitWrapper>\n </AdminSearchGrid>\n <StyledPlaceHolder onClick={toggleCollapse} isCollapsed={isCollapsed}>\n <StyledToggleCollapseButton icon={'chevron-right'} isCollapsed={isCollapsed}/>\n </StyledPlaceHolder>\n </>\n}\n\nAdminSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n searchFilters: PropTypes.arrayOf(PropTypes.object),\n resetSearch: PropTypes.func.isRequired,\n theme: PropTypes.object,\n saveSearchFilter: PropTypes.func.isRequired,\n saveDefaultSearchFilter: PropTypes.func.isRequired,\n resetDefaultSearchFilter: PropTypes.func.isRequired,\n displaySearchFieldsModal: PropTypes.func.isRequired,\n resetSearchFields: PropTypes.func.isRequired,\n searchFormDirty: PropTypes.bool,\n isCollapsed: PropTypes.bool,\n toggleCollapse: PropTypes.func.isRequired\n}\n\nexport default injectIntl(withTheme(AdminSearchForm))\n","import {connect} from 'react-redux'\nimport {isDirty} from 'redux-form'\n\nimport AdminSearchForm from './AdminSearchForm'\nimport {\n displaySearchFieldsModal,\n resetSearch,\n resetSearchFields,\n resetDefaultSearchFilter,\n saveDefaultSearchFilter,\n saveSearchFilter\n} from '../../modules/searchForm/actions'\n\nconst mapActionCreators = {\n resetSearch,\n saveSearchFilter,\n saveDefaultSearchFilter,\n resetDefaultSearchFilter,\n displaySearchFieldsModal,\n resetSearchFields\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFilters: state.searchForm.searchFilters,\n searchFormDirty: isDirty('searchForm')(state)\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(AdminSearchForm)\n","import AdminSearchFormContainer from './AdminSearchFormContainer'\n\nexport default AdminSearchFormContainer\n","import styled from 'styled-components'\n\nexport const StyledAdminSearchFormWrapper = styled.div`\n display: flex; // enables StyledPlaceHolder to take full height\n flex-direction: column;\n height: calc(var(--vh, 1vh) * 100 - 77px); // TODO: This is only a temporary workaround, height needs to be 100%\n overflow-y: auto;\n overflow-x: hidden;\n`\n","import React from 'react'\nimport {Panel} from 'tocco-ui'\nimport PropTypes from 'prop-types'\n\nimport FullTextSearchForm from '../../containers/FullTextSearchFormContainer'\nimport BasicSearchFormContainer from '../../containers/BasicSearchFormContainer'\nimport AdminSearchForm from '../AdminSearchForm'\nimport searchFormTypes, {searchFormTypePropTypes} from '../../util/searchFormTypes'\nimport {StyledAdminSearchFormWrapper} from './StyledComponents'\n\nconst SearchView = ({searchFormType, isCollapsed, toggleCollapse}) => {\n if (searchFormType === searchFormTypes.ADMIN) {\n return (\n <StyledAdminSearchFormWrapper>\n <AdminSearchForm isCollapsed={isCollapsed} toggleCollapse={toggleCollapse}/>\n </StyledAdminSearchFormWrapper>\n )\n }\n\n return <Panel.Wrapper isToggleable={false} isFramed={false}>\n <Panel.Body>\n {searchFormType === searchFormTypes.SIMPLE ? <FullTextSearchForm/> : <BasicSearchFormContainer/>}\n </Panel.Body>\n </Panel.Wrapper>\n}\n\nSearchView.propTypes = {\n searchFormType: searchFormTypePropTypes,\n isCollapsed: PropTypes.bool,\n toggleCollapse: PropTypes.func\n}\n\nexport default SearchView\n","import SearchView from './SearchView'\n\nexport default SearchView\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport SearchView from '../components/SearchView'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = (state, props) => ({\n searchFormType: state.entityList.searchFormType\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(SearchView))\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport default styled.div`\n display: flex;\n width: max-content;\n`\n\nexport const StyledButton = styled.span`\n border-radius: ${theme.radii('medium')};\n padding: .3rem 1.3rem;\n display: ${({disabled}) => disabled ? 'none' : 'flex'};\n margin-right: 1rem;\n align-items: center;\n cursor: pointer;\n background-color: ${({active}) => active && theme.color('secondary')};\n\n &:hover {\n background-color: ${theme.color('secondaryLight')};\n\n * {\n color: ${theme.color('paper')};\n }\n }\n\n && {\n * {\n color: ${({active}) => active && theme.color('paper')};\n }\n\n button {\n background-color: transparent;\n margin-left: .5rem;\n margin-top: -.2rem;\n margin-right: -.8rem;\n\n &:hover * {\n color: ${theme.color('secondary')};\n }\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\nimport {\n Button,\n Typography\n} from 'tocco-ui'\n\nimport StyledSelectionController, {StyledButton} from './StyledSelectionController'\n\nconst SelectionController = ({\n intl,\n selection,\n showSelectedRecords,\n toggleShowSelectedRecords,\n queryCount,\n clearSelection\n}) => {\n const msg = id => intl.formatMessage({id})\n const selectionPossible = selection.length !== 0\n\n return (\n <StyledSelectionController>\n <StyledButton\n active={!showSelectedRecords}\n onClick={() => {\n if (selectionPossible) {\n toggleShowSelectedRecords()\n }\n }}\n >\n <Typography.Span>\n <FormattedMessage\n id=\"client.entity-list.selectionAll\"\n values={{count: queryCount}}/>\n </Typography.Span>\n </StyledButton>\n <StyledButton\n active={showSelectedRecords}\n disabled={!selectionPossible}\n onClick={() => {\n if (selectionPossible) {\n toggleShowSelectedRecords()\n }\n }}\n data-cy=\"selection-controller-selection\"\n >\n <Typography.Span>\n <FormattedMessage\n id=\"client.entity-list.selectionSelection\"\n values={{count: selection.length}}/>\n {selection.length > 0 && <Button\n data-cy=\"selection-controller-delete-selection\"\n dense\n icon=\"times\"\n title={msg('client.entity-list.clearSelection')}\n onClick={e => {\n e.stopPropagation()\n if (showSelectedRecords) {\n toggleShowSelectedRecords()\n }\n clearSelection()\n }}\n />}\n </Typography.Span>\n </StyledButton>\n </StyledSelectionController>\n )\n}\n\nSelectionController.propTypes = {\n clearSelection: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n queryCount: PropTypes.number.isRequired,\n selection: PropTypes.array.isRequired,\n showSelectedRecords: PropTypes.bool,\n toggleShowSelectedRecords: PropTypes.func.isRequired\n}\n\nexport default SelectionController\n","import SelectionController from './SelectionController'\n\nexport default SelectionController\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport SelectionController from '../components/SelectionController'\nimport {clearSelection, toggleShowSelectedRecords} from '../modules/selection/actions'\n\nconst mapActionCreators = {\n clearSelection,\n toggleShowSelectedRecords\n}\n\nconst mapStateToProps = (state, props) => (\n {\n queryCount: state.selection.queryCount,\n selection: state.selection.selection,\n showSelectedRecords: state.selection.showSelectedRecords\n }\n)\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(SelectionController))\n","import React from 'react'\nimport {BallMenu, MenuItem} from 'tocco-ui'\nimport {connect} from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\n\nimport {displayColumnModal, resetSorting, resetPreferences, resetColumns} from '../../modules/preferences/actions'\n\nconst NavigationCellHeader = props =>\n !props.disablePreferencesMenu\n ? <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem onClick={props.displayColumnModal}>\n <FormattedMessage id=\"client.entity-list.preferences.columns\"/>\n </MenuItem>\n <MenuItem onClick={props.resetColumns}>\n <FormattedMessage id=\"client.entity-list.preferences.columns.reset\"/>\n </MenuItem>\n {props.sortable\n && <MenuItem onClick={props.resetSorting}>\n <FormattedMessage id=\"client.entity-list.sorting.reset\"/>\n </MenuItem>\n }\n <MenuItem onClick={props.resetPreferences}>\n <FormattedMessage id=\"client.entity-list.preferences.reset\"/>\n </MenuItem>\n </BallMenu>\n : null\n\nNavigationCellHeader.propTypes = {\n displayColumnModal: PropTypes.func.isRequired,\n resetSorting: PropTypes.func.isRequired,\n resetPreferences: PropTypes.func.isRequired,\n resetColumns: PropTypes.func.isRequired,\n sortable: PropTypes.bool,\n disablePreferencesMenu: PropTypes.bool\n}\n\nconst mapActionCreators = {\n displayColumnModal,\n resetSorting,\n resetPreferences,\n resetColumns\n}\n\nconst mapStateToProps = (state, props) => ({\n sortable: state.list.sortable,\n disablePreferencesMenu: state.list.disablePreferencesMenu\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(NavigationCellHeader)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport NavigationCellHeader from './NavigationCellHeader'\n\nconst CellRenderer = ({showNavigation, rowData, navigationStrategy, parent}) =>\n showNavigation && navigationStrategy.DetailLinkRelative\n ? <span\n onClick={e => e.stopPropagation()}\n data-cy=\"list-navigation-arrow\"\n >\n <navigationStrategy.DetailLinkRelative\n entityKey={rowData.__key}\n {...(parent && parent.relationName && {relation: parent.relationName})}\n >\n <Icon icon=\"arrow-right\"/>\n </navigationStrategy.DetailLinkRelative>\n </span>\n : null\n\nCellRenderer.propTypes = {\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired\n }).isRequired,\n showNavigation: PropTypes.bool.isRequired,\n navigationStrategy: PropTypes.shape({\n DetailLinkRelative: PropTypes.func\n }).isRequired,\n parent: PropTypes.shape({\n relationName: PropTypes.string\n })\n}\n\nexport const navigationCell = (showNavigation, navigationStrategy, parent) => ({\n id: 'navigation-column',\n fixedPosition: true,\n width: 30,\n resizable: false,\n dynamic: false,\n HeaderRenderer: NavigationCellHeader,\n CellRenderer: props => <CellRenderer\n {...props}\n showNavigation={showNavigation}\n navigationStrategy={navigationStrategy}\n parent={parent}\n />\n})\n","import styled from 'styled-components'\nimport {theme, declareFont} from 'tocco-ui'\n\nexport const StyledMarkingWrapper = styled.span`\n ${declareFont()}\n display: flex;\n height: 100%;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n ${({marked, theme}) => marked && `color: ${theme.colors.secondary};`}\n`\n","import React, {useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\nimport {connect} from 'react-redux'\n\nimport {setMarked} from '../../modules/list/actions'\nimport {StyledMarkingWrapper} from './StyledComponents'\n\nconst CellRenderer = ({rowData, markings, setMarked}) => {\n const [mouseOver, setMouseOver] = useState(false)\n\n const marked = markings && markings[rowData.__model] && markings[rowData.__model][rowData.__key]\n\n useEffect(() => {\n if (!marked) {\n setMouseOver(false) // reset mouse over to false to show empty star when user unmarks even if still hovering\n }\n }, [marked])\n\n const handleClick = e => {\n e.stopPropagation()\n setMarked(rowData.__model, rowData.__key, !marked)\n }\n\n return (\n <StyledMarkingWrapper\n marked={marked}\n onClick={handleClick}\n onMouseEnter={() => setMouseOver(true)}\n onMouseLeave={() => setMouseOver(false)}>\n <Icon icon={marked || mouseOver ? 'star-full' : 'star'}/>\n </StyledMarkingWrapper>\n )\n}\n\nCellRenderer.propTypes = {\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired,\n __model: PropTypes.string.isRequired\n }).isRequired,\n markings: PropTypes.objectOf(PropTypes.objectOf(PropTypes.bool)),\n setMarked: PropTypes.func.isRequired\n}\n\nconst mapActionCreators = {\n setMarked\n}\n\nconst mapStateToProps = state => ({\n markings: state.list.lazyData.markings\n})\n\nconst MarkingCellRenderer = connect(mapStateToProps, mapActionCreators)(CellRenderer)\n\nexport const markingCell = () => ({\n id: 'mark-column',\n fixedPosition: true,\n width: 30,\n resizable: false,\n dynamic: false,\n CellRenderer: MarkingCellRenderer\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\nimport {columnPropType, selectionStylePropType, Table as UiTable} from 'tocco-ui'\nimport _get from 'lodash/get'\n\nimport {navigationCell} from './navigationCell'\nimport {markingCell} from './markingCell'\n\nconst Table = props => {\n const showNavigationLink = props.showLink\n && props.clickable\n && props.navigationStrategy\n && props.navigationStrategy.DetailLinkRelative\n const showPreferencesMenu = !props.disablePreferencesMenu\n return <UiTable\n data={props.entities}\n columns={[\n ...((showNavigationLink || showPreferencesMenu)\n ? [navigationCell(showNavigationLink,\n props.navigationStrategy,\n props.parent)]\n : []),\n ...(props.markable ? [markingCell()] : []),\n ...props.columnDefinitions.sort((a, b) =>\n _get(props.positions, [a.id]) - _get(props.positions, [b.id])\n )\n ]}\n dataLoadingInProgress={props.inProgress}\n paginationInfo={{\n currentPage: props.currentPage,\n totalCount: props.entityCount,\n recordsPerPage: props.limit\n }}\n onPageChange={props.changePage}\n onSortingChange={props.setSortingInteractive}\n selectionStyle={props.tableSelectionStyle}\n onSelectionChange={props.onSelectChange}\n selection={props.selection}\n onRowClick={props.onRowClick}\n clickable={props.clickable}\n onColumnPositionChange={props.changePosition}\n />\n}\n\nTable.propTypes = {\n columnDefinitions: PropTypes.arrayOf(columnPropType).isRequired,\n entities: PropTypes.array.isRequired,\n entityCount: PropTypes.number,\n inProgress: PropTypes.bool,\n currentPage: PropTypes.number,\n limit: PropTypes.number,\n onRowClick: PropTypes.func,\n clickable: PropTypes.bool,\n setSortingInteractive: PropTypes.func,\n changePage: PropTypes.func.isRequired,\n tableSelectionStyle: selectionStylePropType,\n onSelectChange: PropTypes.func,\n selection: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string,\n relation: PropTypes.string\n }),\n showLink: PropTypes.bool,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n changePosition: PropTypes.func.isRequired,\n positions: PropTypes.objectOf(PropTypes.number),\n markable: PropTypes.bool,\n disablePreferencesMenu: PropTypes.bool\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = js.difference(prevProps, nextProps)\n return Object.keys(diff).length === 0\n}\n\nexport default React.memo(Table, areEqual)\n","import Table from './Table'\n\nexport default Table\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Table from '../components/Table'\nimport {\n changePage,\n initialize,\n onRowClick,\n setSortingInteractive\n} from '../modules/list/actions'\nimport {\n onSelectChange,\n setSelection\n} from '../modules/selection/actions'\nimport {\n changePosition,\n resetSorting\n} from '../modules/preferences/actions'\n\nconst mapActionCreators = {\n initialize,\n changePage,\n setSortingInteractive,\n onRowClick,\n onSelectChange,\n setSelection,\n changePosition,\n resetSorting\n}\n\nconst mapStateToProps = (state, props) => ({\n currentPage: state.list.currentPage,\n entities: state.list.entities,\n entityCount: state.list.entityCount,\n limit: state.list.limit,\n inProgress: state.list.inProgress,\n tableSelectionStyle: state.selection.tableSelectionStyle,\n clickable: state.list.formClickable,\n selection: state.selection.selection,\n parent: state.entityList.parent,\n showLink: state.list.showLink,\n navigationStrategy: state.input.navigationStrategy,\n positions: state.preferences.positions,\n markable: state.list.entityModel.markable && state.list.formDefinition.markable,\n disablePreferencesMenu: state.list.disablePreferencesMenu\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Table))\n","export const deriveSelectionFromState = state => {\n const {selection, input} = state\n\n if (selection.selection.length > 0 || input.selectionStyle === 'multi_explicit') {\n return {\n entityName: state.entityList.entityName,\n type: 'ID',\n ids: selection.selection,\n count: selection.selection.length || 0\n }\n }\n\n return {\n entityName: state.entityList.entityName,\n type: 'QUERY',\n query: selection.query,\n count: selection.queryCount || 0\n }\n}\n","import {connect} from 'react-redux'\nimport {actions} from 'tocco-app-extensions'\n\nimport {deriveSelectionFromState} from '../util/actions'\n\nconst mapStateToProps = (state, props) => ({\n selection: deriveSelectionFromState(state)\n})\n\nconst mapActionCreators = {}\n\nexport default connect(mapStateToProps, mapActionCreators)(actions.Action)\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport const StyledListWrapper = styled.div`\n grid-row-start: table-start;\n`\n\nexport const StyledActionWrapper = styled.div`\n display: flex;\n background-color: ${theme.color('paper')};\n margin-bottom: 3px;\n padding: 0 8px 8px;\n grid-row-start: action-start;\n flex-wrap: wrap;\n\n & > * {\n margin-top: 8px;\n }\n`\n\nexport const StyledListView = styled.div`\n display: grid;\n grid-template-rows: [action-start] auto [table-start] minmax(200px, 1fr);\n height: 100%;\n`\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport {LoadMask} from 'tocco-ui'\nimport {js} from 'tocco-util'\n\nimport SelectionControllerContainer from '../../containers/SelectionControllerContainer'\nimport {getColumnDefinition, getTable, getActionBar} from '../../util/api/forms'\nimport TableContainer from '../../containers/TableContainer'\nimport ActionContainer from '../../containers/ActionContainer'\nimport {StyledListWrapper, StyledActionWrapper, StyledListView} from './StyledComponents'\n\nconst ListView = ({\n dataLoadingInProgress,\n formDefinition,\n parent,\n searchFormPosition,\n showActions,\n showSelectionController,\n sorting,\n columnDisplayPreferences,\n cellRenderers,\n preferencesLoaded,\n intl,\n sortable\n}) => {\n const msg = (id, values = {}) => intl.formatMessage({id}, values)\n\n const List = useMemo(() => {\n if (formDefinition && preferencesLoaded) {\n const table = getTable(formDefinition)\n const columnsDefinitions = getColumnDefinition(\n {table, sorting, sortable, parent, intl, columnDisplayPreferences, cellRenderers}\n )\n\n return <StyledListWrapper searchFormPosition={searchFormPosition} key={`tableWrapper-${table.id}`}>\n <TableContainer\n key={`table-${table.id}`}\n columnDefinitions={columnsDefinitions}\n />\n </StyledListWrapper>\n }\n }, [formDefinition, sorting, columnDisplayPreferences, preferencesLoaded])\n\n const ActionBar = useMemo(() => {\n if (formDefinition) {\n const actionBar = getActionBar(formDefinition)\n const content = [\n ...(showSelectionController ? [<SelectionControllerContainer key=\"selectionController\"/>] : []),\n ...(showActions !== false && actionBar\n ? [<ActionContainer\n key={`listAction-${actionBar.id}`}\n definition={actionBar}\n parent={parent}\n disabled={dataLoadingInProgress}\n />]\n : [])\n ]\n\n if (content.length > 0 && actionBar) {\n return <StyledActionWrapper key={`listActionWrapper-${actionBar.id}`}>\n {content}\n </StyledActionWrapper>\n }\n }\n }, [dataLoadingInProgress, formDefinition])\n\n return (\n <LoadMask\n required={[formDefinition]}\n loadingText={msg('client.entity-list.loadingText')}\n >\n <StyledListView>\n {ActionBar}\n {List}\n </StyledListView>\n </LoadMask>\n )\n}\n\nListView.propTypes = {\n intl: PropTypes.object.isRequired,\n formDefinition: PropTypes.shape({\n children: PropTypes.array\n }),\n selection: PropTypes.arrayOf(PropTypes.string),\n currentPageIds: PropTypes.arrayOf(PropTypes.string),\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string\n }),\n dataLoadingInProgress: PropTypes.bool,\n showSelectionController: PropTypes.bool,\n entityName: PropTypes.string,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n showActions: PropTypes.bool,\n sorting: PropTypes.arrayOf(PropTypes.shape({\n field: PropTypes.string,\n order: PropTypes.string\n })),\n sortable: PropTypes.bool,\n columnDisplayPreferences: PropTypes.objectOf(PropTypes.bool),\n cellRenderers: PropTypes.objectOf(PropTypes.func),\n preferencesLoaded: PropTypes.bool\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(ListView, areEqual)\n","import ListView from './ListView'\n\nexport default ListView\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport ListView from '../components/ListView'\n\nconst mapStateToProps = (state, props) => ({\n formDefinition: state.list.formDefinition,\n selection: state.selection.selection,\n currentPageIds: state.list.entities.map(e => e.__key),\n entityName: state.entityList.entityName,\n parent: state.entityList.parent,\n dataLoadingInProgress: state.list.inProgress,\n showSelectionController: state.selection.showSelectionController,\n searchFormPosition: state.input.searchFormPosition,\n showActions: state.input.showActions,\n sorting: state.list.sorting,\n sortable: state.list.sortable,\n columnDisplayPreferences: state.preferences.columns,\n preferencesLoaded: state.preferences.preferencesLoaded,\n cellRenderers: state.input.cellRenderers\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(ListView))\n","import styled from 'styled-components'\nimport {scale, StyledScrollbar} from 'tocco-ui'\n\nexport const TopPositioning = styled.div`\n height: 100%;\n display: grid;\n row-gap: 8px;\n grid-template-areas:\n 'search'\n 'list';\n grid-auto-rows: auto minmax(${({searchFormType}) => searchFormType === 'simple' ? 'auto' : '400px'}, 1fr);\n\n /* remove bottom space and set width in modal */\n ${({searchFormType}) => searchFormType !== 'simple' && `\n grid-template-columns: minmax(100%, 700px);\n `\n}\n`\n\nexport const LeftPositioning = styled.div`\n display: grid;\n column-gap: 1rem;\n ${({isCollapsed}) => !isCollapsed\n ? `\n grid: 'search list' / minmax(350px, 16%) auto;\n `\n : `\n grid: 'search list' / 25px auto;\n `\n }\n\n @media (max-width: 600px) {\n column-gap: 8px;\n }\n`\n\nexport const SearchGrid = styled.div`\n grid-area: search;\n overflow-y: auto;\n\n /* Limit height when positioned top */\n ${/* sc-selector */TopPositioning} & {\n max-height: 200px;\n padding-right: ${scale.space(-0.5)};\n ${StyledScrollbar}\n }\n`\n\nexport const ListGrid = styled.div`\n grid-area: list;\n display: flex;\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport SearchViewContainer from '../../containers/SearchViewContainer'\nimport ListViewContainer from '../../containers/ListViewContainer'\nimport {TopPositioning, LeftPositioning, ListGrid, SearchGrid} from './StyledComponents'\nimport searchFormTypes, {searchFormTypePropTypes} from '../../util/searchFormTypes'\n\nconst EntityList = ({\n searchFormType,\n searchFormCollapsed,\n searchFormPosition,\n setSearchFormCollapsed\n}) => {\n const toggleCollapse = () => {\n setSearchFormCollapsed(!searchFormCollapsed)\n }\n\n if (searchFormType === searchFormTypes.NONE) {\n return <ListViewContainer/>\n }\n\n const PositioningContainer = searchFormPosition === 'left' ? LeftPositioning : TopPositioning\n\n return (\n <PositioningContainer searchFormType={searchFormType} isCollapsed={searchFormCollapsed}>\n <SearchGrid>\n <SearchViewContainer isCollapsed={searchFormCollapsed} toggleCollapse={toggleCollapse}/>\n </SearchGrid>\n <ListGrid searchFormType={searchFormType}>\n <ListViewContainer/>\n </ListGrid>\n </PositioningContainer>\n )\n}\n\nEntityList.propTypes = {\n searchFormType: searchFormTypePropTypes,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n searchFormCollapsed: PropTypes.bool,\n setSearchFormCollapsed: PropTypes.func\n}\n\nexport default EntityList\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport EntityList from './EntityList'\nimport {initialize, setSearchFormCollapsed} from '../../modules/entityList/actions'\nimport {initialize as initializeSearchForm} from '../../modules/searchForm/actions'\nimport {loadPreferences} from '../../modules/preferences/actions'\n\nconst mapActionCreators = {\n initialize,\n initializeSearchForm,\n loadPreferences,\n setSearchFormCollapsed\n}\n\nconst mapStateToProps = state => ({\n searchFormType: state.input.searchFormType,\n searchFormPosition: state.input.searchFormPosition,\n searchFormCollapsed: state.entityList.searchFormCollapsed\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(EntityList))\n","import EntityList from './EntityListContainer'\n\nexport default EntityList\n","import {\n setSearchFormType,\n setFormName,\n setEntityName,\n setParent,\n setSearchFormPosition,\n setSearchFormCollapsedInitialValue\n} from './modules/entityList/actions'\nimport {\n setDisableSimpleSearch,\n setSimpleSearchFields\n} from './modules/searchForm/actions'\nimport {\n setLimit,\n setSearchFilters,\n setFormDefinition as setListFormDefinition,\n setShowLink,\n setSortable,\n setInputTql,\n setInputKeys,\n setInputSearchFilters\n} from './modules/list/actions'\nimport {setSelection} from './modules/selection/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\nexport const reloadOptions = {\n ALL: 3,\n DATA: 2,\n NOTHING: 1\n}\n\nexport const getReloadOption = input => {\n return Object.keys(input).reduce((res, key) => {\n const actionSetting = actionSettings.find(aS => aS.name === key)\n if (actionSetting && actionSetting.reload > res) {\n return actionSetting.reload\n }\n return res\n }, reloadOptions.NOTHING)\n}\n\nconst actionSettings = [\n {\n name: 'entityName',\n action: setEntityName,\n argsFactory: input => [input.entityName],\n reload: reloadOptions.ALL\n },\n {\n name: 'formName',\n action: setFormName,\n argsFactory: input => [input.formName],\n reload: reloadOptions.ALL\n },\n {\n name: 'limit',\n action: setLimit,\n argsFactory: input => [input.limit],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFilters',\n action: setSearchFilters,\n argsFactory: input => [input.searchFilters],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormType',\n action: setSearchFormType,\n argsFactory: input => [input.searchFormType],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormPosition',\n action: setSearchFormPosition,\n argsFactory: input => [input.searchFormPosition],\n reload: reloadOptions.DATA\n },\n {\n name: 'disableSimpleSearch',\n action: setDisableSimpleSearch,\n argsFactory: input => [input.disableSimpleSearch],\n reload: reloadOptions.DATA\n },\n {\n name: 'simpleSearchFields',\n action: setSimpleSearchFields,\n argsFactory: input => [input.simpleSearchFields],\n reload: reloadOptions.DATA\n },\n {\n name: 'selection',\n type: 'boolean',\n action: setSelection,\n argsFactory: input => [input.selection],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'parent',\n action: setParent,\n argsFactory: input => [input.parent],\n reload: reloadOptions.DATA\n },\n {\n name: 'listFormDefinition',\n action: setListFormDefinition,\n argsFactory: input => [input.listFormDefinition],\n reload: reloadOptions.ALL\n },\n {\n name: 'showLink',\n action: setShowLink,\n argsFactory: input => [input.showLink],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'sortable',\n action: setSortable,\n argsFactory: input => [input.sortable],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'tql',\n action: setInputTql,\n argsFactory: input => [input.tql],\n reload: reloadOptions.DATA\n },\n {\n name: 'keys',\n action: setInputKeys,\n argsFactory: input => [input.keys],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFilters',\n action: setInputSearchFilters,\n argsFactory: input => [input.searchFilters],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormCollapsed',\n action: setSearchFormCollapsedInitialValue,\n argsFactory: input => [input.searchFormCollapsed],\n reload: reloadOptions.NOTHING\n }\n]\n","import {put} from 'redux-saga/effects'\n\nimport {navigateToCreate, navigateToAction, toggleMarkings} from './modules/list/actions'\n\nexport default input => ({\n new: function* () {\n yield put(navigateToCreate(input.parent && input.parent.relationName))\n },\n fullscreen: function* (definition, selection) {\n yield put(navigateToAction(definition, selection))\n },\n mark: function* (definition, selection) {\n yield put(toggleMarkings(selection))\n }\n})\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {reducer as reducerUtil, navigationStrategy} from 'tocco-util'\nimport {\n appFactory,\n notification,\n errorLogging,\n actionEmitter,\n externalEvents,\n actions,\n formData\n} from 'tocco-app-extensions'\nimport _pickBy from 'lodash/pickBy'\nimport _isEqual from 'lodash/isEqual'\nimport _isEmpty from 'lodash/isEmpty'\nimport SimpleFormApp from 'tocco-simple-form/src/main'\n\nimport reducers, {sagas} from './modules/reducers'\nimport {reloadData, reloadAll} from './modules/entityList/actions'\nimport {refresh} from './modules/list/actions'\nimport EntityList from './components/EntityList'\nimport {getDispatchActions, getReloadOption, reloadOptions} from './input'\nimport {selectionStylePropType} from './util/selectionStyles'\nimport customActions from './customActions'\nimport {searchFormTypePropTypes} from './util/searchFormTypes'\n\nconst packageName = 'entity-list'\n\nconst EXTERNAL_EVENTS = [\n 'onRowClick',\n 'emitAction',\n 'onSelectChange',\n 'onStoreCreate',\n 'onSearchChange',\n 'onSearchFormCollapsedChange'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <EntityList/>\n\n let store = input.store\n\n const allCustomActions = {\n ...customActions(input),\n ...(input.customActions || {})\n }\n\n const context = {\n viewName: 'list',\n formName: input.formName,\n ...(input.contextParams || {})\n }\n\n if (!store) {\n store = appFactory.createStore(reducers, sagas, input, packageName)\n\n externalEvents.addToStore(store, events)\n actionEmitter.addToStore(store, events.emitAction)\n errorLogging.addToStore(store, false)\n notification.addToStore(store, false)\n actions.addToStore(store, {\n formApp: SimpleFormApp,\n listApp: EntityListApp,\n customActions: allCustomActions,\n appComponent: input.actionAppComponent,\n navigationStrategy: input.navigationStrategy,\n context\n })\n formData.addToStore(store, {listApp: EntityListApp, navigationStrategy: input.navigationStrategy})\n\n store.dispatch(externalEvents.fireExternalEvent('onStoreCreate', store))\n } else {\n store.dispatch(refresh())\n }\n\n const app = appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: getDispatchActions(input),\n publicPath,\n textResourceModules: ['component', 'common']\n }\n )\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 return app\n}\n\n(() => {\n if (__DEV__ && __PACKAGE_NAME__ === 'entity-list') {\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('id', input)\n appFactory.renderApp(app.component)\n } else {\n appFactory.registerAppInRegistry(packageName, initApp)\n }\n})()\n\nconst getEvents = props =>\n EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\nclass EntityListApp extends React.Component {\n constructor(props) {\n super(props)\n this.app = initApp(props.id, props, getEvents(props))\n }\n\n componentDidUpdate(prevProps) {\n const changedProps = _pickBy(this.props, (value, key) => !_isEqual(value, prevProps[key]))\n if (changedProps.store) {\n this.app = initApp(this.props.id, this.props, getEvents(this.props))\n } else if (!_isEmpty(changedProps)) {\n getDispatchActions(changedProps).forEach(action => {\n this.app.store.dispatch(action)\n })\n\n const reloadOption = getReloadOption(changedProps)\n if (reloadOption === reloadOptions.ALL) {\n this.app.store.dispatch(reloadAll())\n } else if (reloadOption === reloadOptions.DATA) {\n this.app.store.dispatch(reloadData())\n }\n }\n }\n\n render() {\n return this.app.component\n }\n}\n\nEntityListApp.propTypes = {\n id: PropTypes.string.isRequired,\n entityName: PropTypes.string.isRequired,\n formName: PropTypes.string.isRequired,\n store: PropTypes.object,\n limit: PropTypes.number,\n searchFormType: searchFormTypePropTypes,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n searchFilters: PropTypes.arrayOf(PropTypes.string),\n preselectedSearchFields: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.arrayOf(PropTypes.number),\n PropTypes.arrayOf(PropTypes.string)\n ]),\n hidden: PropTypes.bool\n })\n ),\n tql: PropTypes.string,\n keys: PropTypes.arrayOf(PropTypes.string),\n disableSimpleSearch: PropTypes.bool,\n simpleSearchFields: PropTypes.string,\n onSelectChange: PropTypes.func,\n selectionStyle: selectionStylePropType,\n selection: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {}),\n selectOnRowClick: PropTypes.bool,\n parent: PropTypes.shape({\n id: PropTypes.string,\n value: PropTypes.string\n }),\n actionAppComponent: PropTypes.func,\n navigationStrategy: navigationStrategy.propTypes,\n contextParams: PropTypes.object\n}\n\nexport default EntityListApp\n","export const INITIALIZE_QUESTION_FORM = 'simpleForm/INITIALIZE_QUESTION_FORM'\nexport const ADVANCED_SEARCH_UPDATE = 'simpleForm/ADVANCED_SEARCH_UPDATE'\nexport const SET_FIELD_DEFINITIONS = 'simpleForm/SET_FIELD_DEFINITIONS'\r\n\nexport const SUBMIT = 'simpleForm/SUBMIT'\nexport const CANCEL = 'simpleForm/CANCEL'\n\nexport const initializeForm = () => ({\n type: INITIALIZE_QUESTION_FORM,\n payload: {\n }\n})\n\nexport const submit = () => ({\n type: SUBMIT\n})\n\nexport const cancel = () => ({\n type: CANCEL\n})\n\nexport const setFieldDefinitions = fieldDefinitions => ({\n type: SET_FIELD_DEFINITIONS,\n payload: {\n fieldDefinitions\n }\n})\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_FIELD_DEFINITIONS]: reducerUtil.singleTransferReducer('fieldDefinitions')\n}\n\nconst initialState = {\n fieldDefinitions: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import {actions as formActions, getFormValues, isValid} from 'redux-form'\nimport {CHANGE, INITIALIZE, UPDATE_SYNC_ERRORS} from 'redux-form/es/actionTypes'\nimport {externalEvents, form as formUtil} from 'tocco-app-extensions'\nimport {all, call, put, select, takeEvery, takeLatest} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nconst FORM_ID = 'simpleForm'\nexport const inputSelector = state => state.input\nexport const selector = state => state.simpleForm\n\nexport default function* sagas() {\n yield all([\n takeEvery(actions.INITIALIZE_QUESTION_FORM, initialize),\n takeEvery(actions.SUBMIT, submit),\n takeEvery(actions.CANCEL, cancel),\n takeLatest(CHANGE, change),\n takeLatest(UPDATE_SYNC_ERRORS, change),\n takeLatest(INITIALIZE, change)\n ])\n}\n\nexport function* initialize() {\n const {form, defaultValues: inputDefaultValues} = yield select(inputSelector)\n const fieldDefinitions = yield call(formUtil.getFieldDefinitions, form)\n const fromDefaultValues = yield call(formUtil.getDefaultValues, fieldDefinitions)\n yield put(formActions.initialize(FORM_ID, {...fromDefaultValues, ...inputDefaultValues}))\n}\n\nexport function* submit() {\n const values = yield getValues()\n yield put(externalEvents.fireExternalEvent('onSubmit', {values}))\n}\n\nexport function* cancel() {\n const values = yield getValues()\n yield put(externalEvents.fireExternalEvent('onCancel', {values}))\n}\n\nexport function* change() {\n const values = yield getValues()\n const valid = yield select(isValid(FORM_ID))\n yield put(externalEvents.fireExternalEvent('onChange', {\n values,\n valid\n }))\n}\n\nfunction* getValues() {\n return Object.entries(yield select(getFormValues(FORM_ID)))\n .reduce((acc, [key, value]) => (\n {\n ...acc,\n [key.replace('--', '.')]: value\n }\n ), {})\n}\n","import {reducer as form} from 'redux-form'\n\nimport formReducer, {sagas as formSagas} from './simpleForm'\n\nexport default {\n simpleForm: formReducer,\n form\n}\n\nexport const sagas = [\n formSagas\n]\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui'\n\nexport const StyledButtonsWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {form} from 'tocco-app-extensions'\nimport {Button} from 'tocco-ui'\nimport {reduxForm} from 'redux-form'\n\nimport {StyledButtonsWrapper} from './StyledComponents'\n\nconst REDUX_FORM_NAME = 'simpleForm'\n\nconst Form = ({\n initializeForm,\n intl, onCancel,\n onSubmit,\n handleSubmit: handleSubmitProp,\n form: formName,\n formDefinition,\n formValues,\n mappingType,\n mode,\n noButtons,\n submitting,\n submitText,\n cancelText\n}) => {\n const msg = id => intl.formatMessage({id})\n const handleCancel = () => onCancel()\n const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))\n // delay closing of the window so it won't close immediately with the click\n const handleSubmit = () => sleep(400).then(() => onSubmit())\n\n useEffect(() => {\n initializeForm()\n }, [])\n\n return (\n <form onSubmit={handleSubmitProp(handleSubmit)}>\n <form.FormBuilder\n entity={undefined}\n formName={formName}\n formDefinition={formDefinition}\n formValues={formValues}\n fieldMappingType={mappingType || 'editable'}\n mode={mode}\n />\n {!noButtons\n && <StyledButtonsWrapper>\n <Button\n disabled={submitting}\n ink=\"primary\"\n label={submitText || msg('client.simple-form.defaultOk')}\n pending={submitting}\n type=\"submit\"\n />\n <Button\n disabled={submitting}\n label={cancelText || msg('client.simple-form.defaultCancel')}\n onClick={handleCancel}\n />\n </StyledButtonsWrapper>\n }\n </form>\n )\n}\n\nForm.propTypes = {\n intl: PropTypes.object.isRequired,\n initializeForm: PropTypes.func.isRequired,\n handleSubmit: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n formDefinition: PropTypes.object.isRequired,\n submitting: PropTypes.bool.isRequired,\n cancelText: PropTypes.string,\n submitText: PropTypes.string,\n noButtons: PropTypes.bool,\n formValues: PropTypes.object,\n form: PropTypes.string,\n mappingType: PropTypes.oneOf(['editable', 'search', 'readonly']),\n mode: PropTypes.oneOf(['list', 'detail', 'create', 'update', 'search'])\n}\n\nexport default reduxForm({form: REDUX_FORM_NAME, destroyOnUnmount: false})(Form)\n","import Form from './Form'\n\nexport default Form\n","import {connect} from 'react-redux'\nimport {form} from 'tocco-app-extensions'\nimport {injectIntl} from 'react-intl'\n\nimport Form from '../../src/components/Form'\nimport {initializeForm, submit, cancel} from '../modules/simpleForm/actions'\n\nconst mapActionCreators = {\n initializeForm,\n onSubmit: submit,\n onCancel: cancel\n}\n\nconst mapStateToProps = (state, props) => ({\n noButtons: state.input.noButtons,\n title: state.input.title,\n description: state.input.description,\n submitText: state.input.submitText,\n cancelText: state.input.cancelText,\n formDefinition: state.input.form,\n validate: state.input.validate !== false ? form.syncValidation(state.simpleForm.fieldDefinitions) : () => {},\n listApp: state.input.listApp,\n mappingType: state.input.mappingType,\n mode: state.input.mode\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Form))\n","import React from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, externalEvents, formData, notification, actionEmitter, form} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules/reducers'\nimport {setFieldDefinitions} from './modules/simpleForm/actions'\nimport FormContainer from './containers/FormContainer'\nconst packageName = 'simple-form'\n\nconst EXTERNAL_EVENTS = [\n 'onSubmit',\n 'onCancel',\n 'onChange',\n 'emitAction'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <FormContainer listApp={input.listApp}/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n actionEmitter.addToStore(store, events.emitAction)\n externalEvents.addToStore(store, events)\n formData.addToStore(store, {data: input.formData, listApp: input.listApp})\n notification.addToStore(store, false)\n\n const app = appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [\n setFieldDefinitions(form.getFieldDefinitions(input.form))\n ],\n publicPath,\n textResourceModules: ['component', 'common']\n }\n )\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 return app\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 appFactory.renderApp(app.component)\n }\n }\n})()\n\nclass SimpleFormApp extends React.Component {\n constructor(props) {\n super(props)\n\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n this.app = initApp('id', props, events)\n }\n\n render() {\n return this.app.component\n }\n}\n\nSimpleFormApp.propTypes = {\n hideButton: PropTypes.bool,\n submitText: PropTypes.string,\n cancelText: PropTypes.string,\n form: PropTypes.object.isRequired,\n validate: PropTypes.bool,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {}),\n defaultValues: PropTypes.object\n}\n\nexport default SimpleFormApp\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nconst StyledLayoutBox = styled.div`\n display: grid;\n height: fit-content;\n grid-template-rows: auto;\n grid-template-columns: 100%;\n margin-bottom: ${scale.space(0.25)};\n`\n\nexport default StyledLayoutBox\n","import PropTypes from 'prop-types'\nimport React, {useLayoutEffect, useRef} from 'react'\n\nconst checkboxValues = {\n CHECKED: 'checked',\n INDETERMINATE: 'indeterminate',\n UNCHECKED: 'unchecked'\n}\n\n/**\n * Use <MultiCheckbox> to display if none, some or all items of a portion are selected.\n */\nconst MultiCheckbox = ({value, id, onChange, label}) => {\n const inputEl = useRef(null)\n const handleOnChange = e => {\n if (value === checkboxValues.INDETERMINATE) {\n onChange(checkboxValues.UNCHECKED)\n } else {\n onChange(e.target.checked ? checkboxValues.CHECKED : checkboxValues.UNCHECKED)\n }\n }\n\n useLayoutEffect(() => {\n inputEl.current.indeterminate = (value === checkboxValues.INDETERMINATE)\n inputEl.current.checked = (value === checkboxValues.CHECKED)\n }, [value])\n\n return <input\n ref={inputEl}\n onChange={handleOnChange}\n id={id}\n type=\"checkbox\"\n aria-checked={value === 'checked'}\n aria-label={label}\n />\n}\n\nMultiCheckbox.propTypes = {\n /**\n * State with 'checked' if checkbox is checked. State with 'indeterminate' if checkbox\n * is neither checked nor unchecked.\n */\n value: PropTypes.oneOf(Object.values(checkboxValues)),\n /**\n * Id of the checkbox. Can be used in combination with the 'for' attribute of the label element\n */\n id: PropTypes.string,\n /**\n * Callback is executed on change. Callback receives new checkbox state, which is 'checked' or 'unchecked'.\n */\n onChange: PropTypes.func.isRequired,\n /**\n * Label to be used for the aria-label attribute. Improves Accessibility.\n */\n label: PropTypes.string\n}\n\nexport default MultiCheckbox\n","import MultiCheckbox from './MultiCheckbox'\n\nexport default MultiCheckbox\n","import styled from 'styled-components'\nimport {lighten} from 'polished'\n\nimport {\n theme\n} from '../utilStyles'\n\nconst StyledPanel = styled.div`\n && {\n background-color: ${theme.color('paper')};\n border: 1px\n ${({isFramed}) => isFramed ? 'solid' : 'none'}\n ${({theme}) => lighten(0.93, theme.colors.text)};\n }\n`\nexport default StyledPanel\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\n\nimport StyledPanel from './StyledPanel'\n\n/**\n * <Panel/> is used to conceal and display related content alternating by interaction and to\n * emphasize close relationship of content.\n */\nconst Panel = ({\n children,\n isFramed = true,\n controlledIsOpen,\n isOpenInitial = true,\n isToggleable = true,\n onToggle\n}) => {\n const [isOpen, setIsOpen] = useState(isOpenInitial)\n\n const controlled = typeof controlledIsOpen === 'boolean'\n\n const toggleOpenState = () => {\n if (isToggleable) {\n if (controlled) {\n if (typeof onToggle === 'function') {\n onToggle(!controlledIsOpen)\n }\n } else {\n setIsOpen(!isOpen)\n }\n }\n }\n\n return (\n <StyledPanel\n isFramed={isFramed}\n >\n {\n React.Children.map(children, child =>\n React.cloneElement(child, {\n isFramed,\n isOpen: controlled ? controlledIsOpen : isOpen,\n isToggleable,\n toggleOpenState: toggleOpenState\n })\n )\n }\n </StyledPanel>\n )\n}\n\nPanel.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is bordered.\n * Default value is 'true'.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is opened or not. If not set, the Panel manages it sate by itself.\n */\n controlledIsOpen: PropTypes.bool,\n /**\n * If component is not controlled a initial value can be set\n */\n isOpenInitial: PropTypes.bool,\n /**\n * Boolean to control if body can be opened or closed. Default value is 'true'.\n */\n isToggleable: PropTypes.bool,\n /**\n * Function is triggered if panel is opened or closed.\n */\n onToggle: PropTypes.func\n}\n\nexport default Panel\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\nimport StyledPanel from './StyledPanel'\n\nconst StyledPanelGroup = styled.div`\n margin-bottom: ${scale.space(0)};\n\n && {\n ${/* sc-selector */StyledPanel}:not(:last-child) {\n margin-bottom: ${scale.space(-1)};\n }\n }\n`\n\nexport default StyledPanelGroup\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelGroup from './StyledPanelGroup'\n\nclass PanelGroup extends React.Component {\n state = {\n openPanelIndex: this.props.openPanelIndex\n }\n\n onToggle = (index, open) => {\n this.setState({\n openPanelIndex: open === true ? index : undefined\n })\n }\n\n render() {\n return (\n <StyledPanelGroup>\n {\n React.Children.map(this.props.children, (child, i) =>\n React.cloneElement(child, {\n controlledIsOpen: this.state.openPanelIndex === i,\n onToggle: this.onToggle.bind(this, i)\n })\n )\n }\n </StyledPanelGroup>\n )\n }\n}\n\nPanelGroup.propTypes = {\n children: PropTypes.node,\n /**\n * Define a panel which is initially opened (zero-based index).\n */\n openPanelIndex: PropTypes.number\n}\n\nexport default PanelGroup\n","import styled from 'styled-components'\n\nconst StyledPanelBody = styled.div`\n && {\n padding: 0 ${({isFramed}) => isFramed ? '10px' : 0};\n display: ${({isOpen}) => isOpen ? 'block' : 'none'};\n\n > div {\n padding: ${({isFramed}) => isFramed ? '10px' : 0} 0 0 0;\n }\n\n table {\n position: static;\n }\n }\n`\nexport default StyledPanelBody\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelBody from './StyledPanelBody'\n\n/**\n * Only <Panel.Body/> is affected by the visibility state.\n */\n\nconst PanelBody = ({children, isFramed, isOpen}) =>\n <StyledPanelBody\n isFramed={isFramed}\n isOpen={isOpen}\n >\n <div>\n {children}\n </div>\n </StyledPanelBody>\n\nPanelBody.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is initially opened.\n * Value is always overridden by parent element.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is initially opened. Value is always overridden by parent element.\n */\n isOpen: PropTypes.bool\n}\n\nexport default PanelBody\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {shadeColor, scale, theme} from '../utilStyles'\n\nconst declareDivider = ({theme, isOpen, isFramed}) => {\n const cssShared = `\n &:first-child {\n border-bottom-color: ${shadeColor(_get(theme, 'colors.paper'), 1)};\n border-bottom-style: ${isFramed ? 'solid' : 'none'};\n }\n\n &:last-child,\n &:nth-child(3) {\n border-top-color: ${shadeColor(_get(theme, 'colors.paper'), 1)};\n border-top-style: ${isFramed ? 'solid' : 'none'};\n }\n `\n\n if (isOpen) {\n return `\n ${cssShared}\n &:first-child {\n border-bottom-width: 1px;\n }\n\n &:last-child,\n &:nth-child(3) {\n border-top-width: 1px;\n }\n `\n } else {\n return `\n ${cssShared}\n &:first-child {\n border-bottom-width: 0;\n }\n\n &:last-child {\n border-top-width: 0;\n }\n\n &:nth-child(3) {\n border-top-width: 1px;\n }\n `\n }\n}\n\nexport const StyledIconWrapper = styled.span`\n display: none;\n font-size: ${scale.font(1)};\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n`\n\nconst StyledPanelHeaderFooter = styled.div`\n && {\n background-color: #f2f2f2;\n display: flex;\n padding: ${({isFramed}) => isFramed ? '4px 8px 4px 8px' : 0};\n align-items: center;\n\n &:hover {\n cursor: pointer;\n\n ${StyledIconWrapper} {\n display: block;\n }\n }\n\n > div {\n flex: 1 1 auto;\n }\n ${props => declareDivider(props)}\n }\n`\n\nexport default StyledPanelHeaderFooter\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelHeaderFooter, {StyledIconWrapper} from './StyledPanelHeaderFooter'\nimport Icon from '../Icon'\n\n/**\n * <Panel.Header/> and <Panel.Footer/> contain by default a button to toggle the visibility state of <Panel.Body>.\n * Header and footer can contain any content. If both are displayed is up to the implementer.\n */\nconst PanelHeaderFooter = ({\n children,\n isFramed,\n isOpen,\n isToggleable,\n showToggler,\n toggleOpenState,\n options\n}) => (\n <StyledPanelHeaderFooter\n isFramed={isFramed}\n isOpen={isOpen}\n onClick={toggleOpenState}\n >\n <div>\n {React.Children.map(children, child => React.cloneElement(child))}\n </div>\n {isToggleable\n && showToggler\n && <StyledIconWrapper>\n <Icon\n icon={isOpen ? 'chevron-up' : 'chevron-down'}\n onClick={toggleOpenState}\n title={isOpen ? options.collapseButtonText : options.unfoldButtonText}\n />\n </StyledIconWrapper>\n }\n </StyledPanelHeaderFooter>\n)\n\nPanelHeaderFooter.defaultProps = {\n showToggler: true,\n options: {\n collapseButtonText: 'Hide information',\n unfoldButtonText: 'Show more information'\n }\n}\n\nPanelHeaderFooter.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is initially opened.\n * Value is always overridden by parent element.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is initially opened. Value is always overridden by parent element.\n */\n isOpen: PropTypes.bool,\n /**\n * Boolean to control if body can be opened or closed. Value is always overridden by parent element.\n */\n isToggleable: PropTypes.bool,\n /**\n * Show or hide button if needed. Default value is 'true'.\n */\n showToggler: PropTypes.bool,\n /**\n * Function executed on button click to control accordion. Is always passed from parent.\n */\n toggleOpenState: PropTypes.func,\n /* Define display text for buttons as option object (keys: collapseButtonText, unfoldButtonText). */\n options: PropTypes.shape({\n collapseButtonText: PropTypes.string,\n unfoldButtonText: PropTypes.string\n })\n}\n\nexport default PanelHeaderFooter\n","import Wrapper from './Panel'\nimport Group from './PanelGroup'\nimport Body from './PanelBody'\nimport HeaderFooter from './PanelHeaderFooter'\nimport StyledPanel from './StyledPanel'\nimport StyledPanelBody from './StyledPanelBody'\nimport StyledPanelHeaderFooter from './StyledPanelHeaderFooter'\n\nexport {\n StyledPanel,\n StyledPanelBody,\n StyledPanelHeaderFooter\n}\n\nexport default {\n Body,\n Footer: HeaderFooter,\n Group,\n Header: HeaderFooter,\n Wrapper\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {shadeColor} from '../'\n\nexport const StyledResizeHandle = styled.span`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n background: ${props => shadeColor(_get(props.theme, 'colors.paper'), 2)};\n opacity: 0;\n width: 3px;\n cursor: col-resize;\n`\n\nconst ResizingController = ({column, startResize}) => <StyledResizeHandle\n data-cy={`header-cell-${column.id}-resizing-controller`}\n onMouseDown={startResize(column)}\n/>\n\nResizingController.propTypes = {\n column: PropTypes.shape({\n resizable: PropTypes.bool,\n id: PropTypes.string\n }).isRequired,\n startResize: PropTypes.func.isRequired\n}\n\nexport default ResizingController\n","import styled, {css} from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {\n declareFont,\n theme,\n shadeColor,\n StyledScrollbar,\n scale\n} from '../'\nimport {StyledResizeHandle} from './ResizingController'\nimport {generateShades} from '../utilStyles'\n\nconst borderColor = ({theme}) => shadeColor(_get(theme, 'colors.paper'), 2)\nconst basePadding = scale.space(-1.5)\n\nexport const StyledTableCell = styled.td`\n padding: ${basePadding};\n background-color: ${theme.color('paper')};\n border-bottom: 1px solid ${borderColor};\n align-content: center;\n box-sizing: content-box;\n`\n\nexport const StyledDnD = styled.div`\n padding: ${basePadding};\n width: 100%;\n display: flex;\n align-items: center;\n opacity: ${({isDragged}) => isDragged ? 0.2 : 1};\n`\n\nexport const StyledTableHeaderCell = styled.th`\n position: sticky;\n top: 0;\n background-color: ${theme.color('paper')};\n text-align: left;\n border-bottom: 2px solid ${borderColor};\n ${declareFont({fontWeight: theme.fontWeight('bold')})};\n user-select: none;\n cursor: ${({sortable}) => sortable ? 'pointer' : 'auto'};\n white-space: nowrap;\n display: flex;\n border-right: ${({isDraggedOver, theme}) => isDraggedOver ? `3px solid ${theme.colors.text}` : 'none'};\n ${({id}) => id === 'header-cell-navigation-column' && 'z-index: 1'};\n ${({isResizing, theme}) => isResizing && `\n background-color: ${generateShades(theme.colors.paper)[1]};\n\n > ${StyledResizeHandle} {\n opacity: 1;\n }\n `\n }\n ${({resizingColumn, theme}) => !resizingColumn && `\n &:hover {\n background-color: ${generateShades(theme.colors.paper)[2]};\n\n > ${StyledResizeHandle} {\n opacity: 1;\n }\n }\n `\n }\n ${({isResizing, sortable, fixedPosition, theme}) => !sortable\n ? `\n &:hover {\n background-color: ${theme.colors.paper};\n }\n `\n : !isResizing && !sortable && !fixedPosition && `\n &:hover {\n background-color: transparent;\n }\n `\n }\n`\n\nexport const PaginationContainer = styled.div`\n grid-row-start: pagination-start;\n height: 40px;\n display: flex;\n align-items: center;\n border-top: 1px solid ${borderColor};\n`\n\nconst selectionStyles = css`\n display: contents;\n ${({clickable}) => clickable && 'cursor: pointer;'}\n\n &.selected {\n > ${StyledTableCell} {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[2]};\n }\n }\n\n &.selectableRow:not(.selected):hover {\n > ${StyledTableCell} {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[2]};\n }\n }\n`\n\nexport const StyledSortingSpan = styled.span`\n height: 100%;\n margin-right: 2px;\n`\n\nexport const StyledFullRowProgress = styled.td`\n grid-column: 1 / -1;\n padding-top: ${basePadding};\n height: 50px;\n text-align: center;\n border: 0;\n`\n\nexport const StyledFullRow = styled.td`\n grid-column: 1 / -1;\n padding-top: ${basePadding};\n height: 50px;\n text-align: center;\n border: 0;\n ${declareFont()};\n`\n\nexport const StyledTableHead = styled.thead`\n ${selectionStyles}\n`\n\nexport const StyledTableRow = styled.tr`\n ${selectionStyles}\n\n &:nth-child(even) td {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[1]};\n }\n`\n\nexport const StyledTableBody = styled.tbody`\n ${selectionStyles}\n`\n\nconst StyledTable = styled.table`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: auto;\n display: grid;\n border-collapse: collapse;\n grid-template-columns: ${({columns}) =>\n columns.map(column =>\n column.width\n ? column.width + 'px'\n : column.shrinkToContent\n ? 'max-content'\n : 'minmax(100px, auto)'\n ).join(' ')};\n grid-auto-rows: min-content;\n min-width: 100%;\n ${StyledScrollbar}\n`\n\nexport const StretchingTableContainer = styled.div`\n grid-row-start: table-start;\n position: relative;\n`\n\nexport const StyledTableWrapper = styled.div`\n display: grid;\n background-color: ${theme.color('paper')};\n grid-template-rows: [table-start] minmax(300px, 1fr) [pagination-start] auto auto;\n height: 100%;\n\n // reset external styles in old client\n input[type='checkbox'],\n input[type='radio'] {\n margin: 3px 3px 3px 4px !important;\n }\n\n @media screen and (max-height: 650px) {\n grid-template-rows: [table-start] 1fr [pagination-start] auto auto;\n }\n`\n\nexport const StyledDraggable = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n`\n\nexport default StyledTable\n","import styled from 'styled-components'\n\nimport Button from '../Button'\nimport {scale} from '../'\n\nexport const StyledPagination = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin-left: 5px;\n\n span {\n padding-right: 6px;\n }\n`\n\nexport const StyledPaginationButton = styled(Button)`\n padding: ${scale.space(-2)} ${scale.space(-0.8)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport ButtonGroup from '../ButtonGroup'\nimport Typography from '../Typography'\nimport {StyledPagination, StyledPaginationButton} from './StyledComponents'\n\n/**\n * Controlled Pagination component\n */\nconst Pagination = ({totalCount, recordsPerPage, currentPage, onPageChange, intl}) => {\n const totalPages = Math.ceil(totalCount / recordsPerPage)\n const start = (currentPage - 1) * recordsPerPage + 1\n const to = currentPage * recordsPerPage\n\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledPagination>\n {totalPages > 1\n && <ButtonGroup>\n <StyledPaginationButton\n disabled={currentPage === 1}\n title={msg('client.component.pagination.firstPageTitle')}\n icon=\"chevron-double-left\"\n onClick={() => onPageChange(1)}/>\n <StyledPaginationButton\n disabled={currentPage === 1}\n title={msg('client.component.pagination.prePageTitle')}\n icon=\"chevron-left\"\n onClick={() => onPageChange(currentPage - 1)}/>\n <StyledPaginationButton\n disabled={currentPage === totalPages}\n title={msg('client.component.pagination.nextPageTitle')}\n icon=\"chevron-right\"\n onClick={() => onPageChange(currentPage + 1)}/>\n <StyledPaginationButton\n disabled={currentPage === totalPages}\n title={msg('client.component.pagination.lastPageTitle')}\n icon=\"chevron-double-right\"\n onClick={() => onPageChange(totalPages)}/>\n </ButtonGroup>\n }\n\n <Typography.Span> <FormattedMessage id=\"client.component.pagination.text\" values={{\n start,\n to,\n total: totalCount\n }}/>\n </Typography.Span>\n </StyledPagination>\n )\n}\n\nPagination.propTypes = {\n intl: PropTypes.object.isRequired,\n /**\n * Currently displayed page\n */\n currentPage: PropTypes.number.isRequired,\n /**\n * Total of records available\n */\n totalCount: PropTypes.number.isRequired,\n /**\n * Limit for a page\n */\n recordsPerPage: PropTypes.number.isRequired,\n /**\n * Callback on page change with provided button, returns new page as single argument\n */\n onPageChange: PropTypes.func.isRequired\n}\n\nexport default injectIntl(Pagination)\n","import Pagination from './Pagination'\n\nexport default Pagination\n","import {useState} from 'react'\n\nconst removeAllTextSelections = () => {\n if (document.getSelection) {\n document.getSelection().removeAllRanges()\n }\n}\n\nexport default (selection = [], currentKeys, onSelectChange) => {\n const [lastSelected, setLastSelected] = useState(null)\n\n const isSelected = key => selection.includes(key)\n\n const selectionChange = (key, value, shiftSelection) => {\n if (Array.isArray(key)) {\n onSelectChange(key, value)\n setLastSelected(null)\n } else {\n if (shiftSelection) {\n removeAllTextSelections()\n\n const idxLastSelection = lastSelected ? currentKeys.findIndex(k => k === lastSelected) : 0\n const idxSelection = currentKeys.findIndex(k => k === key)\n onSelectChange(\n currentKeys.slice(Math.min(idxLastSelection, idxSelection), Math.max(idxLastSelection, idxSelection) + 1),\n value\n )\n } else {\n onSelectChange([key], value || !isSelected(key))\n setLastSelected(key)\n }\n }\n }\n\n return {\n isSelected,\n selectionChange\n }\n}\n","import PropTypes from 'prop-types'\n\nconst selectionStyles = {\n SINGLE: 'single',\n MULTI: 'multi',\n NONE: 'none'\n}\n\nconst selectionStylePropType = PropTypes.oneOf(Object.keys(selectionStyles).map(key => selectionStyles[key]))\n\nexport {\n selectionStyles as default,\n selectionStylePropType\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst SingleSelectCell = ({rowData, isSelected, selectionChange}) =>\n <div onClick={e => e.stopPropagation()}>\n <input type=\"radio\" checked={isSelected(rowData.__key)} onChange={e => {\n selectionChange(rowData.__key, e.target.value)\n }}/>\n </div>\n\nSingleSelectCell.propTypes = {\n isSelected: PropTypes.func.isRequired,\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired\n }).isRequired,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default SingleSelectCell\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {MultiCheckbox} from '../../'\nimport {rowDataPropType} from '../propTypes'\n\nconst MultiSelectCell = ({rowData, isSelected, selectionChange, rowIdx}) => {\n const rowSelectionState = rowData => isSelected(rowData.__key) ? 'checked' : 'unchecked'\n const rowSelectionChange = rowData => value => selectionChange(rowData.__key, value === 'checked')\n\n return <div onClick={e => {\n if (e.shiftKey) {\n selectionChange(rowData.__key, true, true)\n }\n e.stopPropagation()\n }}\n data-cy=\"list-selection-checkbox\"\n >\n <MultiCheckbox\n value={rowSelectionState(rowData)}\n onChange={rowSelectionChange(rowData)}\n label={`${rowData.__model} ${rowIdx + 1}`}\n id={'list-selection-checkbox ' + rowData.__key}/>\n </div>\n}\n\nMultiSelectCell.propTypes = {\n isSelected: PropTypes.func.isRequired,\n rowData: rowDataPropType.isRequired,\n rowIdx: PropTypes.number,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default MultiSelectCell\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {MultiCheckbox} from '../../'\nimport {dataPropType} from '../propTypes'\n\nconst MultiSelectHeader = ({data, isSelected, selectionChange}) => {\n const allKeys = data.map(e => e.__key)\n const allRowsSelectionChange = v => {\n selectionChange(allKeys, v === 'checked')\n }\n\n const allRowsSelectionState = allKeys.every(k => isSelected(k))\n ? 'checked'\n : allKeys.some(k => isSelected(k))\n ? 'indeterminate'\n : 'unchecked'\n return data.length === 0\n ? null\n : <MultiCheckbox value={allRowsSelectionState} onChange={allRowsSelectionChange}/>\n}\n\nMultiSelectHeader.propTypes = {\n isSelected: PropTypes.func.isRequired,\n data: dataPropType.isRequired,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default MultiSelectHeader\n","import React from 'react'\n\nimport selectionStyles from './selectionStyles'\nimport SingleSelectCell from './SingleSelectCell'\nimport MultiSelectCell from './MultiSelectCell'\nimport MultiSelectHeader from './MultiSelectHeader'\n\nexport const getSelectionCell = (selectionStyle, columns, isSelected, selectionChange) => {\n if (selectionStyle && selectionStyle !== selectionStyles.NONE) {\n return selectionStyle === selectionStyles.MULTI\n ? getMultiSelectionCell(isSelected, selectionChange)\n : getSingleSelectionCell(isSelected, selectionChange)\n }\n return null\n}\n\nconst getSingleSelectionCell = (isSelected, selectionChange) => ({\n id: 'single-selection',\n width: 30,\n resizable: false,\n fixedPosition: true,\n dynamic: true,\n sorting: {\n sortable: false\n },\n HeaderRenderer: () => null,\n CellRenderer: props => <SingleSelectCell {...props} isSelected={isSelected} selectionChange={selectionChange}/>\n})\n\nconst getMultiSelectionCell = (isSelected, selectionChange) => ({\n id: 'multi-selection',\n dynamic: true,\n resizable: false,\n fixedPosition: true,\n width: 30,\n sorting: {\n sortable: false\n },\n HeaderRenderer: props => <MultiSelectHeader {...props} isSelected={isSelected} selectionChange={selectionChange}/>,\n CellRenderer: props => <MultiSelectCell {...props} isSelected={isSelected} selectionChange={selectionChange}/>\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {Icon} from '../'\nimport {StyledSortingSpan} from './StyledTable'\n\nconst SortingState = ({column}) =>\n column.sorting && column.sorting.sortRank && column.sorting.order\n ? <StyledSortingSpan>\n <Icon icon={`sort-${column.sorting.order === 'asc' ? 'up' : 'down'}`}/>\n {column.sorting.sortRank > 1 && <span>{column.sorting.sortRank}</span>}\n </StyledSortingSpan>\n : null\n\nSortingState.propTypes = {\n column: PropTypes.shape({\n sorting: PropTypes.shape({\n sortable: PropTypes.bool,\n sortRank: PropTypes.number,\n order: PropTypes.oneOf(['asc', 'desc'])\n })\n }).isRequired\n}\n\nexport default SortingState\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {useDnD} from 'tocco-util'\n\nimport {StyledDnD, StyledTableHead, StyledTableHeaderCell, StyledTableRow, StyledDraggable} from './StyledTable'\nimport SortingState from './SortingState'\nimport ResizingController from './ResizingController'\nimport {columnPropType, dataPropType} from './propTypes'\nimport useResize from './useResize'\n\nconst ThContent = ({column, data}) =>\n column.HeaderRenderer\n ? <column.HeaderRenderer column={column} data={data}/>\n : <div dangerouslySetInnerHTML={{__html: column.label}} title={column.label}/>\n\nThContent.propTypes = {\n data: dataPropType,\n column: columnPropType\n}\n\nconst TableHeader = ({columns, data, onColumnPositionChange, onSortingChange, tableEl, resizeCallback}) => {\n const {dndEvents, dndState} = useDnD(onColumnPositionChange, columns)\n\n const {resizingColumn, startResize} = useResize(tableEl, resizeCallback)\n\n const thOnClick = column => e => {\n if (!resizingColumn && column.sorting && column.sorting.sortable) {\n onSortingChange(column.id, e.shiftKey)\n }\n }\n\n return <StyledTableHead>\n <StyledTableRow>\n {columns.map(column => {\n const key = `header-cell-${column.id}`\n return <StyledTableHeaderCell\n key={key}\n data-cy={key}\n id={key}\n onClick={thOnClick(column)}\n resizingColumn={resizingColumn}\n isResizing={resizingColumn && column.id === resizingColumn.id}\n sortable={column.sorting && column.sorting.sortable}\n isDraggedOver={dndState.currentlyDragOver === column.id && dndState.currentlyDragging !== column.id}\n >\n <StyledDraggable\n id={`header-cell-drop-${column.id}`}\n key={`header-cell-drop-${column.id}`}\n {...(!column.fixedPosition && {\n draggable: true,\n ...dndEvents(column.id)\n })}\n >\n <StyledDnD\n isDragged={dndState.currentlyDragging === column.id}\n >\n <SortingState column={column}/>\n <ThContent column={column} data={data}/>\n </StyledDnD>\n </StyledDraggable>\n {column.resizable && <ResizingController column={column} startResize={startResize}/>}\n </StyledTableHeaderCell>\n }\n )}\n </StyledTableRow>\n </StyledTableHead>\n}\n\nTableHeader.propTypes = {\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n data: dataPropType,\n onColumnPositionChange: PropTypes.func,\n onSortingChange: PropTypes.func,\n tableEl: PropTypes.shape({current: PropTypes.object}),\n resizeCallback: PropTypes.func\n}\n\nexport default TableHeader\n","import {useState} from 'react'\n\nexport default (tableElRef, resizeCallback) => {\n const [resizingColumn, setResizingColumn] = useState(null)\n\n const startResize = column => () => {\n setResizingColumn(column)\n tmpColResizing = column\n window.addEventListener('mousemove', onMouseMove)\n window.addEventListener('mouseup', onMouseUp)\n }\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove)\n window.removeEventListener('mouseup', onMouseUp)\n setTimeout(() => {\n setResizingColumn(null)\n }, 100)\n }\n\n let lastPositionX\n let tmpColResizing\n const onMouseMove = e => requestAnimationFrame(() => {\n if (lastPositionX) {\n const diff = e.clientX - lastPositionX\n const thEl = tableElRef.current.querySelector(`th[id='header-cell-${tmpColResizing.id}']`)\n const width = Math.max(50, thEl.offsetWidth + diff)\n resizeCallback(tmpColResizing.id, width)\n }\n\n lastPositionX = e.clientX\n })\n\n return {resizingColumn, startResize}\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\n\nimport {StyledTableCell} from './StyledTable'\nimport {Typography} from '../index'\nimport {columnPropType, rowDataPropType} from './propTypes'\n\nconst StaticCell = React.memo(({column, rowData, rowIdx}) => {\n return <StyledTableCell\n {...column.rightAligned === true && {style: {textAlign: 'right'}}}\n data-cy=\"list-cell\"\n >\n {column.CellRenderer\n ? <column.CellRenderer rowData={rowData} column={column} rowIdx={rowIdx}/>\n : <Typography.Span>{rowData[column.id]}</Typography.Span>\n }\n </StyledTableCell>\n})\n\nStaticCell.propTypes = {\n rowData: rowDataPropType.isRequired,\n column: columnPropType.isRequired,\n rowIdx: PropTypes.number\n}\n\nconst areEqual = (prevProps, nextProps) => {\n if (!prevProps.column.dynamic) {\n return true\n }\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(StaticCell, areEqual)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\n\nimport {Typography, LoadingSpinner} from '../'\nimport {StyledFullRow, StyledFullRowProgress, StyledTableBody, StyledTableRow} from './StyledTable'\nimport StaticCell from './StaticCell'\nimport {columnPropType, dataPropType} from './propTypes'\n\nconst InProgressRow = () => <StyledTableRow>\n <StyledFullRowProgress>\n <LoadingSpinner size=\"20\"/>\n <Typography.P>\n <FormattedMessage id=\"client.component.table.dataLoading\"/>\n </Typography.P>\n </StyledFullRowProgress>\n</StyledTableRow>\n\nconst NoDataRow = () => <StyledTableRow>\n <StyledFullRow>\n <Typography.Span>\n <FormattedMessage id=\"client.component.table.noData\"/>\n </Typography.Span>\n </StyledFullRow>\n</StyledTableRow>\n\nconst TableBody = ({data, columns, isSelected, selectionChange, dataLoadingInProgress, onRowClick, clickable}) => {\n const trOnClick = entity => e => {\n if (e.shiftKey) {\n selectionChange(entity.__key, true, true)\n } else if (e.metaKey || e.ctrlKey) {\n selectionChange(entity.__key)\n } else if (clickable && onRowClick) {\n onRowClick(entity.__key)\n }\n }\n\n return <StyledTableBody>\n {\n dataLoadingInProgress\n ? <InProgressRow/>\n : data.length > 0\n ? data.map((rowData, idx) =>\n <StyledTableRow\n key={`list-row-${rowData.__key}`}\n className={`selectableRow ${isSelected(rowData.__key) && 'selected'}`}\n onClick={trOnClick(rowData)}\n clickable={clickable}\n data-cy=\"list-row\"\n >\n {\n columns.map(column =>\n <StaticCell\n key={`table-static-cell-${rowData.__key}-${column.id}`}\n selected={isSelected(rowData.__key)}\n rowData={rowData}\n column={column}\n rowIdx={idx}\n />\n )\n }\n </StyledTableRow>\n )\n : <NoDataRow/>\n }\n </StyledTableBody>\n}\n\nTableBody.propTypes = {\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n data: dataPropType,\n isSelected: PropTypes.func.isRequired,\n selectionChange: PropTypes.func,\n dataLoadingInProgress: PropTypes.bool,\n onRowClick: PropTypes.func,\n clickable: PropTypes.bool\n}\n\nexport default TableBody\n","import React, {useEffect, useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\n\nimport StyledTable, {PaginationContainer, StretchingTableContainer, StyledTableWrapper} from './StyledTable'\nimport {Pagination} from '../'\nimport useSelection from './selection/useSelection'\nimport {selectionStylePropType} from './selection/selectionStyles'\nimport {getSelectionCell} from './selection/selectionColumnEnhancer'\nimport {columnPropType, dataPropType, keyPropType} from './propTypes'\nimport TableHeader from './TableHeader'\nimport TableBody from './TableBody'\n\nconst Table = props => {\n const {\n selection,\n data,\n onSelectionChange,\n selectionStyle,\n paginationInfo,\n onColumnPositionChange,\n onSortingChange,\n dataLoadingInProgress,\n onRowClick,\n clickable,\n onPageChange\n } = props\n const [columns, setColumns] = useState(props.columns)\n const tableEl = useRef(null)\n\n const resizeCallback = (columnId, width) => {\n setColumns([...columns.map(c => c.id === columnId\n ? {\n ...c,\n width\n }\n : c)])\n }\n\n const {isSelected, selectionChange}\n = useSelection(selection, data ? data.map(e => e.__key) : [], onSelectionChange)\n\n useEffect(() => {\n const selectionColumn = getSelectionCell(selectionStyle, props.columns, isSelected, selectionChange)\n setColumns([...(selectionColumn ? [selectionColumn] : []), ...props.columns])\n }, [props.columns, selection])\n\n const showPagination = paginationInfo\n && (paginationInfo.totalCount - paginationInfo.recordsPerPage) > 0\n\n return <StyledTableWrapper>\n <StretchingTableContainer>\n <StyledTable ref={tableEl} columns={columns}>\n <TableHeader\n columns={columns}\n data={data}\n resizeCallback={resizeCallback}\n onColumnPositionChange={onColumnPositionChange}\n tableEl={tableEl}\n onSortingChange={onSortingChange}\n />\n <TableBody\n columns={columns}\n data={data}\n isSelected={isSelected}\n selectionChange={selectionChange}\n dataLoadingInProgress={dataLoadingInProgress}\n onRowClick={onRowClick}\n clickable={clickable}\n />\n </StyledTable>\n </StretchingTableContainer>\n {showPagination && <PaginationContainer>\n <Pagination\n onPageChange={onPageChange}\n currentPage={paginationInfo.currentPage}\n totalCount={paginationInfo.totalCount}\n recordsPerPage={paginationInfo.recordsPerPage}\n />\n </PaginationContainer>}\n </StyledTableWrapper>\n}\n\nTable.propTypes = {\n /**\n * Array of column definitions. Determines how the cells are rendered.\n */\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n /**\n * List of data to be displayed in the table. Should contain a __key property.\n */\n data: dataPropType,\n /**\n * True if data loading is in process.\n */\n dataLoadingInProgress: PropTypes.bool,\n /**\n * Used to display pagination\n */\n paginationInfo: PropTypes.shape({\n totalCount: PropTypes.number,\n currentPage: PropTypes.number,\n recordsPerPage: PropTypes.number\n }),\n /**\n * Determines if a select row is added\n */\n selectionStyle: selectionStylePropType,\n /**\n * List of selected keys\n */\n selection: PropTypes.arrayOf(keyPropType),\n /**\n * Boolean flag to disable clicking on rows\n */\n clickable: PropTypes.bool,\n /**\n * Callback for selection changes\n */\n onSelectionChange: PropTypes.func,\n /**\n * Callback on page change\n */\n onPageChange: PropTypes.func,\n /**\n * Callback if a column is drag and dropped to a new position\n */\n onColumnPositionChange: PropTypes.func,\n /**\n * Callback if sorting changed\n */\n onSortingChange: PropTypes.func,\n /**\n * Callback if a row is clicked\n */\n onRowClick: PropTypes.func\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(Table, areEqual)\n","import _pick from 'lodash/pick'\nimport _get from 'lodash/get'\nimport _set from 'lodash/set'\nimport _reduce from 'lodash/reduce'\nimport _isObject from 'lodash/isObject'\n\nconst metaFields = {\n KEY: '__key',\n MODEL: '__model',\n VERSION: '__version'\n}\n\nexport const relationFieldTypes = ['single-select-box', 'multi-select-box', 'single-remote-field', 'multi-remote-field']\nexport const relevantRelationAttributes = ['key', 'display', 'model', 'version']\n\nconst typeValueExtractor = (type, value) => {\n switch (type) {\n case 'entity':\n return value ? _pick(value, relevantRelationAttributes) : null\n case 'entity-list':\n return value.length > 0 ? value.map(childValue => _pick(childValue, relevantRelationAttributes)) : null\n case 'login':\n return _get(value, 'username')\n case 'longitude':\n case 'latitude':\n return _get(value, 'value')\n default:\n return value\n }\n}\n\n/**\n * Transforms a entity object into a flatten structure wil only one hierarchy of properties.\n * @param {object} entity - Entity as retrieved by the rest endpoint.\n */\nexport const getFlattenEntity = entity => ({\n [metaFields.KEY]: entity.key,\n [metaFields.MODEL]: entity.model,\n [metaFields.VERSION]: entity.version,\n ...flattenPaths(entity.paths)\n})\n\nexport const flattenPaths = (paths, currentPath = []) =>\n _reduce(\n paths,\n (acc, path, pathId) => {\n let subPaths = {}\n if (path.value) {\n if (Array.isArray(path.value)) {\n subPaths = path.value.reduce((acc, v) => {\n const flatten = flattenPaths(v.paths, [...currentPath, pathId])\n const combinedArrayVales = _reduce(flatten, (acc2, val, key) =>\n ({...acc2, [key]: [...(acc[key] || []), val]}), {})\n return {...acc, ...combinedArrayVales}\n }, {})\n } else {\n subPaths = flattenPaths(path.value.paths, [...currentPath, pathId])\n }\n }\n\n return {...acc, [[...currentPath, pathId].join('.')]: typeValueExtractor(path.type, path.value), ...subPaths}\n },\n {}\n )\n\n/**\n * Transforms a flatten entity back to a api compatible entity object. Only regards fields that are marked as dirty.\n * @param {object} flattenEntity - Entity that was prior transformed with 'getFlattenEntity'\n * @param {array} dirtyFields - Optional list of dirty field names (paths). If undefined, all paths are applied\n */\nexport const toEntity = (flattenEntity, dirtyFields) => {\n const ignoredPath = path => (Object.values(metaFields).includes(path))\n || (dirtyFields && !dirtyFields.some(dirtyField => dirtyField === path || dirtyField.startsWith(path + '.')))\n\n const valueSimplifier = value => {\n if (Array.isArray(value)) {\n return value.map(v => valueSimplifier(v))\n }\n\n return _isObject(value) ? _pick(value, ['key', 'version', 'id']) : value\n }\n\n const paths = Object.keys(flattenEntity).reduce((acc, path) => {\n if (!ignoredPath(path)) {\n const t = path.split('.').join('.paths.')\n return _set(acc, t, valueSimplifier(flattenEntity[path]))\n }\n return acc\n }, {})\n\n return {\n model: flattenEntity[metaFields.MODEL],\n key: flattenEntity[metaFields.KEY],\n version: flattenEntity[metaFields.VERSION],\n paths\n }\n}\n","const isDisplayableChild = child => !child.hidden\n\nconst getSortingAttributes = (column, sorting) => {\n const idx = sorting && sorting.findIndex(s => s.field === column.id)\n return idx >= 0\n ? {\n sortRank: idx + 1,\n order: sorting[idx].order\n }\n : null\n}\n\nconst rightAlignedTypes = ['counter', 'decimal', 'double', 'integer', 'latitude', 'long', 'longitude', 'moneyamount',\n 'percent', 'serial', 'sorting', 'version']\n\nconst isRightAligned = column =>\n column.children && column.children.length === 1 && rightAlignedTypes.includes(column.children[0].dataType)\n\n/**\n * Transforms nice form column definitions in a tocco-ui table compatible format.\n * @param {array} columns - columns from table form definition\n * @param {array} sorting - sorting array with field and order attributes\n * @param {function} cellRenderer - Function to return rendered cell given data and column definition\n */\nexport const getColumnDefinition = (columns, sorting, cellRenderer, ...args) => {\n if (!columns) {\n return []\n }\n return columns\n .filter(column => !column.hidden)\n .filter(column => column.children.filter(isDisplayableChild).length > 0)\n .map((c, idx) => (\n {\n idx: idx,\n id: c.id,\n label: c.label,\n sorting: {\n sortable: c.sortable,\n ...getSortingAttributes(c, sorting)\n },\n children: c.children.filter(isDisplayableChild),\n resizable: !c.widthFixed,\n rightAligned: isRightAligned(c),\n CellRenderer: ({rowData, column}) => column.children.map(child => cellRenderer(child, rowData, ...args))\n }\n ))\n}\n","import {getFlattenEntity, flattenPaths, toEntity, relationFieldTypes, relevantRelationAttributes} from './entities'\nimport {getDisplayRequest, getPathDisplayRequest} from './display'\nimport {getColumnDefinition} from './table'\n\nexport default {\n relationFieldTypes,\n relevantRelationAttributes,\n getFlattenEntity,\n flattenPaths,\n toEntity,\n getPathDisplayRequest,\n getDisplayRequest,\n getColumnDefinition\n}\n","import _get from 'lodash/get'\nimport _set from 'lodash/set'\n\nconst alreadyLoaded = (model, key, lazyData) => {\n return !!_get(lazyData, ['defaultDisplays', model, key], '')\n}\n\nconst alreadyInRequest = (model, key, request) => {\n return _get(request, [model], []).includes(key)\n}\n\n/**\n * Gets a request object to retrieve all the displays of the given paths within the entities.\n *\n * @param {array} entities - List of all entities.\n * @param {object} relationPaths - Field that need a display to be loaded\n * @param {object} lazyData - Optional object with the already loaded displays to shrink the request.\n */\nexport const getPathDisplayRequest = (entities, relationPaths, lazyData) => {\n const request = {}\n entities.forEach(entity => {\n relationPaths.forEach(field => {\n if (entity[field]) {\n const fieldValue = entity[field]\n const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue]\n\n values.forEach(value => {\n const {model, key} = value\n\n if (!alreadyLoaded(model, key, lazyData) && !alreadyInRequest(model, key, request)) {\n _set(request, [model], [..._get(request, [model], []), key])\n }\n })\n }\n })\n })\n\n return request\n}\n\n/**\n * Gets a request object to retrieve all displays of the entities.\n *\n * @param {array} entities - List of all entities.\n */\nexport const getDisplayRequest = entities => (\n entities.reduce((acc, val) => ({\n ...acc,\n [val.model]: [...(acc[val.model] || []), val.key]\n }\n ), {})\n)\n","import _isObject from 'lodash/isObject'\nimport moment from 'moment'\n\nconst isDefined = v => v !== null && v !== undefined && v !== ''\n\nexport const getTql = (path, value, fieldType) => {\n if (!isDefined(value)) {\n return null\n }\n\n const type = fieldType || guessType(value)\n value = rangeMappings(type)(value)\n\n const isRangeValue = value && typeof value === 'object' && value.isRangeValue\n const typeHandler = typeHandlers(type)\n\n if (isRangeValue) {\n return handleRangeValue(value, typeHandler, path)\n } else {\n return typeHandler(path, value, '==')\n }\n}\n\nconst handleRangeValue = (value, typeHandler, path) => (\n [\n ...(isDefined(value.from) ? [typeHandler(path, value.from, '>=')] : []),\n ...(isDefined(value.to) ? [typeHandler(path, value.to, value.exclusive ? '<' : '<=')] : [])\n ].join(' and ')\n)\n\nconst rangeMappings = type => {\n switch (type) {\n case 'datetime':\n case 'createts':\n case 'updatets':\n return value => {\n const momentValue = moment(value, 'YYYY-MM-DD', true)\n if (momentValue.isValid()) {\n return {\n from: value,\n to: momentValue.add(1, 'd'),\n isRangeValue: true,\n exclusive: true\n }\n } else {\n return value\n }\n }\n default:\n return value => value\n }\n}\n\nconst typeHandlers = type => {\n switch (type) {\n case 'multi-select-box':\n case 'multi-remote-field':\n return (path, value) => `KEYS(\"${path}\",${value.map(v => v.key).join(',')})`\n case 'single-remote-field':\n case 'single-select-box':\n return (path, value) => `${path}.pk == ${value.key}`\n case 'fulltext-search':\n return (path, value) => path === 'txtFulltext'\n ? `(fulltext(\"${value}\") or fulltext(\"${value}*\"))`\n : `(fulltext(\"${value}\", ${path}) or fulltext(\"${value}*\", ${path}))`\n case 'birthdate':\n case 'date':\n case 'create_timestamp':\n return (path, value, comp) => `${path} ${comp} date:\"${value}\"`\n case 'datetime':\n case 'createts':\n case 'updatets':\n return (path, value, comp) => `${path} ${comp} datetime:\"${moment(value).utc().format('YYYY-MM-DD HH:mm')}\"`\n case 'time':\n return (path, value, comp) => `${path} ${comp} time:\"${moment(value, 'HH:mm').format('HH:mm:ss.sss')}\"`\n case 'compressed-text':\n case 'string':\n case 'createuser':\n case 'updateuser':\n return (path, value) => `${path} ~= \"${value}\"`\n case 'boolean':\n return (path, value) => value === false ? null : `${path} == ${value}`\n case 'marking':\n return (path, value) => value === false ? null : `exists(${path})`\n default:\n return (path, value, comp) => `${path} ${comp} ${value}`\n }\n}\n\n// For fields that are not in the search form (e.g. parent and preselectedSearchFields)\nconst guessType = value => {\n if (_isObject(value) && value.key) {\n return 'single-select-box'\n }\n\n if (Array.isArray(value) && value.every(v => !!v.key)) {\n return 'multi-select-box'\n }\n\n return 'string'\n}\n","import {getTql} from './tqlBuilder'\n\nexport default {getTql}\n","import {useState} from 'react'\n\nconst initialState = {\n currentlyDragging: null,\n currentlyDragOver: null\n}\n\nexport default (changePosition, columns) => {\n const [state, setState] = useState(initialState)\n\n const events = columnId => ({\n onDragStart: e => {\n setState({...state, currentlyDragging: columnId})\n },\n onDragEnter: e => {\n if (state.currentlyDragOver !== columnId) {\n setState({...state, currentlyDragOver: columnId})\n }\n },\n onDragOver: e => {\n e.preventDefault()\n e.stopPropagation()\n return true\n },\n onDrop: e => {\n changePosition(state.currentlyDragging, state.currentlyDragOver, columns)\n setState(initialState)\n e.stopPropagation()\n },\n onDragEnd: e => {\n setState(initialState)\n }\n })\n\n return {dndEvents: events, dndState: state}\n}\n","import useDnD from './useDnD'\n\nexport default useDnD\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///./packages/app-extensions/src/actions/actionComponentTypes.js","webpack:///./packages/app-extensions/src/actions/actions.js","webpack:///./packages/app-extensions/src/actions/modules/reducer.js","webpack:///./packages/app-extensions/src/actions/modules/actions.js","webpack:///./packages/app-extensions/src/actions/actionTypes.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/simpleAction.js","webpack:///./packages/app-extensions/src/actions/containers/simpleFormConnector.js","webpack:///./packages/app-extensions/src/actions/utils/report.js","webpack:///./packages/app-extensions/src/actions/components/StyledReportSettings.js","webpack:///./packages/app-extensions/src/actions/components/ReportSettings.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/report.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/customAction.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/legacyAction.js","webpack:///./packages/app-extensions/src/actions/modules/actionHandlers/index.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/preCheckHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/confirmHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/initialFormHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/largeSelectionHandler.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/prepare.js","webpack:///./packages/app-extensions/src/actions/modules/prepare/index.js","webpack:///./packages/app-extensions/src/actions/modules/sagas.js","webpack:///./packages/app-extensions/src/actions/components/selectionHelper.js","webpack:///./packages/app-extensions/src/actions/components/ActionGroup.js","webpack:///./packages/app-extensions/src/actions/components/SingleAction.js","webpack:///./packages/app-extensions/src/actions/components/Action.js","webpack:///./packages/app-extensions/src/actions/containers/ActionContainer.js","webpack:///./packages/app-extensions/src/actions/index.js","webpack:///./packages/app-extensions/src/actions/addToStore.js","webpack:///./packages/app-extensions/src/actions/utils/selection.js","webpack:///./packages/tocco-ui/src/Range/StyledRange.js","webpack:///./packages/tocco-ui/src/Range/rangeTypeMappings.js","webpack:///./packages/tocco-ui/src/Range/Range.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/decimal.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/document.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/integer.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/location.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/number.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/remote.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/select.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/boolean.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/index.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/duration.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/html.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/moneyamount.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/phone.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/searchFilter.js","webpack:///./packages/app-extensions/src/field/editableTypeConfigs/percent.js","webpack:///./packages/app-extensions/src/field/editableValueFactory.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/document.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/remote.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/index.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/description.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/number.js","webpack:///./packages/app-extensions/src/field/formattedTypeConfigs/moneyamount.js","webpack:///./packages/app-extensions/src/field/formattedValueFactory.js","webpack:///./packages/app-extensions/src/field/mappings.js","webpack:///./packages/app-extensions/src/field/fieldFactory.js","webpack:///./packages/app-extensions/src/field/index.js","webpack:///./packages/app-extensions/src/form/formErrors.js","webpack:///./packages/tocco-ui/src/Layout/LayoutBox.js","webpack:///./packages/tocco-ui/src/Layout/StyledLayoutContainer.js","webpack:///./packages/tocco-ui/src/Layout/LayoutContainer.js","webpack:///./packages/tocco-ui/src/Layout/index.js","webpack:///./packages/app-extensions/src/formField/formField.js","webpack:///./packages/app-extensions/src/formField/index.js","webpack:///./packages/app-extensions/src/form/ReduxFormFieldAdapter.js","webpack:///./packages/app-extensions/src/form/enums/componentTypes.js","webpack:///./packages/app-extensions/src/form/formDefinition.js","webpack:///./packages/app-extensions/src/form/reduxForm.js","webpack:///./packages/app-extensions/src/form/enums/layoutTypes.js","webpack:///./packages/app-extensions/src/form/StyledFormBuilder.js","webpack:///./packages/app-extensions/src/form/FormBuilder.js","webpack:///./packages/app-extensions/src/form/validators/syncValidators.js","webpack:///./packages/app-extensions/src/form/validators/asyncValidators.js","webpack:///./packages/app-extensions/src/form/validators/index.js","webpack:///./packages/app-extensions/src/form/validators/mandatory.js","webpack:///./packages/app-extensions/src/form/asyncValidation.js","webpack:///./packages/app-extensions/src/form/enums/scopes.js","webpack:///./packages/app-extensions/src/form/transformInputValues.js","webpack:///./packages/app-extensions/src/form/index.js","webpack:///./packages/app-extensions/src/form/syncValidation.js","webpack:///./packages/app-extensions/src/formData/relationEntities/actions.js","webpack:///./packages/app-extensions/src/formData/relationEntities/reducer.js","webpack:///./packages/app-extensions/src/formData/tooltips/actions.js","webpack:///./packages/app-extensions/src/formData/tooltips/reducer.js","webpack:///./packages/app-extensions/src/formData/relationEntities/sagas.js","webpack:///./packages/app-extensions/src/formData/tooltips/sagas.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/actions.js","webpack:///./packages/app-extensions/src/formData/values/actions.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/StyledAdvancedSearch.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/AdvancedSearch.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/AdvancedSearchContainer.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/utils.js","webpack:///./packages/app-extensions/src/formData/advancedSearch/sagas.js","webpack:///./packages/app-extensions/src/formData/values/sagas.js","webpack:///./packages/app-extensions/src/formData/upload/documents.js","webpack:///./packages/app-extensions/src/formData/upload/sagas.js","webpack:///./packages/app-extensions/src/formData/upload/actions.js","webpack:///./packages/app-extensions/src/formData/searchFilters/actions.js","webpack:///./packages/app-extensions/src/formData/searchFilters/reducer.js","webpack:///./packages/app-extensions/src/formData/searchFilters/utils.js","webpack:///./packages/app-extensions/src/formData/searchFilters/sagas.js","webpack:///./packages/app-extensions/src/formData/locations/actions.js","webpack:///./packages/app-extensions/src/formData/locations/utils.js","webpack:///./packages/app-extensions/src/formData/locations/sagas.js","webpack:///./packages/app-extensions/src/formData/locations/reducer.js","webpack:///./packages/app-extensions/src/formData/navigationStrategy/reducer.js","webpack:///./packages/app-extensions/src/formData/navigationStrategy/actions.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/actions.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/RemoteCreate.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/RemoteCreateContainer.js","webpack:///./packages/app-extensions/src/formData/remoteCreate/sagas.js","webpack:///./packages/app-extensions/src/formData/formData.js","webpack:///./packages/app-extensions/src/formData/FormDataContainer.js","webpack:///./packages/app-extensions/src/formData/index.js","webpack:///./packages/app-extensions/src/remoteEvents/index.js","webpack:///./packages/app-extensions/src/remoteEvents/actions.js","webpack:///./packages/entity-list/src/modules/entityList/actions.js","webpack:///./packages/entity-list/src/util/searchFormTypes.js","webpack:///./packages/entity-list/src/modules/entityList/reducer.js","webpack:///./packages/entity-list/src/modules/entityList/index.js","webpack:///./packages/entity-list/src/modules/list/actions.js","webpack:///./packages/entity-list/src/modules/searchForm/actions.js","webpack:///./packages/entity-list/src/modules/preferences/actions.js","webpack:///./packages/entity-list/src/modules/entityList/sagas.js","webpack:///./packages/entity-list/src/modules/list/reducer.js","webpack:///./packages/entity-list/src/modules/list/index.js","webpack:///./packages/entity-list/src/util/api/fetchOptions.js","webpack:///./packages/entity-list/src/modules/selection/actions.js","webpack:///./packages/entity-list/src/modules/searchForm/StyledComponents.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/LazyDataEnhancer.js","webpack:///./packages/entity-list/src/util/lazyLoading.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/LazyDataEnhancerContainer.js","webpack:///./packages/entity-list/src/components/LazyDataEnhancer/index.js","webpack:///./packages/entity-list/src/util/fieldFactory.js","webpack:///./packages/entity-list/src/util/StyledComponents.js","webpack:///./packages/entity-list/src/util/cellRenderer.js","webpack:///./packages/entity-list/src/util/api/forms.js","webpack:///./packages/entity-list/src/util/searchFormValidation.js","webpack:///./packages/entity-list/src/components/ColumnPicker/StyledColumnPicker.js","webpack:///./packages/entity-list/src/components/ColumnPicker/ColumnPicker.js","webpack:///./packages/entity-list/src/components/ColumnPicker/ColumnPickerContainer.js","webpack:///./packages/entity-list/src/components/ColumnPicker/index.js","webpack:///./packages/entity-list/src/modules/searchForm/sagas.js","webpack:///./packages/entity-list/src/util/api/entities.js","webpack:///./packages/entity-list/src/modules/list/sagas.js","webpack:///./packages/entity-list/src/modules/searchForm/reducer.js","webpack:///./packages/entity-list/src/modules/searchForm/index.js","webpack:///./packages/entity-list/src/modules/selection/reducer.js","webpack:///./packages/entity-list/src/modules/selection/index.js","webpack:///./packages/entity-list/src/util/selectionStyles.js","webpack:///./packages/entity-list/src/util/selection.js","webpack:///./packages/entity-list/src/modules/selection/sagas.js","webpack:///./packages/entity-list/src/modules/preferences/reducer.js","webpack:///./packages/entity-list/src/modules/preferences/index.js","webpack:///./packages/entity-list/src/util/preferences.js","webpack:///./packages/entity-list/src/modules/preferences/sagas.js","webpack:///./packages/entity-list/src/modules/reducers.js","webpack:///./packages/entity-list/src/components/FullTextSearchForm/FullTextSearchForm.js","webpack:///./packages/entity-list/src/components/FullTextSearchForm/index.js","webpack:///./packages/entity-list/src/containers/FullTextSearchFormContainer.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/StyledBasicSearchForm.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/BasicSearchForm.js","webpack:///./packages/entity-list/src/components/BasicSearchForm/index.js","webpack:///./packages/entity-list/src/containers/BasicSearchFormContainer.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/StyedComponents.js","webpack:///./packages/entity-list/src/components/SearchFilterList/utils.js","webpack:///./packages/entity-list/src/components/SearchFilterList/StyledComponents.js","webpack:///./packages/entity-list/src/components/SearchFilterList/SearchFilterList.js","webpack:///./packages/entity-list/src/components/SearchFilterList/SearchFilterListContainer.js","webpack:///./packages/entity-list/src/components/SearchFilterList/index.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/AdminSearchForm.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/AdminSearchFormContainer.js","webpack:///./packages/entity-list/src/components/AdminSearchForm/index.js","webpack:///./packages/entity-list/src/components/SearchView/StyledComponents.js","webpack:///./packages/entity-list/src/components/SearchView/SearchView.js","webpack:///./packages/entity-list/src/components/SearchView/index.js","webpack:///./packages/entity-list/src/containers/SearchViewContainer.js","webpack:///./packages/entity-list/src/components/SelectionController/StyledSelectionController.js","webpack:///./packages/entity-list/src/components/SelectionController/SelectionController.js","webpack:///./packages/entity-list/src/components/SelectionController/index.js","webpack:///./packages/entity-list/src/containers/SelectionControllerContainer.js","webpack:///./packages/entity-list/src/components/Table/NavigationCellHeader.js","webpack:///./packages/entity-list/src/components/Table/navigationCell.js","webpack:///./packages/entity-list/src/components/Table/StyledComponents.js","webpack:///./packages/entity-list/src/components/Table/markingCell.js","webpack:///./packages/entity-list/src/components/Table/Table.js","webpack:///./packages/entity-list/src/components/Table/index.js","webpack:///./packages/entity-list/src/containers/TableContainer.js","webpack:///./packages/entity-list/src/util/actions.js","webpack:///./packages/entity-list/src/containers/ActionContainer.js","webpack:///./packages/entity-list/src/components/ListView/StyledComponents.js","webpack:///./packages/entity-list/src/components/ListView/ListView.js","webpack:///./packages/entity-list/src/components/ListView/index.js","webpack:///./packages/entity-list/src/containers/ListViewContainer.js","webpack:///./packages/entity-list/src/components/EntityList/StyledComponents.js","webpack:///./packages/entity-list/src/components/EntityList/EntityList.js","webpack:///./packages/entity-list/src/components/EntityList/EntityListContainer.js","webpack:///./packages/entity-list/src/components/EntityList/index.js","webpack:///./packages/entity-list/src/input.js","webpack:///./packages/entity-list/src/customActions.js","webpack:///./packages/entity-list/src/main.js","webpack:///./packages/simple-form/src/modules/simpleForm/actions.js","webpack:///./packages/simple-form/src/modules/simpleForm/reducer.js","webpack:///./packages/simple-form/src/modules/simpleForm/index.js","webpack:///./packages/simple-form/src/modules/simpleForm/sagas.js","webpack:///./packages/simple-form/src/modules/reducers.js","webpack:///./packages/simple-form/src/components/Form/StyledComponents.js","webpack:///./packages/simple-form/src/components/Form/Form.js","webpack:///./packages/simple-form/src/components/Form/index.js","webpack:///./packages/simple-form/src/containers/FormContainer.js","webpack:///./packages/simple-form/src/main.js","webpack:///./packages/tocco-ui/src/Layout/StyledLayoutBox.js","webpack:///./packages/tocco-ui/src/MultiCheckbox/MultiCheckbox.js","webpack:///./packages/tocco-ui/src/MultiCheckbox/index.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanel.js","webpack:///./packages/tocco-ui/src/Panel/Panel.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelGroup.js","webpack:///./packages/tocco-ui/src/Panel/PanelGroup.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelBody.js","webpack:///./packages/tocco-ui/src/Panel/PanelBody.js","webpack:///./packages/tocco-ui/src/Panel/StyledPanelHeaderFooter.js","webpack:///./packages/tocco-ui/src/Panel/PanelHeaderFooter.js","webpack:///./packages/tocco-ui/src/Panel/index.js","webpack:///./packages/tocco-ui/src/Table/ResizingController.js","webpack:///./packages/tocco-ui/src/Table/StyledTable.js","webpack:///./packages/tocco-ui/src/Pagination/StyledComponents.js","webpack:///./packages/tocco-ui/src/Pagination/Pagination.js","webpack:///./packages/tocco-ui/src/Pagination/index.js","webpack:///./packages/tocco-ui/src/Table/selection/useSelection.js","webpack:///./packages/tocco-ui/src/Table/selection/selectionStyles.js","webpack:///./packages/tocco-ui/src/Table/selection/SingleSelectCell.js","webpack:///./packages/tocco-ui/src/Table/selection/MultiSelectCell.js","webpack:///./packages/tocco-ui/src/Table/selection/MultiSelectHeader.js","webpack:///./packages/tocco-ui/src/Table/selection/selectionColumnEnhancer.js","webpack:///./packages/tocco-ui/src/Table/SortingState.js","webpack:///./packages/tocco-ui/src/Table/TableHeader.js","webpack:///./packages/tocco-ui/src/Table/useResize.js","webpack:///./packages/tocco-ui/src/Table/StaticCell.js","webpack:///./packages/tocco-ui/src/Table/TableBody.js","webpack:///./packages/tocco-ui/src/Table/Table.js","webpack:///./packages/tocco-util/src/api/entities.js","webpack:///./packages/tocco-util/src/api/table.js","webpack:///./packages/tocco-util/src/api/index.js","webpack:///./packages/tocco-util/src/api/display.js","webpack:///./packages/tocco-util/src/tqlBuilder/tqlBuilder.js","webpack:///./packages/tocco-util/src/tqlBuilder/index.js","webpack:///./packages/tocco-util/src/useDnD/useDnD.js","webpack:///./packages/tocco-util/src/useDnD/index.js"],"names":["Object","freeze","ACTION","REPORT","ACTION_GROUP","ACTION_BAR","isAction","componentType","values","componentTypes","indexOf","modeFitsScopes","mode","scopes","length","includes","ACTION_HANDLERS","initialState","reducer","state","action","handler","type","ACTION_INVOKE","ACTION_IN_PROGRESS","ACTION_INVOKED","actionInvoke","definition","selection","parent","payload","actionInvoked","response","CUSTOM","SIMPLE","DIVIDER","LEGACY","invokeActionAsync","invokeActionSync","invokeRequest","showToaster","params","runAsync","runInBackgroundTask","invokeFnc","call","rest","endpoint","method","body","entity","entityName","background","formProperties","properties","acceptedErrorCodes","headers","success","put","notification","title","message","randomId","uuid","progressMsg","remoteEvents","entities","errorCode","validation","errors","downloadUrl","fileResponse","download","filename","errorLogging","key","notificationKey","TOASTER_KEY_PREFIX","undefined","mapActionCreators","emitAction","actionEmitter","connect","DISPLAY","DOWNLOAD","getFormDefinition","settingsDefinition","intl","msg","id","formatMessage","extractFields","name","map","field","children","dataType","defaultValue","label","description","path","targetEntity","hidden","readonly","disabled","modelid","layoutType","PropTypes","customSettings","form","generalSettings","recipient","StyledReportSettings","styled","StyledStickyButtons","scale","theme","StyledButton","injectIntl","formApp","onSubmit","listApp","customSettingsDefined","useState","valid","customSettingsValid","settings","setSettings","settingsRef","useRef","current","SimpleFormContainer","useMemo","simpleFormConnector","noButtons","onChange","Button","ink","onClick","transform","groupedValues","groupValues","reduce","result","getGroupedValues","v","_reduce","value","Array","isArray","look","displayReportSettings","awaitSettingsSubmit","actionDefinition","config","channel","answerChannel","settingsModalId","options","queryParams","model","keys","ids","join","resource","reportId","formValues","take","recipientSettings","customSettingsEntity","api","__model","additionalProperties","formData","handleCustomActionModal","handleFullScreenActions","handleAppActionsFallback","handleAnswer","appId","fullscreen","customActions","consoleLogger","appComponent","actionStatus","ActionComponent","close","context","actionProperties","navigationStrategy","onSuccess","status","onError","onCancel","loadSequentially","readRemoteEvents","registerRemoteEventsListener","handleNotification","readNotifications","registerNotificationsListener","initLegacyActionsEnv","getSelection","getScope","loadScript","src","Promise","resolve","reject","s","document","createElement","onload","onerror","head","appendChild","loadCss","getElementsByTagName","link","rel","href","media","sources","currentEnv","window","legacyActionEnv","serverSettings","source","envs","niceRevision","f","channelFeedingCallback","arg","remoteEventsChannel","event","app","getDataRegistry","dataRegistry","setNewClientCallback","callback","spawn","replace","level","newNotification","Error","notificationsChannel","getGui","gui","getNotifier","notifier","legacyActionsEnvInitialized","setUpLegacyActionsEnv","listSelector","list","entityListSelector","entityList","entityDetailSelector","entityDetail","getManualQuery","listState","nice2","netui","ManualQuery","queryWhere","query","where","queryOrderBy","sortingArray","sorting","getListFormId","FormIdentifier","scope","formName","formDefinition","legacySelection","selectedEntities","selectionType","select","manualQuery","listForm","searchFilters","filter","detail","actions","ClientActionDefinition","setEnabled","readOnly","_isPlainObject","setPropertyEffects","entries","setProperty","all","entityExplorer","modules","NewClientLegacyActionsModule","init","panel","NewClientLegacyActionsPanel","ctx","entityexplorer","EntityExplorerActionContext","getRecord","situation","NetuiActionRegistry","newActionFromDefinition","getSelectionNumber","perform","actionTypes","handleSimpleAction","handleReportAction","handleCustomAction","handleLegacyAction","preCheckHandler","preparationResponse","preCheck","abort","abortMessage","confirmHandler","promptConfirm","confirmMessage","confirmResponse","onYes","initialFormHandler","handleInitialForm","initialFormValues","defaultValues","formTitle","formMessage","Date","valueOf","onSend","paths","largeSelectionHandler","threshold","confirmationThreshold","count","doRequest","run","getHandlers","handlers","i","handlerResponse","sagas","invokeAction","takeEvery","prepare","actionHandler","actionHandlers","actionType","remoteEvent","isValidSelection","selectedCount","minSelection","maxSelection","notEnough","tooMany","selectionText","props","hasDefaultAction","defaultAction","onClickHandler","actionId","ButtonMenu","buttonProps","data-cy","childDefinition","idx","getChildMenuItems","input","validSelection","isActionGroup","MenuItem","icon","child","e","stopPropagation","useLabel","ActionVisual","customRenderedActions","ActionType","ActionGroup","SingleAction","_omit","Action","addToStore","store","reducerUtil","sagaMiddleware","sagasUtil","errorLoging","getSingleEntitySelection","StyledInputWrapper","StyledInputItemWrapper","StyledIconWrapper","StyledRange","StyledInput","StyledExtender","datetimeFormat","datetime","toRange","from","moment","utc","format","to","add","isRangeValue","fromRange","local","getToOptions","fromValue","flatpickrOptions","minDate","getFromOptions","toValue","maxDate","date","events","hasRangeValue","exactEvents","toEvents","fromEvents","typeMapping","rangeTypeMappings","baseType","EditableValue","Ball","getFromOrTo","getRangeValue","getOptions","formField","postPointDigits","_get","prePointDigits","minValue","maxValue","allowNegative","upload","uploadDocument","uploadText","uploadingText","downloadText","deleteText","fixLabel","dataContainerProps","relationEntities","tooltips","moreOptionsAvailable","isLoading","fetchOptions","loadRelationEntities","forceReload","limit","order","formBase","searchOptions","searchTerm","openAdvancedSearch","loadTooltip","noResultsText","moreOptionsAvailableText","DetailLink","entityKey","createPermission","entityModel","relationName","openRemoteCreate","boolean","number","decimal","hoursLabel","minutesLabel","integer","hasValue","locationMapping","city","postcode","getValue","filteredLocationData","renamedLocationData","locKey","filteredLocDataKey","getEvents","locationObject","changeFieldValue","onBlur","touchField","locations","fields","isDirty","fetchSuggestions","country","loadLocationsSuggestions","suggestions","mapButtonTitle","fixedDecimalScale","remote","customPhoneRegex","defaultCountry","isMulti","multiple","loadSearchFilters","group","EditableValueFactory","range","info","formType","editableTypeConfigs","currentValue","Component","Range","fromText","toText","downloadTitle","text","FormattedValueFactory","breakWords","fieldType","formattedTypeConfigs","overwrittenValue","FormattedValue","editableMapping","editableValueFactory","formattedValueFactory","readOnlyMapping","editable","binary","image","search","birthdate","updatets","createts","moneyamount","percent","long","counter","time","factory","mappingType","mappings","getFieldErrors","formErrors","fieldErrors","getGeneralErrors","hasFieldErrors","getValidatorErrors","hasValidatorErrors","hasRelatedEntityErrors","hasOutdatedError","getFirstErrorField","getRelatedEntityErrorsCompact","relatedEntityErrors","relatedEntityError","entityValidatorErrors","r","_forOwn","fieldName","errorKey","push","addErrors","outdatedResponseToFormError","_pick","sameEntity","getOutdatedError","LayoutBox","StyledLayoutBox","memo","containerWidth","occupiesRemainingHeight","Box","Container","ref","setContainerWidth","setPixelWidth","offsetWidth","useEffect","addEventListener","removeEventListener","FormFieldWrapper","hasValueOverwrite","typeEditable","StatedValue","dirty","error","React","displayFieldTypes","multiTypes","isMultipleFields","displayFieldAsDisplayOnly","parentReadOnly","Typography","MultiSeparator","ValueField","fieldMappingType","Field","prev","curr","data","resources","requestedFromData","formDefinitionField","entityField","touched","submitting","mandatory","isDisplay","immutable","mandatoryTitle","exception","ReduxFormFieldAdapter","meta","extractEventsFromInput","fomFieldData","propTypes","isRequired","FIELD_SET","FIELD","LAYOUT","TABLE","SUB_TABLE","getFieldId","validFieldTypes","getFieldsOfChildren","ignoreCopy","typePathsHandlers","location","fieldDefinition","validationErrorToFormError","forEach","prototype","hasOwnProperty","transformFieldName","transformFieldNameBack","formValuesToFlattenEntity","acc","val","getDirtyFields","initialValues","isCreate","dirtyFields","_isEqual","VERTICAL_BOX","HORIZONTAL_BOX","StyledActionsWrapper","FormBuilder","componentMapping","beforeRenderField","modeFitsScope","formTraverser","createLayoutComponent","createAction","createFieldSet","createCustomComponent","fieldSet","find","split","writable","hasEmptyValue","shouldRenderField","component","elements","Boolean","content","Panel","isFramed","isOpen","LayoutComponent","layoutTypes","Layout","areEqual","prevProps","nextProps","js","minLength","maxLength","maxNumber","toString","prePoint","pattern","RegExp","test","isEmail","isUrl","require_tld","syncValidators","asyncValidators","phone","phoneValidation","libphone","isValidCustomRegex","customRegex","match","isValidPhoneNumber","isValidNumber","defaultRegion","mandatoryError","valueDefined","hasError","localeValidation","fieldDefinitions","validators","asyncValidatorKey","_has","validatorValue","validator","validatorErrors","validateRequest","flattenEntity","_validate","then","resp","asyncValidation","localeValidationErrors","validateRequestErrors","CREATE","UPDATE","loadDisplays","transformInputValues","displayRequest","fieldModel","arrayValue","relationFieldTransformer","displays","display","fieldTypeTransformer","multi","formErrorsUtil","getFieldDefinitions","getDefaultValues","valueObj","getUsedPaths","_uniq","accumulator","entityToFormValues","syncValidation","syncValidatorKey","submitValidation","SubmissionError","isValueEmpty","setRelationEntityLoading","setRelationEntities","moreEntitiesAvailable","setToolTip","tooltip","enhanceEntitiesWithDisplays","loadRelationEntity","requestedDisplays","fieldDataSelector","fieldData","dataLoaded","relationEntitiesActions","getQuery","requestOptions","splice","loadToolTip","tooltipSelector","tooltipActions","advancedSearchUpdate","StyledAdvancedSearch","StyledAdvancedSearchButtonWrapper","listFormDefinition","onSelectionChange","onOkClick","ListApp","showSearchForm","onSelectChange","selectionStyle","selectOnRowClick","disableSelectionController","showActions","AdvancedSearch","getAdvancedSearchComponent","fieldId","AdvancedSearchContainer","closeAdvancedSearch","textResourceSelector","messages","fieldFormBase","remoteFieldFormName","modalId","advancedSearchTitle","advancedSearchComponent","advancedSearchActions","modalOpen","valueActions","changeValue","formActions","UPLOAD_ENDPOINT_URL","__BACKEND_URL__","uploadRequest","file","FormData","append","fetch","credentials","json","documentToFormValueTransformer","uploadResponse","responseAttributes","mimeType","contentType","binaryLink","preview","thumbnailLink","startsWith","documentFormValue","JSON","stringify","timestamp","now","setSearchFilter","filters","searchFilterResponseTransformer","searchFilterResponse","uniqueId","takeLatest","searchFiltersSelector","setLocationSuggestions","setLocationSuggestionsLoading","getCountryCodeByKey","loadCountries","requestSuggestions","getCountry","countryCache","prop","countryCode","suggestion","allCountries","allCountriesUniq","notLoaded","conditions","countriesResponse","transformToSuggestions","countries","fieldCountries","loadLocations","searchInput","countryValue","suggestionsResponse","handleEntityCreated","DetailApp","onEntityCreated","RemoteCreate","detailApp","buildCreateForm","combineReducers","relationEntitiesSagas","tooltipsSaga","advancedSearchSagas","valueSagas","uploadSagas","searchFilterSagas","locationSagas","remoteCreateSagas","dispatch","relationEntitiesData","FormDataContainer","isDirtySelector","_merge","getFormSubmitErrors","getFormSyncErrors","getFormAsyncErrors","areStatePropsEqual","REMOTE_EVENT","setSearchFormType","searchFormType","searchFormTypes","NONE","BASIC","ADMIN","newSearchFormType","enumV","initialized","searchFormPosition","searchFormCollapsed","initialize","setEntities","addEntitiesToStore","page","setEntityCount","entityCount","setFormDefinition","setSorting","setInProgress","inProgress","setEndpoint","setSearchEndpoint","searchEndpoint","setConstriction","constriction","setLazyData","navigateToAction","toggleMarkings","setDisablePreferencesMenu","disablePreferencesMenu","setInitialized","executeSearch","submitSearchForm","setFormFieldsFlat","formFieldsFlat","setSearchFilters","setSearchFilterActive","searchFilterId","active","exclusive","loadPreferences","setPositions","positions","setColumns","columns","resetSorting","reloadData","appFactory","externalEvents","collapsed","getOpposite","contains","currentSorting","entityStore","lazyData","currentPage","formSelectable","formClickable","showLink","sortable","inputTql","inputKeys","inputSearchFilters","getFilterArray","getFetchOptionsFromSearchForm","searchFormValues","formFields","addition","tql","tqlBuilder","setSelection","isSelected","setTableSelectionStyle","tableSelectionStyle","setQuery","multiRelationHandler","singleRelationHandler","typeHandlers","typeHandler","infos","LazyDataEnhancer","FormattedValueWrapper","modelField","StyledActionWrapper","getAction","isMultiType","pathValue","style","marginRight","__key","fieldFactory","getDisplayExpression","definitionCache","getTable","getSorting","table","getSelectable","selectable","getClickable","clickable","getDisablePreferencesMenu","getEndpoint","getSearchEndpoint","getConstriction","isDisplayableChild","getSortingAttributes","column","findIndex","sortRank","rightAlignedTypes","getColumnDefinition","columnDisplayPreferences","cellRenderers","reverseRelationName","c","shrinkToContent","resizable","widthFixed","rightAligned","CellRenderer","rowData","clientRenderer","cellRenderer","getFields","relationFields","displayExpressionFields","getFormFieldFlat","searchChildren","node","changeParentFieldType","formElement","parentPath","containsParentField","some","getTableColumns","validateSearchFields","fieldDefinitionCache","get","getFieldDefinition","validateField","typeValidator","typeValidators","StyledUl","StyledLabel","StyledCheckbox","StyledButtonWrapper","StyledId","StyledItem","StyledLi","isDraggedOver","colors","secondary","draggable","lighten","secondaryLight","onOk","dndEnabled","initialColumns","setSearchTerm","useDnD","currentlyDragging","currentlyDragOver","currentlyDraggingItem","dndEvents","dndState","items","checked","target","for","SearchBox","placeholder","onSearch","ColumnPicker","getListFormDefinition","setInitialFormValues","transformFieldNames","submitSearchFrom","loadSearchFilter","setSimpleForm","loadSearchForm","getEntityModel","resetSearchFilters","resetSearch","getSearchFormValues","saveSearchFilter","saveNewSearchFilter","deleteSearchFilter","saveDefaultSearchFilter","resetDefaultSearchFilter","displaySearchFieldsModal","saveSearchFields","resetSearchFields","inputSelector","searchFormSelector","searchForm","listFromDefinitionSelector","searchValuesSelector","getFormValues","formActionTypes","searchFormVisible","preselectedSearchFields","preselectedValues","fromDefaultValues","transformedFromValues","oldValues","valuesInitialized","listHasNoParent","searchFilter","defaultFilter","txtFulltext","forceLoad","searchValues","setName","searchFilterName","getBasicQuery","createdSearchFilter","primaryKey","ActionAppComponent","actionAppComponent","modelName","flatMap","columnsSorted","hiddenFields","displayedFields","entitiesListTransformer","queryChanged","loadData","prepareEndpointUrl","countEntities","changePage","refreshData","getSearchFilter","hasActiveSearchFilterOrderBy","loadDisplayExpressions","loadRelationDisplays","loadMarkings","setMarked","setLazyDataMarked","fetchEntitiesAndAddToStore","requestEntities","delayedPreloadNextPage","preloadNextPage","displayEntity","getPreferencesSorting","loadFormDefinition","extractFormInformation","loadEntityModel","onRowClick","navigateToCreate","selectionSelector","preferencesSelector","preferences","selectionActions","fork","regardSelection","showSelectedRecords","searchFormSearchFilter","searchFormFetchOptions","relevantSearchFormFetchOptions","getTql","hasUserChanges","parentKey","selectedEndpoint","preparedEndpoint","queryCount","searchInputsFilters","adminSearchFormFilters","activeSearchFormFilters","_union","orderBy","searchTql","request","markable","marked","oldMarkings","setToMarked","newMarkings","markings","currentEntityMarkings","newEntityMarkings","columnPreferences","basicQuery","delay","nextPage","setCountAction","tableSorting","preferencesSorting","activeSearchFilterHasOrderBy","fetchedFormDefinition","selected","navigateToCreateRelative","navigateToActionRelative","containsEntityOfModel","deletedEntityKeys","fieldArray","simpleSearchFields","trim","showExtendedSearchForm","disableSimpleSearch","comparator","a","b","sort","showSelectionController","selectionStyles","SINGLE","MULTI","MULTI_EXPLICIT","showSelectionComponent","inputSelectionStyle","getTableSelectionStyle","fromSelectable","ascendingNumberComparator","combineSelection","currentSelection","newSelection","slice","k","clearSelection","setTableStyle","selectionMode","selectionControllerVisible","preferencesLoaded","getPositions","endsWith","Number","getPositionsFromColumns","fixedPosition","changePosition","fieldAfterPosition","getPositionsPreferencesToSave","keyRegex","transformSortingKey","index","keyMatch","transformSortingField","parseInt","toLowerCase","getSortingPreferencesToSave","getAdditionalSortingPreferencesToSave","getColumns","getColumnPreferencesToSave","saveSorting","resetPreferences","displayColumnModal","saveColumnPreferences","resetColumns","listSagas","util","afterFieldPosition","newPositions","positionPreferences","sortings","sortingPreferences","preferencesColumns","formColumns","item","diffColumns","columnName","entityListReducer","listReducer","searchFormReducer","selectionReducer","preferencesReducer","entityListSagas","searchFormSagas","selectionSagas","preferencesSaga","reduxForm","destroyOnUnmount","liveSearch","preventDefault","FullTextSearchForm","StyledBasicSearchForm","StyledScrollbar","StyledSearchFormButtons","searchFormDefinition","setShowExtendedSearchForm","hasExtendedOnlySearchFields","every","isHidden","searchInputs","BasicSearchForm","StyledSplit","Split","StyledSplitWrapper","StyledHeader","Menu","AdminSearchGrid","isCollapsed","StyledPlaceHolder","StyledToggleCollapseButton","StyledGutter","searchFilterCompare","SearchFilterListWrapper","StyledSpanSearchFilter","StyledSpan","StyledAddRemoveButton","StyledMenuWrapper","StyleButtonWrapper","StyledSearchFilterButton","StyledItemLabel","StyledMessageWrapper","EllipsisMenu","canEdit","canDelete","openDetail","BallMenu","SearchFilterButton","setActive","dense","editAllowed","deleteAllowed","SearchFilterList","tabIndex","BasicSearchFormContainer","withTheme","searchFormDirty","toggleCollapse","splitWrapperEl","size","setSize","searchFilterExpanded","setSearchFilterExpanded","showExpandSearchFilter","setShowExpandSearchFilter","searchFilterHeight","splitWrapperHeight","clientHeight","searchFilterHeightPercentage","Math","ceil","isSingleSearchFilterActive","Popover","direction","gutterSize","sizes","minSize","gutter","gutterEl","ReactDOM","AdminSearchForm","StyledAdminSearchFormWrapper","isToggleable","SearchView","toggleShowSelectedRecords","selectionPossible","StyledSelectionController","SelectionController","showNavigation","DetailLinkRelative","relation","StyledMarkingWrapper","declareFont","MarkingCellRenderer","mouseOver","setMouseOver","onMouseEnter","onMouseLeave","Table","showNavigationLink","showPreferencesMenu","width","dynamic","HeaderRenderer","NavigationCellHeader","columnDefinitions","dataLoadingInProgress","paginationInfo","totalCount","recordsPerPage","onPageChange","onSortingChange","setSortingInteractive","onColumnPositionChange","diff","deriveSelectionFromState","StyledListWrapper","StyledListView","SelectionControllerContainer","ListView","List","columnsDefinitions","TableContainer","ActionBar","actionBar","getActionBar","ActionContainer","LoadMask","required","loadingText","currentPageIds","TopPositioning","LeftPositioning","SearchGrid","ListGrid","ListViewContainer","setSearchFormCollapsed","PositioningContainer","SearchViewContainer","initializeSearchForm","EntityList","getDispatchActions","actionSettings","actionSetting","argsFactory","reloadOptions","reload","setListFormDefinition","new","mark","EXTERNAL_EVENTS","initApp","publicPath","allCustomActions","viewName","contextParams","reducers","SimpleFormApp","EntityListApp","textResourceModules","changedProps","_pickBy","this","_isEmpty","reloadOption","res","aS","setFieldDefinitions","submit","cancel","change","getValues","CHANGE","UPDATE_SYNC_ERRORS","INITIALIZE","inputDefaultValues","formUtil","isValid","simpleForm","formReducer","formSagas","StyledButtonsWrapper","initializeForm","handleSubmitProp","handleSubmit","submitText","cancelText","ms","setTimeout","pending","validate","Form","FormContainer","checkboxValues","inputEl","useLayoutEffect","indeterminate","aria-checked","aria-label","controlledIsOpen","isOpenInitial","onToggle","setIsOpen","controlled","toggleOpenState","StyledPanel","PanelGroup","openPanelIndex","open","setState","bind","cssShared","shadeColor","PanelHeaderFooter","showToggler","collapseButtonText","unfoldButtonText","defaultProps","Body","Footer","Group","Header","Wrapper","StyledResizeHandle","startResize","onMouseDown","borderColor","basePadding","StyledTableCell","StyledDnD","isDragged","StyledTableHeaderCell","fontWeight","isResizing","generateShades","paper","resizingColumn","PaginationContainer","css","StyledSortingSpan","StyledFullRowProgress","StyledFullRow","StyledTableHead","StyledTableRow","StyledTableBody","StyledTable","StretchingTableContainer","StyledTableWrapper","StyledDraggable","StyledPagination","StyledPaginationButton","totalPages","start","ButtonGroup","total","removeAllTextSelections","removeAllRanges","selectionChange","rowIdx","shiftKey","MultiCheckbox","rowSelectionState","rowSelectionChange","allKeys","allRowsSelectionState","getSingleSelectionCell","getMultiSelectionCell","ThContent","dangerouslySetInnerHTML","__html","tableEl","resizeCallback","tableElRef","lastPositionX","tmpColResizing","setResizingColumn","onMouseUp","onMouseMove","requestAnimationFrame","clientX","thEl","querySelector","max","useResize","thOnClick","StaticCell","textAlign","InProgressRow","NoDataRow","className","metaKey","ctrlKey","currentKeys","lastSelected","setLastSelected","shiftSelection","idxLastSelection","idxSelection","min","useSelection","selectionColumn","getSelectionCell","showPagination","columnId","metaFields","KEY","MODEL","VERSION","relevantRelationAttributes","typeValueExtractor","childValue","flattenPaths","currentPath","pathId","subPaths","flatten","combinedArrayVales","acc2","isRightAligned","relationFieldTypes","getFlattenEntity","version","toEntity","dirtyField","ignoredPath","t","_set","valueSimplifier","_isObject","getPathDisplayRequest","relationPaths","fieldValue","alreadyLoaded","alreadyInRequest","getDisplayRequest","args","isDefined","handleRangeValue","rangeMappings","momentValue","comp","guessType","onDragStart","onDragEnter","onDragOver","onDrop","onDragEnd"],"mappings":"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","file":"chunk-230.65e7e9a6a1f335412b65.js","sourcesContent":["export default Object.freeze({\n ACTION: 'action',\n REPORT: 'report',\n ACTION_GROUP: 'action-group',\n ACTION_BAR: 'action-bar'\n})\n","import componentTypes from './actionComponentTypes'\n\nexport const isAction = componentType => !!componentType && Object.values(componentTypes).indexOf(componentType) >= 0\n\nexport const modeFitsScopes = (mode, scopes) => (!mode || !scopes || scopes.length < 0 || scopes.includes(mode))\n","const ACTION_HANDLERS = {\n\n}\n\nconst initialState = {\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","export const ACTION_INVOKE = 'actions/ACTION_INVOKE'\nexport const ACTION_IN_PROGRESS = 'actions/ACTION_IN_PROGRESS'\nexport const ACTION_INVOKED = 'actions/ACTION_INVOKED'\n\nexport const actionInvoke = (definition, selection, parent) => ({\n type: ACTION_INVOKE,\n payload: {\n definition,\n selection,\n parent\n }\n})\n\nexport const actionInvoked = (definition, selection, response) => ({\n type: ACTION_INVOKED,\n payload: {\n definition,\n selection,\n response\n }\n})\n","export default Object.freeze({\n CUSTOM: 'custom',\n SIMPLE: 'simple',\n REPORT: 'report',\n DIVIDER: 'divider',\n LEGACY: 'legacy'\n})\n","import {put, call} from 'redux-saga/effects'\nimport {download, validation} from 'tocco-util'\nimport {v4 as uuid} from 'uuid'\n\nimport errorLogging from '../../../errorLogging'\nimport rest from '../../../rest'\nimport notification from '../../../notification'\nimport {TOASTER_KEY_PREFIX} from '../../../notification/modules/socket/socket'\n\nexport default function* (definition, selection, parent, params) {\n const runAsync = definition.runInBackgroundTask\n const invokeFnc = runAsync ? invokeActionAsync : invokeActionSync\n\n return yield call(invokeFnc, definition, selection, parent, params)\n}\n\nexport function* invokeActionAsync(definition, selection, parent, params) {\n const response = yield call(rest.requestSaga, definition.endpoint, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n params: {\n background: true\n },\n formProperties: definition.properties\n },\n acceptedErrorCodes: ['VALIDATION_FAILED'],\n headers: {\n 'X-Enable-Notifications': true\n }\n })\n\n if (response.body && response.body.success === false) {\n yield put(notification.toaster({\n type: 'error',\n title: 'client.common.unexpectedError',\n body: response.body.message || 'client.component.actions.errorText'\n }))\n } else {\n yield call(showToaster, response, 'info')\n }\n}\n\nexport function* invokeActionSync(definition, selection, parent, params) {\n const randomId = uuid()\n const title = definition.progressMsg || 'client.component.actions.defaultProgressMessage'\n yield put(notification.blockingInfo(randomId, title))\n const response = yield call(invokeRequest, definition, selection, parent, params)\n yield put(notification.removeBlockingInfo(randomId))\n\n return {\n ...response,\n remoteEvents: [\n ...(response && response.success\n ? [{\n type: 'entity-update-event',\n payload: {\n parent,\n entities: [{entityName: selection.entityName}]\n }\n }]\n : []\n )\n ]\n }\n}\n\nexport function* invokeRequest(definition, selection, parent, params) {\n try {\n const response = yield call(rest.requestSaga, definition.endpoint, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n formProperties: definition.properties\n },\n acceptedErrorCodes: ['VALIDATION_FAILED'],\n headers: {\n 'X-Enable-Notifications': true\n }\n })\n if (response.body && response.body.errorCode === 'VALIDATION_FAILED') {\n yield put(\n notification.toaster({\n type: 'error',\n title: 'client.component.actions.validationError',\n body: validation.getErrorCompact(response.body.errors)\n })\n )\n } else if (response.body && response.body.params && response.body.params.downloadUrl) {\n const fileResponse = yield call(rest.requestBytesSaga, response.body.params.downloadUrl, {\n method: 'POST',\n body: {\n entity: selection.entityName,\n selection,\n parent,\n ...params,\n formProperties: definition.properties\n }\n })\n yield call(download.downloadReadableStream, fileResponse.body, response.body.params.filename)\n } else {\n yield call(showToaster, response, response.body.success === true ? 'success' : 'warning')\n }\n\n return response.body\n } catch (error) {\n if (!(error instanceof rest.ClientQuestionCancelledException)) {\n yield put(errorLogging.logError(\n 'client.common.unexpectedError',\n 'client.component.actions.errorText',\n error\n ))\n }\n }\n}\n\nexport function* showToaster(response, type) {\n const title = response.body.message || 'client.component.actions.successDefault'\n const key = response.body.notificationKey ? `${TOASTER_KEY_PREFIX}${response.body.notificationKey}` : undefined\n yield put(notification.toaster({type, title, key}))\n}\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\n\nconst mapActionCreators = {\n emitAction: action => actionEmitter.dispatchEmittedAction(action)\n}\n\nexport default connect(null, mapActionCreators)\n","import PropTypes from 'prop-types'\nimport _reduce from 'lodash/reduce'\n\nconst GROUP_GENERAL = 'generalSettings'\nconst GROUP_RECIPIENT = 'recipientSettings'\n\nexport const submitActions = Object.freeze({\n DISPLAY: 'display',\n DOWNLOAD: 'download'\n})\n\nexport const getGroupedValues = (settingsDefinition, values) => {\n const groupValues = name => (\n {\n [name]: (settingsDefinition[name] || []).reduce((result, field) => (\n {...result, [field.id]: values[field.id]}\n ), {})\n }\n )\n\n return {\n ...groupValues(GROUP_GENERAL),\n ...groupValues(GROUP_RECIPIENT)\n }\n}\n\nexport const transformValues = values => {\n const transform = v => {\n return v.key ? v.key : v\n }\n\n return _reduce(values, (result, value, key) => (\n {\n ...result,\n [key]: Array.isArray(value) ? value.map(transform) : transform(value)\n }\n ), {})\n}\n\nexport const getFormDefinition = (settingsDefinition, intl) => {\n const msg = id => intl.formatMessage({id})\n\n const extractFields = name =>\n (settingsDefinition[name] || []).map(field => (\n {\n children: [\n {\n componentType: 'field',\n dataType: field.dataType,\n defaultValue: field.defaultValue,\n id: field.id,\n label: field.label || field.description,\n path: field.id,\n ...(field.targetEntity ? {targetEntity: field.targetEntity} : {}),\n ...(field.validation ? {validation: field.validation} : {})\n }\n ],\n componentType: 'field-set',\n hidden: false,\n id: field.id,\n label: field.label || field.description,\n readonly: field.disabled,\n scopes: []\n }\n ))\n\n return {\n componentType: 'form',\n label: null,\n modelid: 'Bill_report_settings',\n readonly: false,\n children: [\n {\n componentType: 'layout',\n id: 'generalSettings',\n label: msg('client.common.report.generalSettings'),\n layoutType: 'vertical-box',\n children: extractFields(GROUP_GENERAL)\n },\n {\n componentType: 'layout',\n id: 'recipientSettings',\n label: msg('client.common.report.recipientSettings'),\n layoutType: 'vertical-box',\n children: extractFields(GROUP_RECIPIENT)\n }\n ]\n }\n}\n\nexport const reportSettingsDefinitionPropType = PropTypes.shape({\n customSettings: PropTypes.shape({\n form: PropTypes.object,\n entity: PropTypes.object\n }),\n generalSettings: PropTypes.array,\n recipient: PropTypes.array,\n description: PropTypes.shape({\n name: PropTypes.string.isRequired\n })\n})\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\n\nexport const StyledReportSettings = styled.div`\n && {\n > div:first-of-type {\n margin-bottom: 10px;\n }\n }\n`\n\nexport const StyledStickyButtons = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n z-index: 1;\n display: flex;\n justify-content: flex-end;\n\n ${/* sc-selector */StyledButton}:last-child {\n margin-right: 0;\n }\n`\n","import React, {useState, useMemo, useRef} from 'react'\nimport PropTypes from 'prop-types'\nimport {Button} from 'tocco-ui'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport simpleFormConnector from '../containers/simpleFormConnector'\nimport {\n getFormDefinition,\n getGroupedValues,\n reportSettingsDefinitionPropType,\n transformValues\n} from '../utils/report'\nimport {StyledStickyButtons, StyledReportSettings} from './StyledReportSettings'\n\nexport const ReportSettings = ({settingsDefinition, formApp, onSubmit, listApp, intl}) => {\n const customSettingsDefined = settingsDefinition.customSettings && settingsDefinition.customSettings.entity\n const [settings, setSettings] = useState({\n valid: false,\n customSettingsValid: !customSettingsDefined\n })\n const settingsRef = useRef()\n settingsRef.current = settings // workaround to read current state in static callbacks (because of memo hook)\n\n const SimpleFormContainer = useMemo(() => simpleFormConnector(formApp), [formApp])\n\n const handleSettingsChange = ({values, valid}) => {\n setSettings({\n ...settingsRef.current,\n values,\n valid\n })\n }\n\n const handleCustomSettingsChange = ({values, valid}) => {\n setSettings({\n ...settingsRef.current,\n customSettings: values,\n customSettingsValid: valid\n })\n }\n\n const handleButtonClick = () => {\n const groupedValues = {\n ...getGroupedValues(settingsDefinition, transformValues(settings.values)),\n customSettings: settings.customSettings\n }\n\n onSubmit(groupedValues)\n }\n\n return (\n <StyledReportSettings>\n <SimpleFormContainer\n listApp={listApp}\n form={getFormDefinition(settingsDefinition, intl)}\n noButtons\n onChange={handleSettingsChange}\n mode=\"create\"\n />\n {customSettingsDefined\n && <SimpleFormContainer\n listApp={listApp}\n form={settingsDefinition.customSettings.form.form}\n noButtons\n onChange={handleCustomSettingsChange}\n mode=\"create\"\n />\n }\n <StyledStickyButtons>\n <Button\n ink=\"primary\"\n disabled={!settings.customSettingsValid || !settings.valid}\n onClick={handleButtonClick}\n look=\"raised\"\n >\n <FormattedMessage id=\"client.common.report.generate\"/>\n </Button>\n </StyledStickyButtons>\n </StyledReportSettings>\n )\n}\n\nReportSettings.propTypes = {\n intl: PropTypes.object.isRequired,\n onSubmit: PropTypes.func.isRequired,\n listApp: PropTypes.func.isRequired,\n formApp: PropTypes.func.isRequired,\n settingsDefinition: reportSettingsDefinitionPropType.isRequired\n}\n\nexport default injectIntl(ReportSettings)\n","import React from 'react'\nimport {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport {api} from 'tocco-util'\nimport {call, put, take} from 'redux-saga/effects'\n\nimport rest from '../../../rest'\nimport notification from '../../../notification'\nimport ReportSettings from '../../components/ReportSettings'\nimport {invokeActionAsync} from './simpleAction'\n\nexport default function* (actionDefinition, selection, parent, params, config) {\n const answerChannel = yield call(channel)\n const settingsModalId = yield call(displayReportSettings, actionDefinition, selection, answerChannel, config)\n yield call(awaitSettingsSubmit, actionDefinition, answerChannel, settingsModalId, selection)\n}\n\nexport function* displayReportSettings(actionDefinition, selection, answerChannel, config) {\n const options = {\n queryParams: {\n model: selection.entityName,\n ...(selection.mode === 'ID' ? {keys: selection.ids.join(',')} : {})\n }\n }\n\n const resource = `report/${actionDefinition.reportId}/settings`\n const {body: settingsDefinition} = yield call(rest.requestSaga, resource, options)\n const onSubmit = formValues => answerChannel.put({\n formValues,\n settingsDefinition\n })\n const settingsModalId = yield call(uuid)\n\n yield put(notification.modal(\n settingsModalId,\n settingsDefinition.description.name,\n null,\n () => (\n <ReportSettings\n listApp={config.listApp}\n formApp={config.formApp}\n onSubmit={onSubmit}\n settingsDefinition={settingsDefinition}\n />\n ),\n true\n ))\n\n return settingsModalId\n}\n\nexport function* awaitSettingsSubmit(definition, answerChannel, settingsModalId, selection) {\n while (true) {\n const {\n formValues: {customSettings, generalSettings, recipientSettings},\n settingsDefinition\n } = yield take(answerChannel)\n\n definition.endpoint = 'report/generations'\n const customSettingsEntity = settingsDefinition.customSettings\n ? api.toEntity({\n __model: settingsDefinition.customSettings.entity.name,\n ...customSettings\n })\n : null\n const params = {\n additionalProperties: {\n reportId: definition.reportId,\n generalSettings,\n recipientSettings\n },\n formData: customSettingsEntity\n }\n\n yield call(invokeActionAsync, definition, selection, null, params)\n yield put(notification.removeModal(settingsModalId))\n }\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport React from 'react'\nimport {consoleLogger} from 'tocco-util'\nimport {channel} from 'redux-saga'\n\nimport notification from '../../../notification'\n\nexport default function* (definition, selection, parent, params, config) {\n if (definition.appId) {\n if (definition.fullscreen) {\n if (config.customActions && config.customActions.fullscreen) {\n yield call(handleFullScreenActions, {definition, selection, config})\n } else {\n yield call(consoleLogger.logError, 'Unable to render custom action: No fullscreen handler provided')\n }\n } else {\n if (config.appComponent) {\n return yield call(handleCustomActionModal, {definition, config, selection})\n } else {\n yield call(consoleLogger.logError, 'Unable to render custom action: No appComponent provided')\n }\n }\n } else {\n const handler = config && config.customActions && config.customActions[definition.id]\n if (handler) {\n return yield call(handleAppActionsFallback, {definition, selection, parent, params, config, handler})\n } else {\n yield call(consoleLogger.logError, `Unable to load custom action with id ${definition.id}`)\n }\n }\n}\n\nconst actionStatus = {\n OK: 'ok',\n NOT_OK: 'not_ok',\n CANCEL: 'cancel'\n}\n\nexport function* handleCustomActionModal({definition, selection, config}) {\n const answerChannel = yield call(channel)\n\n const ActionComponent = config.appComponent\n yield put(notification.modal(\n `action-${definition.appId}`,\n `client.actions.${definition.appId}.title`,\n null,\n ({close}) => {\n const onSuccess = ({message, remoteEvents}) => {\n close()\n answerChannel.put({status: actionStatus.OK, message, remoteEvents})\n }\n\n const onError = ({message}) => {\n close()\n answerChannel.put({status: actionStatus.NOT_OK, message})\n }\n\n const onCancel = () => {\n close()\n answerChannel.put({status: actionStatus.CANCEL})\n }\n\n return <ActionComponent\n appId={definition.appId}\n context={config.context}\n actionProperties={definition.properties}\n selection={selection}\n navigationStrategy={config.navigationStrategy || {}}\n onSuccess={onSuccess}\n onError={onError}\n onCancel={onCancel}\n />\n },\n true\n ))\n const response = yield take(answerChannel)\n if (response.status === actionStatus.CANCEL) {\n return null\n }\n\n const success = response.status === actionStatus.OK\n if (response.message !== null) {\n const type = success ? 'success' : 'warning'\n const title = response.message || 'client.component.actions.successDefault'\n\n yield put(notification.toaster({type, title}))\n }\n return {success: success, remoteEvents: response.remoteEvents}\n}\n\nexport function* handleFullScreenActions({definition, selection, config}) {\n yield call(config.customActions.fullscreen, definition, selection)\n}\n\nexport function* handleAppActionsFallback({definition, selection, config, parent, params, handler}) {\n const answerChannel = yield call(channel)\n const onSuccess = ({message, remoteEvents}) => {\n answerChannel.put({status: actionStatus.OK, message, remoteEvents})\n }\n const onError = ({message}) => {\n answerChannel.put({status: actionStatus.NOT_OK, message})\n }\n const onCancel = () => {\n answerChannel.put({status: actionStatus.CANCEL})\n }\n\n yield call(handler, definition, selection, parent, params, config, onSuccess, onError, onCancel)\n\n return yield call(handleAnswer, answerChannel)\n}\n\nexport function* handleAnswer(answerChannel) {\n const response = yield take(answerChannel)\n if (response.status === actionStatus.CANCEL) {\n return null\n }\n\n const success = response.status === actionStatus.OK\n\n if (response.message) {\n const type = success ? 'success' : 'warning'\n const title = response.message === 'default' ? 'client.component.actions.successDefault' : response.message\n\n yield put(notification.toaster({type, title}))\n }\n\n return {success: success, remoteEvents: response.remoteEvents}\n}\n","import _isPlainObject from 'lodash/isPlainObject'\nimport {channel} from 'redux-saga'\nimport {call, all, put, spawn, take, select} from 'redux-saga/effects'\n\nimport newNotification from '../../../notification'\nimport remoteEvents from '../../../remoteEvents'\nimport rest from '../../../rest'\n\nexport const loadScript = src => new Promise((resolve, reject) => {\n const s = document.createElement('script')\n s.src = src\n s.onload = resolve\n s.onerror = reject\n document.head.appendChild(s)\n})\n\nexport const loadCss = src => new Promise((resolve, reject) => {\n const head = document.getElementsByTagName('head')[0]\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = 'text/css'\n link.href = src\n link.media = 'all'\n link.onload = resolve\n link.onerror = reject\n head.appendChild(link)\n})\n\nexport function* loadSequentially(sources) {\n const currentEnv = window.legacyActionEnv || 'new'\n const serverSettings = yield call(rest.fetchServerSettings)\n for (const source of sources) {\n if (source.envs.includes(currentEnv)) {\n yield call(source.handler, `${source.src}?v=${serverSettings.niceRevision}`)\n }\n }\n}\n\nexport const sources = [\n {src: '/nice2/javascript/lang.release.js', handler: loadScript, envs: ['new']},\n {src: '/nice2/javascript/nice2-ext-newclient-actions.release.js', handler: loadScript, envs: ['new']},\n {src: '/nice2/javascript/nice2-admin.release.js', handler: loadScript, envs: ['new']},\n {\n src: '/nice2/javascript/nice2-newclient-actions-public.release.js',\n handler: loadScript,\n envs: ['legacy-public']\n },\n {\n src: '/nice2/javascript/nice2-newclient-actions-setup.release.js',\n handler: loadScript,\n envs: ['legacy-public', 'legacy-admin', 'new']\n },\n {src: '/nice2/dwr-all.js', handler: loadScript, envs: ['new']},\n {src: '/js/ext-extensions/ckeditor/ckeditor/ckeditor.js', handler: loadScript, envs: ['new']},\n {src: '/css/themes/blue-medium.css', handler: loadCss, envs: ['new']},\n {src: '/css/nice2-admin.css', handler: loadCss, envs: ['new']},\n {src: '/css/nice2-new-client-legacy-actions.css', handler: loadCss, envs: ['new']}\n]\n\nexport const channelFeedingCallback = channel => arg => {\n channel.put(arg)\n}\n\nexport function* readRemoteEvents(remoteEventsChannel) {\n while (true) {\n const event = yield take(remoteEventsChannel)\n const action = remoteEvents.remoteEvent(event)\n yield put(action)\n }\n}\n\nexport function* registerRemoteEventsListener() {\n const dataRegistry = yield call([window.app, window.app.getDataRegistry])\n if (dataRegistry.setNewClientCallback) {\n const remoteEventsChannel = yield call(channel)\n const callback = yield call(channelFeedingCallback, remoteEventsChannel)\n yield call([dataRegistry, dataRegistry.setNewClientCallback], callback)\n yield spawn(readRemoteEvents, remoteEventsChannel)\n }\n}\n\nexport function* handleNotification(notification) {\n const message = notification.message.replace(/&nbsp;/g, ' ')\n\n let action\n\n switch (notification.level) {\n case 'ERROR':\n action = newNotification.toaster({type: 'error', title: message})\n break\n case 'INFO':\n action = newNotification.toaster({type: 'info', title: message})\n break\n default:\n throw new Error(`Unsupported notification level: ${notification.level}`)\n }\n\n if (action) {\n yield put(action)\n }\n}\n\nexport function* readNotifications(notificationsChannel) {\n while (true) {\n const notification = yield take(notificationsChannel)\n yield call(handleNotification, notification)\n }\n}\n\nexport function* registerNotificationsListener() {\n const gui = yield call([window.app, window.app.getGui])\n const notifier = yield call([gui, gui.getNotifier])\n if (notifier.setNewClientCallback) {\n const notificationsChannel = yield call(channel)\n const callback = yield call(channelFeedingCallback, notificationsChannel)\n yield call([notifier, notifier.setNewClientCallback], callback)\n yield spawn(readNotifications, notificationsChannel)\n }\n}\n\nexport function* initLegacyActionsEnv() {\n if (window.legacyActionsEnvInitialized !== true) {\n yield call(loadSequentially, sources)\n yield call(window.setUpLegacyActionsEnv)\n }\n yield call(registerRemoteEventsListener)\n yield call(registerNotificationsListener)\n}\n\nexport const listSelector = state => state.list\n\nexport const entityListSelector = state => state.entityList\nexport const entityDetailSelector = state => state.entityDetail\n\nexport const getOrderByString = sortingArray => sortingArray && sortingArray.length > 0\n ? rest.createSortingString(sortingArray)\n : null\n\nexport const getManualQuery = (selection, listState) => ({\n ...new window.nice2.netui.ManualQuery(),\n entityName: selection.entityName,\n queryWhere: selection.query.where,\n queryOrderBy: getOrderByString(listState.sorting)\n})\n\nexport const getListFormId = listState => ({\n ...new window.form.FormIdentifier(),\n scope: 'list',\n formName: listState.formDefinition.id\n})\n\nexport function* getSelection(selection) {\n const legacySelection = {\n entityName: selection.entityName\n }\n\n if (selection.type === 'ID') {\n legacySelection.selectedEntities = selection.ids\n legacySelection.selectionType = 'SELECTION'\n } else if (selection.type === 'QUERY') {\n const listState = yield select(listSelector)\n\n legacySelection.selectionType = 'NEW_CLIENT_QUERY'\n legacySelection.manualQuery = getManualQuery(selection, listState)\n legacySelection.listForm = getListFormId(listState)\n legacySelection.searchFilters = selection.query.filter\n } else {\n throw new Error(`Unsupported selection type: ${selection.type}`)\n }\n\n return legacySelection\n}\n\nexport function* getScope() {\n const list = yield select(entityListSelector)\n const detail = yield select(entityDetailSelector)\n\n if (list && detail) {\n throw new Error('Unable to get form scope. Unexpected state: entityList and entityDetail exist')\n }\n\n if (list) {\n return 'list'\n }\n\n if (detail) {\n if (detail.mode === 'update') {\n return 'detail'\n } else if (detail.mode === 'create') {\n return 'create'\n } else {\n throw new Error(`Unable to get form scope. Unexpected detail mode: ${detail.mode}`)\n }\n }\n\n throw new Error('Unable to get form scope. Expected to find either entityList or entityDetail in state')\n}\n\nexport default function* (definition, selection, parent, params, config) {\n yield call(initLegacyActionsEnv)\n\n const actionDefinition = new window.nice2.netui.actions.model.ClientActionDefinition(definition.path, definition.id)\n actionDefinition.setEnabled(!definition.readOnly)\n if (_isPlainObject(definition.properties)) {\n const setPropertyEffects = Object.entries(definition.properties)\n .map(([key, value]) => call([actionDefinition, actionDefinition.setProperty], key, value))\n yield all(setPropertyEffects)\n }\n\n const entityExplorer = new window.nice2.modules.NewClientLegacyActionsModule({\n entityName: selection.entityName,\n formName: selection.entityName\n })\n entityExplorer.init()\n\n const panel = new window.nice2.modules.NewClientLegacyActionsPanel({\n entityName: selection.entityName\n })\n\n const ctx = new window.nice2.modules.entityexplorer.EntityExplorerActionContext(entityExplorer, panel)\n if (selection.type === 'ID' && selection.ids.length === 1) {\n ctx.getRecord = () => ({id: selection.ids[0]})\n }\n\n const situation = {\n entityName: selection.entityName,\n scope: definition.scope || (yield call(getScope))\n }\n\n const action = window.NetuiActionRegistry.newActionFromDefinition(actionDefinition, situation, ctx)\n\n const legacySelection = yield call(getSelection, selection)\n\n action.getSelectionNumber = () => selection.type === 'ID' ? selection.ids.length : 0\n action.getSelection = () => legacySelection\n\n action.perform()\n}\n","import actionTypes from '../../actionTypes'\nimport handleSimpleAction from './simpleAction'\nimport handleReportAction from './report'\nimport handleCustomAction from './customAction'\nimport handleLegacyAction from './legacyAction'\n\nexport default {\n [actionTypes.SIMPLE]: handleSimpleAction,\n [actionTypes.REPORT]: handleReportAction,\n [actionTypes.CUSTOM]: handleCustomAction,\n [actionTypes.LEGACY]: handleLegacyAction\n}\n","export default function* preCheckHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.preCheck && preparationResponse.preCheck.success === false) {\n return {\n abort: true,\n abortMessage: preparationResponse.preCheck.message || 'client.component.actions.errorText'\n }\n }\n\n return {\n abort: false\n }\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\nimport React from 'react'\n\nimport notification from '../../../notification'\n\nexport default function* confirmHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.preCheck && preparationResponse.preCheck.confirmMessage) {\n const confirmResponse = yield call(promptConfirm, preparationResponse.preCheck.confirmMessage)\n return {abort: !confirmResponse}\n }\n\n return {abort: false}\n}\n\nexport function* promptConfirm(message) {\n const answerChannel = yield call(channel)\n const onYes = () => answerChannel.put(true)\n const onCancel = () => answerChannel.put(false)\n\n yield put(\n notification.confirm(\n 'client.component.actions.confirmTitle',\n <FormattedMessage id={message}/>,\n <FormattedMessage id=\"client.common.yes\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n onYes,\n onCancel\n )\n )\n return yield take(answerChannel)\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport React from 'react'\n\nimport simpleFormConnector from '../../containers/simpleFormConnector'\nimport notification from '../../../notification'\n\nexport default function* initialFormHandler(preparationResponse, params, definition, selection, config) {\n if (preparationResponse.initialFormValues) {\n const formValues = yield call(handleInitialForm, preparationResponse.initialFormValues, config)\n\n return {\n abort: formValues === null,\n params: {formData: formValues}\n }\n }\n return {\n abort: false\n }\n}\n\nexport const formValues = formValues => ({formValues})\n\nexport function* handleInitialForm({formDefinition, defaultValues, formTitle, formMessage}, config) {\n const answerChannel = yield call(channel)\n\n const id = new Date().valueOf()\n const onSend = ({values}) => answerChannel.put(formValues(values))\n const onCancel = () => answerChannel.put(formValues(null))\n const SimpleFormContainer = simpleFormConnector(config.formApp)\n yield put(notification.modal(id, formTitle, formMessage, () =>\n <SimpleFormContainer\n form={formDefinition.form}\n listApp={config.listApp}\n onSubmit={onSend}\n onCancel={onCancel}\n defaultValues={defaultValues}\n mode=\"create\"\n />\n ))\n\n const response = yield take(answerChannel)\n yield put(notification.removeModal(id))\n return response.formValues ? {model: formDefinition.model, paths: response.formValues} : null\n}\n","import {call, put, take} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\nimport React from 'react'\n\nimport notification from '../../../notification'\n\nconst SELECTION_THRESHOLD_DEFAULT = 100\n\nexport default function* largeSelectionHandler(preparationResponse, params, definition, selection, config) {\n const threshold = definition.confirmationThreshold === null || definition.confirmationThreshold === undefined\n ? SELECTION_THRESHOLD_DEFAULT\n : definition.confirmationThreshold\n\n if (threshold !== -1 && selection && selection.count > threshold) {\n const confirmResponse = yield call(promptConfirm, selection.count)\n return {abort: !confirmResponse}\n }\n\n return {abort: false}\n}\n\nexport function* promptConfirm(count) {\n const answerChannel = yield call(channel)\n const onYes = () => answerChannel.put(true)\n const onCancel = () => answerChannel.put(false)\n\n yield put(\n notification.confirm(\n <FormattedMessage id=\"client.component.actions.confirmTitle\"/>,\n <FormattedMessage id=\"client.component.actions.largeSelectionConfirm\" values={{count}}/>,\n <FormattedMessage id=\"client.common.yes\"/>,\n <FormattedMessage id=\"client.common.cancel\"/>,\n onYes,\n onCancel\n )\n )\n return yield take(answerChannel)\n}\n","import {call} from 'redux-saga/effects'\n\nimport rest from '../../../rest'\nimport preCheckHandler from './preCheckHandler'\nimport confirmHandler from './confirmHandler'\nimport initialFormHandler from './initialFormHandler'\nimport largeSelectionHandler from './largeSelectionHandler'\n\nexport function* doRequest(definition, selection, parent) {\n const response = yield call(rest.requestSaga, definition.endpoint + '/check', {\n method: 'POST',\n body: {\n selection,\n parent\n }\n })\n return response.body\n}\n\nexport const getHandlers = () => [largeSelectionHandler, preCheckHandler, confirmHandler, initialFormHandler]\n\nexport default function* run(definition, selection, parent, config) {\n let abort = false\n let abortMessage = null\n let params = {}\n\n const preparationResponse = definition.endpoint\n ? yield call(doRequest, definition, selection, parent)\n : {}\n const handlers = yield call(getHandlers)\n\n let i = 0\n\n while (!abort && handlers[i]) {\n const handler = handlers[i]\n const handlerResponse = yield call(handler, preparationResponse, params, definition, selection, config)\n\n abort = handlerResponse.abort\n params = {...params, ...handlerResponse.params}\n if (handlerResponse.abortMessage) {\n abortMessage = handlerResponse.abortMessage\n }\n\n i++\n }\n\n return {abort, abortMessage, params}\n}\n","import prepare from './prepare'\n\nexport default prepare\n","import {takeEvery, all, call, put} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport actionHandlers from './actionHandlers'\nimport remoteEvents from '../../remoteEvents'\nimport prepare from './prepare'\nimport notification from '../../notification'\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(actions.ACTION_INVOKE, invokeAction, config)\n ])\n}\n\nexport function* invokeAction(config, {payload}) {\n const {definition, selection, parent} = payload\n\n const {abort, abortMessage, params} = yield call(prepare, definition, selection, parent, config)\n\n if (!abort) {\n const actionHandler = actionHandlers[definition.actionType]\n const response = yield call(actionHandler, definition, selection, parent, params, config)\n\n if (response && response.remoteEvents) {\n yield all(response.remoteEvents.map(remoteEvent => put(remoteEvents.remoteEvent(remoteEvent))))\n }\n\n if (response && response.success) {\n yield put(actions.actionInvoked(definition, selection, response))\n }\n } else if (abortMessage) {\n yield put(notification.toaster({type: 'info', title: abortMessage}))\n }\n}\n","export const isValidSelection = (selectedCount, {minSelection, maxSelection}) =>\n !(notEnough(selectedCount, minSelection) || tooMany(selectedCount, maxSelection))\n\nexport const selectionText = (selectedCount, {minSelection, maxSelection}, intl) => {\n if (notEnough(selectedCount, minSelection)) {\n return intl.formatMessage({id: 'client.component.actions.notEnoughSelected'}, {minSelection})\n }\n\n if (tooMany(selectedCount, maxSelection)) {\n return intl.formatMessage({id: 'client.component.actions.tooManySelected'}, {maxSelection})\n }\n\n return null\n}\n\nconst notEnough = (selectedCount, minSelection) => minSelection && selectedCount < minSelection\nconst tooMany = (selectedCount, maxSelection) => maxSelection && selectedCount > maxSelection\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {injectIntl} from 'react-intl'\nimport {ButtonMenu, MenuItem, Icon} from 'tocco-ui'\n\nimport {isValidSelection, selectionText} from './selectionHelper'\n\nconst getChildMenuItems = input => {\n const {onClick, definition, selectedCount, intl} = input\n const validSelection = isValidSelection(selectedCount, definition)\n const disabled = definition.readonly === true || !validSelection\n const title = selectionText(selectedCount, definition, intl)\n const isActionGroup = definition.componentType === 'action-group'\n return <MenuItem\n {...(!isActionGroup && !disabled && {onClick: () => onClick(definition)})}\n disabled={disabled}\n title={title}\n key={`MenuItem-${definition.id}`}\n >\n <span>{definition.icon && <Icon icon={definition.icon}/>} {definition.label}</span>\n {\n definition.componentType === 'action-group'\n && definition.children.map(child => getChildMenuItems({...input, definition: child}))\n }\n </MenuItem>\n}\n\nconst ActionGroup = props => {\n const {definition, onClick} = props\n const hasDefaultAction = (definition.defaultAction && Object.keys(definition.defaultAction).length > 0)\n\n const label = hasDefaultAction ? definition.defaultAction.label : definition.label\n const onClickHandler = hasDefaultAction\n ? () => {\n onClick(definition.defaultAction)\n }\n : null\n const actionId = hasDefaultAction ? definition.defaultAction.id : definition.id\n return <ButtonMenu\n buttonProps={{look: 'raised'}}\n label={label}\n data-cy={`action-${actionId}`}\n onClick={onClickHandler}>\n {\n definition.children.map((childDefinition, idx) => getChildMenuItems({...props, definition: childDefinition}))\n }\n </ButtonMenu>\n}\n\nActionGroup.propTypes = {\n intl: PropTypes.object.isRequired,\n definition: PropTypes.object.isRequired,\n onClick: PropTypes.func.isRequired,\n selectedCount: PropTypes.number,\n disabled: PropTypes.bool\n}\n\nexport default injectIntl(ActionGroup)\n","\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport {Button} from 'tocco-ui'\nimport {injectIntl} from 'react-intl'\n\nimport {selectionText, isValidSelection} from './selectionHelper'\n\nexport const SingleAction = ({definition, onClick, selectedCount, disabled, intl}) => {\n const validSelection = isValidSelection(selectedCount, definition)\n const title = selectionText(selectedCount, definition, intl)\n return (\n <Button\n data-cy={`action-${definition.id}`}\n look=\"raised\"\n onClick={e => {\n onClick(definition)\n e.stopPropagation()\n }}\n icon={definition.icon}\n {...definition.label && definition.useLabel === 'NO' ? {title: definition.label} : {label: definition.label}}\n {...(definition.readonly === true || !validSelection || disabled) && {disabled: true}}\n title={title}\n />\n )\n}\n\nSingleAction.propTypes = {\n intl: PropTypes.object.isRequired,\n definition: PropTypes.object.isRequired,\n onClick: PropTypes.func,\n selectedCount: PropTypes.number,\n disabled: PropTypes.bool\n}\n\nexport default injectIntl(SingleAction)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport _omit from 'lodash/omit'\n\nimport componentTypes from '../actionComponentTypes'\nimport {modeFitsScopes} from '../actions'\nimport ActionGroup from './ActionGroup'\nimport SingleAction from './SingleAction'\n\nconst ActionVisual = ({definition, onClick, selection, parent, mode, callback, disabled, customRenderedActions}) => {\n if (customRenderedActions && customRenderedActions[definition.id]) {\n return customRenderedActions[definition.id]()\n }\n\n if (!modeFitsScopes(mode, definition.scopes)) {\n return null\n }\n\n const ActionType = definition.componentType === componentTypes.ACTION_GROUP ? ActionGroup : SingleAction\n\n return (\n <ActionType\n definition={definition}\n onClick={definition => {\n onClick(_omit(definition, ['label']), selection, parent, callback)\n }}\n selectedCount={selection.count}\n disabled={disabled}\n />\n )\n}\n\nActionVisual.propTypes = {\n /**\n * Object as derived from the form definition.\n */\n definition: PropTypes.shape({\n id: PropTypes.string,\n type: PropTypes.string,\n useLabel: PropTypes.string,\n icon: PropTypes.string,\n label: PropTypes.string,\n config: PropTypes.object,\n scopes: PropTypes.arrayOf(PropTypes.string),\n componentType: PropTypes.string,\n children: PropTypes.Array\n }).isRequired,\n selection: PropTypes.shape({\n entityName: PropTypes.string.isRequired,\n ids: (props, propName, componentName) => {\n if (props.selection && props.selection.type === 'ID' && !props.selection[propName]) {\n return new Error(`Selection.ids prop not defined. Component: ${componentName}'.`)\n }\n },\n query: (props, propName, componentName) => {\n if (props.selection && props.selection.type === 'QUERY' && !props.selection[propName]) {\n return new Error(`Selection.query prop not defined. Component: ${componentName}'.`)\n }\n },\n type: PropTypes.oneOf(['ID', 'QUERY']).isRequired,\n count: PropTypes.number\n }).isRequired,\n onClick: PropTypes.func.isRequired,\n callback: PropTypes.func,\n /**\n * Used to render action conditionally if mode fits definition mode.\n */\n mode: PropTypes.oneOf(['create', 'update']),\n /**\n * Depending on the context a parent entity of the current entity can be passed. This information\n * can be important when an action is executed.\n */\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string\n }),\n disabled: PropTypes.bool,\n /**\n * Used if a custom Rendering is desired. E.g. save button\n */\n customRenderedActions: PropTypes.objectOf(PropTypes.func)\n}\n\nconst Action = props => {\n if (props.definition.componentType === componentTypes.ACTION_BAR) {\n return props.definition.children.map(child => (\n <ActionVisual key={`action-${props.definition.id}-${child.id}`} {...props} definition={child}/>\n )\n )\n }\n\n return <ActionVisual {...props}/>\n}\n\nAction.propTypes = {\n definition: PropTypes.shape({\n id: PropTypes.string,\n componentType: PropTypes.string,\n children: PropTypes.Array\n }).isRequired\n}\n\nexport default Action\n","import {connect} from 'react-redux'\n\nimport {actionInvoke} from '../modules/actions'\nimport Action from '../components/Action'\n\nconst mapActionCreators = {\n onClick: actionInvoke\n}\n\nexport default connect(null, mapActionCreators)(Action)\n","import {isAction} from './actions'\nimport addToStore from './addToStore'\nimport * as actions from './modules/actions'\nimport Action from './containers/ActionContainer'\nimport {getSingleEntitySelection} from './utils/selection'\n\nexport default {\n isAction,\n Action,\n addToStore,\n actions,\n getSingleEntitySelection\n}\n","import {saga as sagasUtil, reducer as reducerUtil} from 'tocco-util'\n\nimport errorLoging from '../errorLogging'\nimport reducer from './modules/reducer'\nimport sagas from './modules/sagas'\n\nexport default (store, config) => {\n reducerUtil.injectReducers(store, {actions: reducer})\n store.sagaMiddleware.run(sagasUtil.autoRestartSaga(sagas, config, errorLoging.logError))\n}\n","export const getSingleEntitySelection = (entityName, key) => ({\n entityName,\n type: 'ID',\n ids: [key],\n count: 1\n})\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nexport const StyledInputWrapper = styled.div`\n width: calc(100% - 20px); // subtract extender width\n`\nexport const StyledInputItemWrapper = styled.div`\n display: inline-block;\n width: 50%;\n\n * {\n line-height: unset !important;\n text-align: center;\n }\n`\n\nexport const StyledIconWrapper = styled.div`\n font-size: ${scale.font(-2.7)};\n display: flex;\n align-items: center;\n`\n\nexport const StyledRange = styled.div`\n display: flex;\n`\n\nexport const StyledInput = styled.div`\n flex: 1;\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n width: inherit;\n`\n\nexport const StyledExtender = styled.div`\n display: flex;\n align-items: center;\n position: relative;\n left: 2px;\n z-index: 1;\n`\n","import moment from 'moment'\n\nconst datetimeFormat = 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\nconst dateFormat = 'YYYY-MM-DD'\n\nconst rangeTypeMappings = {\n datetime: {\n type: 'date',\n toRange: value => {\n const fromValue = value ? moment(value).utc().format(datetimeFormat) : null\n const toValue = value ? moment(value).utc().add(1, 'd').format(datetimeFormat) : null\n return {from: fromValue, to: toValue, isRangeValue: true}\n },\n fromRange: value => {\n if (value && value.from) {\n return moment.utc(value.from, datetimeFormat).local().format(dateFormat)\n }\n if (value && value.to) {\n return moment.utc(value.to, datetimeFormat).local().format(dateFormat)\n }\n return null\n },\n getToOptions: (options, fromValue) => ({...options, flatpickrOptions: {minDate: fromValue}}),\n getFromOptions: (options, toValue) => ({...options, flatpickrOptions: {maxDate: toValue}})\n },\n date: {\n getToOptions: (options, fromValue) => ({...options, flatpickrOptions: {minDate: fromValue}}),\n getFromOptions: (options, toValue) => ({...options, flatpickrOptions: {maxDate: toValue}})\n }\n}\n\nexport default rangeTypeMappings\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport _omit from 'lodash/omit'\n\nimport {\n StyledRange,\n StyledInputWrapper,\n StyledInputItemWrapper,\n StyledIconWrapper,\n StyledInput,\n StyledExtender\n} from './StyledRange'\nimport EditableValue from '../EditableValue'\nimport Ball from '../Ball'\nimport Icon from '../Icon'\nimport rangeTypeMappings from './rangeTypeMappings'\n\n/**\n * Allows to render EditableValues as a range. The value can be switched between a range or single value.\n */\nconst Range = props => {\n const {value, events, readOnly, type, options} = props\n const hasRangeValue = typeof value === 'object' && value && value.isRangeValue\n\n const exactEvents = useMemo(() => ({\n ...events,\n onChange: value => {\n events.onChange(value)\n }\n }))\n\n const toEvents = useMemo(() => ({\n onChange: toValue => {\n events.onChange({\n ...value,\n to: toValue\n })\n }\n }))\n\n const fromEvents = useMemo(() => ({\n onChange: fromValue => {\n events.onChange({\n ...value,\n from: fromValue\n })\n }\n }))\n\n const typeMapping = rangeTypeMappings[type]\n\n const getToOptions = (options, fromValue) =>\n typeMapping && typeMapping.getToOptions\n ? typeMapping.getToOptions(options, fromValue)\n : options\n\n const getFromOptions = (options, toValue) =>\n typeMapping && typeMapping.getFromOptions\n ? typeMapping.getFromOptions(options, toValue)\n : options\n\n const getFromOrTo = value =>\n typeMapping && typeMapping.fromRange\n ? typeMapping.fromRange(value)\n : value && value.from ? value.from : value && value.to ? value.to : null\n\n const getRangeValue = value =>\n typeMapping && typeMapping.toRange\n ? typeMapping.toRange(value)\n : {from: value, to: value, isRangeValue: true}\n\n const baseType = typeMapping && typeMapping.type ? typeMapping.type : type\n\n return <StyledRange>\n <StyledInputWrapper>\n {!hasRangeValue\n ? <EditableValue\n type={baseType}\n {..._omit(props, ['type'])}\n events={exactEvents}\n />\n : <StyledInput>\n <StyledInputItemWrapper>\n <EditableValue\n {...props}\n options={getFromOptions(options, value.to)}\n value={value && value.from ? value.from : null}\n events={fromEvents}\n />\n </StyledInputItemWrapper>\n <StyledIconWrapper>\n <Icon icon=\"horizontal-rule\"/>\n </StyledIconWrapper>\n <StyledInputItemWrapper>\n <EditableValue\n {...props}\n options={getToOptions(options, value.from)}\n value={value && value.to ? value.to : null}\n events={toEvents}\n />\n </StyledInputItemWrapper>\n </StyledInput>}\n </StyledInputWrapper>\n <StyledExtender>\n <Ball disabled={readOnly} icon={hasRangeValue ? 'chevron-left' : 'chevron-down'} onClick={() => {\n if (hasRangeValue) {\n events.onChange(getFromOrTo(value))\n } else {\n events.onChange(getRangeValue(value))\n }\n }}>\n </Ball>\n </StyledExtender>\n </StyledRange>\n}\n\nRange.propTypes = {\n /**\n * EditableValue type\n */\n type: PropTypes.string,\n /**\n * The Range Component can either handle a single value or and object with the following three\n * attributes: isRangeValue (true), from, to. The later two are single values.\n * example:\n * {\n * isRangeValue: true,\n * from: 1,\n * to: 2\n * }\n */\n value: PropTypes.any,\n /**\n * See EditableValue\n */\n events: PropTypes.shape({\n onChange: PropTypes.func\n }).isRequired,\n /**\n * See EditableValue\n */\n readOnly: PropTypes.bool,\n /**\n * See EditableValue\n */\n options: PropTypes.object,\n /**\n * Shown above \"from\" input\n */\n fromText: PropTypes.string,\n /**\n * Shown above \"to\" input\n */\n toText: PropTypes.string\n}\n\nexport default Range\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true\n })\n}\n","export default {\n getOptions: ({formField, formName, formData}) => ({\n upload: document => {\n formData.uploadDocument(formName, formField.id, document)\n },\n uploadText: formData.intl.formatMessage({id: 'client.component.upload.upload'}),\n uploadingText: formData.intl.formatMessage({id: 'client.component.upload.uploading'}),\n downloadText: formData.intl.formatMessage({id: 'client.component.upload.downloadTitle'}),\n deleteText: formData.intl.formatMessage({id: 'client.component.upload.deleteTitle'})\n }),\n fixLabel: () => true\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null)\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n hasValue: (value, formField) => {\n const locationMapping = formField.locationMapping\n return !!(value[locationMapping.city] || value[locationMapping.postcode])\n },\n getValue: ({formField, formData}) => {\n const locationMapping = formField.locationMapping\n const filteredLocationData = formData.formValues\n\n let renamedLocationData = {}\n for (const locKey in locationMapping) {\n for (const filteredLocDataKey in filteredLocationData) {\n if (locationMapping[locKey] === filteredLocDataKey) {\n renamedLocationData = {...renamedLocationData, [locKey]: filteredLocationData[filteredLocDataKey]}\n }\n }\n }\n return renamedLocationData\n },\n getEvents: ({formField, formName, formData, events}) => {\n const locationMapping = formField.locationMapping || {}\n const onChange = locationObject => {\n for (const key in locationMapping) {\n if (locationMapping[key] && locationObject[key] !== undefined) {\n formData.changeFieldValue(formName, locationMapping[key], locationObject[key])\n }\n }\n }\n return {\n ...events,\n onChange,\n onBlur: () => {\n formData.touchField(formName, formField.id)\n }\n }\n },\n dataContainerProps: ({formField, formName}) => ({\n locations: [formField.id],\n formValues: {\n formName: formName,\n fields: formField.locationMapping ? Object.values(formField.locationMapping) : {}\n },\n isDirty: {\n formName: formName,\n fields: formField.locationMapping\n ? [formField.locationMapping.city, formField.locationMapping.postcode]\n : []\n },\n errors: {\n formName: formName,\n fields: [formField.locationMapping.city, formField.locationMapping.postcode]\n }\n }),\n getOptions: ({formField, formData}) => ({\n fetchSuggestions: (searchTerm, country) =>\n formData.loadLocationsSuggestions(formField.id, searchTerm, country, _get(formField, 'countries')),\n isLoading: _get(formData, ['locations', formField.id, 'isLoading'], false),\n suggestions: _get(formData, ['locations', formField.id, 'suggestions'], null),\n mapButtonTitle: formData.intl.formatMessage({id: 'client.component.location.mapButtonTitle'})\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true\n })\n}\n","import _get from 'lodash/get'\nimport React from 'react'\n\nconst settings = {\n SEARCH_RESULT_LIMIT: 50,\n SUGGESTION_LIMIT: 10,\n SUGGESTION_ORDER_FIELD: 'update_timestamp'\n}\n\nexport default {\n dataContainerProps: ({formField}) => ({\n relationEntities: [formField.id],\n tooltips: [formField.targetEntity],\n navigationStrategy: true\n }),\n getOptions: ({formField, formName, formData}) => ({\n options: _get(formData, ['relationEntities', formField.id, 'data'], []),\n moreOptionsAvailable: _get(formData, ['relationEntities', formField.id, 'moreEntitiesAvailable'], false),\n isLoading: _get(formData, ['relationEntities', formField.id, 'isLoading'], false),\n fetchOptions: () => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n forceReload: true,\n limit: settings.SUGGESTION_LIMIT,\n sorting: [{field: settings.SUGGESTION_ORDER_FIELD, order: 'desc'}],\n formBase: formField.formBase\n }),\n searchOptions: searchTerm => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n searchTerm,\n limit: settings.SEARCH_RESULT_LIMIT,\n forceReload: true,\n formBase: formField.formBase\n }),\n openAdvancedSearch: value => formData.openAdvancedSearch(formName, formField, value),\n tooltips: _get(formData.tooltips, formField.targetEntity, null),\n loadTooltip: id => formData.loadTooltip(formField.targetEntity, id),\n noResultsText: formData.intl.formatMessage(\n {id: 'client.component.remoteselect.noResultsText'}\n ),\n moreOptionsAvailableText: formData.intl.formatMessage(\n {id: 'client.component.remoteselect.moreOptionsAvailableText'}\n ),\n DetailLink: formData.navigationStrategy && formData.navigationStrategy.DetailLink\n ? ({entityKey, children}) =>\n <formData.navigationStrategy.DetailLink\n entityName={formField.targetEntity}\n entityKey={entityKey}\n >\n {children}\n </formData.navigationStrategy.DetailLink>\n : null,\n createPermission: formData.entityModel\n && formField.relationName\n && formData.entityModel.paths[formField.relationName].createPermission,\n openRemoteCreate: () => formData.openRemoteCreate(formField, formName, formData)\n })\n}\n","import _get from 'lodash/get'\n\nconst settings = {\n LIMIT: 10000\n}\n\nexport default {\n dataContainerProps: ({formField}) => ({\n relationEntities: [formField.id],\n tooltips: [formField.targetEntity]\n }),\n getOptions: ({formField, formData}) => ({\n options: _get(formData, ['relationEntities', formField.id, 'data'], []),\n isLoading: _get(formData, ['relationEntities', formField.id, 'isLoading'], false),\n tooltips: _get(formData.tooltips, formField.targetEntity, null),\n loadTooltip: id => formData.loadTooltip(formField.targetEntity, id),\n noResultsText: formData.intl.formatMessage({id: 'client.component.remoteselect.noResultsText'}),\n fetchOptions: () => formData.loadRelationEntities(formField.id, formField.targetEntity, {\n forceReload: false,\n limit: settings.LIMIT\n })\n })\n}\n","export default {\n fixLabel: () => true\n}\n","import decimal from './decimal'\nimport document from './document'\nimport duration from './duration'\nimport integer from './integer'\nimport location from './location'\nimport moneyamount from './moneyamount'\nimport number from './number'\nimport phone from './phone'\nimport remote from './remote'\nimport select from './select'\nimport searchFilter from './searchFilter'\nimport html from './html'\nimport boolean from './boolean'\nimport percent from './percent'\n\nexport default {\n 'binary': document,\n 'boolean': boolean,\n 'counter': number,\n 'data-amount': number,\n 'decimal': decimal,\n 'document': document,\n 'double': decimal,\n 'duration': duration,\n 'html': html,\n 'image': document,\n 'integer': integer,\n 'location': location,\n 'long': integer,\n 'moneyamount': moneyamount,\n 'marking': boolean,\n 'multi-remote-field': remote,\n 'multi-select-box': select,\n 'named-upload': document,\n 'number': number,\n 'phone': phone,\n 'search-filter': searchFilter,\n 'single-remote-field': remote,\n 'single-select-box': select,\n 'sorting': number,\n 'percent': percent\n}\n","export default {\n getOptions: ({formData}) => ({\n hoursLabel: formData.intl.formatMessage({id: 'client.component.duration.hoursLabel'}),\n minutesLabel: formData.intl.formatMessage({id: 'client.component.duration.minutesLabel'})\n })\n}\n","export default {\n fixLabel: () => true\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', 2),\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: true,\n fixedDecimalScale: true\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n customPhoneRegex: _get(formField, 'validation.phone.customRegex', null),\n defaultCountry: _get(formField, 'validation.phone.defaultRegion', null)\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n dataContainerProps: ({formField}) => ({\n searchFilters: [formField.model]\n }),\n getOptions: ({formField, formData}) => ({\n isMulti: formField.multiple,\n options: _get(formData.searchFilters, formField.model, null),\n fetchOptions: () => formData.loadSearchFilters(formField.model, formField.group),\n noResultsText: formData.intl.formatMessage({id: 'client.component.searchfilter.noResultsText'})\n })\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n prePointDigits: _get(formField, 'validation.decimalDigits.prePointDigits', null),\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null),\n minValue: _get(formField, 'validation.numberRange.fromIncluding', null),\n maxValue: _get(formField, 'validation.numberRange.toIncluding', null),\n allowNegative: false\n })\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {EditableValue, Range} from 'tocco-ui'\n\nimport editableTypeConfigs from './editableTypeConfigs'\n\nconst getEvents = (type, formField, formName, formData, events) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getEvents\n ? editableTypeConfigs[type].getEvents({formField, formName, formData, events})\n : events\n\nconst getValue = (type, formField, formName, formData, currentValue) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getValue\n ? editableTypeConfigs[type].getValue({formField, formName, formData, currentValue})\n : currentValue\n\nconst getOptions = (type, formField, formName, formData) =>\n editableTypeConfigs[type] && editableTypeConfigs[type].getOptions\n ? editableTypeConfigs[type].getOptions({formField, formName, formData})\n : {}\n\nconst EditableValueFactory = ({type, range, formField, formName, value, info, events, formData}) => {\n const formType = formField.dataType || formField.componentType\n const options = getOptions(formType, formField, formName, formData)\n\n events = getEvents(formType, formField, formName, formData, events)\n value = getValue(formType, formField, formName, formData, value)\n\n const Component = range ? Range : EditableValue\n\n return (\n <Component\n type={type}\n events={events}\n value={value}\n {...info}\n options={options}\n {...(range && {\n fromText: formData.intl.formatMessage({id: 'client.component.range.from'}),\n toText: formData.intl.formatMessage({id: 'client.component.range.to'})\n })}\n />\n )\n}\n\nEditableValueFactory.propTypes = {\n type: PropTypes.string,\n range: PropTypes.bool,\n formName: PropTypes.string,\n formField: PropTypes.shape({\n dataType: PropTypes.string,\n componentType: PropTypes.string\n }),\n value: PropTypes.any,\n info: PropTypes.object,\n events: PropTypes.object,\n formData: PropTypes.object\n}\n\nexport default (type, range) => props => <EditableValueFactory type={type} range={range} {...props}/>\n","export default {\n getOptions: ({formData}) => ({\n downloadTitle: formData.intl.formatMessage({id: 'client.component.upload.downloadTitle'})\n })\n}\n","import React from 'react'\nexport default {\n getOptions: ({formField, formData}) => ({\n DetailLink: formData.navigationStrategy && formData.navigationStrategy.DetailLink\n ? ({entityKey, children}) =>\n <formData.navigationStrategy.DetailLink\n entityName={formField.targetEntity}\n entityKey={entityKey}\n >\n {children}\n </formData.navigationStrategy.DetailLink>\n : null\n })\n\n}\n","import document from './document'\nimport remote from './remote'\nimport description from './description'\nimport number from './number'\nimport moneyamount from './moneyamount'\n\nexport default {\n 'document-compact': document,\n 'multi-remote-field': remote,\n 'single-remote-field': remote,\n 'description': description,\n 'number': number,\n 'moneyamount': moneyamount\n}\n","export default {\n getOptions: ({formField}) => ({\n mode: formField.mode,\n title: formField.title\n }),\n getValue: ({formField}) => formField.text\n}\n","import _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', null)\n })\n}\n","\nimport _get from 'lodash/get'\n\nexport default {\n getOptions: ({formField}) => ({\n postPointDigits: _get(formField, 'validation.decimalDigits.postPointDigits', 2)\n })\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedValue} from 'tocco-ui'\n\nimport formattedTypeConfigs from './formattedTypeConfigs'\n\nconst getOptions = (fieldType, formField, formData) =>\n formattedTypeConfigs[fieldType] && formattedTypeConfigs[fieldType].getOptions\n ? formattedTypeConfigs[fieldType].getOptions({formField, formData})\n : {}\n\nconst getValue = (fieldType, formField, formData, value) =>\n formattedTypeConfigs[fieldType] && formattedTypeConfigs[fieldType].getValue\n ? formattedTypeConfigs[fieldType].getValue({formField, formData})\n : value\n\nconst FormattedValueFactory = ({type, formField, value, formData, key, breakWords}) => {\n const fieldType = formField.dataType || formField.componentType\n const options = getOptions(fieldType, formField, formData, value)\n const overwrittenValue = getValue(fieldType, formField, formData, value)\n\n return <FormattedValue key={key} type={type} value={overwrittenValue} options={options} breakWords={breakWords}/>\n}\n\nFormattedValueFactory.propTypes = {\n type: PropTypes.string,\n formField: PropTypes.shape({\n dataType: PropTypes.string,\n componentType: PropTypes.string\n }),\n value: PropTypes.any,\n formData: PropTypes.object,\n key: PropTypes.string,\n breakWords: PropTypes.bool\n}\n\nexport default type => props => <FormattedValueFactory {...props} type={type}/>\n","import editableValueFactory from './editableValueFactory'\nimport formattedValueFactory from './formattedValueFactory'\n\nconst editableMapping = {\n 'binary': editableValueFactory('document'),\n 'birthdate': editableValueFactory('date'),\n 'boolean': editableValueFactory('boolean'),\n 'char': editableValueFactory('string'),\n 'code': editableValueFactory('text'),\n 'count': editableValueFactory('string'),\n 'counter': editableValueFactory('integer'),\n 'createts': editableValueFactory('datetime'),\n 'createuser': editableValueFactory('string'),\n 'compressed-text': editableValueFactory('text'),\n 'date': editableValueFactory('date'),\n 'datetime': editableValueFactory('datetime'),\n 'decimal': editableValueFactory('number'),\n 'display': formattedValueFactory('html'),\n 'description': formattedValueFactory('description'),\n 'document': editableValueFactory('document'),\n 'double': editableValueFactory('number'),\n 'duration': editableValueFactory('duration'),\n 'email': editableValueFactory('string'),\n 'fulltext-search': editableValueFactory('string'),\n 'html': editableValueFactory('html'),\n 'image': editableValueFactory('document'),\n 'identifier': editableValueFactory('string'),\n 'integer': editableValueFactory('integer'),\n 'ipaddress': editableValueFactory('string'),\n 'latitude': editableValueFactory('string'),\n 'location': editableValueFactory('location'),\n 'login': editableValueFactory('string'),\n 'long': editableValueFactory('integer'),\n 'longitude': editableValueFactory('string'),\n 'marking': editableValueFactory('boolean'),\n 'moneyamount': editableValueFactory('number'),\n 'multi-remote-field': editableValueFactory('multi-remote'),\n 'multi-select-box': editableValueFactory('multi-select'),\n 'named-upload': editableValueFactory('document'),\n 'percent': editableValueFactory('number'),\n 'phone': editableValueFactory('phone'),\n 'postcode': editableValueFactory('string'),\n 'pulldown-date': editableValueFactory('date'),\n 'search-filter': editableValueFactory('search-filter'),\n 'serial': editableValueFactory('string'),\n 'single-remote-field': editableValueFactory('remote'),\n 'single-select-box': editableValueFactory('single-select'),\n 'sorting': editableValueFactory('integer'),\n 'string': editableValueFactory('string'),\n 'text': editableValueFactory('text'),\n 'text-area': editableValueFactory('text'),\n 'time': editableValueFactory('time'),\n 'updatets': editableValueFactory('datetime'),\n 'updateuser': editableValueFactory('string'),\n 'upload': editableValueFactory('document'),\n 'url': editableValueFactory('url'),\n 'uuid': editableValueFactory('string'),\n 'version': editableValueFactory('string')\n}\nconst readOnlyMapping = {\n 'binary': formattedValueFactory('document'),\n 'birthdate': formattedValueFactory('date'),\n 'boolean': formattedValueFactory('boolean'),\n 'code': formattedValueFactory('text'),\n 'char': formattedValueFactory('string'),\n 'counter': formattedValueFactory('integer'),\n 'createuser': formattedValueFactory('string'),\n 'createts': formattedValueFactory('datetime'),\n 'compressed-text': formattedValueFactory('text'),\n 'data-amount': formattedValueFactory('number'),\n 'date': formattedValueFactory('date'),\n 'datetime': formattedValueFactory('datetime'),\n 'decimal': formattedValueFactory('number'),\n 'display': formattedValueFactory('html'),\n 'description': formattedValueFactory('description'),\n 'duration': formattedValueFactory('duration'),\n 'document': formattedValueFactory('document'),\n 'double': formattedValueFactory('number'),\n 'email': formattedValueFactory('string'),\n 'html': formattedValueFactory('html'),\n 'image': formattedValueFactory('document'),\n 'ipaddress': formattedValueFactory('string'),\n 'identifier': formattedValueFactory('string'),\n 'latitude': formattedValueFactory('string'),\n 'login': formattedValueFactory('string'),\n 'long': formattedValueFactory('integer'),\n 'longitude': formattedValueFactory('string'),\n 'moneyamount': formattedValueFactory('number'),\n 'multi-remote-field': formattedValueFactory('multi-remote'),\n 'multi-select-box': formattedValueFactory('multi-select'),\n 'named-upload': formattedValueFactory('document'),\n 'integer': formattedValueFactory('integer'),\n 'percent': formattedValueFactory('number'),\n 'phone': formattedValueFactory('phone'),\n 'postcode': formattedValueFactory('string'),\n 'pulldown-date': formattedValueFactory('date'),\n 'remote': formattedValueFactory('remote'),\n 'search-filter': formattedValueFactory('search-filter'),\n 'serial': formattedValueFactory('string'),\n 'single-remote-field': formattedValueFactory('remote'),\n 'single-select-box': formattedValueFactory('single-select'),\n 'sorting': formattedValueFactory('integer'),\n 'string': formattedValueFactory('string'),\n 'text': formattedValueFactory('text'),\n 'text-area': formattedValueFactory('text'),\n 'time': formattedValueFactory('time'),\n 'updatets': formattedValueFactory('datetime'),\n 'updateuser': formattedValueFactory('string'),\n 'upload': formattedValueFactory('document'),\n 'url': formattedValueFactory('url'),\n 'uuid': formattedValueFactory('string'),\n 'version': formattedValueFactory('string')\n}\n\nconst listMapping = {\n ...readOnlyMapping,\n binary: formattedValueFactory('document-compact'),\n document: formattedValueFactory('document-compact'),\n image: formattedValueFactory('document-compact')\n}\n\nconst searchMapping = {\n ...editableMapping,\n text: editableValueFactory('string'),\n birthdate: editableValueFactory('date', true),\n date: editableValueFactory('date', true),\n updatets: editableValueFactory('datetime', true),\n createts: editableValueFactory('datetime', true),\n datetime: editableValueFactory('datetime', true),\n moneyamount: editableValueFactory('number', true),\n percent: editableValueFactory('number', true),\n long: editableValueFactory('integer', true),\n integer: editableValueFactory('integer', true),\n decimal: editableValueFactory('number', true),\n counter: editableValueFactory('integer', true),\n time: editableValueFactory('time', true)\n}\n\nexport default {\n editable: editableMapping,\n readOnly: readOnlyMapping,\n list: listMapping,\n search: searchMapping\n}\n","import React from 'react'\nimport {consoleLogger} from 'tocco-util'\n\nimport mappings from './mappings'\n\nexport default (mappingType, type) => {\n if (!mappings[mappingType] || !mappings[mappingType][type]) {\n consoleLogger.log(`Unable to display field: unknown mapping type combination (${mappingType} / ${type})`)\n return () => <span/>\n }\n\n return mappings[mappingType][type]\n}\n","import factory from './fieldFactory'\nimport editableTypeConfigs from './editableTypeConfigs'\n\nexport default {factory, editableTypeConfigs}\n","import _forOwn from 'lodash/forOwn'\nimport _reduce from 'lodash/reduce'\nimport _pick from 'lodash/pick'\n\nexport const generalErrorField = '_error'\nexport const entityValidatorErrorsField = 'entityValidatorErrors'\nexport const relatedEntityErrorsField = 'relatedEntityErrors'\nexport const outdatedErrorField = 'outdatedError'\n\nconst getFieldErrors = formErrors => {\n const fieldErrors = {...formErrors}\n delete fieldErrors[generalErrorField]\n return fieldErrors\n}\n\nconst hasFieldErrors = formErrors => (\n Object.keys(getFieldErrors(formErrors)).length >= 1\n)\n\nconst hasValidatorErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[entityValidatorErrorsField] && Object.keys(errors[entityValidatorErrorsField]).length >= 1)\n}\n\nconst getValidatorErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return _reduce(errors[entityValidatorErrorsField], (result, value) => [...result, ...value], [])\n}\n\nconst hasRelatedEntityErrors = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[relatedEntityErrorsField] && errors[relatedEntityErrorsField].length >= 1)\n}\n\nconst getGeneralErrors = formErrors => (\n formErrors[generalErrorField]\n)\n\nconst getFirstErrorField = formErrors => (\n Object.keys(getFieldErrors(formErrors))[0]\n)\n\nconst hasOutdatedError = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return !!(errors && errors[outdatedErrorField] && Object.keys(errors[outdatedErrorField]).length >= 1)\n}\n\nconst outdatedResponseToFormError = (response, entity) => ({\n [generalErrorField]: {\n [outdatedErrorField]: {\n ..._pick(response, ['updateTimestamp', 'updateUser', 'key', 'model']),\n sameEntity: entity.model === response.model && entity.key === response.key\n }\n }\n})\n\nconst getOutdatedError = formErrors => {\n const errors = getGeneralErrors(formErrors)\n return errors[outdatedErrorField]\n}\n\nconst getRelatedEntityErrorsCompact = formErrors => {\n const relatedEntityErrors = getGeneralErrors(formErrors).relatedEntityErrors\n\n return _reduce(relatedEntityErrors, (result, relatedEntityError) => {\n const {key, model, paths, entityValidatorErrors} = relatedEntityError\n\n const r = [...result]\n _forOwn(paths, (values, fieldName) => {\n _forOwn(values, (errors, errorKey) => {\n r.push(...(errors.map(e => `${e} (${fieldName}, ${model}, ${key})`)))\n })\n })\n\n if (entityValidatorErrors && Object.keys(entityValidatorErrors).length >= 1) {\n r.push(...(\n _reduce(\n entityValidatorErrors,\n (result, value) => [...result, ...(value.map(e => `${e} (${model}, ${key})`))],\n []))\n )\n }\n\n return r\n }, [])\n}\n\nconst addErrors = (errors, field, fieldErrors) => (\n {\n ...errors,\n [field]:\n {\n ...(errors[field] || {}),\n ...(fieldErrors || {})\n }\n }\n)\n\nexport default {\n hasFieldErrors,\n getFieldErrors,\n getValidatorErrors,\n hasValidatorErrors,\n hasRelatedEntityErrors,\n hasOutdatedError,\n getFirstErrorField,\n getRelatedEntityErrorsCompact,\n addErrors,\n outdatedResponseToFormError,\n getOutdatedError\n}\n","import PropTypes from 'prop-types'\nimport React, {memo} from 'react'\n\nimport StyledLayoutBox from './StyledLayoutBox'\n\n/**\n * Wrap as many <Layout.Box/> into a <Layout.Container> to layout them.\n */\nconst LayoutBox = ({children}) => (\n <StyledLayoutBox>\n {children}\n </StyledLayoutBox>\n)\n\nLayoutBox.propTypes = {\n children: PropTypes.node\n}\n\nexport default memo(LayoutBox)\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nconst StyledLayoutContainer = styled.div`\n display: grid;\n padding-right: ${scale.space(0)};\n ${({containerWidth, theme}) => containerWidth < 600\n? 'grid-template-columns: 100%;'\n : `grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n grid-gap: ${scale.space(0.25)({theme})}`\n };\n ${({occupiesRemainingHeight}) => occupiesRemainingHeight && `\n flex: 1;\n `};\n`\n\nexport default StyledLayoutContainer\n","import PropTypes from 'prop-types'\nimport React, {useRef, useState, useEffect} from 'react'\n\nimport StyledLayoutContainer from './StyledLayoutContainer'\n\nconst LayoutContainer = ({children, occupiesRemainingHeight}) => {\n const ref = useRef(null)\n const [containerWidth, setContainerWidth] = useState(0)\n\n const setPixelWidth = () => {\n setContainerWidth(ref.current.offsetWidth)\n }\n\n useEffect(() => {\n setPixelWidth()\n window.addEventListener('resize', setPixelWidth)\n return () => window.removeEventListener('resize', setPixelWidth)\n }, [])\n\n return (\n <StyledLayoutContainer\n ref={ref}\n containerWidth={containerWidth}\n occupiesRemainingHeight={occupiesRemainingHeight}>\n {children}\n </StyledLayoutContainer>\n )\n}\n\nLayoutContainer.propTypes = {\n children: PropTypes.node,\n occupiesRemainingHeight: PropTypes.bool\n}\n\nexport default LayoutContainer\n","import Box from './LayoutBox'\nimport Container from './LayoutContainer'\nimport StyledLayoutBox from './StyledLayoutBox'\nimport StyledLayoutContainer from './StyledLayoutContainer'\nimport {StyledScrollbar} from './StyledScrollbar'\n\nexport {\n StyledLayoutBox,\n StyledLayoutContainer,\n StyledScrollbar\n}\n\nexport default {\n Box,\n Container\n}\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport _get from 'lodash/get'\nimport {StatedValue, Typography} from 'tocco-ui'\nimport {consoleLogger} from 'tocco-util'\n\nimport field from '../field'\nimport fromData from '../formData'\n\nconst FormFieldWrapper = props => {\n const hasValueOverwrite = props.typeEditable && props.typeEditable.hasValue\n && props.typeEditable.hasValue(props.formData.formValues, props.formField)\n\n return <StatedValue\n {...props}\n dirty={props.formData.isDirty || props.dirty}\n error={props.formData.errors || props.error}\n hasValue={hasValueOverwrite || props.hasValue}\n >\n {React.cloneElement(props.children, {formData: props.formData})}\n </StatedValue>\n}\n\nFormFieldWrapper.propTypes = {\n typeEditable: PropTypes.object,\n children: PropTypes.node,\n formData: PropTypes.object,\n formField: PropTypes.object,\n dirty: PropTypes.bool,\n error: PropTypes.object,\n hasValue: PropTypes.bool\n}\n\nconst displayFieldTypes = ['display', 'description']\nconst multiTypes = ['multi-select-box', 'multi-remote-field', 'search-filter']\n\nconst isMultipleFields = (value, dataType) =>\n Array.isArray(value) && !multiTypes.includes(dataType)\n\nconst displayFieldAsDisplayOnly = (value, componentType, dataType, parentReadOnly) => {\n if (parentReadOnly) {\n return true\n }\n\n if (displayFieldTypes.includes(componentType)) {\n return true\n }\n\n if (isMultipleFields(value, dataType)) {\n return true\n }\n\n return false\n}\n\nexport const formFieldFactory = (fieldMappingType, data, resources = {}) => {\n try {\n const {\n formDefinitionField,\n entityField,\n id,\n value,\n dirty,\n touched,\n events,\n error,\n submitting,\n parentReadOnly,\n formName,\n mode\n } = data\n\n const {\n componentType,\n dataType,\n readonly\n } = formDefinitionField\n\n const readOnly = (\n parentReadOnly\n || readonly\n || submitting\n || !_get(entityField, 'writable', true)\n )\n\n const mandatory = !readOnly && _get(formDefinitionField, 'validation.mandatory', false) && mode !== 'search'\n const hasValue = value !== null\n && value !== undefined\n && value !== false\n && (value.length === undefined || value.length > 0)\n const isDisplay = displayFieldAsDisplayOnly(value, componentType, dataType, parentReadOnly)\n\n const type = formDefinitionField.dataType || formDefinitionField.componentType\n let requestedFromData\n\n const typeEditable = field.editableTypeConfigs[type]\n\n if (typeEditable && typeEditable.dataContainerProps) {\n requestedFromData = typeEditable.dataContainerProps({formField: formDefinitionField, formName})\n }\n\n const fixLabel = typeEditable && typeEditable.fixLabel && typeEditable.fixLabel()\n\n return (\n <fromData.FormDataContainer {...requestedFromData}>\n <FormFieldWrapper\n typeEditable={typeEditable}\n dirty={dirty}\n error={error}\n hasValue={hasValue}\n id={id}\n immutable={readOnly}\n isDisplay={isDisplay}\n key={id}\n label={formDefinitionField.label}\n mandatory={mandatory}\n mandatoryTitle={resources.mandatoryTitle}\n touched={touched}\n fixLabel={fixLabel}\n formField={formDefinitionField}\n >\n <ValueField\n fieldMappingType={isDisplay ? 'readOnly' : fieldMappingType}\n formName={formName}\n formField={formDefinitionField}\n value={value}\n info={{id, readOnly, mandatory}}\n events={events}\n />\n </FormFieldWrapper>\n </fromData.FormDataContainer>\n )\n } catch (exception) {\n consoleLogger.logError('Error creating formField', exception)\n return <span/>\n }\n}\n\nexport const MultiSeparator = () => (<Typography.Span>, </Typography.Span>)\n\nconst ValueField = ({\n fieldMappingType,\n formName,\n formField,\n value,\n info,\n events,\n formData\n}) => {\n const Field = useMemo(() =>\n field.factory(fieldMappingType, formField.dataType || formField.componentType), []\n )\n\n if (isMultipleFields(value, formField.dataType)) {\n return value\n .map((v, idx) => <Field\n formField={formField}\n formName={formName}\n value={v}\n info={info}\n events={events}\n formData={formData}\n key={'valueField-' + formField.id + idx}\n />)\n .reduce((prev, curr, idx) => [prev, <MultiSeparator key={'sep' + idx}/>, curr])\n }\n\n return <Field\n formField={formField}\n formName={formName}\n value={value}\n info={info}\n events={events}\n formData={formData}\n />\n}\n\nValueField.propTypes = {\n events: PropTypes.objectOf(PropTypes.func),\n fieldMappingType: PropTypes.string.isRequired,\n formData: PropTypes.object,\n formField: PropTypes.object,\n formName: PropTypes.string,\n info: PropTypes.object,\n value: PropTypes.any\n}\n","import {formFieldFactory} from './formField'\n\nexport default {formFieldFactory}\n","import PropTypes from 'prop-types'\nimport _omit from 'lodash/omit'\nimport {injectIntl} from 'react-intl'\n\nimport formField from '../formField'\n\nconst extractEventsFromInput = input => (\n _omit(input, ['name', 'value'])\n)\n\nconst ReduxFormFieldAdapter = props => {\n const {\n input,\n meta: {dirty, touched, error, submitting},\n id,\n formDefinitionField,\n entityField,\n parentReadOnly,\n formName,\n mode\n } = props\n\n const events = extractEventsFromInput(input)\n\n const fomFieldData = {\n formDefinitionField,\n id,\n formName,\n value: input.value,\n dirty,\n touched,\n submitting,\n events,\n error,\n entityField,\n parentReadOnly,\n mode\n }\n const resources = {\n mandatoryTitle: props.intl.formatMessage({id: 'client.component.form.mandatoryFieldTitle'})\n }\n\n return formField.formFieldFactory(props.fieldMappingType, fomFieldData, resources)\n}\n\nReduxFormFieldAdapter.propTypes = {\n intl: PropTypes.object.isRequired,\n id: PropTypes.string,\n input: PropTypes.shape({\n value: PropTypes.any,\n name: PropTypes.string,\n onChange: PropTypes.func\n }).isRequired,\n meta: PropTypes.shape({\n touched: PropTypes.bool,\n error: PropTypes.objectOf(\n PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.node, PropTypes.string]))\n ),\n dirty: PropTypes.bool,\n submitting: PropTypes.bool\n }).isRequired,\n formDefinitionField: PropTypes.object.isRequired,\n entityField: PropTypes.object,\n parentReadOnly: PropTypes.bool,\n fieldMappingType: PropTypes.string.isRequired,\n mode: PropTypes.string\n}\n\nexport default injectIntl(ReduxFormFieldAdapter)\n","export default Object.freeze({\n FIELD_SET: 'field-set',\n FIELD: 'field',\n ACTION: 'action',\n ACTION_BAR: 'action-bar',\n LAYOUT: 'layout',\n TABLE: 'table',\n SUB_TABLE: 'sub-table',\n DISPLAY: 'display'\n})\n","import _uniq from 'lodash/uniq'\n\nimport componentTypes from './enums/componentTypes'\nexport const getFieldId = (formName, fieldName) => (\n `input-${formName}-${fieldName}`\n)\n\nexport const getFieldDefinitions = formDefinition => {\n return getFieldsOfChildren(formDefinition)\n}\n\nconst validFieldTypes = [\n componentTypes.FIELD,\n componentTypes.DISPLAY\n]\n\nconst getFieldsOfChildren = definition => {\n const result = []\n\n for (let i = 0; i < definition.children.length; i++) {\n if (definition.children[i].children) {\n result.push(...getFieldsOfChildren(definition.children[i]))\n }\n\n const componentType = definition.children[i].componentType\n if (validFieldTypes.includes(componentType) && definition.hidden !== true) {\n result.push({\n ...definition.children[i],\n readonly: definition.readonly,\n ignoreCopy: definition.ignoreCopy\n })\n }\n }\n\n return result\n}\n\nexport const getDefaultValues = fieldDefinitions =>\n fieldDefinitions\n .filter(f => f.defaultValue)\n .reduce((valueObj, field) => ({\n ...valueObj,\n [field.path || field.id]: field.defaultValue\n }), {})\n\nconst typePathsHandlers = {\n location: fieldDefinition => Object.values(fieldDefinition.locationMapping).filter(v => v)\n}\n\nexport const getUsedPaths = fieldDefinitions =>\n _uniq(\n fieldDefinitions\n .filter(field => field.componentType === componentTypes.FIELD)\n .reduce((accumulator, field) =>\n [\n ...accumulator,\n ...(typePathsHandlers[field.dataType] ? typePathsHandlers[field.dataType](field) : [field.path || field.id])\n ],\n [])\n )\n","import _forOwn from 'lodash/forOwn'\nimport _isEqual from 'lodash/isEqual'\nimport _reduce from 'lodash/reduce'\n\nimport {generalErrorField, entityValidatorErrorsField, relatedEntityErrorsField} from './formErrors'\n\nexport const validationErrorToFormError = (entity, errors) => {\n let result = {[generalErrorField]: {[relatedEntityErrorsField]: []}}\n\n if (!errors) {\n return result\n }\n errors.forEach(error => {\n if (error.model === entity.model && ((!entity.key && !error.key) || error.key === entity.key)) {\n result = {...result, ...error.paths}\n if (Object.prototype.hasOwnProperty.call(error, entityValidatorErrorsField)) {\n result[generalErrorField][entityValidatorErrorsField] = error[entityValidatorErrorsField]\n }\n } else {\n result[generalErrorField][relatedEntityErrorsField].push(error)\n }\n })\n return result\n}\n\n// workaround: redux-forms can't get the value of a field if the field-name contains a dot.\nexport const transformFieldName = fieldName => (fieldName.replace(/\\./g, '--'))\nexport const transformFieldNameBack = fieldName => (fieldName.replace(/--/g, '.'))\n\nexport const entityToFormValues = entity => {\n return _reduce(entity, (acc, val, key) => ({...acc, [transformFieldName(key)]: val}), {})\n}\n\nexport const formValuesToFlattenEntity = entity => {\n return _reduce(entity, (acc, val, key) => ({...acc, [transformFieldNameBack(key)]: val}), {})\n}\n\nexport const getDirtyFields = (initialValues, values, isCreate) => {\n const dirtyFields = []\n\n _forOwn(values, (value, key) => {\n if (isCreate || !_isEqual(value, initialValues[key])) {\n dirtyFields.push(key)\n }\n })\n\n return dirtyFields\n}\n\nexport const isValueEmpty = v =>\n v === null\n || v === undefined\n || v === ''\n || (Array.isArray(v) && v.length === 0)\n || (typeof v === 'object' && Object.keys(v).length === 0)\n","export default Object.freeze({\n VERTICAL_BOX: 'vertical-box',\n HORIZONTAL_BOX: 'horizontal-box'\n})\n","import styled from 'styled-components'\nimport {scale, theme} from 'tocco-ui'\n\nexport const StyledActionsWrapper = styled.div`\n background-color: ${theme.color('paper')};\n padding-bottom: ${scale.space(-0.5)};\n display: flex;\n flex-wrap: wrap;\n z-index: 2; // Higher than StyledIndicatorsContainerWrapper\n position: sticky;\n top: 0;\n\n & > * {\n margin-top: ${scale.space(-0.5)};\n }\n`\n","/* eslint-disable react/prop-types */\n// propTypes are not recognized properly in this file\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport {Field} from 'redux-form'\nimport _get from 'lodash/get'\nimport _pick from 'lodash/pick'\nimport {Layout, Panel, Typography} from 'tocco-ui'\nimport {consoleLogger, js} from 'tocco-util'\n\nimport ReduxFormFieldAdapter from './ReduxFormFieldAdapter'\nimport {getFieldId} from './formDefinition'\nimport {transformFieldName} from './reduxForm'\nimport actions from '../actions'\nimport componentTypes from './enums/componentTypes'\nimport layoutTypes from './enums/layoutTypes'\nimport {isAction} from '../actions/actions'\nimport {StyledActionsWrapper} from './StyledFormBuilder'\n\nconst FormBuilder = props => {\n const {\n componentMapping,\n entity,\n mode,\n beforeRenderField,\n formDefinition,\n formValues,\n formName,\n fieldMappingType,\n customRenderedActions\n } = props\n\n const modeFitsScope = (mode, scopes) => (\n !mode || !scopes || scopes.length === 0 || scopes.includes(mode)\n )\n\n const formTraverser = (children, parentReadOnly = false) => {\n const result = []\n for (const child of children) {\n if (child.componentType === componentTypes.LAYOUT) {\n result.push(createLayoutComponent(child, child.layoutType, parentReadOnly))\n } else if (isAction(child.componentType)) {\n result.push(createAction(child))\n } else if (child.componentType === componentTypes.FIELD_SET) {\n result.push(createFieldSet(child, parentReadOnly))\n } else if (componentMapping && componentMapping[child.componentType]) {\n return createCustomComponent(child)\n }\n }\n return result\n }\n\n const createFieldSet = (fieldSet, parentReadOnly) => {\n const fieldDefinition = fieldSet.children.find(child => !isAction(child.componentType))\n\n if (!fieldDefinition) {\n return null\n }\n\n const formDefinitionField = {\n ...fieldDefinition,\n ..._pick(fieldSet, ['label', 'hidden', 'readonly', 'scopes'])\n }\n\n const fieldName = formDefinitionField.path || formDefinitionField.id\n const entityField = _get(entity, 'paths.' + fieldName.split('.').join('.value.paths.'))\n\n const shouldRenderField = (formDefinitionField, entityField) => {\n if (!modeFitsScope(mode, formDefinitionField.scopes)) {\n return false\n }\n\n if (formDefinitionField.hidden) {\n return false\n }\n\n if (beforeRenderField && !beforeRenderField(fieldName)) {\n return false\n }\n\n if (fieldMappingType === 'search') {\n return true\n }\n\n const hasEmptyValue = (fieldName, formValues) => {\n if (!Object.prototype.hasOwnProperty.call(formValues || {}, fieldName)) {\n return true\n } else {\n const value = formValues[fieldName]\n return (value == null || value === '' || (Array.isArray(value) && value.length === 0))\n }\n }\n\n const readOnly = (\n parentReadOnly\n || formDefinition.readonly\n || (entityField && entityField.writable === false)\n || (mode !== 'create' && !entityField && formDefinitionField.componentType !== 'description'\n && formDefinitionField.dataType !== 'location')\n || formDefinitionField.readonly || formDefinitionField.componentType === 'display'\n )\n\n return !(readOnly && hasEmptyValue(transformFieldName(fieldName), formValues))\n }\n\n if (shouldRenderField(formDefinitionField, entityField)) {\n return <Field\n key={`field-${fieldName}`}\n parentReadOnly={parentReadOnly}\n name={transformFieldName(fieldName)}\n id={getFieldId(formName, fieldName)}\n formName={formName}\n component={ReduxFormFieldAdapter}\n formDefinitionField={formDefinitionField}\n entityField={entityField}\n fieldMappingType={fieldMappingType}\n format={null}\n mode={mode}\n />\n }\n\n return null\n }\n\n const createAction = action => {\n const entityName = _get(props, 'entity.model')\n const entityKey = _get(props, 'entity.key')\n\n return <StyledActionsWrapper\n key={`action-${action.id}`}\n >\n <actions.Action\n definition={action}\n selection={actions.getSingleEntitySelection(entityName, entityKey)}\n mode={mode}\n customRenderedActions={customRenderedActions}\n />\n </StyledActionsWrapper>\n }\n\n const createLayoutComponent = (field, type, parentReadOnly) => {\n let elements = formTraverser(field.children, parentReadOnly || field.readonly)\n\n if (Array.isArray(elements)) {\n elements = elements.filter(Boolean)\n }\n\n if (!elements || (Array.isArray(elements) && elements.length === 0)) {\n return null\n }\n\n const content = field.label\n ? <Panel.Wrapper isFramed={true} isOpen={true}>\n <Panel.Header><Typography.H4>{field.label}</Typography.H4></Panel.Header>\n <Panel.Body>{elements}</Panel.Body>\n </Panel.Wrapper>\n : elements\n\n const layoutMap = {\n [layoutTypes.HORIZONTAL_BOX]: Layout.Container,\n [layoutTypes.VERTICAL_BOX]: Layout.Box\n }\n\n const LayoutComponent = layoutMap[type]\n const key = `layoutcomponent-${field.id}-${field.layoutType}`\n\n if (LayoutComponent) {\n return <LayoutComponent\n key={key}\n occupiesRemainingHeight={field.occupiesRemainingHeight}>\n {content}\n </LayoutComponent>\n } else {\n consoleLogger.logWarning(`Layout type \"${type}\" for box \"${field.id}\" is unknown.`)\n return null\n }\n }\n\n const createCustomComponent = field => {\n if (!modeFitsScope(mode, field.scopes)) {\n return null\n }\n\n const key = `custom-component-${field.id}-${field.layoutType}`\n const component = componentMapping[field.componentType]\n\n return component(field, key)\n }\n\n return formTraverser(formDefinition.children, formDefinition.readonly)\n}\n\nFormBuilder.propTypes = {\n entity: PropTypes.object,\n formName: PropTypes.string.isRequired,\n formDefinition: PropTypes.object.isRequired,\n formValues: PropTypes.object,\n mode: PropTypes.string,\n componentMapping: PropTypes.objectOf(PropTypes.func),\n beforeRenderField: PropTypes.func,\n customRenderedActions: PropTypes.objectOf(PropTypes.func)\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(FormBuilder, areEqual)\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\nimport isEmail from 'validator/lib/isEmail'\nimport isUrl from 'validator/lib/isURL'\n\nexport const minLengthValidator = (value, minLength) =>\n value.length < minLength\n ? {\n minLength: [\n <FormattedMessage\n key=\"syncValidationMinLength\"\n id=\"client.component.form.syncValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n : null\n\nexport const minNumberValidator = (value, minValue) =>\n value < minValue\n ? {\n maxNumber: [\n <FormattedMessage\n key=\"syncValidationMaxNumber\"\n id=\"client.component.form.syncValidationMinNumber\"\n values={{minValue}}\n />\n ]\n }\n : null\n\nexport const maxLengthValidator = (value, maxLength) =>\n value.length > maxLength\n ? {\n maxLength: [\n <FormattedMessage\n key=\"syncValidationMaxLength\"\n id=\"client.component.form.syncValidationMaxLength\"\n values={{maxLength}}\n />\n ]\n }\n : null\n\nexport const maxNumberValidator = (value, maxValue) =>\n value > maxValue\n ? {\n maxNumber: [\n <FormattedMessage\n key=\"syncValidationMaxNumber\"\n id=\"client.component.form.syncValidationMaxNumber\"\n values={{maxValue}}\n />\n ]\n }\n : null\n\nexport const postPointValidator = (value, limit) =>\n value.toString().includes('.') && value.toString().split('.')[1].length > limit\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationPrePoint\"\n id=\"client.component.form.syncValidationPrePoint\"\n values={{limit}}\n />\n ]\n }\n : null\n\nexport const prePointValidator = (value, limit) =>\n limit > 0 && value.toString().split('.')[0].length > limit\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationPrePoint\"\n id=\"client.component.form.syncValidationPrePoint\"\n values={{limit}}\n />\n ]\n }\n : null\n\nexport const regexValidator = (value, pattern) =>\n !RegExp(pattern).test(value)\n ? {\n prePoint: [\n <FormattedMessage\n key=\"syncValidationRegexPattern\"\n id=\"client.component.form.syncValidationRegexPattern\"\n values={{pattern}}\n />\n ]\n }\n : null\n\nexport const emailValidator = value =>\n !isEmail(value)\n ? {\n format: [<FormattedMessage\n key=\"invalidEmail\"\n id=\"client.component.form.invalidEmail\"\n />\n ]\n\n }\n : null\n\nexport const urlValidator = value =>\n !isUrl(value) && !(value.includes('localhost') && isUrl(value, {require_tld: false}))\n ? {\n format: [<FormattedMessage\n key=\"invalidUrl\"\n id=\"client.component.form.invalidUrl\"\n />\n ]\n }\n : null\n\nexport default {\n 'length.fromIncluding': minLengthValidator,\n 'length.toIncluding': maxLengthValidator,\n 'numberRange.fromIncluding': minNumberValidator,\n 'numberRange.toIncluding': maxNumberValidator,\n 'decimalDigits.postPointDigits': postPointValidator,\n 'decimalDigits.prePointDigits': prePointValidator,\n 'regex.pattern': regexValidator,\n 'email': emailValidator,\n 'url': urlValidator\n}\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\n\nconst DEFAULT_DEFAULT_REGION = 'CH'\nexport const phoneValidator = async(value, phoneValidation = {}) => {\n const libphone = await import(/* webpackChunkName: \"vendor-libphonenumber-js\" */ 'libphonenumber-js')\n const isValidCustomRegex = phoneValidation.customRegex && value.match(phoneValidation.customRegex)\n const isValidPhoneNumber = libphone.isValidNumber(\n value,\n (phoneValidation.defaultRegion) || DEFAULT_DEFAULT_REGION\n )\n\n return (isValidCustomRegex || isValidPhoneNumber)\n ? null\n : {\n phone: [<FormattedMessage\n key=\"invalidPhoneNumber\"\n id=\"client.component.form.invalidPhoneNumber\"\n />\n ]\n }\n}\n\nexport default {\n phone: phoneValidator\n}\n","import syncValidators from './syncValidators'\nimport asyncValidators from './asyncValidators'\nimport {mandatoryError, valueDefined} from './mandatory'\n\nexport default {syncValidators, asyncValidators, mandatoryError, valueDefined}\n","import React from 'react'\nimport {FormattedMessage} from 'react-intl'\n\nexport const valueDefined = value => !(\n value === null\n || value === undefined\n || value === ''\n || (Array.isArray(value) && value.length === 0)\n || (typeof value === 'object' && Object.keys(value).length === 0)\n)\n\nexport const mandatoryError = {\n mandatory: [\n <FormattedMessage\n key=\"syncValidationRequired\"\n id=\"client.component.form.syncValidationRequired\"\n />\n ]\n}\n","import {SubmissionError} from 'redux-form/es/SubmissionError'\nimport {api} from 'tocco-util'\nimport _has from 'lodash/has'\nimport _get from 'lodash/get'\n\nimport rest from '../rest'\nimport validators from './validators'\nimport formErrors from './formErrors'\nimport {formValuesToFlattenEntity, getDirtyFields, validationErrorToFormError} from './reduxForm'\n\nconst OUTDATED_ENTITY_ERROR_CODE = 'OUTDATED_ENTITY'\n\nconst hasError = errors => (\n errors && Object.keys(errors).length > 0\n)\n\nconst localeValidation = async(values, fieldDefinitions) => {\n let errors = {}\n for (const fieldDefinition of fieldDefinitions) {\n const value = values[fieldDefinition.path]\n if (validators.valueDefined(value)) {\n for (const asyncValidatorKey in validators.asyncValidators) {\n if (_has(fieldDefinition, ['validation', asyncValidatorKey])) {\n const validatorValue = _get(fieldDefinition, ['validation', asyncValidatorKey])\n const validator = validators.asyncValidators[asyncValidatorKey]\n const validatorErrors = await validator(value, validatorValue)\n if (validatorErrors) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validatorErrors)\n }\n }\n }\n }\n }\n return errors\n}\n\nconst validateRequest = (formValues, initialValues, mode) => {\n const dirtyFields = getDirtyFields(initialValues, formValues)\n const flattenEntity = formValuesToFlattenEntity(formValues)\n const entity = api.toEntity(flattenEntity, dirtyFields)\n const options = {\n queryParams: {_validate: true},\n method: mode === 'create' ? 'POST' : 'PATCH',\n headers: {'X-Client-Questions': 'false'},\n body: entity,\n acceptedErrorCodes: [OUTDATED_ENTITY_ERROR_CODE]\n }\n\n return rest.simpleRequest(`entities/2.0/${entity.model}${entity.key ? `/${entity.key}` : ''}`, options)\n .then(resp => resp.body)\n .then(body => {\n if (body.valid) {\n return {}\n }\n\n if (body.errorCode === OUTDATED_ENTITY_ERROR_CODE) {\n return formErrors.outdatedResponseToFormError(body, entity)\n }\n\n return validationErrorToFormError(entity, body.errors)\n })\n}\n\nexport const submitValidation = (formValues, initialValues, mode) =>\n validateRequest(formValues, initialValues, mode)\n .then(errors => {\n if (hasError(errors)) {\n throw new SubmissionError(errors)\n }\n })\n\nexport const asyncValidation = async(formValues, initialValues, fieldDefinitions, mode) => {\n const localeValidationErrors = await localeValidation(formValues, fieldDefinitions)\n if (hasError(localeValidationErrors)) {\n throw localeValidationErrors\n }\n\n const validateRequestErrors = await validateRequest(formValues, initialValues, mode)\n if (hasError(validateRequestErrors)) {\n throw validateRequestErrors\n }\n}\n","export default Object.freeze({\n CREATE: 'create',\n UPDATE: 'update'\n})\n","import _get from 'lodash/get'\nimport {call} from 'redux-saga/effects'\n\nimport rest from '../rest'\n\nfunction* loadDisplays(fields, entityModel) {\n const displayRequest = fields.reduce((acc, field) => {\n const {id, value} = field\n const fieldModel = _get(entityModel, ['paths', id])\n if (fieldModel && fieldModel.type === 'relation') {\n const targetEntity = fieldModel.targetEntity\n const arrayValue = Array.isArray(value) ? value : [value]\n\n return {\n ...acc,\n [targetEntity]: [\n ...(acc[targetEntity] || []),\n ...arrayValue\n ]\n }\n }\n return acc\n }\n , {})\n\n if (Object.keys(displayRequest).length === 0) {\n return null\n }\n\n return yield call(rest.fetchDisplays, displayRequest)\n}\n\nexport const NOT_FOUND_DISPLAY = '??'\nconst relationFieldTransformer = (value, displays, targetEntity) =>\n ({key: value, display: _get(displays, [targetEntity, value], NOT_FOUND_DISPLAY)})\n\nconst fieldTypeTransformer = (value, fieldModel, displays) => {\n if (fieldModel && fieldModel.type === 'relation') {\n const {targetEntity} = fieldModel\n\n if (fieldModel.multi) {\n return value.map(v => relationFieldTransformer(v, displays, targetEntity))\n } else {\n return relationFieldTransformer(value, displays, targetEntity)\n }\n }\n\n return value\n}\n\n/**\n * Takes an array of values and transforms it into usable form values and load displays where needed.\n *\n * @param {array} fields Input array with schema [{id: 'firstname', value: 'Donald'}, {id: 'relGender', value: '1'}]\n * @param {entityModel} entityModel\n *\n * @return {object} With schema {firstname: 'Donald', relGender: {key: '1', display: 'Male'}}\n */\nexport default function* transformInputValues(fields, entityModel) {\n const displays = yield call(loadDisplays, fields, entityModel)\n\n return fields.reduce((acc, field) => {\n const {id, value} = field\n const fieldModel = _get(entityModel, ['paths', id])\n\n return {\n ...acc,\n [id]: fieldTypeTransformer(value, fieldModel, displays)\n }\n }, {})\n}\n","import formErrorsUtil from './formErrors'\nimport FormBuilder from './FormBuilder'\nimport {getFieldId, getFieldDefinitions, getDefaultValues, getUsedPaths} from './formDefinition'\nimport syncValidation from './syncValidation'\nimport {asyncValidation, submitValidation} from './asyncValidation'\nimport {\n formValuesToFlattenEntity,\n entityToFormValues,\n getDirtyFields,\n validationErrorToFormError,\n transformFieldName,\n transformFieldNameBack,\n isValueEmpty\n} from './reduxForm'\nimport componentTypes from './enums/componentTypes'\nimport layoutTypes from './enums/layoutTypes'\nimport scopes from './enums/scopes'\nimport validators from './validators'\nimport transformInputValues from './transformInputValues'\n\nexport default {\n formErrorsUtil,\n FormBuilder,\n getFieldId,\n getFieldDefinitions,\n getDefaultValues,\n getUsedPaths,\n formValuesToFlattenEntity,\n entityToFormValues,\n getDirtyFields,\n validationErrorToFormError,\n transformFieldName,\n transformFieldNameBack,\n syncValidation,\n componentTypes,\n layoutTypes,\n scopes,\n validators,\n transformInputValues,\n asyncValidation,\n submitValidation,\n isValueEmpty\n}\n","import _has from 'lodash/has'\nimport _get from 'lodash/get'\n\nimport validators from './validators'\nimport formErrors from './formErrors'\n\nexport default fieldDefinitions => values => {\n let errors = {}\n\n fieldDefinitions.forEach(fieldDefinition => {\n const value = values[fieldDefinition.path]\n\n if (validators.valueDefined(value)) {\n Object.keys(validators.syncValidators).forEach(syncValidatorKey => {\n if (_has(fieldDefinition, ['validation', ...syncValidatorKey.split('.')])) {\n const validatorValue = _get(fieldDefinition, ['validation', ...syncValidatorKey.split('.')])\n const validator = validators.syncValidators[syncValidatorKey]\n const validatorErrors = validator(value, validatorValue)\n if (validatorErrors) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validatorErrors)\n }\n }\n })\n } else {\n if (fieldDefinition.validation && fieldDefinition.validation.mandatory) {\n errors = formErrors.addErrors(errors, fieldDefinition.path, validators.mandatoryError)\n }\n }\n })\n\n return errors\n}\n","export const LOAD_RELATION_ENTITIES = 'formData/LOAD_RELATION_ENTITIES'\nexport const SET_RELATION_ENTITIES = 'formData/SET_RELATION_ENTITIES'\nexport const SET_RELATION_ENTITIES_LOADING = 'formData/SET_RELATION_ENTITIES_LOADING'\n\nexport const loadRelationEntities = (fieldName, entityName, options) => ({\n type: LOAD_RELATION_ENTITIES,\n payload: {\n fieldName,\n entityName,\n options\n }\n})\n\nexport const setRelationEntityLoading = fieldName => ({\n type: SET_RELATION_ENTITIES_LOADING,\n payload: {\n fieldName\n }\n})\n\nexport const setRelationEntities = (fieldName, entities, moreEntitiesAvailable = false) => ({\n type: SET_RELATION_ENTITIES,\n payload: {\n fieldName,\n entities,\n moreEntitiesAvailable\n }\n})\n","import * as actions from './actions'\n\nexport const setRelationEntities = (state, {payload: {fieldName, entities, moreEntitiesAvailable}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [fieldName]: {\n data: entities,\n isLoading: false,\n moreEntitiesAvailable\n }\n }\n }\n)\n\nexport const setRelationEntitiesLoading = (state, {payload: {fieldName}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [fieldName]: {\n isLoading: true,\n data: []\n }\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_RELATION_ENTITIES]: setRelationEntities,\n [actions.SET_RELATION_ENTITIES_LOADING]: setRelationEntitiesLoading\n}\n\nconst initialState = {\n data: {}\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","export const LOAD_TOOLTIP = 'formData/LOAD_TOOLTIP'\nexport const SET_TOOLTIP = 'formData/SET_TOOLTIP'\n\nexport const loadTooltip = (entity, id) => ({\n type: LOAD_TOOLTIP,\n payload: {\n entity,\n id\n }\n})\n\nexport const setToolTip = (entity, id, tooltip) => ({\n type: SET_TOOLTIP,\n payload: {\n entity,\n id,\n tooltip\n }\n})\n","import * as actions from './actions'\n\nexport const setToolTip = (state, {payload: {entity, id, tooltip}}) => (\n {\n ...state,\n data: {\n ...state.data,\n [entity]: {\n ...state.data[entity],\n [id]: tooltip\n }\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_TOOLTIP]: setToolTip\n}\n\nconst initialState = {\n data: {}\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, call, put, select, takeEvery} from 'redux-saga/effects'\nimport _pick from 'lodash/pick'\nimport {api} from 'tocco-util'\n\nimport * as relationEntitiesActions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeEvery(relationEntitiesActions.LOAD_RELATION_ENTITIES, loadRelationEntity)\n ])\n}\n\nexport function* enhanceEntitiesWithDisplays(entities) {\n const requestedDisplays = yield call(api.getDisplayRequest, entities)\n const displays = yield call(rest.fetchDisplays, requestedDisplays)\n return entities.map(entity => ({...entity, display: displays[entity.model][entity.key]}))\n}\n\nexport function* loadRelationEntity({payload: {fieldName, entityName, options = {}}}) {\n const fieldData = yield select(fieldDataSelector, fieldName)\n if (!dataLoaded(fieldData) || options.forceReload) {\n yield put(relationEntitiesActions.setRelationEntityLoading(fieldName))\n const query = yield call(getQuery, options)\n const requestOptions = {\n method: 'GET'\n }\n\n let entities = yield call(rest.fetchEntities, entityName, query, requestOptions)\n entities = yield call(enhanceEntitiesWithDisplays, entities)\n entities = entities.map(entity => _pick(entity, api.relevantRelationAttributes))\n const moreEntitiesAvailable = options.limit ? entities.length > options.limit : false\n yield put(\n relationEntitiesActions.setRelationEntities(\n fieldName, options.limit ? entities.splice(0, options.limit) : entities, moreEntitiesAvailable)\n )\n }\n}\n\nexport const fieldDataSelector = (state, fieldName) => state.formData.relationEntities.data[fieldName]\n\nconst dataLoaded = fieldData => !!(fieldData && fieldData.data && fieldData.data.length > 0)\n\nexport const getQuery = options => (\n {\n ...(options.limit ? {limit: options.limit + 1} : {}),\n ...(options.searchTerm ? {search: options.searchTerm} : {}),\n ...(options.sorting ? {sorting: options.sorting} : {})\n }\n)\n","import _get from 'lodash/get'\nimport {all, call, put, select, takeEvery} from 'redux-saga/effects'\n\nimport * as tooltipActions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeEvery(tooltipActions.LOAD_TOOLTIP, loadToolTip)\n ])\n}\n\nexport const tooltipSelector = (state, entityName, id) =>\n _get(state, `formData.tooltips.data.${entityName}.${id}`, null)\n\nexport function* loadToolTip({payload: {entity, id}}) {\n if (entity) {\n const tooltip = yield select(tooltipSelector, entity, id)\n\n if (tooltip == null) {\n const display = yield call(rest.fetchDisplay, entity, id, 'tooltip')\n yield put(tooltipActions.setToolTip(entity, id, display))\n }\n }\n}\n","export const OPEN_ADVANCED_SEARCH = 'formData/OPEN_ADVANCED_SEARCH'\nexport const ADVANCED_SEARCH_UPDATE = 'formData/ADVANCED_SEARCH_UPDATE'\nexport const ADVANCED_SEARCH_CLOSE = 'formData/ADVANCED_SEARCH_CLOSE'\n\nexport const openAdvancedSearch = (formName, formField, value) => ({\n type: OPEN_ADVANCED_SEARCH,\n payload: {\n formName,\n formField,\n value\n }\n})\n\nexport const advancedSearchUpdate = ids => ({\n type: ADVANCED_SEARCH_UPDATE,\n payload: {\n ids\n }\n})\n\nexport const advancedSearchClose = () => ({\n type: ADVANCED_SEARCH_CLOSE\n})\n","export const CHANGE_FIELD_VALUE = 'formData/CHANGE_FIELD_VALUE'\nexport const TOUCH_FIELD = 'formData/TOUCH_FIELD'\n\nexport const changeFieldValue = (formName, fieldName, value) => ({\n type: CHANGE_FIELD_VALUE,\n payload: {\n formName,\n fieldName,\n value\n }\n})\n\nexport const touchField = (formName, fieldName) => ({\n type: TOUCH_FIELD,\n payload: {\n formName,\n fieldName\n }\n})\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\n\nexport const StyledAdvancedSearch = styled.div`\n && {\n > *:not(:last-child) {\n margin-bottom: ${scale.space(-1)};\n }\n }\n`\n\nexport const StyledAdvancedSearchButtonWrapper = styled.div`\n background: ${theme.color('paper')};\n padding-top: ${scale.space(0.5)};\n z-index: 1;\n position: sticky;\n bottom: 0;\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {Button} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\nimport {v4 as uuid} from 'uuid'\n\nimport {StyledAdvancedSearch, StyledAdvancedSearchButtonWrapper} from './StyledAdvancedSearch'\n\nconst AdvancedSearch = ({\n entityName,\n formName,\n listFormDefinition,\n onSelectionChange,\n selection,\n emitAction,\n multi,\n onOkClick,\n ListApp\n}) => (\n <StyledAdvancedSearch>\n <ListApp\n id={`advancedSearch-${uuid()}`}\n entityName={entityName}\n formName={formName}\n listFormDefinition={listFormDefinition}\n limit={15}\n showSearchForm={true}\n onSelectChange={selection => {\n onSelectionChange(selection)\n }}\n selection={selection}\n emitAction={emitAction}\n selectionStyle={multi ? 'multi' : 'single'}\n selectOnRowClick={true}\n disableSelectionController={true}\n showActions={false}\n />\n <StyledAdvancedSearchButtonWrapper>\n <Button look=\"raised\" onClick={onOkClick}>\n <FormattedMessage id=\"client.common.ok\"/>\n </Button>\n </StyledAdvancedSearchButtonWrapper>\n </StyledAdvancedSearch>\n)\n\nAdvancedSearch.propTypes = {\n ListApp: PropTypes.func.isRequired,\n entityName: PropTypes.string.isRequired,\n formName: PropTypes.string.isRequired,\n listFormDefinition: PropTypes.shape({\n children: PropTypes.arrayOf(PropTypes.object)\n }),\n emitAction: PropTypes.func.isRequired,\n selection: PropTypes.array,\n field: PropTypes.string,\n onSelectionChange: PropTypes.func,\n onOkClick: PropTypes.func,\n appId: PropTypes.string,\n showSearchForm: PropTypes.bool,\n multi: PropTypes.bool\n}\n\nexport default AdvancedSearch\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\nimport AdvancedSearch from './AdvancedSearch'\n\nconst mapActionCreators = {\n emitAction: actionEmitter.dispatchEmittedAction\n}\n\nexport default connect(null, mapActionCreators)(AdvancedSearch)\n","import React from 'react'\n\nimport AdvancedSearchContainer from './AdvancedSearchContainer'\n\nexport const getSelection = (value, multi) => value ? multi ? value.map(v => v.key) : [value.key] : []\n\nexport const getValue = (entities, multi) =>\n multi\n ? entities\n : (entities.length > 0\n ? {\n key: entities[0].key,\n display: entities[0].display\n }\n : null)\n\nexport const getAdvancedSearchComponent\n = (listApp, entity, formName, listFormDefinition, selection, onSelectionChange, onOkClick, fieldId, multi) =>\n () =>\n <AdvancedSearchContainer\n ListApp={listApp}\n entityName={entity}\n formName={formName}\n listFormDefinition={listFormDefinition}\n selection={selection}\n onSelectionChange={onSelectionChange}\n onOkClick={onOkClick}\n field={fieldId}\n multi={multi}\n />\n","import {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport {all, call, put, takeEvery, take, spawn, select} from 'redux-saga/effects'\nimport {api} from 'tocco-util'\n\nimport notification from './../../notification'\nimport rest from '../../rest'\nimport * as advancedSearchActions from './actions'\nimport * as valueActions from '../values/actions'\nimport {getSelection, getValue, getAdvancedSearchComponent} from './utils'\n\nexport const textResourceSelector = (state, key) => state.intl.messages[key] || key\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(advancedSearchActions.OPEN_ADVANCED_SEARCH, openAdvancedSearch, config)\n ])\n}\n\nexport function* openAdvancedSearch(config, {payload}) {\n const {listApp} = config\n const {formName, formField, value} = payload\n\n const {id: fieldId, label, formBase: fieldFormBase, targetEntity: entity, dataType} = formField\n const multi = dataType === 'multi-remote-field'\n const remoteFieldFormName = fieldFormBase || entity\n const listFormDefinition = yield call(rest.fetchForm, remoteFieldFormName, 'remotefield')\n const answerChannel = yield call(channel)\n const modalId = yield call(uuid)\n const advancedSearchTitle = yield select(textResourceSelector, 'client.common.advancedSearch')\n const selection = yield call(getSelection, value, multi)\n\n const advancedSearchComponent = getAdvancedSearchComponent(\n listApp,\n entity,\n remoteFieldFormName,\n listFormDefinition,\n selection,\n ids => {\n answerChannel.put(advancedSearchActions.advancedSearchUpdate(ids))\n },\n () => {\n answerChannel.put(advancedSearchActions.advancedSearchClose())\n },\n fieldId,\n multi)\n\n yield put(notification.modal(modalId, `${label}: ${advancedSearchTitle}`, null, advancedSearchComponent, true))\n yield spawn(closeAdvancedSearch, answerChannel, modalId, fieldId, formName, entity, multi)\n}\n\nexport function* enhanceEntitiesWithDisplays(entities) {\n const requestedDisplays = yield call(api.getDisplayRequest, entities)\n const displays = yield call(rest.fetchDisplays, requestedDisplays)\n return entities.map(entity => ({...entity, display: displays[entity.model][entity.key]}))\n}\n\nexport function* closeAdvancedSearch(answerChannel, modalId, fieldId, formName, entity, multi) {\n let modalOpen = true\n while (modalOpen) {\n const {payload, type} = yield take(answerChannel)\n if (type === advancedSearchActions.ADVANCED_SEARCH_UPDATE) {\n if (payload.ids && payload.ids.length > 0) {\n const query = {\n keys: payload.ids\n }\n let entities = yield call(rest.fetchEntities, entity, query)\n entities = yield call(enhanceEntitiesWithDisplays, entities)\n const value = yield call(getValue, entities, multi)\n yield call(advancedSearchUpdate, formName, fieldId, value)\n } else {\n yield call(advancedSearchUpdate, formName, fieldId, [])\n }\n if (!multi) {\n yield put(notification.removeModal(modalId))\n modalOpen = false\n }\n } else if (type === advancedSearchActions.ADVANCED_SEARCH_CLOSE) {\n yield put(notification.removeModal(modalId))\n modalOpen = false\n }\n }\n}\n\nexport function* advancedSearchUpdate(formName, field, ids) {\n yield put(valueActions.changeFieldValue(formName, field, ids))\n}\n","import {actions as formActions} from 'redux-form'\nimport {all, put, takeEvery} from 'redux-saga/effects'\n\nimport form from '../../form'\nimport * as tooltipActions from './actions'\n\nexport default function* sagas() {\n yield all([\n takeEvery(tooltipActions.CHANGE_FIELD_VALUE, changeValue),\n takeEvery(tooltipActions.TOUCH_FIELD, touchField)\n ])\n}\n\nexport function* changeValue({payload: {formName, fieldName, value}}) {\n yield put(formActions.change(formName, form.transformFieldName(fieldName), value))\n}\n\nexport function* touchField({payload: {formName, fieldName}}) {\n yield put(formActions.touch(formName, form.transformFieldName(fieldName)))\n}\n","import _pick from 'lodash/pick'\n\nconst UPLOAD_ENDPOINT_URL = `${__BACKEND_URL__}/nice2/upload`\n\n/**\n * Upload a file.\n *\n * @param file {File} File to upload\n *\n * @returns {Object} An object which contains the following options:\n * - contentType {String}\n * - fileName {String}\n * - id {String}\n * - size {String}\n * - sizeInBytes {Number}\n * - success {bool}\n * - binaryLink {string}\n * - thumbnailLink {string}\n */\nexport const uploadRequest = file => {\n const data = new FormData()\n data.append('file', file)\n\n const fetchOptions = {\n method: 'POST',\n credentials: 'include',\n body: data\n }\n\n return fetch(UPLOAD_ENDPOINT_URL, fetchOptions)\n .then(response => response.json())\n}\n\nexport const documentToFormValueTransformer = (uploadResponse, file) => {\n const responseAttributes = _pick(uploadResponse, ['id', 'fileName'])\n const mimeType = uploadResponse.contentType\n\n return {\n ...responseAttributes,\n binaryLink: file.preview,\n thumbnailLink: mimeType.startsWith('image') ? file.preview : null\n }\n}\n","import {actions as formActions} from 'redux-form'\nimport {all, call, put, takeEvery} from 'redux-saga/effects'\n\nimport {documentToFormValueTransformer, uploadRequest} from './documents'\nimport * as actions from './actions'\nimport errorLogging from '../../errorLogging'\nimport form from '../../form'\n\nexport default function* sagas() {\n yield all([\n takeEvery(actions.UPLOAD_DOCUMENT, uploadDocument)\n ])\n}\n\nexport function* uploadDocument({payload}) {\n const {formName, file, field} = payload\n\n try {\n const uploadResponse = yield call(uploadRequest, file)\n\n if (uploadResponse.success) {\n const documentFormValue = yield call(documentToFormValueTransformer, uploadResponse, file)\n yield put(formActions.change(formName, form.transformFieldName(field), documentFormValue))\n } else {\n throw new Error(`upload not successful: ${JSON.stringify(uploadResponse)}`)\n }\n } catch (error) {\n // timestamp is needed as workaround, so that Upload component rerenders\n yield put(formActions.change(formName, field, {id: null, timestamp: Date.now()}))\n yield put(errorLogging.logError(\n 'client.component.form.uploadFailedTitle',\n 'client.component.form.uploadFailedMessage',\n error\n ))\n }\n}\n","export const UPLOAD_DOCUMENT = 'formData/UPLOAD_DOCUMENT'\n\nexport const uploadDocument = (formName, field, file) => ({\n type: UPLOAD_DOCUMENT,\n payload: {\n formName,\n file,\n field\n }\n})\n","export const LOAD_SEARCH_FILTERS = 'formData/LOAD_SEARCH_FILTERS'\nexport const SET_SEARCH_FILTER = 'formData/SET_SEARCH_FILTER'\n\nexport const loadSearchFilters = (entity, group) => ({\n type: LOAD_SEARCH_FILTERS,\n payload: {\n entity,\n group\n }\n})\n\nexport const setSearchFilter = (entity, filters) => ({\n type: SET_SEARCH_FILTER,\n payload: {\n entity,\n filters\n }\n})\n","import * as actions from './actions'\n\nconst setSearchFilter = (state, {payload: {entity, filters}}) => ({...state, [entity]: filters})\n\nconst ACTION_HANDLERS = {\n [actions.SET_SEARCH_FILTER]: setSearchFilter\n}\n\nconst initialState = {}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","export const searchFilterResponseTransformer = searchFilterResponse =>\n searchFilterResponse.body.filters.map(f => ({uniqueId: f.uniqueId, display: f.label, key: f.key}))\n","import {all, call, put, select, takeLatest} from 'redux-saga/effects'\n\nimport {searchFilterResponseTransformer} from './utils'\nimport * as actions from './actions'\nimport rest from '../../rest'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_SEARCH_FILTERS, loadSearchFilters)\n ])\n}\n\nexport const searchFiltersSelector = state => state.formData.searchFilters\n\nexport function* loadSearchFilters({payload}) {\n const {entity, group} = payload\n const searchFilter = yield select(searchFiltersSelector)\n\n if (!searchFilter[entity]) {\n const searchFilterResponse = yield call(\n rest.requestSaga, `client/searchfilters/${entity}${group ? `?group=${group}` : ''}`\n )\n const searchFilters = yield call(searchFilterResponseTransformer, searchFilterResponse)\n\n yield put(actions.setSearchFilter(entity, searchFilters))\n }\n}\n","export const LOAD_LOCATION_SUGGESTIONS = 'formData/LOAD_LOCATION_SUGGESTIONS'\nexport const SET_LOCATION_SUGGESTIONS = 'formData/SET_LOCATION_SUGGESTIONS'\nexport const SET_LOCATION_SUGGESTIONS_LOADING = 'formData/SET_LOCATION_SUGGESTIONS_LOADING'\n\nexport const loadLocationsSuggestions = (field, searchInput, countryValue, fieldCountries) => ({\n type: LOAD_LOCATION_SUGGESTIONS,\n payload: {\n field,\n searchInput,\n countryValue,\n fieldCountries\n }\n})\n\nexport const setLocationSuggestions = (field, suggestions) => ({\n type: SET_LOCATION_SUGGESTIONS,\n payload: {\n field,\n suggestions\n }\n})\n\nexport const setLocationSuggestionsLoading = field => ({\n type: SET_LOCATION_SUGGESTIONS_LOADING,\n payload: {\n field\n }\n})\n","import _uniq from 'lodash/uniq'\nimport _get from 'lodash/get'\nimport {all, call} from 'redux-saga/effects'\nimport {api} from 'tocco-util'\n\nimport rest from '../../rest'\n\nconst LOCATION_ENDPOINT = 'location/suggestions'\nconst countryCodeField = 'iso2'\n\n// Caches country response to reduce resolving of key or ISO code.\n// e.g. {'CH': {key: '22', display: 'Switzerland'}\nlet countryCache = {}\n\nexport const setCountryCache = newCountryCache => {\n countryCache = newCountryCache\n}\n\nexport const getCountryCache = () => countryCache\n\nexport function* getCountryCodeByKey(key) {\n for (const prop in countryCache) {\n if (countryCache[prop].key === key) {\n return prop\n }\n }\n\n const entity = yield call(rest.fetchEntity, 'Country', key, {paths: [countryCodeField]})\n const display = yield call(rest.fetchDisplay, 'Country', key)\n const countryCode = _get(entity, ['paths', countryCodeField, 'value'])\n countryCache = {\n ...countryCache,\n [countryCode]: {key: entity.key, display}\n }\n\n return countryCode\n}\n\nexport function* loadCountries(suggestions) {\n const allCountries = yield all(suggestions.map(suggestion => suggestion.country))\n\n const allCountriesUniq = yield call(_uniq, allCountries)\n\n const notLoaded = yield all(\n allCountriesUniq.reduce(\n (accumulator, currentValue) => [...accumulator, ...(countryCache[currentValue] ? [] : [currentValue])],\n []\n ))\n\n if (notLoaded.length > 0) {\n const query = {\n conditions: {\n [countryCodeField]: notLoaded\n },\n paths: [countryCodeField]\n }\n\n const countriesResponse = yield call(rest.fetchEntities, 'Country', query, {method: 'GET'})\n const displays = yield call(rest.fetchDisplays, api.getDisplayRequest(countriesResponse))\n\n countryCache = {\n ...countryCache,\n ...(countriesResponse.reduce(\n (acc, value) =>\n ({\n ...acc,\n [_get(value, ['paths', countryCodeField, 'value'])]: {\n key: value.key,\n display: _get(displays, ['Country', value.key])\n }\n }),\n {}\n ))\n }\n }\n\n return countryCache\n}\n\nexport const transformToSuggestions = (suggestions, countries) =>\n suggestions.map(suggestion => ({\n ...suggestion,\n country: countries[suggestion.country]\n }))\n\nexport function* requestSuggestions(city, postcode, country) {\n const options = {\n queryParams: {\n ...(city ? {city} : {}),\n ...(postcode ? {postcode} : {}),\n ...(country ? {country} : {})\n },\n method: 'GET'\n }\n\n const response = yield call(rest.requestSaga, LOCATION_ENDPOINT, options)\n return response.body.data\n}\n\nexport function* getCountry(country, fieldCountries) {\n return country\n ? yield call(getCountryCodeByKey, country.key)\n : fieldCountries\n}\n","import {all, call, put, takeLatest} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport {loadCountries, transformToSuggestions, requestSuggestions, getCountry} from './utils'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_LOCATION_SUGGESTIONS, loadLocations)\n ])\n}\n\nexport function* loadLocations({payload: {field, searchInput, countryValue, fieldCountries}}) {\n yield put(actions.setLocationSuggestionsLoading(field))\n\n const {city, postcode} = searchInput\n const country = yield call(getCountry, countryValue, fieldCountries)\n const suggestionsResponse = yield call(requestSuggestions, city, postcode, country)\n\n const countries = yield call(loadCountries, suggestionsResponse)\n const suggestions = yield call(transformToSuggestions, suggestionsResponse, countries)\n\n yield put(actions.setLocationSuggestions(field, suggestions))\n}\n","import * as actions from './actions'\n\nexport const setLocationSuggestions = (state, {payload: {field, suggestions}}) => (\n {\n ...state,\n [field]: {\n suggestions\n }\n }\n)\n\nexport const setLocationSuggestionsLoading = (state, {payload: {field}}) => (\n {\n ...state,\n [field]: {\n isLoading: true\n }\n }\n)\n\nconst ACTION_HANDLERS = {\n [actions.SET_LOCATION_SUGGESTIONS]: setLocationSuggestions,\n [actions.SET_LOCATION_SUGGESTIONS_LOADING]: setLocationSuggestionsLoading\n}\n\nconst initialState = {}\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 * as actions from './actions'\n\nexport const setNavigationStrategy = (state, {payload: {navigationStrategy}}) => {\n return {\n ...state,\n navigationStrategy\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_NAVIGATION_STRATEGY]: setNavigationStrategy\n}\n\nconst initialState = {\n navigationStrategy: 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","export const SET_NAVIGATION_STRATEGY = 'formData/SET_NAVIGATION_STRATEGY'\n\nexport const setNavigationStrategy = navigationStrategy => ({\n type: SET_NAVIGATION_STRATEGY,\n payload: {\n navigationStrategy\n }\n})\n","export const OPEN_REMOTE_CREATE = 'formData/OPEN_REMOTE_CREATE'\nexport const FINISH_CREATION = 'formData/FINISH_CREATION'\n\nexport const openRemoteCreate = (formField, formName) => ({\n type: OPEN_REMOTE_CREATE,\n payload: {\n formField,\n formName\n }\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst handleEntityCreated = (close, answerChannel) => result => {\n close()\n answerChannel.put(result)\n}\n\nconst RemoteCreate = ({\n DetailApp,\n targetEntity,\n answerChannel,\n close,\n emitAction\n}) => {\n return <DetailApp\n entityName={targetEntity}\n formName={targetEntity}\n mode={'create'}\n onEntityCreated={handleEntityCreated(close, answerChannel)}\n emitAction={emitAction}\n />\n}\n\nRemoteCreate.propTypes = {\n DetailApp: PropTypes.func.isRequired,\n targetEntity: PropTypes.string.isRequired,\n answerChannel: PropTypes.object.isRequired,\n emitAction: PropTypes.func.isRequired,\n close: PropTypes.func.isRequired\n}\n\nexport default RemoteCreate\n","import {connect} from 'react-redux'\n\nimport actionEmitter from '../../actionEmitter'\nimport RemoteCreate from './RemoteCreate'\n\nconst mapActionCreators = {\n emitAction: actionEmitter.dispatchEmittedAction\n}\n\nexport default connect(null, mapActionCreators)(RemoteCreate)\n","import {all, call, put, take, takeEvery} from 'redux-saga/effects'\nimport {channel} from 'redux-saga'\nimport {v4 as uuid} from 'uuid'\nimport React from 'react'\n\nimport * as actions from './actions'\nimport * as valueActions from '../values/actions'\nimport rest from '../../rest'\nimport notification from '../../notification'\nimport RemoteCreate from './RemoteCreateContainer'\n\nexport default function* sagas(config) {\n yield all([\n takeEvery(actions.OPEN_REMOTE_CREATE, openRemoteCreate, config)\n ])\n}\n\nexport function* openRemoteCreate({detailApp}, {payload: {formName, formField}}) {\n const answerChannel = yield call(channel)\n const modalId = yield call(uuid)\n const buildCreateForm = ({close}) => <RemoteCreate\n targetEntity={formField.targetEntity}\n answerChannel={answerChannel}\n close={close}\n DetailApp={detailApp}/>\n yield put(notification.modal(modalId, formField.label, null, buildCreateForm, true))\n\n const {id} = yield take(answerChannel)\n const display = yield call(rest.fetchDisplay, formField.targetEntity, id)\n yield put(valueActions.changeFieldValue(formName, formField.path, {key: id, display}))\n}\n","import {combineReducers} from 'redux'\nimport PropTypes from 'prop-types'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport _get from 'lodash/get'\n\nimport relationEntities from './relationEntities/reducer'\nimport tooltips from './tooltips/reducer'\nimport relationEntitiesSagas from './relationEntities/sagas'\nimport tooltipsSaga from './tooltips/sagas'\nimport advancedSearchSagas from './advancedSearch/sagas'\nimport valueSagas from './values/sagas'\nimport uploadSagas from './upload/sagas'\nimport searchFilters from './searchFilters/reducer'\nimport searchFilterSagas from './searchFilters/sagas'\nimport {setRelationEntities} from './relationEntities/actions'\nimport locationSagas from './locations/sagas'\nimport locations from './locations/reducer'\nimport navigationStrategy from './navigationStrategy/reducer'\nimport {setNavigationStrategy} from './navigationStrategy/actions'\nimport remoteCreateSagas from './remoteCreate/sagas'\n\nexport const relationEntitiesSelector = store => store.formData.relationEntities.data\nexport const tooltipSelector = store => store.formData.tooltips.data\nexport const locationSuggestionsSelector = store => store.formData.locations\n\nexport const addToStore = (store, config) => {\n reducerUtil.injectReducers(store, {\n formData: combineReducers({\n relationEntities,\n tooltips,\n searchFilters,\n locations,\n navigationStrategy\n })\n })\n\n store.sagaMiddleware.run(relationEntitiesSagas)\n store.sagaMiddleware.run(tooltipsSaga)\n store.sagaMiddleware.run(advancedSearchSagas, config)\n store.sagaMiddleware.run(valueSagas)\n store.sagaMiddleware.run(uploadSagas)\n store.sagaMiddleware.run(searchFilterSagas)\n store.sagaMiddleware.run(locationSagas)\n store.sagaMiddleware.run(remoteCreateSagas, config)\n\n if (config.navigationStrategy) {\n store.dispatch(setNavigationStrategy(config.navigationStrategy))\n }\n\n const relationEntitiesData = _get(config, 'data.relationEntities', null)\n if (relationEntitiesData !== null) {\n Object.keys(relationEntitiesData).forEach(field => {\n store.dispatch(setRelationEntities(field, relationEntitiesData[field], false))\n })\n }\n}\n\nexport const formDataPropType = PropTypes.shape({\n relationEntities: PropTypes.objectOf(PropTypes.array)\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {injectIntl} from 'react-intl'\nimport {connect} from 'react-redux'\nimport _isEqual from 'lodash/isEqual'\nimport _reduce from 'lodash/reduce'\nimport _get from 'lodash/get'\nimport _pick from 'lodash/pick'\nimport _merge from 'lodash/merge'\nimport {\n isDirty as isDirtySelector,\n getFormSyncErrors,\n getFormAsyncErrors,\n getFormSubmitErrors\n} from 'redux-form'\n\nimport {loadRelationEntities} from './relationEntities/actions'\nimport {loadTooltip} from './tooltips/actions'\nimport {openAdvancedSearch} from './advancedSearch/actions'\nimport {changeFieldValue, touchField} from './values/actions'\nimport {uploadDocument} from './upload/actions'\nimport {loadSearchFilters} from './searchFilters/actions'\nimport {loadLocationsSuggestions} from './locations/actions'\nimport {openRemoteCreate} from './remoteCreate/actions'\n\nconst FormData = props =>\n <React.Fragment>{React.cloneElement(props.children, {formData: props})}</React.Fragment>\n\nFormData.propTypes = {\n children: PropTypes.node\n}\n\nconst mapStateToProps = (\n state,\n {formValues, tooltips, locations, relationEntities, searchFilters, isDirty, errors, navigationStrategy}\n) => ({\n ...(relationEntities ? {relationEntities: _pick(state.formData.relationEntities.data, relationEntities)} : {}),\n ...(tooltips ? {tooltips: _pick(state.formData.tooltips.data, tooltips)} : {}),\n ...(searchFilters ? {searchFilters: _pick(state.formData.searchFilters, searchFilters)} : {}),\n ...(locations ? {locations: _pick(state.formData.locations, locations)} : {}),\n ...(formValues && state.form[formValues.formName]\n ? {formValues: _pick(state.form[formValues.formName].values, formValues.fields)}\n : {}),\n ...(isDirty && state.form[isDirty.formName]\n ? {isDirty: isDirtySelector(isDirty.formName)(state, ...isDirty.fields)}\n : {}),\n ...(errors && state.form[errors.formName]\n ? {\n errors: _reduce(\n _merge(\n _pick(getFormSubmitErrors(errors.formName)(state), errors.fields),\n _pick(getFormSyncErrors(errors.formName)(state), errors.fields),\n _pick(getFormAsyncErrors(errors.formName)(state), errors.fields)\n ),\n (result, value) => ({...result, ...value}), null)\n }\n : null),\n ...(navigationStrategy && state.formData.navigationStrategy\n ? {navigationStrategy: state.formData.navigationStrategy.navigationStrategy}\n : {}\n ),\n entityModel: _get(state, 'entityDetail.entityModel')\n})\n\nconst mapActionCreators = {\n loadRelationEntities: loadRelationEntities,\n loadTooltip: loadTooltip,\n openAdvancedSearch: openAdvancedSearch,\n uploadDocument: uploadDocument,\n changeFieldValue: changeFieldValue,\n touchField: touchField,\n loadSearchFilters: loadSearchFilters,\n loadLocationsSuggestions: loadLocationsSuggestions,\n openRemoteCreate: openRemoteCreate\n}\n\nconst FormDataContainer = connect(\n mapStateToProps,\n mapActionCreators,\n null,\n {\n areStatePropsEqual: _isEqual\n }\n)(injectIntl(FormData))\n\nexport default FormDataContainer\n","import {addToStore} from './formData'\nimport FormDataContainer from './FormDataContainer'\n\nexport default {\n addToStore,\n FormDataContainer\n}\n","import {\n REMOTE_EVENT,\n remoteEvent\n} from './actions'\n\nexport default {\n REMOTE_EVENT,\n remoteEvent\n}\n","export const REMOTE_EVENT = 'remoteEvents/REMOTE_EVENT'\n\nexport const remoteEvent = event => ({\n type: REMOTE_EVENT,\n payload: {\n event\n }\n})\n","export const SET_INITIALIZED = 'entityList/SET_INITIALIZED'\nexport const INITIALIZE = 'entityList/INITIALIZE'\nexport const SET_SEARCH_FORM_TYPE = 'entityList/SET_SEARCH_FORM_TYPE'\nexport const SET_ENTITY_NAME = 'entityList/SET_ENTITY_NAME'\nexport const SET_PARENT = 'entityList/SET_PARENT'\nexport const SET_SEARCH_FORM_POSITION = 'entityList/SET_SEARCH_FORM_POSITION'\nexport const SET_FORM_NAME = 'entityList/SET_FORM_NAME'\nexport const RELOAD_ALL = 'entityList/RELOAD_ALL'\nexport const RELOAD_DATA = 'entityList/RELOAD_DATA'\nexport const SET_SEARCH_FORM_COLLAPSED = 'entityList/SET_SEARCH_FORM_COLLAPSED'\nexport const SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE = 'entityList/SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE'\n\nexport const setInitialized = (initialized = true) => ({\n type: SET_INITIALIZED,\n payload: {\n initialized\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setSearchFormType = searchFormType => ({\n type: SET_SEARCH_FORM_TYPE,\n payload: {\n searchFormType\n }\n})\n\nexport const setEntityName = entityName => ({\n type: SET_ENTITY_NAME,\n payload: {\n entityName\n }\n})\n\nexport const setParent = parent => ({\n type: SET_PARENT,\n payload: {\n parent\n }\n})\n\nexport const setSearchFormPosition = searchFormPosition => ({\n type: SET_SEARCH_FORM_POSITION,\n payload: {\n searchFormPosition\n }\n})\n\nexport const setFormName = formName => ({\n type: SET_FORM_NAME,\n payload: {\n formName\n }\n})\n\nexport const reloadData = () => ({\n type: RELOAD_DATA\n})\n\nexport const reloadAll = () => ({\n type: RELOAD_ALL\n})\n\nexport const setSearchFormCollapsed = searchFormCollapsed => ({\n type: SET_SEARCH_FORM_COLLAPSED,\n payload: {\n searchFormCollapsed\n }\n})\n\nexport const setSearchFormCollapsedInitialValue = searchFormCollapsed => ({\n type: SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE,\n payload: {\n searchFormCollapsed\n }\n})\n","import PropTypes from 'prop-types'\nconst searchFormTypes = {\n NONE: 'none',\n SIMPLE: 'simple',\n BASIC: 'basic',\n ADMIN: 'admin'\n}\n\nexport const searchFormTypePropTypes = PropTypes.oneOf(Object.values(searchFormTypes))\n\nexport default searchFormTypes\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\nimport searchFormTypes from '../../util/searchFormTypes'\n\nconst setSearchFormType = (state, {payload}) => {\n const {searchFormType: newSearchFormType} = payload\n\n const searchFormType = Object.values(searchFormTypes).find(enumV => enumV === newSearchFormType)\n || searchFormTypes.BASIC\n\n return {...state, searchFormType}\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_INITIALIZED]: reducerUtil.singleTransferReducer('initialized'),\n [actions.SET_ENTITY_NAME]: reducerUtil.singleTransferReducer('entityName'),\n [actions.SET_FORM_NAME]: reducerUtil.singleTransferReducer('formName'),\n [actions.SET_SEARCH_FORM_TYPE]: setSearchFormType,\n [actions.SET_SEARCH_FORM_POSITION]: reducerUtil.singleTransferReducer('searchFormPosition'),\n [actions.SET_PARENT]: reducerUtil.singleTransferReducer('parent'),\n [actions.SET_SEARCH_FORM_COLLAPSED]: reducerUtil.singleTransferReducer('searchFormCollapsed'),\n [actions.SET_SEARCH_FORM_COLLAPSED_INITIAL_VALUE]: reducerUtil.singleTransferReducer('searchFormCollapsed')\n}\n\nconst initialState = {\n initialized: false,\n entityName: '',\n formName: '',\n searchFormType: searchFormTypes.BASIC,\n searchFormPosition: 'top',\n parent: null,\n searchFormCollapsed: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","export const INITIALIZE = 'list/INITIALIZE'\nexport const REQUEST_ENTITIES = 'list/REQUEST_ENTITIES'\nexport const SET_ENTITIES = 'list/SET_ENTITIES'\nexport const SET_FORM_DEFINITION = 'list/SET_FORM_DEFINITION'\nexport const SET_ENTITY_MODEL = 'list/SET_ENTITY_MODEL'\nexport const SET_SORTING = 'list/SET_SORTING'\nexport const SET_LIMIT = 'list/SET_LIMIT'\nexport const SET_CURRENT_PAGE = 'list/SET_CURRENT_PAGE'\nexport const SET_ENTITY_COUNT = 'list/SET_ENTITY_COUNT'\nexport const ADD_ENTITIES_TO_STORE = 'list/ADD_ENTITIES_TO_STORE'\nexport const CLEAR_ENTITY_STORE = 'list/CLEAR_ENTITIES_CACHE'\nexport const SET_IN_PROGRESS = 'list/SET_IN_PROGRESS'\nexport const CHANGE_PAGE = 'list/CHANGE_PAGE'\nexport const REFRESH = 'list/REFRESH'\nexport const SET_SHOW_SEARCH_FORM = 'list/SET_SEARCH_FORM'\nexport const SET_SEARCH_FILTERS = 'list/SET_SEARCH_FILTERS'\nexport const SET_SIMPLE_SEARCH_FIELDS = 'list/SET_SIMPLE_SEARCH_FIELDS'\nexport const ON_ROW_CLICK = 'list/ON_ROW_CLICK'\nexport const NAVIGATE_TO_CREATE = 'entityList/NAVIGATE_TO_CREATE'\nexport const SET_FORM_SELECTABLE = 'list/SET_FORM_SELECTABLE'\nexport const SET_FORM_CLICKABLE = 'list/SET_FORM_CLICKABLE'\nexport const SET_ENDPOINT = 'list/SET_ENDPOINT'\nexport const SET_SEARCH_ENDPOINT = 'list/SET_SEARCH_ENDPOINT'\nexport const SET_CONSTRICTION = 'list/SET_CONSTRICTION'\nexport const QUERY_CHANGED = 'list/QUERY_CHANGED'\nexport const SET_SHOW_LINK = 'list/SET_SHOW_LINK'\nexport const SET_LAZY_DATA = 'list/SET_LAZY_DATA'\nexport const NAVIGATE_TO_ACTION = 'list/NAVIGATE_TO_ACTION'\nexport const SET_SORTING_INTERACTIVE = 'list/SET_SORTING_INTERACTIVE'\nexport const DEFINE_SORTING = 'list/DEFINE_SORTING'\nexport const SET_INPUT_TQL = 'list/SET_INPUT_TQL'\nexport const SET_INPUT_KEYS = 'list/SET_INPUT_KEYS'\nexport const SET_INPUT_SEARCH_FILTERS = 'list/SET_INPUT_SEARCH_FILTERS'\nexport const SET_INITIALIZED = 'list/SET_INITIALIZED'\nexport const SET_SORTABLE = 'list/SET_SORTABLE'\nexport const SET_MARKED = 'list/SET_MARKED'\nexport const TOGGLE_MARKINGS = 'list/TOGGLE_MARKINGS'\nexport const SET_DISABLE_PREFERENCES_MENU = 'list/SET_DISABLE_PREFERENCES_MENU'\r\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const requestEntities = (page, show) => ({\n type: REQUEST_ENTITIES,\n payload: {\n page,\n show\n }\n})\n\nexport const setEntities = entities => ({\n type: SET_ENTITIES,\n payload: {\n entities\n }\n})\n\nexport const addEntitiesToStore = (page, entities) => ({\n type: ADD_ENTITIES_TO_STORE,\n payload: {\n page,\n entities\n }\n})\n\nexport const clearEntityStore = () => ({\n type: CLEAR_ENTITY_STORE\n})\n\nexport const setEntityCount = entityCount => ({\n type: SET_ENTITY_COUNT,\n payload: {\n entityCount\n }\n})\n\nexport const setFormDefinition = formDefinition => ({\n type: SET_FORM_DEFINITION,\n payload: {\n formDefinition\n }\n})\n\nexport const setEntityModel = entityModel => ({\n type: SET_ENTITY_MODEL,\n payload: {\n entityModel\n }\n})\n\nexport const setSorting = sorting => ({\n type: SET_SORTING,\n payload: {\n sorting\n }\n})\n\nexport const setLimit = limit => ({\n type: SET_LIMIT,\n payload: {\n limit\n }\n})\n\nexport const setCurrentPage = currentPage => ({\n type: SET_CURRENT_PAGE,\n payload: {\n currentPage\n }\n})\n\nexport const setInProgress = inProgress => ({\n type: SET_IN_PROGRESS,\n payload: {\n inProgress\n }\n})\n\nexport const changePage = page => ({\n type: CHANGE_PAGE,\n payload: {\n page\n }\n})\n\nexport const refresh = () => ({\n type: REFRESH\n})\n\nexport const setShowSearchForm = showSearchForm => ({\n type: SET_SHOW_SEARCH_FORM,\n payload: {\n showSearchForm\n }\n})\n\nexport const setSearchFilters = searchFilters => ({\n type: SET_SEARCH_FILTERS,\n payload: {\n searchFilters\n }\n})\n\nexport const onRowClick = id => ({\n type: ON_ROW_CLICK,\n payload: {\n id\n }\n})\n\nexport const navigateToCreate = relationName => ({\n type: NAVIGATE_TO_CREATE,\n payload: {\n relationName\n }\n})\n\nexport const setFormSelectable = formSelectable => ({\n type: SET_FORM_SELECTABLE,\n payload: {\n formSelectable\n }\n})\n\nexport const setFormClickable = formClickable => ({\n type: SET_FORM_CLICKABLE,\n payload: {\n formClickable\n }\n})\n\nexport const setEndpoint = endpoint => ({\n type: SET_ENDPOINT,\n payload: {\n endpoint\n }\n})\n\nexport const setSearchEndpoint = searchEndpoint => ({\n type: SET_SEARCH_ENDPOINT,\n payload: {\n searchEndpoint\n }\n})\n\nexport const setConstriction = constriction => ({\n type: SET_CONSTRICTION,\n payload: {\n constriction\n }\n})\n\nexport const queryChanged = query => ({\n type: QUERY_CHANGED,\n payload: {\n query\n }\n})\n\nexport const setShowLink = showLink => ({\n type: SET_SHOW_LINK,\n payload: {\n showLink\n }\n})\n\nexport const setLazyData = (type, id, values) => ({\n type: SET_LAZY_DATA,\n payload: {\n type,\n id,\n values\n }\n})\n\nexport const navigateToAction = (definition, selection) => ({\n type: NAVIGATE_TO_ACTION,\n payload: {\n definition,\n selection\n }\n})\n\nexport const setSortingInteractive = (field, add) => ({\n type: SET_SORTING_INTERACTIVE,\n payload: {\n field,\n add\n }\n})\n\nexport const defineSorting = () => ({\n type: DEFINE_SORTING\n})\n\nexport const setInputTql = inputTql => ({\n type: SET_INPUT_TQL,\n payload: {\n inputTql\n }\n})\n\nexport const setInputKeys = inputKeys => ({\n type: SET_INPUT_KEYS,\n payload: {\n inputKeys\n }\n})\n\nexport const setInputSearchFilters = inputSearchFilters => ({\n type: SET_INPUT_SEARCH_FILTERS,\n payload: {\n inputSearchFilters\n }\n})\n\nexport const setInitialized = () => ({\n type: SET_INITIALIZED\n})\n\nexport const setSortable = sortable => ({\n type: SET_SORTABLE,\n payload: {\n sortable\n }\n})\n\nexport const setMarked = (entityName, entityKey, marked) => ({\n type: SET_MARKED,\n payload: {\n entityName,\n entityKey,\n marked\n }\n})\n\nexport const toggleMarkings = selection => ({\n type: TOGGLE_MARKINGS,\n payload: {\n selection\n }\n})\n\nexport const setDisablePreferencesMenu = disablePreferencesMenu => ({\n type: SET_DISABLE_PREFERENCES_MENU,\n payload: {\n disablePreferencesMenu\n }\n})\n","export const SET_INITIALIZED = 'searchForm/SET_INITIALIZED'\nexport const INITIALIZE = 'searchForm/INITIALIZE'\nexport const SET_FORM_DEFINITION = 'searchForm/SET_FORM_DEFINITION'\nexport const EXECUTE_SEARCH = 'searchForm/EXECUTE_SEARCH'\nexport const RESET_SEARCH = 'searchForm/RESET_SEARCH'\nexport const SET_SHOW_EXTENDED_SEARCH_FORM = 'searchForm/SET_SHOW_EXTENDED_SEARCH_FORM'\nexport const SET_SIMPLE_SEARCH_FIELDS = 'searchForm/SET_SIMPLE_SEARCH_FIELDS'\nexport const SET_DISABLE_SIMPLE_SEARCH = 'searchForm/SET_DISABLE_SIMPLE_SEARCH'\nexport const SET_SEARCH_FORM_NAME = 'searchForm/SET_SEARCH_FORM_NAME'\nexport const SUBMIT_SEARCH_FORM = 'searchForm/SUBMIT_SEARCH_FORM'\nexport const SET_VALUES_INITIALIZED = 'searchForm/SET_VALUES_INITIALIZED'\nexport const ADVANCED_SEARCH_UPDATE = 'searchForm/ADVANCED_SEARCH_UPDATE'\nexport const SET_FORM_FIELDS_FLAT = 'searchForm/SET_FORM_FIELDS_FLAT'\nexport const SET_SEARCH_FILTERS = 'searchForm/SET_SEARCH_FILTERS'\nexport const SET_SEARCH_FILTER_ACTIVE = 'searchForm/SET_SEARCH_FILTER_ACTIVE'\nexport const DELETE_SEARCH_FILTER = 'searchForm/DELETE_SEARCH_FILTER'\nexport const SAVE_SEARCH_FILTER = 'searchForm/SAVE_SEARCH_FILTER'\nexport const SAVE_DEFAULT_SEARCH_FILTER = 'searchForm/SAVE_DEFAULT_SEARCH_FILTER'\nexport const RESET_DEFAULT_SEARCH_FILTER = 'searchForm/RESET_DEFAULT_SEARCH_FILTER'\nexport const DISPLAY_SEARCH_FIELDS_MODAL = 'searchForm/DISPLAY_SEARCH_FIELDS_MODAL'\nexport const RESET_SEARCH_FIELDS = 'searchForm/resetSearchFields'\n\nexport const setInitialized = (initialized = true) => ({\n type: SET_INITIALIZED,\n payload: {\n initialized\n }\n})\n\nexport const initialize = () => ({\n type: INITIALIZE\n})\n\nexport const setFormDefinition = formDefinition => ({\n type: SET_FORM_DEFINITION,\n payload: {\n formDefinition\n }\n})\n\nexport const executeSearch = () => ({\n type: EXECUTE_SEARCH\n})\n\nexport const resetSearch = () => ({\n type: RESET_SEARCH\n})\n\nexport const setShowExtendedSearchForm = showExtendedSearchForm => ({\n type: SET_SHOW_EXTENDED_SEARCH_FORM,\n payload: {\n showExtendedSearchForm\n }\n})\n\nexport const setSimpleSearchFields = simpleSearchFields => ({\n type: SET_SIMPLE_SEARCH_FIELDS,\n payload: {\n simpleSearchFields\n }\n})\n\nexport const setDisableSimpleSearch = disableSimpleSearch => ({\n type: SET_DISABLE_SIMPLE_SEARCH,\n payload: {\n disableSimpleSearch\n }\n})\n\nexport const submitSearchForm = () => ({\n type: SUBMIT_SEARCH_FORM\n})\n\nexport const setValuesInitialized = valuesInitialized => ({\n type: SET_VALUES_INITIALIZED,\n payload: {\n valuesInitialized\n }\n})\n\nexport const setFormFieldsFlat = formFieldsFlat => ({\n type: SET_FORM_FIELDS_FLAT,\n payload: {\n formFieldsFlat\n }\n})\n\nexport const setSearchFilters = searchFilters => ({\n type: SET_SEARCH_FILTERS,\n payload: {\n searchFilters\n }\n})\n\nexport const setSearchFilterActive = (searchFilterId, active, exclusive) => ({\n type: SET_SEARCH_FILTER_ACTIVE,\n payload: {\n searchFilterId,\n active,\n exclusive\n }\n})\n\nexport const deleteSearchFilter = primaryKey => ({\n type: DELETE_SEARCH_FILTER,\n payload: {\n primaryKey\n }\n})\n\nexport const saveSearchFilter = () => ({\n type: SAVE_SEARCH_FILTER\n})\n\nexport const saveDefaultSearchFilter = () => ({\n type: SAVE_DEFAULT_SEARCH_FILTER\n})\n\nexport const resetDefaultSearchFilter = () => ({\n type: RESET_DEFAULT_SEARCH_FILTER\n})\n\nexport const displaySearchFieldsModal = () => ({\n type: DISPLAY_SEARCH_FIELDS_MODAL\n})\n\nexport const resetSearchFields = () => ({\n type: RESET_SEARCH_FIELDS\n})\n","export const LOAD_PREFERENCES = 'preferences/LOAD_PREFERENCES'\nexport const SET_POSITIONS = 'preferences/SET_POSITIONS'\nexport const CHANGE_POSITION = 'preferences/CHANGE_POSITION'\nexport const SET_SORTING = 'preferences/SET_SORTING'\nexport const SET_COLUMNS = 'preferences/SET_COLUMNS'\nexport const RESET_SORTING = 'preferences/RESET_SORTING'\nexport const RESET_COLUMNS = 'preferences/RESET_COLUMNS'\nexport const RESET_PREFERENCES = 'preferences/RESET_PREFERENCES'\nexport const DISPLAY_COLUMN_MODAL = 'preferences/DISPLAY_COLUMN_MODAL'\nexport const SET_PREFERENCES_LOADED = 'preferences/SET_PREFERENCES_LOADED'\n\nexport const loadPreferences = () => ({\n type: LOAD_PREFERENCES\n})\n\nexport const setPreferencesLoaded = preferencesLoaded => ({\n type: SET_PREFERENCES_LOADED,\n payload: {\n preferencesLoaded\n }\n})\n\nexport const setPositions = positions => ({\n type: SET_POSITIONS,\n payload: {\n positions\n }\n})\n\nexport const changePosition = (field, afterFieldPosition, columns) => ({\n type: CHANGE_POSITION,\n payload: {\n field,\n afterFieldPosition,\n columns\n }\n})\n\nexport const setSorting = sorting => ({\n type: SET_SORTING,\n payload: {\n sorting\n }\n})\n\nexport const setColumns = columns => ({\n type: SET_COLUMNS,\n payload: {\n columns\n }\n})\n\nexport const resetSorting = () => ({\n type: RESET_SORTING,\n payload: {}\n})\n\nexport const resetPreferences = () => ({\n type: RESET_PREFERENCES,\n payload: {}\n})\n\nexport const displayColumnModal = () => ({\n type: DISPLAY_COLUMN_MODAL,\n payload: {}\n})\n\nexport const resetColumns = () => ({\n type: RESET_COLUMNS,\n payload: {}\n})\n","import {put, call, all, take, takeLatest} from 'redux-saga/effects'\nimport {appFactory, externalEvents} from 'tocco-app-extensions'\n\nimport * as actions from './../entityList/actions'\nimport * as listActions from './../list/actions'\nimport * as searchFormActions from './../searchForm/actions'\nimport * as preferenceActions from './../preferences/actions'\n\nexport const entityListSelector = state => state.entityList\n\nexport default function* sagas() {\n yield all([\n call(initialize),\n takeLatest(actions.RELOAD_DATA, reloadData),\n takeLatest(actions.RELOAD_ALL, initialize, false),\n takeLatest(actions.SET_SEARCH_FORM_COLLAPSED, searchFormCollapsed)\n ])\n}\n\nexport function* initialize(waitForInputDispatch = true) {\n if (waitForInputDispatch) {\n yield take(appFactory.inputDispatchActionType)\n }\n yield put(listActions.initialize())\n yield put(preferenceActions.loadPreferences())\n yield put(searchFormActions.initialize())\n yield all([\n take(listActions.SET_INITIALIZED),\n take(searchFormActions.SET_INITIALIZED),\n take(preferenceActions.SET_PREFERENCES_LOADED)\n ])\n yield put(listActions.defineSorting())\n yield take(listActions.SET_SORTING)\n yield put(searchFormActions.executeSearch())\n}\n\nexport function* reloadData() {\n yield put(searchFormActions.initialize())\n yield all([\n take(searchFormActions.SET_INITIALIZED)\n ])\n yield put(searchFormActions.executeSearch())\n}\n\nexport function* searchFormCollapsed({payload: {searchFormCollapsed}}) {\n yield put(externalEvents.fireExternalEvent('onSearchFormCollapsedChange', {collapsed: searchFormCollapsed}))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\nimport _get from 'lodash/get'\n\nimport * as actions from './actions'\n\nconst addEntityToStore = (state, {payload}) => ({\n ...state,\n entityStore: {\n ...state.entityStore,\n [payload.page]: payload.entities\n }\n})\n\nconst setLazyData = (state, {payload: {type, id, values}}) => ({\n ...state,\n lazyData: {\n ...state.lazyData,\n [type]: {\n ...state.lazyData[type],\n [id]: {..._get(state, ['lazyData', type, id], {}), ...values}\n }\n }\n})\n\nconst clearEntityStore = state => ({\n ...state,\n entityStore: {}\n})\n\nconst defaultOrder = 'asc'\nconst getOpposite = order => order === 'asc' ? 'desc' : 'asc'\nconst setSortingInteractive = (state, {payload: {field, add}}) => {\n if (!add) {\n const currentSorting = state.sorting\n const order = (currentSorting.length > 0 && currentSorting[0].field === field\n ? getOpposite(currentSorting[0].order)\n : defaultOrder)\n return {\n ...state,\n sorting: [{field, order}]\n }\n } else {\n const contains = state.sorting.filter(s => s.field === field)\n const order = contains.length > 0 ? getOpposite(contains[0].order) : defaultOrder\n\n return {\n ...state,\n sorting: [...state.sorting.filter(s => s.field !== field), {field, order}]\n }\n }\n}\n\nconst ACTION_HANDLERS = {\n [actions.SET_ENTITIES]: reducerUtil.singleTransferReducer('entities'),\n [actions.SET_FORM_DEFINITION]: reducerUtil.singleTransferReducer('formDefinition'),\n [actions.SET_ENTITY_MODEL]: reducerUtil.singleTransferReducer('entityModel'),\n [actions.SET_LIMIT]: reducerUtil.singleTransferReducer('limit'),\n [actions.SET_CURRENT_PAGE]: reducerUtil.singleTransferReducer('currentPage'),\n [actions.SET_SORTING]: reducerUtil.singleTransferReducer('sorting'),\n [actions.SET_SORTING_INTERACTIVE]: setSortingInteractive,\n [actions.SET_ENTITY_COUNT]: reducerUtil.singleTransferReducer('entityCount'),\n [actions.ADD_ENTITIES_TO_STORE]: addEntityToStore,\n [actions.SET_LAZY_DATA]: setLazyData,\n [actions.CLEAR_ENTITY_STORE]: clearEntityStore,\n [actions.SET_IN_PROGRESS]: reducerUtil.singleTransferReducer('inProgress'),\n [actions.SET_SHOW_SEARCH_FORM]: reducerUtil.singleTransferReducer('showSearchForm'),\n [actions.SET_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('searchFilters'),\n [actions.SET_FORM_SELECTABLE]: reducerUtil.singleTransferReducer('formSelectable'),\n [actions.SET_FORM_CLICKABLE]: reducerUtil.singleTransferReducer('formClickable'),\n [actions.SET_ENDPOINT]: reducerUtil.singleTransferReducer('endpoint'),\n [actions.SET_SEARCH_ENDPOINT]: reducerUtil.singleTransferReducer('searchEndpoint'),\n [actions.SET_CONSTRICTION]: reducerUtil.singleTransferReducer('constriction'),\n [actions.SET_SHOW_LINK]: reducerUtil.singleTransferReducer('showLink'),\n [actions.SET_SORTABLE]: reducerUtil.singleTransferReducer('sortable'),\n [actions.SET_INPUT_TQL]: reducerUtil.singleTransferReducer('inputTql'),\n [actions.SET_INPUT_KEYS]: reducerUtil.singleTransferReducer('inputKeys'),\n [actions.SET_INPUT_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('inputSearchFilters'),\n [actions.SET_DISABLE_PREFERENCES_MENU]: reducerUtil.singleTransferReducer('disablePreferencesMenu')\n}\n\nconst initialState = {\n entityModel: {},\n entities: [],\n limit: 10,\n currentPage: 1,\n sorting: [],\n formDefinition: null,\n entityCount: null,\n entityStore: {},\n inProgress: true,\n showSearchForm: true,\n searchFilters: [],\n createPermission: false,\n formSelectable: false,\n formClickable: false,\n showLink: false,\n sortable: true,\n lazyData: {},\n endpoint: null,\n searchEndpoint: null,\n constriction: null,\n inputTql: null,\n inputKeys: null,\n inputSearchFilters: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import _reduce from 'lodash/reduce'\nimport {tqlBuilder} from 'tocco-util'\n\nconst getFilterArray = v =>\n Array.isArray(v) ? v.map(e => e.uniqueId) : [v.uniqueId]\n\nexport const getFetchOptionsFromSearchForm = (searchFormValues, formFields = {}) => (\n _reduce(searchFormValues, (acc, value, path) => {\n const addition = {}\n if (path === 'searchFilter') {\n if (value) {\n addition.filters = getFilterArray(value)\n }\n } else {\n const fieldType = formFields[path]\n const tql = tqlBuilder.getTql(path, value, fieldType)\n addition.tql = [...(acc.tql ? [acc.tql] : []), tql].filter(Boolean).join(' and ')\n }\n\n return {...acc, ...addition}\n }, {})\n)\n","export const ON_SELECT_CHANGE = 'list/ON_ROW_SELECT'\nexport const SET_SELECTION = 'list/SET_SELECTION'\nexport const CLEAR_SELECTION = 'selection/CLEAR_SELECTION'\nexport const SET_SHOW_SELECTION_CONTROLLER = 'selection/SET_SHOW_SELECTION_CONTROLLER'\nexport const SET_TABLE_SELECTION_STYLE = 'selection/SET_TABLE_SELECTION_STYLE'\nexport const SET_QUERY = 'selection/SET_QUERY'\nexport const SET_QUERY_COUNT = 'selection/SET_QUERY_COUNT'\nexport const TOGGLE_SHOW_SELECTED_RECORDS = 'selection/TOOGLE_SHOW_SELECTED_RECORDS'\nexport const RELOAD_DATA = 'selection/RELOAD_DATA'\n\nexport const setSelection = selection => ({\n type: SET_SELECTION,\n payload: {\n selection\n }\n})\n\nexport const onSelectChange = (keys, isSelected) => ({\n type: ON_SELECT_CHANGE,\n payload: {\n keys,\n isSelected\n }\n})\n\nexport const clearSelection = () => ({\n type: CLEAR_SELECTION\n})\n\nexport const setShowSelectionController = showSelectionController => ({\n type: SET_SHOW_SELECTION_CONTROLLER,\n payload: {\n showSelectionController\n }\n})\n\nexport const setTableSelectionStyle = tableSelectionStyle => ({\n type: SET_TABLE_SELECTION_STYLE,\n payload: {\n tableSelectionStyle\n }\n})\n\nexport const setQuery = query => ({\n type: SET_QUERY,\n payload: {\n query\n }\n})\n\nexport const setQueryCount = queryCount => ({\n type: SET_QUERY_COUNT,\n payload: {\n queryCount\n }\n})\n\nexport const toggleShowSelectedRecords = () => ({\n type: TOGGLE_SHOW_SELECTED_RECORDS\n})\n\nexport const reloadData = () => ({\n type: RELOAD_DATA\n})\n","import styled from 'styled-components'\nimport {Button, scale} from 'tocco-ui'\n\nexport const StyledButton = styled(Button)`\n float: right;\n margin-top: ${scale.space(0)};\n margin-right: 0;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst LazyDataEnhancer = ({value, children}) => React.cloneElement(children, {value})\n\nLazyDataEnhancer.propTypes = {\n children: PropTypes.node,\n value: PropTypes.any\n}\n\nexport default LazyDataEnhancer\n","import _get from 'lodash/get'\n\nconst multiRelationHandler = (value, lazyData) => {\n if (!value) {\n return value\n }\n\n return value.map(value => {\n const display = _get(lazyData, ['defaultDisplays', value.model, value.key], '')\n return {...value, display}\n })\n}\n\nconst singleRelationHandler = (value, lazyData) => {\n if (!value) {\n return value\n }\n const display = _get(lazyData, ['defaultDisplays', value.model, value.key], '')\n return {...value, display}\n}\n\nconst displayExpressionHandler = (value, lazyData, info) => (\n _get(lazyData, ['displayExpressions', info.formName, info.key, info.path], '')\n)\n\nconst typeHandlers = {\n 'multi-select-box': multiRelationHandler,\n 'multi-remote-field': multiRelationHandler,\n 'single-select-box': singleRelationHandler,\n 'single-remote-field': singleRelationHandler,\n 'displayExpression': displayExpressionHandler\n}\n\nexport const lazyValueEnhancer = (value, type, lazyData, info) => {\n const typeHandler = typeHandlers[type]\n\n if (!typeHandler) {\n return value\n }\n\n return typeHandler(value, lazyData, info)\n}\n","import {connect} from 'react-redux'\n\nimport LazyDataEnhancer from './LazyDataEnhancer'\nimport {lazyValueEnhancer} from '../../util/lazyLoading'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = (state, props) => {\n const infos = {\n path: props.path,\n formName: state.entityList.formName,\n key: props.entityKey\n }\n\n return {\n value: lazyValueEnhancer(props.value, props.type, state.list.lazyData, infos)\n }\n}\n\nexport default connect(mapStateToProps, mapActionCreators)(LazyDataEnhancer)\n","import LazyDataEnhancerContainer from './LazyDataEnhancerContainer'\n\nexport default LazyDataEnhancerContainer\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport {Typography} from 'tocco-ui'\nimport {formData, field} from 'tocco-app-extensions'\nimport {js} from 'tocco-util'\n\nimport LazyDataEnhancer from '../components/LazyDataEnhancer'\n\nexport const MultiSeparator = () => (<Typography.Span>, </Typography.Span>)\n\nconst multiTypes = ['multi-select-box', 'multi-remote-field']\n\nexport default (fieldDefinition, entity, intl) => {\n const {id, path, dataType} = fieldDefinition\n const isMultiType = multiTypes.includes(dataType)\n const pathValue = entity[path]\n const values = !isMultiType && Array.isArray(pathValue) ? pathValue : [pathValue]\n return <span key={id} style={{marginRight: '2px'}}>\n {values.map((v, idx) =>\n <formData.FormDataContainer key={`formDataContainer-${entity.__key}-${path}-${idx}`} navigationStrategy={true}>\n <FormattedValueWrapper type={dataType} value={v} intl={intl} formField={fieldDefinition}/>\n </formData.FormDataContainer>\n ).reduce((prev, curr, idx) => [prev, <MultiSeparator key={'sep' + idx}/>, curr])\n }\n </span>\n}\n\nconst FormattedValueWrapper = ({value, type, formData, intl, formField}) => {\n const modelField = {\n targetEntity: value && js.getOrFirst(value).model\n }\n\n const Field = useMemo(() => field.factory('list', type), [])\n\n return <LazyDataEnhancer value={value} type={type}>\n <Field\n type={type}\n formField={formField}\n modelField={modelField}\n value={value}\n formData={formData}\n breakWords={false}\n />\n </LazyDataEnhancer>\n}\n\nFormattedValueWrapper.propTypes = {\n value: PropTypes.any,\n type: PropTypes.string.isRequired,\n formData: PropTypes.shape({\n navigationStrategy: PropTypes.object\n }),\n intl: PropTypes.object.isRequired,\n formField: PropTypes.object.isRequired\n}\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui'\n\nexport const StyledActionWrapper = styled.div`\n ${StyledButton} {\n width: 100%;\n max-width: fit-content;\n justify-content: center;\n box-sizing: border-box;\n\n > * {\n overflow: hidden;\n }\n }\n`\n","import React from 'react'\nimport {actions, form} from 'tocco-app-extensions'\nimport {FormattedValue} from 'tocco-ui'\n\nimport fieldFactory from './fieldFactory'\nimport LazyDataCell from '../components/LazyDataEnhancer'\nimport {StyledActionWrapper} from './StyledComponents'\n\nexport default (field, entity, parent, intl) => {\n const {componentType} = field\n\n if (actions.isAction(componentType)) {\n return getAction(field, entity, parent)\n } else if (componentType === form.componentTypes.FIELD) {\n return fieldFactory(field, entity, intl)\n } else if (componentType === form.componentTypes.DISPLAY) {\n return getDisplayExpression(field, entity)\n }\n}\n\nconst getDisplayExpression = (field, entity) =>\n <LazyDataCell\n key={'action-' + field.id}\n path={field.id}\n entityKey={entity.__key}\n type={'displayExpression'}\n value={null}\n >\n <FormattedValue type=\"html\" breakWords={false} value={entity[field.id]}/>\n </LazyDataCell>\n\nconst getAction = (field, entity, parent) =>\n <StyledActionWrapper\n key={'action-' + field.id}\n onClick={e => {\n e.stopPropagation()\n }}\n >\n <actions.Action\n key={'tableAction' + field.id}\n definition={field}\n selection={actions.getSingleEntitySelection(entity.__model, entity.__key)}\n parent={parent}\n />\n </StyledActionWrapper>\n","import _uniq from 'lodash/uniq'\nimport {actions, form} from 'tocco-app-extensions'\nimport {api} from 'tocco-util'\n\nimport cellRenderer from '../cellRenderer'\n\nexport const getTable = formDefinition =>\n formDefinition.children.find(child => child.componentType === form.componentTypes.TABLE)\n\nexport const getActionBar = formDefinition =>\n formDefinition.children.find(child => child.componentType === form.componentTypes.ACTION_BAR)\n\nexport const getSorting = formDefinition => {\n const table = getTable(formDefinition)\n return table.sorting ? table.sorting : []\n}\n\nexport const getSelectable = formDefinition => {\n const table = getTable(formDefinition)\n return table.selectable !== false\n}\n\nexport const getClickable = formDefinition => {\n const table = getTable(formDefinition)\n return table.clickable !== false\n}\n\nexport const getDisablePreferencesMenu = formDefinition =>\n formDefinition.disablePreferencesMenu === true\n\nexport const getEndpoint = formDefinition => {\n const table = getTable(formDefinition)\n return table.endpoint || null\n}\n\nexport const getSearchEndpoint = formDefinition => {\n const table = getTable(formDefinition)\n return table.searchEndpoint || null\n}\n\nexport const getConstriction = formDefinition => {\n const table = getTable(formDefinition)\n return table.constriction || null\n}\n\nconst isDisplayableChild = child => !child.hidden\n\nconst getSortingAttributes = (column, sorting) => {\n const idx = sorting && sorting.findIndex(s => s.field === column.id)\n return idx >= 0\n ? {\n sortRank: idx + 1,\n order: sorting[idx].order\n }\n : null\n}\n\nconst rightAlignedTypes = ['counter', 'decimal', 'double', 'integer', 'latitude', 'long', 'longitude', 'moneyamount',\n 'percent', 'serial', 'sorting', 'version']\n\nconst isRightAligned = column =>\n column.children && column.children.length === 1 && rightAlignedTypes.includes(column.children[0].dataType)\n\nexport const getColumnDefinition = ({\n table,\n sorting,\n sortable = true,\n parent,\n intl,\n columnDisplayPreferences = {},\n cellRenderers = {}\n}\n\n) => table.children\n .filter(column => Object.prototype.hasOwnProperty.call(columnDisplayPreferences, column.id)\n ? columnDisplayPreferences[column.id]\n : !column.hidden)\n .filter(column => !parent || column.children.length !== 1 || column.children[0].path !== parent.reverseRelationName)\n .filter(column => column.children.filter(isDisplayableChild).length > 0)\n .map(c => (\n {\n id: c.id,\n label: c.label,\n sorting: {\n sortable: sortable && c.sortable,\n ...getSortingAttributes(c, sorting)\n },\n shrinkToContent: c.shrinkToContent || false,\n children: c.children.filter(isDisplayableChild),\n resizable: !c.widthFixed,\n rightAligned: isRightAligned(c),\n CellRenderer: ({rowData, column}) =>\n c.clientRenderer && cellRenderers[c.clientRenderer]\n ? cellRenderers[c.clientRenderer](rowData, column, child => cellRenderer(child, rowData, parent, intl))\n : column.children.map(child => cellRenderer(child, rowData, parent, intl))\n }\n ))\n\nexport const getFields = (formDefinition, columnDisplayPreferences) => {\n const relationFields = []\n const displayExpressionFields = []\n const columns = getColumnDefinition({table: getTable(formDefinition), columnDisplayPreferences})\n\n const fields = columns.reduce((accumulator, current) => (\n [\n ...accumulator,\n ...current.children\n .filter(child => !actions.isAction(child.componentType))\n .map(child => {\n if (api.relationFieldTypes.includes(child.dataType)) {\n relationFields.push(child.path)\n } else if (child.componentType === 'display') {\n displayExpressionFields.push(child.id)\n return null\n }\n\n return child.path\n }).filter(f => f)]\n ), [])\n\n return {paths: _uniq(fields), relationFields, displayExpressionFields}\n}\n\nexport const getFormFieldFlat = formDefinition =>\n searchChildren(formDefinition)\n\nconst searchChildren = node => {\n if (node.componentType === 'field-set') {\n return node.children.reduce((acc, value) => ({...acc, [value.path || value.id]: value.dataType}), {})\n } else if (node.children) {\n return node.children.reduce((acc, value) => ({\n ...acc,\n ...searchChildren(value)\n }), {})\n }\n}\n\n/**\n * If the search form contains a field pointing to the parent entity this must not be a full-text\n * search field and should be readonly. This function will search for the correct field and replace its\n * type and change the readonly attribute.\n */\nexport const changeParentFieldType = (formElement, parentPath) => {\n if (formElement.componentType === 'field-set') {\n const containsParentField = formElement.children.some(child => child.path === parentPath)\n\n return {\n ...formElement,\n ...(containsParentField && {readonly: true}),\n children: formElement.children.map(child =>\n child.path === parentPath\n ? {...child, dataType: 'single-select-box'}\n : child)\n }\n }\n if (formElement.children) {\n return {\n ...formElement,\n children: formElement.children.map(child => changeParentFieldType(child, parentPath))\n }\n }\n\n return formElement\n}\n\nexport const getTableColumns = (formDefinition, columnDisplayPreferences = {}, parent) =>\n getTable(formDefinition)\n .children\n .filter(column => !parent || column.children.length !== 1 || column.children[0].path !== parent.reverseRelationName)\n .map(column => ({\n ...column,\n hidden: Object.prototype.hasOwnProperty.call(columnDisplayPreferences, column.id)\n ? !columnDisplayPreferences[column.id]\n : column.hidden\n }))\n","import React from 'react'\nimport _forOwn from 'lodash/forOwn'\nimport {FormattedMessage} from 'react-intl'\nimport {form} from 'tocco-app-extensions'\n\nexport const validateSearchFields = (values, formDefinition) => {\n const errors = {}\n\n _forOwn(values, (value, fieldName) => {\n let fieldDefinition = fieldDefinitionCache.get(fieldName)\n if (!fieldDefinition) {\n fieldDefinition = getFieldDefinition(form.transformFieldNameBack(fieldName), formDefinition)\n fieldDefinitionCache.add(fieldName, fieldDefinition)\n }\n\n if (fieldDefinition) {\n const fieldErrors = validateField(value, fieldDefinition)\n if (fieldErrors) {\n errors[fieldName] = fieldErrors\n }\n }\n })\n\n return errors\n}\n\nconst validateField = (value, definition) => {\n const type = definition.dataType\n const typeValidator = typeValidators[type]\n\n if (typeValidator) {\n return typeValidator(value)\n }\n return null\n}\n\nconst fieldDefinitionCache = (() => {\n const definitionCache = {}\n\n const addToCache = (name, definition) => {\n definitionCache[name] = definition\n }\n const getFromCache = name => definitionCache[name]\n\n return {\n add: addToCache,\n get: getFromCache\n }\n})()\n\nconst getFieldDefinition = (fieldName, fieldDefinition) => {\n if (fieldDefinition.id === fieldName) {\n return fieldDefinition.children[0]\n }\n\n let result = null\n if (fieldDefinition.children) {\n fieldDefinition.children.forEach(child => {\n const fieldDefinition = getFieldDefinition(fieldName, child)\n if (fieldDefinition) {\n result = fieldDefinition\n }\n })\n }\n\n return result\n}\n\nconst typeValidators = {\n 'string': value => {\n const minLength = 2\n if (value.length > 0 && value.length < minLength) {\n return {\n minLength: [\n <FormattedMessage\n key=\"minLength\"\n id=\"client.entity-list.searchFormValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n }\n },\n 'fulltext-search': value => {\n const minLength = 2\n if (value.length > 0 && value.length < minLength) {\n return {\n minLength: [\n <FormattedMessage\n key=\"minLength\"\n id=\"client.entity-list.searchFormValidationMinLength\"\n values={{minLength}}\n />\n ]\n }\n }\n }\n}\n","import styled from 'styled-components'\nimport {scale, theme, StyledButton} from 'tocco-ui'\nimport {StyledLabel, StyledLi} from 'tocco-ui/src/Typography'\nimport {lighten} from 'polished'\n\nexport const StyledUl = styled.ul`\n list-style-type: none;\n margin-top: ${scale.space(-0.5)} !important; // Nice2 Reset\n padding-left: ${scale.space(-0.5)} !important; // Nice2 Reset\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n\n ${StyledLabel} {\n padding: 0 !important; // Nice2 Reset\n }\n`\n\nexport const StyledCheckbox = styled.input`\n vertical-align: top;\n margin-right: ${scale.space(-1)} !important; // Nice2 Reset\n\n &:hover {\n cursor: pointer;\n }\n`\n\nexport const StyledButtonWrapper = styled.div`\n position: sticky;\n bottom: 0;\n padding-top: ${scale.space(0)};\n background-color: ${theme.color('paper')};\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n\nexport const StyledId = styled.span`\n color: ${theme.color('text')};\n font-style: italic;\n`\n\nexport const StyledItem = styled(StyledLi)`\n border-right: ${({isDraggedOver, theme}) => isDraggedOver ? `3px solid ${theme.colors.secondary}` : 'none'};\n ${({draggable, theme}) => draggable && `\n &:hover {\n background-color: ${lighten(0.25, theme.colors.secondaryLight)};\n\n &,\n label {\n cursor: pointer;\n }\n }\n `\n }\n`\n","import PropTypes from 'prop-types'\nimport React, {useState, useMemo} from 'react'\nimport {useDnD} from 'tocco-util'\nimport {Button, SearchBox, Typography} from 'tocco-ui'\n\nimport {\n StyledCheckbox,\n StyledUl,\n StyledButtonWrapper,\n StyledId,\n StyledItem\n} from './StyledColumnPicker'\n\nconst ColumnPicker = ({onOk, dndEnabled, initialColumns, intl}) => {\n const [columns, setColumns] = useState(initialColumns)\n const [searchTerm, setSearchTerm] = useState(null)\n const changeColumnPosition = (currentlyDragging, currentlyDragOver, columns) => {\n if (currentlyDragging !== currentlyDragOver) {\n const currentlyDraggingItem = columns.find(c => c.id === currentlyDragging)\n setColumns(columns\n .filter(c => c !== currentlyDraggingItem)\n .reduce((acc, key) => [\n ...acc,\n key,\n ...(key.id === currentlyDragOver ? [currentlyDraggingItem] : [])\n ], []))\n }\n }\n const {dndEvents, dndState} = useDnD(changeColumnPosition, columns)\n\n const items = useMemo(() => columns\n .filter(column => searchTerm === null || column.label.match(new RegExp(searchTerm, 'i')))\n .map(column => <StyledItem\n key={column.id}\n draggable={dndEnabled}\n isDraggedOver={dndState.currentlyDragOver === column.id && dndState.currentlyDragging !== column.id}\n {...(dndEnabled && {...dndEvents(column.id)})}>\n <StyledCheckbox\n type={'checkbox'}\n id={column.id}\n checked={!column.hidden}\n onChange={value => setColumns(columns\n .map(c => c.id === column.id\n ? ({\n ...c,\n hidden: !value.target.checked\n })\n : c))}\n />\n <Typography.Label for={column.id}>\n {column.label || <StyledId>{column.id}</StyledId>}\n </Typography.Label>\n </StyledItem>), [searchTerm, columns, dndState])\n\n return (\n <div>\n <SearchBox\n placeholder={intl.formatMessage({id: 'client.entity-list.preferences.columns.search'})}\n onSearch={setSearchTerm}/>\n <StyledUl>{items}</StyledUl>\n <StyledButtonWrapper>\n <Button onClick={() => onOk(columns)} look={'raised'}>\n {intl.formatMessage({id: 'client.entity-list.preferences.columns.okButton'})}\n </Button>\n </StyledButtonWrapper>\n </div>\n )\n}\n\nColumnPicker.propTypes = {\n initialColumns: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.string.isRequired,\n label: PropTypes.string,\n hidden: PropTypes.bool.isRequired\n })).isRequired,\n onOk: PropTypes.func.isRequired,\n dndEnabled: PropTypes.bool.isRequired,\n intl: PropTypes.object.isRequired\n}\n\nexport default ColumnPicker\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport ColumnPicker from './ColumnPicker'\n\nconst mapStateToProps = (state, props) => ({\n columns: props.columns,\n onOk: props.onOk\n})\n\nexport default connect(mapStateToProps)(injectIntl(ColumnPicker))\n","import ColumnPicker from './ColumnPickerContainer'\n\nexport default ColumnPicker\n","import {form, rest, notification} from 'tocco-app-extensions'\nimport React, {useState} from 'react'\nimport _reduce from 'lodash/reduce'\nimport {\n actions as formActions,\n getFormValues,\n isDirty\n} from 'redux-form'\nimport * as formActionTypes from 'redux-form/es/actionTypes'\nimport {call, put, select, takeLatest, take, all} from 'redux-saga/effects'\nimport {EditableValue, StatedValue} from 'tocco-ui'\nimport {channel} from 'redux-saga'\nimport {FormattedMessage} from 'react-intl'\n\nimport {StyledButton} from './StyledComponents'\nimport * as actions from './actions'\nimport {getFormFieldFlat, getEndpoint, changeParentFieldType} from '../../util/api/forms'\nimport {setSearchFormType} from '../entityList/actions'\nimport {validateSearchFields} from '../../util/searchFormValidation'\nimport {SET_ENTITY_MODEL, SET_FORM_DEFINITION} from '../list/actions'\nimport {getBasicQuery} from '../list/sagas'\nimport searchFormTypes from '../../util/searchFormTypes'\nimport ColumnPicker from '../../components/ColumnPicker'\n\nexport const inputSelector = state => state.input\nexport const searchFormSelector = state => state.searchForm\nexport const listSelector = state => state.list\nexport const entityListSelector = state => state.entityList\nexport const listFromDefinitionSelector = state => state.list.formDefinition\nexport const searchValuesSelector = getFormValues('searchForm')\nexport const isDirtySelector = isDirty('searchForm')\n\nconst FORM_ID = 'searchForm'\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(formActionTypes.CHANGE, submitSearchFrom),\n takeLatest(actions.SUBMIT_SEARCH_FORM, submitSearchFrom),\n takeLatest(actions.RESET_SEARCH, resetSearch),\n takeLatest(actions.SAVE_SEARCH_FILTER, saveSearchFilter),\n takeLatest(actions.DELETE_SEARCH_FILTER, deleteSearchFilter),\n takeLatest(actions.SAVE_DEFAULT_SEARCH_FILTER, saveDefaultSearchFilter),\n takeLatest(actions.RESET_DEFAULT_SEARCH_FILTER, resetDefaultSearchFilter),\n takeLatest(actions.DISPLAY_SEARCH_FIELDS_MODAL, displaySearchFieldsModal),\n takeLatest(actions.RESET_SEARCH_FIELDS, resetSearchFields)\n ])\n}\n\nexport function* initialize() {\n const {searchFormType, entityName} = yield select(entityListSelector)\n const searchFormVisible = searchFormType !== searchFormTypes.NONE\n\n const formDefinition = searchFormVisible ? yield call(loadSearchForm) : null\n yield call(setInitialFormValues, searchFormVisible, formDefinition)\n if (searchFormType === searchFormTypes.ADMIN) {\n yield call(loadSearchFilter, entityName)\n }\n\n yield put(actions.setInitialized())\n}\n\nexport function* getListFormDefinition() {\n const formDefinition = yield select(listFromDefinitionSelector)\n if (!formDefinition) {\n const action = yield take(SET_FORM_DEFINITION)\n return action.payload.formDefinition\n }\n\n return formDefinition\n}\n\nexport function* setInitialFormValues(searchFormVisible, formDefinition) {\n const {preselectedSearchFields} = yield select(inputSelector)\n const {parent} = yield select(entityListSelector)\n let formValues = {}\n if (preselectedSearchFields) {\n const model = yield call(getEntityModel)\n const preselectedValues = searchFormVisible\n ? yield call(form.transformInputValues, preselectedSearchFields, model)\n : preselectedSearchFields\n\n formValues = {...formValues, ...preselectedValues}\n }\n\n if (parent && !Object.prototype.hasOwnProperty.call(formValues, parent.reverseRelationName)) {\n const listFormDefinition = yield call(getListFormDefinition)\n const endpoint = yield call(getEndpoint, listFormDefinition)\n if (!endpoint) {\n const display = yield call(rest.fetchDisplay, parent.model, parent.key)\n formValues[parent.reverseRelationName] = {key: parent.key, display}\n }\n }\n\n if (searchFormVisible && formDefinition) {\n const fieldDefinitions = yield call(form.getFieldDefinitions, formDefinition)\n const fromDefaultValues = yield call(form.getDefaultValues, fieldDefinitions)\n formValues = {...fromDefaultValues, ...formValues}\n }\n\n const transformedFromValues = yield call(transformFieldNames, formValues)\n const oldValues = yield select(getFormValues(FORM_ID))\n\n yield put(formActions.initialize(FORM_ID, transformedFromValues))\n if (oldValues) {\n yield all(Object.keys(oldValues).map(fieldId =>\n put(formActions.change(FORM_ID, fieldId, oldValues[fieldId]))\n ))\n }\n yield put(actions.setValuesInitialized(true))\n}\n\nexport function* transformFieldNames(formValues) {\n return _reduce(formValues, (acc, val, key) => (\n {...acc, [form.transformFieldName(key)]: val}\n ), {})\n}\n\nexport function* submitSearchFrom() {\n const values = yield select(getFormValues(FORM_ID))\n const {formDefinition} = yield select(searchFormSelector)\n const errors = yield call(validateSearchFields, values, formDefinition)\n\n if (Object.keys(errors).length === 0) {\n yield put(actions.executeSearch())\n }\n}\n\nexport function* loadSearchFilter(entityName) {\n const searchFilters = yield call(rest.fetchSearchFilters, entityName)\n\n const {parent} = yield select(entityListSelector)\n const listHasNoParent = !parent\n yield put(actions.setSearchFilters(searchFilters.map(searchFilter =>\n ({...searchFilter, ...(listHasNoParent && searchFilter.defaultFilter && {active: true})}))\n ))\n}\n\nexport function* setSimpleForm() {\n const formDefinition = {txtFulltext: 'fulltext-search'}\n yield put(actions.setFormFieldsFlat(formDefinition))\n}\n\nexport function* loadSearchForm(forceLoad = false) {\n const {searchFormType, formName} = yield select(entityListSelector)\n if (searchFormType === searchFormTypes.SIMPLE) {\n yield call(setSimpleForm)\n return null\n }\n\n let formDefinition = yield call(rest.fetchForm, formName, 'search', true, forceLoad)\n\n if (formDefinition) {\n const {parent} = yield select(inputSelector)\n if (parent && parent.reverseRelationName) {\n formDefinition = yield call(changeParentFieldType, formDefinition, parent.reverseRelationName)\n }\n\n yield put(actions.setFormDefinition(formDefinition))\n yield put(actions.setFormFieldsFlat(getFormFieldFlat(formDefinition)))\n return formDefinition\n } else {\n yield put(setSearchFormType(searchFormTypes.SIMPLE))\n yield call(setSimpleForm)\n return null\n }\n}\n\nexport function* getEntityModel() {\n const entityList = yield select(listSelector)\n if (Object.keys(entityList.entityModel).length === 0) {\n yield take(SET_ENTITY_MODEL)\n }\n\n const {entityModel} = yield select(listSelector)\n return entityModel\n}\n\nexport function* resetSearchFilters() {\n const {searchFilters} = yield select(searchFormSelector)\n\n yield put(actions.setSearchFilters(searchFilters.map(searchFilter =>\n ({...searchFilter, active: searchFilter.defaultFilter})\n )))\n}\n\nexport function* resetSearch() {\n yield call(resetSearchFilters)\n yield put(formActions.reset('searchForm'))\n yield call(submitSearchFrom)\n}\n\nexport function* getSearchFormValues() {\n const {valuesInitialized} = yield select(searchFormSelector)\n\n if (!valuesInitialized) {\n yield take(actions.SET_VALUES_INITIALIZED)\n }\n\n const searchValues = yield select(searchValuesSelector)\n\n return _reduce(searchValues, (result, value, key) => (\n {\n ...result,\n ...(!Array.isArray(value) || value.length) ? {[form.transformFieldNameBack(key)]: value} : {}\n }\n ), {})\n}\n\nexport function* saveSearchFilter() {\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'filter-save',\n 'client.entity-list.search.settings.saveAsFilter',\n null,\n ({close}) => {\n const onSave = value => {\n close()\n answerChannel.put(value)\n }\n const [name, setName] = useState('')\n return <>\n <StatedValue label={'Name'}>\n <EditableValue type={'string'} value={name} events={{onChange: setName}}/>\n </StatedValue>\n <StyledButton onClick={() => onSave(name)} look={'raised'} ink={'primary'} disabled={!name}>\n <FormattedMessage id=\"client.entity-list.search.settings.saveAsFilter.button\"/>\n </StyledButton>\n </>\n },\n true\n ))\n\n const searchFilterName = yield take(answerChannel)\n const {where, filter} = yield call(getBasicQuery, false)\n const {sorting} = yield select(listSelector)\n const {entityName} = yield select(entityListSelector)\n\n const createdSearchFilter = yield call(saveNewSearchFilter, searchFilterName, entityName, where, sorting, filter)\n yield call(loadSearchFilter, entityName)\n yield call(resetSearch)\n yield put(actions.setSearchFilterActive(createdSearchFilter.uniqueId, true, true))\n}\n\nexport function* saveNewSearchFilter(name, entityName, query, sorting, filters) {\n const order = rest.createSortingString(sorting)\n const resource = 'client/searchfilters'\n const body = {\n name,\n query,\n entityName,\n order,\n filters\n }\n const {body: response} = yield call(rest.requestSaga, resource, {method: 'POST', body})\n return response\n}\n\nexport function* deleteSearchFilter({payload: {primaryKey}}) {\n const {actionAppComponent: ActionAppComponent, navigationStrategy} = yield select(inputSelector)\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n 'filter-delete',\n 'client.actions.delete.title',\n null,\n ({close}) => {\n const onSuccess = () => {\n answerChannel.put(true)\n close()\n }\n\n const onCancel = () => {\n answerChannel.put(false)\n close()\n }\n\n return <ActionAppComponent\n appId={'delete'}\n selection={{\n entityName: 'Search_filter',\n ids: [primaryKey],\n type: 'ID'\n }}\n navigationStrategy={navigationStrategy}\n onSuccess={onSuccess}\n onCancel={onCancel}/>\n },\n true\n ))\n\n const isSearchFilterDeleted = yield take(answerChannel)\n if (isSearchFilterDeleted) {\n const {entityName} = yield select(entityListSelector)\n yield call(loadSearchFilter, entityName)\n yield call(resetSearch)\n }\n}\n\nexport function* saveDefaultSearchFilter() {\n const {searchFilters, formDefinition} = yield select(searchFormSelector)\n const key = `${formDefinition.modelName}.${formDefinition.id}.searchfilter`\n const value = searchFilters.find(s => s.active).key\n yield call(rest.savePreferences, {[key]: value})\n yield put(notification.toaster({\n type: 'success',\n title: 'client.entity-list.search.settings.defaultFilter.save.success'\n }))\n}\n\nexport function* resetDefaultSearchFilter() {\n const {formDefinition} = yield select(searchFormSelector)\n yield call(rest.deleteUserPreferences, `${formDefinition.modelName}.${formDefinition.id}.searchfilter`)\n yield put(notification.toaster({\n type: 'success',\n title: 'client.entity-list.search.settings.defaultFilter.reset.success'\n }))\n}\n\nexport function* displaySearchFieldsModal() {\n const {formDefinition} = yield select(searchFormSelector)\n const columns = formDefinition.children.flatMap(f => f.children).map(f => ({\n id: f.id,\n label: f.label,\n hidden: f.hidden === true\n }))\n const columnsSorted = [\n ...columns.filter(f => !f.hidden),\n ...columns.filter(f => f.hidden)\n ]\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n `${formDefinition.id}-search-fields-selection`,\n 'client.entity-list.search.settings.searchForm.edit',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <ColumnPicker initialColumns={columnsSorted} onOk={onOk} dndEnabled={true}/>\n },\n true\n ))\n\n yield call(saveSearchFields, formDefinition.modelName, answerChannel)\n yield call(loadSearchForm, true)\n yield call(resetSearch)\n}\n\nfunction* saveSearchFields(modelName, answerChannel) {\n const columns = yield take(answerChannel)\n const resource = `forms/${modelName}/search-fields`\n const options = {\n method: 'POST',\n body: {\n hiddenFields: columns.filter(c => c.hidden).map(c => c.id),\n displayedFields: columns.filter(c => !c.hidden).map(c => c.id)\n }\n }\n\n yield call(rest.requestSaga, resource, options)\n}\n\nexport function* resetSearchFields() {\n const {formDefinition} = yield select(searchFormSelector)\n const resource = `forms/${formDefinition.modelName}/search-fields/reset`\n const options = {\n method: 'POST'\n }\n\n yield call(rest.requestSaga, resource, options)\n yield call(loadSearchForm, true)\n yield call(resetSearch)\n}\n","import {api} from 'tocco-util'\n\nexport const entitiesListTransformer = json => {\n return json.data.map(entity => api.getFlattenEntity(entity))\n}\n","import _isEqual from 'lodash/isEqual'\nimport _union from 'lodash/union'\nimport {externalEvents, rest, remoteEvents, actionEmitter} from 'tocco-app-extensions'\nimport _omit from 'lodash/omit'\nimport {call, put, fork, select, spawn, takeEvery, takeLatest, all, take, delay} from 'redux-saga/effects'\nimport {api, consoleLogger} from 'tocco-util'\n\nimport {getFetchOptionsFromSearchForm} from '../../util/api/fetchOptions'\nimport * as actions from './actions'\nimport * as searchFormActions from '../searchForm/actions'\nimport * as selectionActions from '../selection/actions'\nimport {getSearchFormValues} from '../searchForm/sagas'\nimport {\n getSorting,\n getSelectable,\n getClickable,\n getEndpoint,\n getSearchEndpoint,\n getConstriction,\n getFields,\n getDisablePreferencesMenu\n} from '../../util/api/forms'\nimport {entitiesListTransformer} from '../../util/api/entities'\nimport * as preferencesActions from '../preferences/actions'\n\nexport const inputSelector = state => state.input\nexport const entityListSelector = state => state.entityList\nexport const listSelector = state => state.list\nexport const searchFormSelector = state => state.searchForm\nexport const selectionSelector = state => state.selection\nexport const preferencesSelector = state => state.preferences\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.INITIALIZE, initialize),\n takeLatest(actions.CHANGE_PAGE, changePage),\n takeLatest(searchFormActions.EXECUTE_SEARCH, reloadData),\n takeLatest(searchFormActions.EXECUTE_SEARCH, queryChanged),\n takeLatest(actions.SET_SORTING_INTERACTIVE, reloadData),\n takeLatest(actions.REFRESH, refreshData),\n takeLatest(actions.NAVIGATE_TO_CREATE, navigateToCreate),\n takeLatest(actions.NAVIGATE_TO_ACTION, navigateToAction),\n takeLatest(selectionActions.RELOAD_DATA, reloadData),\n takeLatest(actions.ON_ROW_CLICK, onRowClick),\n takeEvery(remoteEvents.REMOTE_EVENT, remoteEvent),\n takeLatest(searchFormActions.SET_SEARCH_FILTER_ACTIVE, setSorting),\n takeLatest(actions.DEFINE_SORTING, setSorting),\n takeLatest(actions.SET_MARKED, setMarked),\n takeLatest(actions.TOGGLE_MARKINGS, toggleMarkings)\n ])\n}\n\nexport function* initialize() {\n const {entityName, formName} = yield select(entityListSelector)\n yield all([\n call(loadFormDefinition, formName),\n call(loadEntityModel, entityName)\n ])\n\n yield put(actions.setInitialized())\n}\n\nexport function* queryChanged() {\n const query = yield call(getBasicQuery)\n yield put(selectionActions.setQuery(query))\n yield put(externalEvents.fireExternalEvent('onSearchChange', {query: query}))\n}\n\nexport function* loadData(page) {\n yield put(actions.setInProgress(true))\n yield fork(countEntities)\n yield put(actions.clearEntityStore())\n yield call(requestEntities, page)\n yield put(actions.setInProgress(false))\n}\n\nexport function* getBasicQuery(regardSelection = true) {\n const {inputSearchFilters, inputTql, inputKeys, constriction} = yield select(listSelector)\n\n const {showSelectedRecords, selection} = yield select(selectionSelector)\n if (regardSelection && showSelectedRecords) {\n return {\n keys: selection\n }\n }\n\n const {formFieldsFlat, searchFilters: searchFormSearchFilter} = yield select(searchFormSelector)\n const searchFormValues = yield call(getSearchFormValues)\n\n const searchFormFetchOptions = yield call(getFetchOptionsFromSearchForm, searchFormValues, formFieldsFlat)\n\n const relevantSearchFormFetchOptions = _omit(searchFormFetchOptions, ['filters', 'tql'])\n const filter = yield call(getSearchFilter, inputSearchFilters, searchFormFetchOptions.filters, searchFormSearchFilter)\n const where = yield call(getTql, inputTql, searchFormFetchOptions.tql)\n\n const hasUserChanges = Object.keys(relevantSearchFormFetchOptions).length > 0\n || !_isEqual(inputSearchFilters || [], filter)\n || (!!searchFormFetchOptions.tql && searchFormFetchOptions.tql.length > 0)\n\n return {\n ...relevantSearchFormFetchOptions,\n ...(filter && filter.length > 0 ? {filter} : {}),\n ...(where ? {where} : {}),\n ...(constriction && {constriction}),\n ...(inputKeys ? {keys: inputKeys} : {}),\n hasUserChanges\n }\n}\n\nexport function* prepareEndpointUrl(endpoint, searchEndpoint, hasUserChanges) {\n const {parent} = yield select(entityListSelector)\n const parentKey = parent ? parent.key : ''\n const selectedEndpoint = hasUserChanges && searchEndpoint ? searchEndpoint : endpoint\n return selectedEndpoint ? selectedEndpoint.replace('{parentKey}', parentKey) : null\n}\n\nexport function* countEntities() {\n const {entityName} = yield select(inputSelector)\n const {endpoint, searchEndpoint} = yield select(listSelector)\n const {showSelectedRecords, selection} = yield select(selectionSelector)\n\n const regardSelection = !showSelectedRecords\n const query = yield call(getBasicQuery, regardSelection)\n const preparedEndpoint = yield call(prepareEndpointUrl, endpoint, searchEndpoint, query.hasUserChanges)\n\n const requestOptions = {\n method: endpoint ? 'GET' : 'POST',\n ...(preparedEndpoint ? {endpoint: preparedEndpoint} : {})\n }\n const entityCount = yield call(rest.fetchEntityCount, entityName, query, requestOptions)\n\n if (showSelectedRecords) {\n yield put(actions.setEntityCount(selection.length))\n } else {\n yield put(actions.setEntityCount(entityCount))\n }\n\n yield put(selectionActions.setQueryCount(entityCount))\n}\n\nexport function* changePage({payload}) {\n const {page} = payload\n yield put(actions.setInProgress(true))\n yield put(actions.setCurrentPage(page))\n yield call(requestEntities, page)\n yield put(actions.setInProgress(false))\n}\n\nexport function* refreshData() {\n const {currentPage} = yield select(listSelector)\n yield call(loadData, currentPage)\n}\n\nexport function* reloadData() {\n yield call(loadData, 1)\n}\n\nexport function* getSearchFilter(inputSearchFilters, searchInputsFilters, adminSearchFormFilters = []) {\n const activeSearchFormFilters = adminSearchFormFilters && adminSearchFormFilters\n .filter(f => f.active).map(f => f.uniqueId)\n\n return yield call(_union, inputSearchFilters, searchInputsFilters, activeSearchFormFilters)\n}\n\nexport function* hasActiveSearchFilterOrderBy() {\n const {searchFilters} = yield select(searchFormSelector)\n return searchFilters && searchFilters.some(f => f.active && f.orderBy)\n}\n\nexport const getTql = (inputTql, searchTql) => [\n ...(inputTql && inputTql.length > 0 ? [`(${inputTql})`] : []),\n ...(searchTql && searchTql.length > 0 ? [`(${searchTql})`] : [])\n].join(' and ')\n\nexport function* loadDisplayExpressions(formName, paths, entities) {\n if (paths && paths.length > 0 && entities.length > 0) {\n const keys = entities.map(e => e.__key)\n const entityName = entities[0].__model\n const result = yield call(rest.fetchDisplayExpressions, formName, 'list', keys, paths, entityName)\n yield put(actions.setLazyData('displayExpressions', formName, result))\n }\n}\n\nexport function* loadRelationDisplays(relationFields, entities) {\n if (relationFields && relationFields.length > 0) {\n const {lazyData} = yield select(listSelector)\n const request = yield call(api.getPathDisplayRequest, entities, relationFields, lazyData)\n const displays = yield call(rest.fetchDisplays, request)\n yield all(Object.keys(displays).map(entity =>\n put(actions.setLazyData('defaultDisplays', entity, displays[entity]))\n ))\n }\n}\n\nexport function* loadMarkings(entities) {\n const {formDefinition, entityModel} = yield select(listSelector)\n if (entityModel.markable && formDefinition.markable && entities.length > 0) {\n const selection = {\n type: 'ID',\n entityName: entityModel.name,\n ids: entities.map(e => e.__key)\n }\n const result = yield call(rest.fetchMarkings, selection)\n yield call(setLazyDataMarked, entityModel.name, result)\n }\n}\n\nexport function* setMarked({payload: {entityName, entityKey, marked}}) {\n try {\n yield all([\n call(setLazyDataMarked, entityName, {\n [entityKey]: marked\n }),\n call(rest.setMarked, entityName, entityKey, marked)\n ])\n } catch (e) {\n consoleLogger.logError('Failed to set marked', e)\n yield call(setLazyDataMarked, entityName, {\n [entityKey]: !marked\n })\n }\n}\n\nexport function* toggleMarkings({payload: {selection}}) {\n try {\n const oldMarkings = yield call(rest.fetchMarkings, selection)\n const setToMarked = Object.values(oldMarkings).includes(false)\n const newMarkings = yield call(rest.setSelectionMarked, selection, setToMarked)\n yield call(setLazyDataMarked, selection.entityName, newMarkings)\n } catch (e) {\n consoleLogger.logError('Failed to toggle markings', e)\n }\n}\n\nexport function* setLazyDataMarked(entityName, markings) {\n const {lazyData} = yield select(listSelector)\n const currentEntityMarkings = lazyData.markings && lazyData.markings[entityName] ? lazyData.markings[entityName] : {}\n const newEntityMarkings = {\n ...currentEntityMarkings,\n ...markings\n }\n yield put(actions.setLazyData('markings', entityName, newEntityMarkings))\n}\n\nexport function* fetchEntitiesAndAddToStore(page) {\n const {entityName, formName} = yield select(entityListSelector)\n const {columns: columnPreferences} = yield select(preferencesSelector)\n const {entityStore, sorting, limit, formDefinition, endpoint, searchEndpoint} = yield select(listSelector)\n if (!entityStore[page]) {\n const {paths, relationFields, displayExpressionFields} = yield call(getFields, formDefinition, columnPreferences)\n const basicQuery = yield call(getBasicQuery)\n const query = {\n ...basicQuery,\n page,\n sorting,\n limit,\n paths\n }\n const preparedEndpoint = yield call(prepareEndpointUrl, endpoint, searchEndpoint, basicQuery.hasUserChanges)\n const requestOptions = {\n method: endpoint ? 'GET' : 'POST',\n ...(preparedEndpoint ? {endpoint: preparedEndpoint} : {})\n }\n\n const entities = yield call(rest.fetchEntities, entityName, query, requestOptions, entitiesListTransformer)\n\n yield put(actions.addEntitiesToStore(page, entities))\n yield spawn(loadRelationDisplays, relationFields, entities)\n yield spawn(loadDisplayExpressions, formName, displayExpressionFields, entities)\n yield spawn(loadMarkings, entities)\n }\n}\n\nexport function* requestEntities(page) {\n const {entityStore} = yield select(listSelector)\n\n if (!entityStore[page]) {\n yield call(fetchEntitiesAndAddToStore, page)\n }\n\n yield call(displayEntity, page)\n yield spawn(delayedPreloadNextPage, page)\n}\n\nexport function* delayedPreloadNextPage(page) {\n yield delay(2000)\n yield call(preloadNextPage, page)\n}\n\nexport function* preloadNextPage(currentPage) {\n const list = yield select(listSelector)\n const {entityStore, limit} = list\n let {entityCount} = list\n const nextPage = currentPage + 1\n\n if (entityCount === null || entityCount === undefined) {\n const setCountAction = yield take(actions.SET_ENTITY_COUNT)\n entityCount = setCountAction.payload.entityCount\n }\n\n if (currentPage * limit < entityCount && !entityStore[nextPage]) {\n yield call(fetchEntitiesAndAddToStore, nextPage)\n }\n}\n\nexport function* displayEntity(page) {\n const list = yield select(listSelector)\n const entities = list.entityStore[page]\n yield put(actions.setEntities(entities))\n}\n\nfunction* getPreferencesSorting() {\n const preferences = yield select(preferencesSelector)\n if (!preferences.sorting) {\n const {payload} = yield take(preferencesActions.SET_SORTING)\n return payload.sorting\n } else {\n return preferences.sorting\n }\n}\n\nexport const FALLBACK_SORTING_FIELD = 'update_timestamp'\nexport function* setSorting() {\n const {formDefinition, entityModel} = yield select(listSelector)\n const tableSorting = yield call(getSorting, formDefinition)\n const preferencesSorting = yield call(getPreferencesSorting)\n const activeSearchFilterHasOrderBy = yield call(hasActiveSearchFilterOrderBy)\n if (preferencesSorting && preferencesSorting.length > 0) {\n yield put(actions.setSorting(preferencesSorting))\n } else if (tableSorting.length > 0) {\n yield put(actions.setSorting(tableSorting))\n } else if (!activeSearchFilterHasOrderBy && entityModel.paths[FALLBACK_SORTING_FIELD]) {\n yield put(actions.setSorting([{field: FALLBACK_SORTING_FIELD, order: 'desc'}]))\n } else {\n yield put(actions.setSorting([]))\n }\n}\n\nexport function* loadFormDefinition(formName) {\n const fetchedFormDefinition = yield call(rest.fetchForm, formName, 'list')\n yield put(actions.setFormDefinition(fetchedFormDefinition))\n yield call(extractFormInformation, fetchedFormDefinition)\n}\n\nexport function* extractFormInformation(formDefinition) {\n const selectable = yield call(getSelectable, formDefinition)\n yield put(actions.setFormSelectable(selectable))\n const clickable = yield call(getClickable, formDefinition)\n yield put(actions.setFormClickable(clickable))\n const endpoint = yield call(getEndpoint, formDefinition)\n yield put(actions.setEndpoint(endpoint))\n const searchEndpoint = yield call(getSearchEndpoint, formDefinition)\n yield put(actions.setSearchEndpoint(searchEndpoint))\n const constriction = yield call(getConstriction, formDefinition)\n yield put(actions.setConstriction(constriction))\n const disablePreferencesMenu = yield call(getDisablePreferencesMenu, formDefinition)\n yield put(actions.setDisablePreferencesMenu(disablePreferencesMenu))\n}\n\nexport function* loadEntityModel(entityName) {\n const model = yield call(rest.fetchModel, entityName)\n yield put(actions.setEntityModel(model))\n}\n\nexport function* onRowClick({payload}) {\n const {selectOnRowClick} = yield select(inputSelector)\n if (selectOnRowClick === true) {\n const list = yield select(selectionSelector)\n const selected = list.selection.includes(payload.id)\n yield put(selectionActions.onSelectChange([payload.id], !selected))\n }\n yield put(externalEvents.fireExternalEvent('onRowClick', {id: payload.id}))\n}\n\nexport function* navigateToCreate({payload}) {\n const {navigationStrategy} = yield select(inputSelector)\n yield call(navigationStrategy.navigateToCreateRelative, payload.relationName)\n}\n\nexport function* navigateToAction({payload}) {\n const {definition, selection} = payload\n const {navigationStrategy} = yield select(inputSelector)\n yield call(navigationStrategy.navigateToActionRelative, definition, selection)\n}\n\nexport const containsEntityOfModel = (event, entityName) =>\n !!event.payload.entities.find(entity => entity.entityName === entityName)\n\nexport function* remoteEvent(action) {\n const event = action.payload.event\n const {entityModel} = yield select(listSelector)\n if (['entity-create-event', 'entity-delete-event', 'entity-update-event'].includes(event.type)) {\n if (containsEntityOfModel(event, entityModel.name)) {\n yield call(reloadData)\n }\n }\n\n if (event.type === 'entity-delete-event') {\n const deletedEntityKeys = event.payload.entities.filter(e => e.entityName === entityModel.name).map(e => e.key)\n yield put(selectionActions.onSelectChange(deletedEntityKeys, false))\n }\n\n yield put(actionEmitter.emitAction(action))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst simpleSearchFieldsToArray = simpleSearchFields => (\n simpleSearchFields.split(',')\n .filter(s => s)\n .map(s => s.trim())\n)\n\nconst setSimpleSearchFields = (state, {payload}) => {\n const fieldArray = simpleSearchFieldsToArray(payload.simpleSearchFields)\n if (fieldArray.length > 0) {\n return {\n ...state,\n simpleSearchFields: fieldArray\n }\n }\n return state\n}\n\nconst setSearchFilterActive = (state, {payload: {searchFilterId, active, exclusive}}) => ({\n ...state,\n searchFilters: [...state.searchFilters.map(searchFilter =>\n ({...searchFilter, ...(searchFilterId === searchFilter.uniqueId ? {active} : exclusive ? {active: !active} : {})})\n )]\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_INITIALIZED]: reducerUtil.singleTransferReducer('initialized'),\n [actions.SET_SIMPLE_SEARCH_FIELDS]: setSimpleSearchFields,\n [actions.SET_FORM_DEFINITION]: reducerUtil.singleTransferReducer('formDefinition'),\n [actions.SET_SHOW_EXTENDED_SEARCH_FORM]: reducerUtil.singleTransferReducer('showExtendedSearchForm'),\n [actions.SET_DISABLE_SIMPLE_SEARCH]: reducerUtil.singleTransferReducer('disableSimpleSearch'),\n [actions.SET_VALUES_INITIALIZED]: reducerUtil.singleTransferReducer('valuesInitialized'),\n [actions.SET_FORM_FIELDS_FLAT]: reducerUtil.singleTransferReducer('formFieldsFlat'),\n [actions.SET_SEARCH_FILTERS]: reducerUtil.singleTransferReducer('searchFilters'),\n [actions.SET_SEARCH_FILTER_ACTIVE]: setSearchFilterActive\n}\n\nconst initialState = {\n initialized: false,\n formDefinition: {},\n showExtendedSearchForm: false,\n simpleSearchFields: ['txtFulltext'],\n disableSimpleSearch: false,\n valuesInitialized: false,\n searchFilters: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import {reducer as reducerUtil} from 'tocco-util'\nimport _uniq from 'lodash/uniq'\n\nimport * as actions from './actions'\n\nconst comparator = (a, b) => a - b\n\nconst setSelection = (state, {payload}) => ({\n ...state,\n selection: _uniq(payload.selection).sort(comparator)\n})\n\nconst clearSelection = (state, {payload}) => ({\n ...state,\n selection: [],\n showSelectedRecords: false\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_TABLE_SELECTION_STYLE]: reducerUtil.singleTransferReducer('tableSelectionStyle'),\n [actions.TOGGLE_SHOW_SELECTED_RECORDS]: reducerUtil.toggleReducer('showSelectedRecords'),\n [actions.SET_SELECTION]: setSelection,\n [actions.CLEAR_SELECTION]: clearSelection,\n [actions.SET_SHOW_SELECTION_CONTROLLER]: reducerUtil.singleTransferReducer('showSelectionController'),\n [actions.SET_TABLE_SELECTION_STYLE]: reducerUtil.singleTransferReducer('tableSelectionStyle'),\n [actions.SET_QUERY]: reducerUtil.singleTransferReducer('query'),\n [actions.SET_QUERY_COUNT]: reducerUtil.singleTransferReducer('queryCount')\n}\n\nconst initialState = {\n showSelectedRecords: false,\n selection: [],\n showSelectionController: false,\n tableSelectionStyle: 'none',\n query: {},\n queryCount: 0\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import PropTypes from 'prop-types'\n\nconst selectionStyles = {\n SINGLE: 'single',\n MULTI: 'multi',\n MULTI_EXPLICIT: 'multi_explicit',\n NONE: 'none'\n}\n\nconst selectionStylePropType = PropTypes.oneOf(Object.keys(selectionStyles).map(key => selectionStyles[key]))\n\nexport {\n selectionStyles as default,\n selectionStylePropType\n}\n","import _uniq from 'lodash/uniq'\n\nimport selectionStyles from './selectionStyles'\n\nexport const showSelectionComponent = (inputSelectionStyle, disableSelectionController, formSelectable) => {\n return disableSelectionController !== true\n && (!inputSelectionStyle || inputSelectionStyle === selectionStyles.MULTI)\n && formSelectable !== false\n}\n\nexport const getTableSelectionStyle = (inputSelectionStyle, fromSelectable) => {\n if (fromSelectable === false || inputSelectionStyle === selectionStyles.NONE) {\n return selectionStyles.NONE\n }\n\n if (inputSelectionStyle === selectionStyles.SINGLE) {\n return selectionStyles.SINGLE\n }\n\n return selectionStyles.MULTI\n}\n\n/**\n * Comparator function which can be used to sort numerical arrays in ascending order.\n */\nconst ascendingNumberComparator = (a, b) => a - b\n\n/**\n * Takes the existing selection and the new selection which can be either of the type selected or deselected and\n * combines them to a new selection which will be returned.\n */\nexport const combineSelection = (currentSelection, keys, isSelected) => {\n let newSelection = currentSelection.slice()\n for (const key of keys) {\n if (isSelected) {\n newSelection.push(key)\n } else {\n newSelection = newSelection.filter(k => k !== key)\n }\n }\n\n return _uniq(newSelection).sort(ascendingNumberComparator)\n}\n","import {externalEvents} from 'tocco-app-extensions'\nimport {call, put, select, takeLatest, all} from 'redux-saga/effects'\n\nimport * as actions from './actions'\nimport selectionStyles from '../../util/selectionStyles'\nimport {SET_FORM_SELECTABLE} from '../list/actions'\nimport {combineSelection, showSelectionComponent, getTableSelectionStyle} from '../../util/selection'\n\nexport const inputSelector = state => state.input\nexport const entityListSelector = state => state.entityList\nexport const selectionSelector = state => state.selection\nexport const listSelector = state => state.list\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.TOGGLE_SHOW_SELECTED_RECORDS, reloadData),\n takeLatest(actions.ON_SELECT_CHANGE, onSelectChange),\n takeLatest(actions.CLEAR_SELECTION, clearSelection),\n takeLatest(SET_FORM_SELECTABLE, initialize)\n ])\n}\n\nexport function* onSelectChange({payload: {keys, isSelected}}) {\n const {selection: currentSelection} = yield select(selectionSelector)\n const {selectionStyle} = yield select(inputSelector)\n\n const newSelection = selectionStyle === selectionStyles.SINGLE\n ? keys\n : yield call(combineSelection, currentSelection, keys, isSelected)\n\n yield put(actions.setSelection(newSelection))\n yield put(externalEvents.fireExternalEvent('onSelectChange', newSelection))\n}\n\nexport function* clearSelection() {\n yield put(externalEvents.fireExternalEvent('onSelectChange', []))\n}\n\nexport function* reloadData() {\n yield put(actions.reloadData())\n}\n\nexport function* initialize() {\n const {formSelectable} = yield select(listSelector)\n const {selectionStyle, disableSelectionController} = yield select(inputSelector)\n const {selectionMode} = yield select(selectionSelector)\n\n const selectionControllerVisible = yield call(\n showSelectionComponent,\n selectionStyle,\n disableSelectionController,\n formSelectable\n )\n yield put(actions.setShowSelectionController(selectionControllerVisible))\n\n yield call(setTableStyle, selectionMode)\n}\n\nexport function* setTableStyle() {\n const {formSelectable} = yield select(listSelector)\n const {selectionStyle} = yield select(inputSelector)\n\n const tableSelectionStyle = yield call(getTableSelectionStyle, selectionStyle, formSelectable)\n yield put(actions.setTableSelectionStyle(tableSelectionStyle))\n}\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst resetSorting = state => ({\n ...state,\n sorting: []\n})\n\nconst resetColumns = state => ({\n ...state,\n positions: {},\n columns: {}\n})\n\nconst resetPreferences = state => ({\n ...state,\n positions: {},\n sorting: [],\n columns: {}\n})\n\nconst ACTION_HANDLERS = {\n [actions.SET_POSITIONS]: reducerUtil.singleTransferReducer('positions'),\n [actions.SET_SORTING]: reducerUtil.singleTransferReducer('sorting'),\n [actions.SET_COLUMNS]: reducerUtil.singleTransferReducer('columns'),\n [actions.SET_PREFERENCES_LOADED]: reducerUtil.singleTransferReducer('preferencesLoaded'),\n [actions.RESET_SORTING]: resetSorting,\n [actions.RESET_COLUMNS]: resetColumns,\n [actions.RESET_PREFERENCES]: resetPreferences\n}\n\nconst initialState = {\n positions: {},\n sorting: [],\n columns: {},\n preferencesLoaded: false\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","export const getPositions = preferences =>\n Object.keys(preferences)\n .filter(key => key.endsWith('.position'))\n .reduce((acc, key) => {\n const fieldName = key.match(/.*\\.([^.]+)\\.position$/)\n return {\n ...acc,\n [fieldName[1]]: Number(preferences[key])\n }\n }, {})\n\nexport const getPositionsFromColumns = columns =>\n columns\n .filter(c => !c.fixedPosition)\n .reduce((acc, c, idx) => ({\n ...acc,\n [c.id]: idx\n }), {})\n\nexport const changePosition = (positions, field, fieldAfterPosition) =>\n Object.keys(positions)\n .sort((a, b) => positions[a] - positions[b])\n .filter(key => key !== field)\n .reduce((acc, key) => [\n ...acc,\n key,\n ...(key === fieldAfterPosition ? [field] : [])\n ]\n , [])\n .reduce((acc, key, idx) => ({\n ...acc,\n [key]: idx\n })\n , {})\n\nexport const getPositionsPreferencesToSave = (formName, positions) =>\n Object.keys(positions)\n .reduce((acc, key) => ({\n ...acc,\n [`${formName}.${key}.position`]: positions[key].toString()\n }), {})\n\nexport const getSorting = preferences => {\n const keyRegex = /^.*\\.sorting(Field|Direction)\\.?([1-9]*)$/\n return Object.entries(preferences)\n .filter(([key]) => keyRegex.test(key))\n .map(([key, value]) => [transformSortingKey(key.match(keyRegex)), value])\n .reduce((acc, [key, value]) => {\n acc[key.index] = {\n ...acc[key.index],\n [key.field]: value\n }\n return acc\n }, [])\n}\n\nconst transformSortingKey = keyMatch => ({\n field: transformSortingField(keyMatch[1]),\n index: keyMatch[2] ? parseInt(keyMatch[2]) : 0\n})\n\nconst transformSortingField = field => field === 'Direction' ? 'order' : field.toLowerCase()\n\nexport const getSortingPreferencesToSave = (formName, sorting) => ({\n [`${formName}.sortingField`]: sorting.field,\n [`${formName}.sortingDirection`]: sorting.order\n})\n\nexport const getAdditionalSortingPreferencesToSave = (formName, sorting, index) => ({\n [`${formName}.sortingField.${index}`]: sorting.field,\n [`${formName}.sortingDirection.${index}`]: sorting.order\n})\n\nexport const getColumns = preferences => {\n const keyRegex = /^[^.]+\\.(.+)\\.hidden$/\n return Object.entries(preferences)\n .filter(([key]) => keyRegex.test(key))\n .reduce((acc, [key, value]) => {\n const fieldName = key.match(keyRegex)[1]\n return {\n ...acc,\n // old preferences marked hidden columns as true, now we mark visible columns as true\n [fieldName]: value === 'false'\n }\n }, {})\n}\n\nexport const getColumnPreferencesToSave = (formName, columns) =>\n Object.keys(columns)\n .reduce((acc, key) => ({\n ...acc,\n // old preferences marked hidden columns as true, now we mark visible columns as true\n [`${formName}.${key}.hidden`]: (!columns[key]).toString()\n }), {})\n","import {rest, notification} from 'tocco-app-extensions'\nimport {all, call, put, select, take, takeLatest} from 'redux-saga/effects'\nimport React from 'react'\nimport {channel} from 'redux-saga'\n\nimport * as actions from './actions'\nimport {setPositions, setSorting, setColumns, setPreferencesLoaded} from './actions'\nimport * as listActions from '../list/actions'\nimport * as listSagas from '../list/sagas'\nimport * as util from '../../util/preferences'\nimport ColumnPicker from '../../components/ColumnPicker'\nimport {getTableColumns} from '../../util/api/forms'\n\nexport const inputSelector = state => state.input\n\nexport const preferencesSelector = state => state.preferences\n\nexport default function* sagas() {\n yield all([\n takeLatest(actions.LOAD_PREFERENCES, loadPreferences),\n takeLatest(actions.CHANGE_POSITION, changePosition),\n takeLatest(listActions.SET_SORTING_INTERACTIVE, saveSorting),\n takeLatest(actions.RESET_SORTING, resetSorting),\n takeLatest(actions.RESET_COLUMNS, resetColumns),\n takeLatest(actions.RESET_PREFERENCES, resetPreferences),\n takeLatest(actions.DISPLAY_COLUMN_MODAL, displayColumnModal)\n ])\n}\n\nexport function* loadPreferences() {\n const listState = yield select(listSagas.entityListSelector)\n const formName = `${listState.formName}_list`\n const preferences = yield call(rest.fetchUserPreferences, `${formName}*`)\n yield put(setPositions(util.getPositions(preferences)))\n yield put(setSorting(util.getSorting(preferences)))\n yield put(setColumns(util.getColumns(preferences)))\n yield put(setPreferencesLoaded(true))\n}\n\nexport function* changePosition({payload}) {\n const {field, afterFieldPosition, columns} = payload\n let {positions} = yield select(preferencesSelector)\n\n if (Object.keys(positions).length === 0) {\n positions = yield call(util.getPositionsFromColumns, columns)\n }\n\n const newPositions = yield call(util.changePosition, positions, field, afterFieldPosition)\n yield put(setPositions(newPositions))\n const listState = yield select(listSagas.entityListSelector)\n const formName = `${listState.formName}_list`\n yield call(rest.deleteUserPreferences, `${formName}.*.positions`)\n const positionPreferences = yield call(util.getPositionsPreferencesToSave, formName, newPositions)\n yield call(rest.savePreferences, positionPreferences)\n}\n\nexport function* saveSorting() {\n const {sorting: sortings} = yield select(listSagas.listSelector)\n if (sortings.length > 0) {\n const listState = yield select(listSagas.entityListSelector)\n const formName = `${listState.formName}_list`\n yield all([\n call(rest.deleteUserPreferences, `${formName}.sortingField*`),\n call(rest.deleteUserPreferences, `${formName}.sortingDirection*`)\n ])\n const sortingPreferences = sortings.slice(1)\n .map((sorting, index) => util.getAdditionalSortingPreferencesToSave(formName, sorting, index + 1))\n .reduce((acc, sorting) => ({\n ...acc,\n ...sorting\n }), util.getSortingPreferencesToSave(formName, sortings[0]))\n yield call(rest.savePreferences, sortingPreferences)\n }\n}\n\nexport function* resetSorting() {\n const listState = yield select(listSagas.entityListSelector)\n yield all([\n call(rest.deleteUserPreferences, `${listState.formName}_list.sortingField*`),\n call(rest.deleteUserPreferences, `${listState.formName}_list.sortingDirection*`)\n ])\n yield call(listSagas.setSorting)\n yield call(listSagas.reloadData)\n}\n\nexport function* resetPreferences() {\n const listState = yield select(listSagas.entityListSelector)\n yield call(rest.deleteUserPreferences, `${listState.formName}_list.*`)\n yield call(listSagas.setSorting)\n yield call(listSagas.reloadData)\n}\n\nexport function* displayColumnModal() {\n const {formDefinition} = yield select(listSagas.listSelector)\n const {columns: preferencesColumns} = yield select(preferencesSelector)\n const {parent} = yield select(listSagas.entityListSelector)\n const formColumns = getTableColumns(formDefinition, preferencesColumns, parent)\n\n const answerChannel = yield call(channel)\n yield put(notification.modal(\n `${formDefinition.id}-column-selection`,\n 'client.entity-list.preferences.columns',\n null,\n ({close}) => {\n const onOk = columns => {\n close()\n answerChannel.put(columns)\n }\n\n return <ColumnPicker initialColumns={formColumns} onOk={onOk} dndEnabled={false}/>\n },\n true\n ))\n\n yield saveColumnPreferences(answerChannel, preferencesColumns, formDefinition)\n}\n\nfunction* saveColumnPreferences(answerChannel, preferencesColumns, formDefinition) {\n const columns = (yield take(answerChannel)).reduce((accumulator, item) => ({\n ...accumulator,\n [item.id]: !item.hidden\n }), {})\n const diffColumns = Object.keys(columns).reduce((accumulator, columnName) => ({\n ...accumulator,\n ...(columns[columnName] !== preferencesColumns[columnName]\n ? {[columnName]: columns[columnName]}\n : {})\n }), {})\n yield put(setColumns(columns))\n if (Object.entries(diffColumns).some(([, value]) => value)) {\n yield put(listActions.refresh())\n }\n const columnPreferences = yield call(util.getColumnPreferencesToSave, formDefinition.id, diffColumns)\n yield call(rest.savePreferences, columnPreferences)\n}\n\nexport function* resetColumns() {\n const listState = yield select(listSagas.entityListSelector)\n yield all([\n call(rest.deleteUserPreferences, `${listState.formName}_list.*.position`),\n call(rest.deleteUserPreferences, `${listState.formName}_list.*.hidden`)\n ])\n yield put(listActions.refresh())\n}\n","import {reducer as form} from 'redux-form'\n\nimport entityListReducer, {sagas as entityListSagas} from './entityList'\nimport listReducer, {sagas as listSagas} from './list'\nimport searchFormReducer, {sagas as searchFormSagas} from './searchForm'\nimport selectionReducer, {sagas as selectionSagas} from './selection'\nimport preferencesReducer, {sagas as preferencesSaga} from './preferences'\n\nexport default {\n entityList: entityListReducer,\n list: listReducer,\n searchForm: searchFormReducer,\n form,\n selection: selectionReducer,\n preferences: preferencesReducer\n}\n\nexport const sagas = [\n entityListSagas,\n listSagas,\n searchFormSagas,\n selectionSagas,\n preferencesSaga\n]\n","import React, {useMemo} from 'react'\nimport PropTypes from 'prop-types'\nimport {reduxForm, Field} from 'redux-form'\nimport {form} from 'tocco-app-extensions'\nimport {SearchBox} from 'tocco-ui'\n\nconst FullTextSearchForm = props => {\n const {submitSearchForm, intl} = props\n const handleSubmit = e => {\n e.preventDefault()\n e.stopPropagation()\n submitSearchForm()\n }\n\n const msg = id => (intl.formatMessage({id}))\n\n const field = useMemo(() => ({input}) =>\n <SearchBox\n value={input.value}\n liveSearch={true}\n onSearch={value => input.onChange(value)}\n placeholder={msg('client.entity-list.fullTextPlaceholder')}\n />, [])\n\n return (\n <form onSubmit={handleSubmit}>\n <Field name=\"txtFulltext\" component={field}/>\n </form>\n )\n}\n\nFullTextSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n submitSearchForm: PropTypes.func.isRequired,\n input: PropTypes.string\n}\n\nexport default reduxForm({\n form: 'searchForm',\n destroyOnUnmount: false\n})(FullTextSearchForm)\n","import FullTextSearchForm from './FullTextSearchForm'\n\nexport default FullTextSearchForm\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport FullTextSearchForm from '../components/FullTextSearchForm'\nimport {submitSearchForm} from '../modules/searchForm/actions'\n\nconst mapActionCreators = {\n submitSearchForm\n}\n\nexport default connect(null, mapActionCreators)(injectIntl(FullTextSearchForm))\n","import styled from 'styled-components'\nimport {StyledLayoutBox, StyledScrollbar} from 'tocco-ui/src/Layout'\n\nexport const StyledBasicSearchForm = styled.div`\n ${StyledScrollbar}\n\n && {\n ${StyledLayoutBox} {\n padding-bottom: 0;\n }\n }\n`\n\nexport const StyledSearchFormButtons = styled.div`\n && {\n width: 100%;\n text-align: center;\n }\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {reduxForm} from 'redux-form'\nimport {Ball} from 'tocco-ui'\nimport {form} from 'tocco-app-extensions'\n\nimport {\n StyledBasicSearchForm,\n StyledSearchFormButtons\n} from './StyledBasicSearchForm'\n\nconst REDUX_FORM_NAME = 'searchForm'\n\nconst BasicSearchForm = ({\n disableSimpleSearch,\n entity,\n form: formName,\n formValues,\n intl,\n preselectedSearchFields,\n searchFormDefinition,\n setShowExtendedSearchForm,\n showExtendedSearchForm,\n simpleSearchFields,\n submitSearchForm\n}) => {\n if (!searchFormDefinition.children) {\n return null\n }\n\n const msg = id => intl.formatMessage({id})\n\n const handleSubmit = e => {\n e.preventDefault()\n e.stopPropagation()\n submitSearchForm()\n }\n\n const isHidden = (preselectedSearchFields, name) => {\n if (!preselectedSearchFields) {\n return false\n }\n const field = preselectedSearchFields.find(f => f.id === name)\n return field && field.hidden\n }\n\n const shouldRenderField = (\n preselectedSearchFields,\n disableSimpleSearch,\n showExtendedSearchForm,\n simpleSearchFields) => name => (\n !isHidden(preselectedSearchFields, name)\n && (\n disableSimpleSearch\n || showExtendedSearchForm\n || simpleSearchFields.includes(name)\n )\n )\n\n const toggleExtendedSearchForm = () => {\n setShowExtendedSearchForm(!showExtendedSearchForm)\n }\n\n const fields = form.getFieldDefinitions(searchFormDefinition)\n const hasExtendedOnlySearchFields = !fields.every(field => simpleSearchFields.includes(field.id))\n\n return (\n <StyledBasicSearchForm>\n <form onSubmit={handleSubmit}>\n {hasExtendedOnlySearchFields && !disableSimpleSearch\n && <StyledSearchFormButtons>\n <Ball\n data-cy=\"extend-search-button\"\n icon={`chevron-${showExtendedSearchForm ? 'up' : 'down'}`}\n onClick={toggleExtendedSearchForm}\n title={msg('client.entity-list.extendedSearch')}\n />\n </StyledSearchFormButtons>\n }\n <form.FormBuilder\n entity={entity}\n formName={formName}\n formDefinition={searchFormDefinition}\n formValues={formValues}\n fieldMappingType=\"search\"\n beforeRenderField={shouldRenderField(\n preselectedSearchFields,\n disableSimpleSearch,\n showExtendedSearchForm,\n simpleSearchFields)\n }\n mode=\"search\"\n />\n </form>\n </StyledBasicSearchForm>\n )\n}\n\nBasicSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n searchFormDefinition: PropTypes.shape({\n children: PropTypes.array\n }).isRequired,\n submitSearchForm: PropTypes.func.isRequired,\n disableSimpleSearch: PropTypes.bool,\n simpleSearchFields: PropTypes.arrayOf(\n PropTypes.string\n ),\n showExtendedSearchForm: PropTypes.bool,\n setShowExtendedSearchForm: PropTypes.func.isRequired,\n preselectedSearchFields: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n hidden: PropTypes.bool\n })\n ),\n entity: PropTypes.object,\n form: PropTypes.string,\n formValues: PropTypes.object\n}\n\nexport default reduxForm({\n form: REDUX_FORM_NAME,\n destroyOnUnmount: false\n})(BasicSearchForm)\n","import BasicSearchForm from './BasicSearchForm'\n\nexport default BasicSearchForm\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport BasicSearchForm from '../components/BasicSearchForm'\nimport {\n submitSearchForm,\n setShowExtendedSearchForm\n} from '../modules/searchForm/actions'\n\nconst mapActionCreators = {\n submitSearchForm,\n setShowExtendedSearchForm\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFormDefinition: state.searchForm.formDefinition,\n entityModel: state.list.entityModel,\n searchInputs: state.searchForm.searchInputs,\n disableSimpleSearch: props.disableSimpleSearch || state.searchForm.disableSimpleSearch,\n simpleSearchFields: state.searchForm.simpleSearchFields,\n showExtendedSearchForm: state.searchForm.showExtendedSearchForm,\n preselectedSearchFields: state.input.preselectedSearchFields\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(BasicSearchForm))\n","import styled from 'styled-components'\nimport {StyledScrollbar, theme, Menu, Button, scale} from 'tocco-ui'\nimport Split from 'react-split'\n\nexport const StyledSplit = styled(Split)``\n\nexport const StyledSplitWrapper = styled.div`\n height: 100%;\n`\n\nexport const StyledHeader = styled.div`\n background-color: ${theme.color('paper')};\n border-bottom: 3px solid ${theme.color('backgroundBody')};\n display: flex;\n justify-content: flex-end;\n padding: 9px;\n position: relative;\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n\n ${Menu} {\n z-index: 3; //higher than rest to lay over search filter list\n }\n`\n\nexport const AdminSearchGrid = styled.div`\n display: ${({isCollapsed}) => isCollapsed ? 'none' : 'block'};\n height: 100%;\n overflow: hidden;\n\n ${StyledSplit} {\n height: calc(100% - 40px);\n display: flex;\n flex-direction: column;\n }\n`\n\nexport const StyledPlaceHolder = styled.div`\n display: ${({isCollapsed}) => isCollapsed ? 'flex' : 'none'};\n flex: 1;\n background: ${theme.color('paper')};\n padding-top: ${scale.space(-0.5)};\n padding-left: ${scale.space(-2.5)};\n\n &:hover {\n cursor: pointer;\n }\n`\n\nexport const StyledToggleCollapseButton = styled(Button)`\n font-size: ${scale.font(0)};\n padding: 0;\n margin-right: auto;\n position: relative;\n left: ${({isCollapsed}) => !isCollapsed ? '-5px' : '2.5px'};\n\n &:hover,\n ${/* sc-selector */StyledPlaceHolder}:hover & {\n background-color: transparent;\n color: ${theme.color('secondaryLight')};\n }\n`\n\nexport const Box = styled.div`\n background-color: ${theme.color('paper')};\n overflow-y: auto;\n padding: .6rem 1rem 0 .6rem;\n position: relative;\n\n &:first-of-type {\n z-index: 2; // higher than StyledTether to prevent cover on scroll\n }\n ${StyledScrollbar}\n`\n\nexport const StyledGutter = styled.div`\n background-color: ${theme.color('paper')};\n display: flex;\n padding-top: 3px;\n justify-content: center;\n align-items: center;\n height: calc(100% - 1px); //subtract border height from total height\n font-size: 20px;\n border-top: 1px solid ${theme.color('backgroundBody')};\n position: relative;\n z-index: 2;\n\n &:hover {\n cursor: row-resize;\n }\n`\n","export const searchFilterCompare = (a, b) => {\n return a.defaultFilter || b.defaultFilter\n ? a.defaultFilter ? -1 : 1\n : (a.sorting === null) - (b.sorting === null) || a.sorting - b.sorting\n}\n","/* stylelint-disable no-descending-specificity */\n/* stylelint-disable rule-empty-line-before */\nimport styled from 'styled-components'\nimport {Button, scale, StyledSpan, theme, StyledItemLabel} from 'tocco-ui'\n\nexport const SearchFilterListWrapper = styled.div`\n margin-top: .4rem;\n margin-bottom: .4rem;\n`\n\nexport const StyledSpanSearchFilter = styled(StyledSpan)`\n width: 90%;\n`\n\nexport const StyledAddRemoveButton = styled(Button)`\n && {\n background-color: transparent;\n border: 0;\n height: auto;\n border-radius: 0;\n padding: 0 ${scale.space(-2.5)} 0 0;\n\n &:hover * {\n color: ${({active}) => active ? theme.color('paper') : theme.color('secondary')} !important;\n }\n }\n`\n\nexport const StyledMenuWrapper = styled.div`\n &&& {\n button {\n background-color: transparent;\n padding: 0 ${scale.space(-1)} 0 0;\n }\n\n &:hover button {\n color: ${({active}) => active ? theme.color('paper') : theme.color('secondary')};\n cursor: pointer;\n }\n }\n`\n\nexport const StyleButtonWrapper = styled.div`\n display: flex;\n ${/* sc-selector */StyledMenuWrapper} button,\n ${/* sc-selector */StyledAddRemoveButton} * {\n color: transparent;\n }\n`\n\nexport const StyledSearchFilterButton = styled.div`\n border-radius: ${theme.radii('medium')};\n display: flex;\n padding: .3rem 0 .3rem 1rem;\n margin-bottom: .2rem;\n background-color: ${({active}) => active && theme.color('secondary')};\n justify-content: flex-end;\n\n && {\n *:not(${/* sc-selector */StyledItemLabel}) {\n color: ${({active}) => active && theme.color('paper')};\n }\n }\n\n &:hover {\n ${/* sc-selector */StyledSpanSearchFilter},\n ${/* sc-selector */StyledMenuWrapper} button,\n ${/* sc-selector */StyledAddRemoveButton} * {\n color: ${theme.color('paper')};\n }\n background-color: ${({active}) => !active && theme.color('secondaryLight')};\n cursor: pointer;\n }\n`\n\nexport const StyledMessageWrapper = styled.div`\n padding-left: 8px;\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {MenuItem, BallMenu, Typography} from 'tocco-ui'\nimport {FormattedMessage} from 'react-intl'\n\nimport {searchFilterCompare} from './utils'\nimport {\n SearchFilterListWrapper,\n StyledSpanSearchFilter,\n StyledAddRemoveButton,\n StyledMenuWrapper,\n StyledSearchFilterButton,\n StyledMessageWrapper,\n StyleButtonWrapper\n} from './StyledComponents'\n\nconst EllipsisMenu = ({canEdit, canDelete, navigationStrategy, deleteSearchFilter, primaryKey, active}) => {\n const entries = []\n\n if (canEdit) {\n entries.push(\n <MenuItem key={'edit-button'} onClick={() => navigationStrategy.openDetail('Search_filter', primaryKey)}>\n <FormattedMessage id=\"client.entity-list.search.settings.editFilter\"/>\n </MenuItem>\n )\n }\n if (canDelete) {\n entries.push(\n <MenuItem key={'delete-button'} onClick={deleteSearchFilter}>\n <FormattedMessage id=\"client.entity-list.search.settings.deleteFilter\"/>\n </MenuItem>\n )\n }\n\n if (entries.length === 0) {\n return null\n }\n\n return (\n <StyledMenuWrapper active={active}>\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n {entries}\n </BallMenu>\n </StyledMenuWrapper>\n )\n}\n\nEllipsisMenu.propTypes = {\n canEdit: PropTypes.bool,\n canDelete: PropTypes.bool,\n primaryKey: PropTypes.string,\n deleteSearchFilter: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n active: PropTypes.bool\n}\n\nconst SearchFilterButton = ({\n setActive,\n active,\n label,\n canEdit,\n canDelete,\n primaryKey,\n navigationStrategy,\n deleteSearchFilter\n}) =>\n <StyledSearchFilterButton active={active} onClick={() => setActive(!active)}>\n <StyledSpanSearchFilter title={label}>{label}</StyledSpanSearchFilter>\n <StyleButtonWrapper>\n <StyledAddRemoveButton\n active={active}\n onClick={e => {\n setActive(false)\n e.stopPropagation()\n }}\n icon={active ? 'minus' : 'plus'}\n dense/>\n <EllipsisMenu\n canEdit={canEdit}\n canDelete={canDelete}\n navigationStrategy={navigationStrategy}\n deleteSearchFilter={deleteSearchFilter}\n primaryKey={primaryKey}\n active={active}\n />\n </StyleButtonWrapper>\n </StyledSearchFilterButton>\n\nSearchFilterButton.propTypes = {\n label: PropTypes.string,\n setActive: PropTypes.func.isRequired,\n active: PropTypes.bool,\n canEdit: PropTypes.bool,\n canDelete: PropTypes.bool,\n primaryKey: PropTypes.string,\n deleteSearchFilter: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func)\n}\n\nconst AdminSearchForm = props => {\n const {searchFilters, setSearchFilterActive, executeSearch, navigationStrategy, deleteSearchFilter} = props\n if (!searchFilters) {\n return null\n }\n\n if (searchFilters.length === 0) {\n return <StyledMessageWrapper>\n <Typography.I>\n <FormattedMessage id=\"client.entity-list.noSearchFilters\"/>\n </Typography.I>\n </StyledMessageWrapper>\n }\n\n return <SearchFilterListWrapper>\n {[...searchFilters]\n .sort(searchFilterCompare)\n .map(searchFilter =>\n <SearchFilterButton\n key={searchFilter.uniqueId}\n primaryKey={searchFilter.key}\n active={searchFilter.active}\n label={searchFilter.label}\n setActive={exclusive => {\n setSearchFilterActive(searchFilter.uniqueId, !searchFilter.active, exclusive)\n executeSearch()\n }}\n canEdit={searchFilter.editAllowed}\n canDelete={searchFilter.deleteAllowed}\n navigationStrategy={navigationStrategy}\n deleteSearchFilter={() => deleteSearchFilter(searchFilter.key)}\n />\n )\n }\n </SearchFilterListWrapper>\n}\n\nAdminSearchForm.propTypes = {\n searchFilters: PropTypes.arrayOf(PropTypes.object),\n setSearchFilterActive: PropTypes.func.isRequired,\n executeSearch: PropTypes.func.isRequired,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n deleteSearchFilter: PropTypes.func.isRequired\n}\n\nexport default AdminSearchForm\n","import {connect} from 'react-redux'\n\nimport SearchFilterList from './SearchFilterList'\nimport {setSearchFilterActive, executeSearch, deleteSearchFilter} from '../../modules/searchForm/actions'\n\nconst mapActionCreators = {\n setSearchFilterActive,\n executeSearch,\n deleteSearchFilter\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFilters: state.searchForm.searchFilters,\n navigationStrategy: state.input.navigationStrategy\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(SearchFilterList)\n","import SearchFilterList from './SearchFilterListContainer'\n\nexport default SearchFilterList\n","import React, {useRef, useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport ReactDOM from 'react-dom'\nimport {Icon, Ball, BallMenu, MenuItem, Popover} from 'tocco-ui'\nimport {withTheme} from 'styled-components'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport {\n StyledSplit,\n AdminSearchGrid,\n Box,\n StyledGutter,\n StyledHeader,\n StyledSplitWrapper,\n StyledToggleCollapseButton,\n StyledPlaceHolder\n} from './StyedComponents'\nimport BasicSearchFormContainer from '../../containers/BasicSearchFormContainer'\nimport SearchFilterList from '../SearchFilterList'\n\nconst SEARCH_FILTER_BUTTON_HEIGHT = 28\nconst SEARCH_FILTER_PADDING = 10\nconst MAX_HEIGHT_THRESHOLD = 30\nconst MAX_SIZE_SEARCH_FILTER = 25\n\nconst getGutter = () => () => {\n const gutterEl = document.createElement('div')\n ReactDOM.render(\n <StyledGutter tabIndex={0}>\n <Icon icon=\"horizontal-rule\"/>\n </StyledGutter>, gutterEl\n )\n return gutterEl\n}\n\nconst AdminSearchForm = ({\n resetSearch,\n intl,\n searchFilters,\n saveSearchFilter,\n saveDefaultSearchFilter,\n resetDefaultSearchFilter,\n displaySearchFieldsModal,\n resetSearchFields,\n searchFormDirty,\n isCollapsed,\n toggleCollapse\n}) => {\n const splitWrapperEl = useRef(null)\n const [size, setSize] = useState([MAX_SIZE_SEARCH_FILTER, 100 - MAX_SIZE_SEARCH_FILTER])\n const [searchFilterExpanded, setSearchFilterExpanded] = useState(false)\n const [showExpandSearchFilter, setShowExpandSearchFilter] = useState(false)\n\n const msg = id => intl.formatMessage({id})\n\n useEffect(() => {\n const searchFilterHeight = searchFilters\n ? searchFilters.length * SEARCH_FILTER_BUTTON_HEIGHT + SEARCH_FILTER_PADDING\n : SEARCH_FILTER_BUTTON_HEIGHT\n const splitWrapperHeight = splitWrapperEl.current.clientHeight\n const searchFilterHeightPercentage = Math.ceil(100 / (splitWrapperHeight / searchFilterHeight))\n\n if (!searchFilterExpanded && searchFilterHeightPercentage > MAX_HEIGHT_THRESHOLD) {\n setShowExpandSearchFilter(true)\n setSize([MAX_SIZE_SEARCH_FILTER, 100 - MAX_SIZE_SEARCH_FILTER])\n } else {\n setSize([searchFilterHeightPercentage, 100 - searchFilterHeightPercentage])\n }\n }, [searchFilters, searchFilterExpanded])\n\n const isSingleSearchFilterActive = searchFilters !== null && searchFilters.filter(s => s.active).length === 1\n\n return <>\n <AdminSearchGrid isCollapsed={isCollapsed}>\n <StyledHeader>\n <StyledToggleCollapseButton icon={'chevron-left'} isCollapsed={isCollapsed} onClick={toggleCollapse}/>\n {showExpandSearchFilter && <Ball\n icon={searchFilterExpanded ? 'chevron-up' : 'chevron-down'}\n onClick={() => setSearchFilterExpanded(!searchFilterExpanded)}\n title={searchFilterExpanded ? msg('client.entity-list.contract') : msg('client.entity-list.expand')}\n />}\n <Ball\n data-cy=\"reset-button\"\n icon=\"times\"\n onClick={resetSearch}\n title={msg('client.entity-list.reset')}\n />\n <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem disabled={!isSingleSearchFilterActive} onClick={saveDefaultSearchFilter}>\n <Popover content={!isSingleSearchFilterActive\n && <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.save.info\"/>\n }>\n <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.save\"/>\n </Popover>\n </MenuItem>\n <MenuItem onClick={resetDefaultSearchFilter}>\n <FormattedMessage id=\"client.entity-list.search.settings.defaultFilter.reset\"/>\n </MenuItem>\n <MenuItem onClick={saveSearchFilter} disabled={!searchFormDirty}>\n <FormattedMessage id=\"client.entity-list.search.settings.saveAsFilter\"/>\n </MenuItem>\n <MenuItem onClick={displaySearchFieldsModal}>\n <FormattedMessage id=\"client.entity-list.search.settings.searchForm.edit\"/>\n </MenuItem>\n <MenuItem onClick={resetSearchFields}>\n <FormattedMessage id=\"client.entity-list.search.settings.searchForm.reset\"/>\n </MenuItem>\n </BallMenu>\n </StyledHeader>\n <StyledSplitWrapper ref={splitWrapperEl}>\n <StyledSplit\n direction=\"vertical\"\n gutterSize={20}\n sizes={size}\n minSize={[90, 0]}\n gutter={getGutter()}\n >\n <Box>\n <SearchFilterList/>\n </Box>\n <Box>\n <BasicSearchFormContainer disableSimpleSearch={true}/>\n </Box>\n </StyledSplit>\n </StyledSplitWrapper>\n </AdminSearchGrid>\n <StyledPlaceHolder onClick={toggleCollapse} isCollapsed={isCollapsed}>\n <StyledToggleCollapseButton icon={'chevron-right'} isCollapsed={isCollapsed}/>\n </StyledPlaceHolder>\n </>\n}\n\nAdminSearchForm.propTypes = {\n intl: PropTypes.object.isRequired,\n searchFilters: PropTypes.arrayOf(PropTypes.object),\n resetSearch: PropTypes.func.isRequired,\n theme: PropTypes.object,\n saveSearchFilter: PropTypes.func.isRequired,\n saveDefaultSearchFilter: PropTypes.func.isRequired,\n resetDefaultSearchFilter: PropTypes.func.isRequired,\n displaySearchFieldsModal: PropTypes.func.isRequired,\n resetSearchFields: PropTypes.func.isRequired,\n searchFormDirty: PropTypes.bool,\n isCollapsed: PropTypes.bool,\n toggleCollapse: PropTypes.func.isRequired\n}\n\nexport default injectIntl(withTheme(AdminSearchForm))\n","import {connect} from 'react-redux'\nimport {isDirty} from 'redux-form'\n\nimport AdminSearchForm from './AdminSearchForm'\nimport {\n displaySearchFieldsModal,\n resetSearch,\n resetSearchFields,\n resetDefaultSearchFilter,\n saveDefaultSearchFilter,\n saveSearchFilter\n} from '../../modules/searchForm/actions'\n\nconst mapActionCreators = {\n resetSearch,\n saveSearchFilter,\n saveDefaultSearchFilter,\n resetDefaultSearchFilter,\n displaySearchFieldsModal,\n resetSearchFields\n}\n\nconst mapStateToProps = (state, props) => ({\n searchFilters: state.searchForm.searchFilters,\n searchFormDirty: isDirty('searchForm')(state)\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(AdminSearchForm)\n","import AdminSearchFormContainer from './AdminSearchFormContainer'\n\nexport default AdminSearchFormContainer\n","import styled from 'styled-components'\n\nexport const StyledAdminSearchFormWrapper = styled.div`\n display: flex; // enables StyledPlaceHolder to take full height\n flex-direction: column;\n height: calc(var(--vh, 1vh) * 100 - 77px); // TODO: This is only a temporary workaround, height needs to be 100%\n overflow-y: auto;\n overflow-x: hidden;\n`\n","import React from 'react'\nimport {Panel} from 'tocco-ui'\nimport PropTypes from 'prop-types'\n\nimport FullTextSearchForm from '../../containers/FullTextSearchFormContainer'\nimport BasicSearchFormContainer from '../../containers/BasicSearchFormContainer'\nimport AdminSearchForm from '../AdminSearchForm'\nimport searchFormTypes, {searchFormTypePropTypes} from '../../util/searchFormTypes'\nimport {StyledAdminSearchFormWrapper} from './StyledComponents'\n\nconst SearchView = ({searchFormType, isCollapsed, toggleCollapse}) => {\n if (searchFormType === searchFormTypes.ADMIN) {\n return (\n <StyledAdminSearchFormWrapper>\n <AdminSearchForm isCollapsed={isCollapsed} toggleCollapse={toggleCollapse}/>\n </StyledAdminSearchFormWrapper>\n )\n }\n\n return <Panel.Wrapper isToggleable={false} isFramed={false}>\n <Panel.Body>\n {searchFormType === searchFormTypes.SIMPLE ? <FullTextSearchForm/> : <BasicSearchFormContainer/>}\n </Panel.Body>\n </Panel.Wrapper>\n}\n\nSearchView.propTypes = {\n searchFormType: searchFormTypePropTypes,\n isCollapsed: PropTypes.bool,\n toggleCollapse: PropTypes.func\n}\n\nexport default SearchView\n","import SearchView from './SearchView'\n\nexport default SearchView\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport SearchView from '../components/SearchView'\n\nconst mapActionCreators = {}\n\nconst mapStateToProps = (state, props) => ({\n searchFormType: state.entityList.searchFormType\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(SearchView))\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport default styled.div`\n display: flex;\n width: max-content;\n`\n\nexport const StyledButton = styled.span`\n border-radius: ${theme.radii('medium')};\n padding: .3rem 1.3rem;\n display: ${({disabled}) => disabled ? 'none' : 'flex'};\n margin-right: 1rem;\n align-items: center;\n cursor: pointer;\n background-color: ${({active}) => active && theme.color('secondary')};\n\n &:hover {\n background-color: ${theme.color('secondaryLight')};\n\n * {\n color: ${theme.color('paper')};\n }\n }\n\n && {\n * {\n color: ${({active}) => active && theme.color('paper')};\n }\n\n button {\n background-color: transparent;\n margin-left: .5rem;\n margin-top: -.2rem;\n margin-right: -.8rem;\n\n &:hover * {\n color: ${theme.color('secondary')};\n }\n }\n }\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\nimport {\n Button,\n Typography\n} from 'tocco-ui'\n\nimport StyledSelectionController, {StyledButton} from './StyledSelectionController'\n\nconst SelectionController = ({\n intl,\n selection,\n showSelectedRecords,\n toggleShowSelectedRecords,\n queryCount,\n clearSelection\n}) => {\n const msg = id => intl.formatMessage({id})\n const selectionPossible = selection.length !== 0\n\n return (\n <StyledSelectionController>\n <StyledButton\n active={!showSelectedRecords}\n onClick={() => {\n if (selectionPossible) {\n toggleShowSelectedRecords()\n }\n }}\n >\n <Typography.Span>\n <FormattedMessage\n id=\"client.entity-list.selectionAll\"\n values={{count: queryCount}}/>\n </Typography.Span>\n </StyledButton>\n <StyledButton\n active={showSelectedRecords}\n disabled={!selectionPossible}\n onClick={() => {\n if (selectionPossible) {\n toggleShowSelectedRecords()\n }\n }}\n data-cy=\"selection-controller-selection\"\n >\n <Typography.Span>\n <FormattedMessage\n id=\"client.entity-list.selectionSelection\"\n values={{count: selection.length}}/>\n {selection.length > 0 && <Button\n data-cy=\"selection-controller-delete-selection\"\n dense\n icon=\"times\"\n title={msg('client.entity-list.clearSelection')}\n onClick={e => {\n e.stopPropagation()\n if (showSelectedRecords) {\n toggleShowSelectedRecords()\n }\n clearSelection()\n }}\n />}\n </Typography.Span>\n </StyledButton>\n </StyledSelectionController>\n )\n}\n\nSelectionController.propTypes = {\n clearSelection: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n queryCount: PropTypes.number.isRequired,\n selection: PropTypes.array.isRequired,\n showSelectedRecords: PropTypes.bool,\n toggleShowSelectedRecords: PropTypes.func.isRequired\n}\n\nexport default SelectionController\n","import SelectionController from './SelectionController'\n\nexport default SelectionController\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport SelectionController from '../components/SelectionController'\nimport {clearSelection, toggleShowSelectedRecords} from '../modules/selection/actions'\n\nconst mapActionCreators = {\n clearSelection,\n toggleShowSelectedRecords\n}\n\nconst mapStateToProps = (state, props) => (\n {\n queryCount: state.selection.queryCount,\n selection: state.selection.selection,\n showSelectedRecords: state.selection.showSelectedRecords\n }\n)\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(SelectionController))\n","import React from 'react'\nimport {BallMenu, MenuItem} from 'tocco-ui'\nimport {connect} from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\n\nimport {displayColumnModal, resetSorting, resetPreferences, resetColumns} from '../../modules/preferences/actions'\n\nconst NavigationCellHeader = props =>\n !props.disablePreferencesMenu\n ? <BallMenu buttonProps={{icon: 'ellipsis-v'}}>\n <MenuItem onClick={props.displayColumnModal}>\n <FormattedMessage id=\"client.entity-list.preferences.columns\"/>\n </MenuItem>\n <MenuItem onClick={props.resetColumns}>\n <FormattedMessage id=\"client.entity-list.preferences.columns.reset\"/>\n </MenuItem>\n {props.sortable\n && <MenuItem onClick={props.resetSorting}>\n <FormattedMessage id=\"client.entity-list.sorting.reset\"/>\n </MenuItem>\n }\n <MenuItem onClick={props.resetPreferences}>\n <FormattedMessage id=\"client.entity-list.preferences.reset\"/>\n </MenuItem>\n </BallMenu>\n : null\n\nNavigationCellHeader.propTypes = {\n displayColumnModal: PropTypes.func.isRequired,\n resetSorting: PropTypes.func.isRequired,\n resetPreferences: PropTypes.func.isRequired,\n resetColumns: PropTypes.func.isRequired,\n sortable: PropTypes.bool,\n disablePreferencesMenu: PropTypes.bool\n}\n\nconst mapActionCreators = {\n displayColumnModal,\n resetSorting,\n resetPreferences,\n resetColumns\n}\n\nconst mapStateToProps = (state, props) => ({\n sortable: state.list.sortable,\n disablePreferencesMenu: state.list.disablePreferencesMenu\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(NavigationCellHeader)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\n\nimport NavigationCellHeader from './NavigationCellHeader'\n\nconst CellRenderer = ({showNavigation, rowData, navigationStrategy, parent}) =>\n showNavigation && navigationStrategy.DetailLinkRelative\n ? <span\n onClick={e => e.stopPropagation()}\n data-cy=\"list-navigation-arrow\"\n >\n <navigationStrategy.DetailLinkRelative\n entityKey={rowData.__key}\n {...(parent && parent.relationName && {relation: parent.relationName})}\n >\n <Icon icon=\"arrow-right\"/>\n </navigationStrategy.DetailLinkRelative>\n </span>\n : null\n\nCellRenderer.propTypes = {\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired\n }).isRequired,\n showNavigation: PropTypes.bool.isRequired,\n navigationStrategy: PropTypes.shape({\n DetailLinkRelative: PropTypes.func\n }).isRequired,\n parent: PropTypes.shape({\n relationName: PropTypes.string\n })\n}\n\nexport const navigationCell = (showNavigation, navigationStrategy, parent) => ({\n id: 'navigation-column',\n fixedPosition: true,\n width: 30,\n resizable: false,\n dynamic: false,\n HeaderRenderer: NavigationCellHeader,\n CellRenderer: props => <CellRenderer\n {...props}\n showNavigation={showNavigation}\n navigationStrategy={navigationStrategy}\n parent={parent}\n />\n})\n","import styled from 'styled-components'\nimport {theme, declareFont} from 'tocco-ui'\n\nexport const StyledMarkingWrapper = styled.span`\n ${declareFont()}\n display: flex;\n height: 100%;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n ${({marked, theme}) => marked && `color: ${theme.colors.secondary};`}\n`\n","import React, {useEffect, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {Icon} from 'tocco-ui'\nimport {connect} from 'react-redux'\n\nimport {setMarked} from '../../modules/list/actions'\nimport {StyledMarkingWrapper} from './StyledComponents'\n\nconst CellRenderer = ({rowData, markings, setMarked}) => {\n const [mouseOver, setMouseOver] = useState(false)\n\n const marked = markings && markings[rowData.__model] && markings[rowData.__model][rowData.__key]\n\n useEffect(() => {\n if (!marked) {\n setMouseOver(false) // reset mouse over to false to show empty star when user unmarks even if still hovering\n }\n }, [marked])\n\n const handleClick = e => {\n e.stopPropagation()\n setMarked(rowData.__model, rowData.__key, !marked)\n }\n\n return (\n <StyledMarkingWrapper\n marked={marked}\n onClick={handleClick}\n onMouseEnter={() => setMouseOver(true)}\n onMouseLeave={() => setMouseOver(false)}>\n <Icon icon={marked || mouseOver ? 'star-full' : 'star'}/>\n </StyledMarkingWrapper>\n )\n}\n\nCellRenderer.propTypes = {\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired,\n __model: PropTypes.string.isRequired\n }).isRequired,\n markings: PropTypes.objectOf(PropTypes.objectOf(PropTypes.bool)),\n setMarked: PropTypes.func.isRequired\n}\n\nconst mapActionCreators = {\n setMarked\n}\n\nconst mapStateToProps = state => ({\n markings: state.list.lazyData.markings\n})\n\nconst MarkingCellRenderer = connect(mapStateToProps, mapActionCreators)(CellRenderer)\n\nexport const markingCell = () => ({\n id: 'mark-column',\n fixedPosition: true,\n width: 30,\n resizable: false,\n dynamic: false,\n CellRenderer: MarkingCellRenderer\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\nimport {columnPropType, selectionStylePropType, Table as UiTable} from 'tocco-ui'\nimport _get from 'lodash/get'\n\nimport {navigationCell} from './navigationCell'\nimport {markingCell} from './markingCell'\n\nconst Table = props => {\n const showNavigationLink = props.showLink\n && props.clickable\n && props.navigationStrategy\n && props.navigationStrategy.DetailLinkRelative\n const showPreferencesMenu = !props.disablePreferencesMenu\n return <UiTable\n data={props.entities}\n columns={[\n ...((showNavigationLink || showPreferencesMenu)\n ? [navigationCell(showNavigationLink,\n props.navigationStrategy,\n props.parent)]\n : []),\n ...(props.markable ? [markingCell()] : []),\n ...props.columnDefinitions.sort((a, b) =>\n _get(props.positions, [a.id]) - _get(props.positions, [b.id])\n )\n ]}\n dataLoadingInProgress={props.inProgress}\n paginationInfo={{\n currentPage: props.currentPage,\n totalCount: props.entityCount,\n recordsPerPage: props.limit\n }}\n onPageChange={props.changePage}\n onSortingChange={props.setSortingInteractive}\n selectionStyle={props.tableSelectionStyle}\n onSelectionChange={props.onSelectChange}\n selection={props.selection}\n onRowClick={props.onRowClick}\n clickable={props.clickable}\n onColumnPositionChange={props.changePosition}\n />\n}\n\nTable.propTypes = {\n columnDefinitions: PropTypes.arrayOf(columnPropType).isRequired,\n entities: PropTypes.array.isRequired,\n entityCount: PropTypes.number,\n inProgress: PropTypes.bool,\n currentPage: PropTypes.number,\n limit: PropTypes.number,\n onRowClick: PropTypes.func,\n clickable: PropTypes.bool,\n setSortingInteractive: PropTypes.func,\n changePage: PropTypes.func.isRequired,\n tableSelectionStyle: selectionStylePropType,\n onSelectChange: PropTypes.func,\n selection: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string,\n relation: PropTypes.string\n }),\n showLink: PropTypes.bool,\n navigationStrategy: PropTypes.objectOf(PropTypes.func),\n changePosition: PropTypes.func.isRequired,\n positions: PropTypes.objectOf(PropTypes.number),\n markable: PropTypes.bool,\n disablePreferencesMenu: PropTypes.bool\n}\n\nconst areEqual = (prevProps, nextProps) => {\n const diff = js.difference(prevProps, nextProps)\n return Object.keys(diff).length === 0\n}\n\nexport default React.memo(Table, areEqual)\n","import Table from './Table'\n\nexport default Table\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport Table from '../components/Table'\nimport {\n changePage,\n initialize,\n onRowClick,\n setSortingInteractive\n} from '../modules/list/actions'\nimport {\n onSelectChange,\n setSelection\n} from '../modules/selection/actions'\nimport {\n changePosition,\n resetSorting\n} from '../modules/preferences/actions'\n\nconst mapActionCreators = {\n initialize,\n changePage,\n setSortingInteractive,\n onRowClick,\n onSelectChange,\n setSelection,\n changePosition,\n resetSorting\n}\n\nconst mapStateToProps = (state, props) => ({\n currentPage: state.list.currentPage,\n entities: state.list.entities,\n entityCount: state.list.entityCount,\n limit: state.list.limit,\n inProgress: state.list.inProgress,\n tableSelectionStyle: state.selection.tableSelectionStyle,\n clickable: state.list.formClickable,\n selection: state.selection.selection,\n parent: state.entityList.parent,\n showLink: state.list.showLink,\n navigationStrategy: state.input.navigationStrategy,\n positions: state.preferences.positions,\n markable: state.list.entityModel.markable && state.list.formDefinition.markable,\n disablePreferencesMenu: state.list.disablePreferencesMenu\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Table))\n","export const deriveSelectionFromState = state => {\n const {selection, input} = state\n\n if (selection.selection.length > 0 || input.selectionStyle === 'multi_explicit') {\n return {\n entityName: state.entityList.entityName,\n type: 'ID',\n ids: selection.selection,\n count: selection.selection.length || 0\n }\n }\n\n return {\n entityName: state.entityList.entityName,\n type: 'QUERY',\n query: selection.query,\n count: selection.queryCount || 0\n }\n}\n","import {connect} from 'react-redux'\nimport {actions} from 'tocco-app-extensions'\n\nimport {deriveSelectionFromState} from '../util/actions'\n\nconst mapStateToProps = (state, props) => ({\n selection: deriveSelectionFromState(state)\n})\n\nconst mapActionCreators = {}\n\nexport default connect(mapStateToProps, mapActionCreators)(actions.Action)\n","import styled from 'styled-components'\nimport {theme} from 'tocco-ui'\n\nexport const StyledListWrapper = styled.div`\n grid-row-start: table-start;\n`\n\nexport const StyledActionWrapper = styled.div`\n display: flex;\n background-color: ${theme.color('paper')};\n margin-bottom: 3px;\n padding: 0 8px 8px;\n grid-row-start: action-start;\n flex-wrap: wrap;\n\n & > * {\n margin-top: 8px;\n }\n`\n\nexport const StyledListView = styled.div`\n display: grid;\n grid-template-rows: [action-start] auto [table-start] minmax(200px, 1fr);\n height: 100%;\n`\n","import PropTypes from 'prop-types'\nimport React, {useMemo} from 'react'\nimport {LoadMask} from 'tocco-ui'\nimport {js} from 'tocco-util'\n\nimport SelectionControllerContainer from '../../containers/SelectionControllerContainer'\nimport {getColumnDefinition, getTable, getActionBar} from '../../util/api/forms'\nimport TableContainer from '../../containers/TableContainer'\nimport ActionContainer from '../../containers/ActionContainer'\nimport {StyledListWrapper, StyledActionWrapper, StyledListView} from './StyledComponents'\n\nconst ListView = ({\n dataLoadingInProgress,\n formDefinition,\n parent,\n searchFormPosition,\n showActions,\n showSelectionController,\n sorting,\n columnDisplayPreferences,\n cellRenderers,\n preferencesLoaded,\n intl,\n sortable\n}) => {\n const msg = (id, values = {}) => intl.formatMessage({id}, values)\n\n const List = useMemo(() => {\n if (formDefinition && preferencesLoaded) {\n const table = getTable(formDefinition)\n const columnsDefinitions = getColumnDefinition(\n {table, sorting, sortable, parent, intl, columnDisplayPreferences, cellRenderers}\n )\n\n return <StyledListWrapper searchFormPosition={searchFormPosition} key={`tableWrapper-${table.id}`}>\n <TableContainer\n key={`table-${table.id}`}\n columnDefinitions={columnsDefinitions}\n />\n </StyledListWrapper>\n }\n }, [formDefinition, sorting, columnDisplayPreferences, preferencesLoaded])\n\n const ActionBar = useMemo(() => {\n if (formDefinition) {\n const actionBar = getActionBar(formDefinition)\n const content = [\n ...(showSelectionController ? [<SelectionControllerContainer key=\"selectionController\"/>] : []),\n ...(showActions !== false && actionBar\n ? [<ActionContainer\n key={`listAction-${actionBar.id}`}\n definition={actionBar}\n parent={parent}\n disabled={dataLoadingInProgress}\n />]\n : [])\n ]\n\n if (content.length > 0 && actionBar) {\n return <StyledActionWrapper key={`listActionWrapper-${actionBar.id}`}>\n {content}\n </StyledActionWrapper>\n }\n }\n }, [dataLoadingInProgress, formDefinition])\n\n return (\n <LoadMask\n required={[formDefinition]}\n loadingText={msg('client.entity-list.loadingText')}\n >\n <StyledListView>\n {ActionBar}\n {List}\n </StyledListView>\n </LoadMask>\n )\n}\n\nListView.propTypes = {\n intl: PropTypes.object.isRequired,\n formDefinition: PropTypes.shape({\n children: PropTypes.array\n }),\n selection: PropTypes.arrayOf(PropTypes.string),\n currentPageIds: PropTypes.arrayOf(PropTypes.string),\n parent: PropTypes.shape({\n key: PropTypes.string.isRequired,\n model: PropTypes.string.isRequired,\n reverseRelationName: PropTypes.string\n }),\n dataLoadingInProgress: PropTypes.bool,\n showSelectionController: PropTypes.bool,\n entityName: PropTypes.string,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n showActions: PropTypes.bool,\n sorting: PropTypes.arrayOf(PropTypes.shape({\n field: PropTypes.string,\n order: PropTypes.string\n })),\n sortable: PropTypes.bool,\n columnDisplayPreferences: PropTypes.objectOf(PropTypes.bool),\n cellRenderers: PropTypes.objectOf(PropTypes.func),\n preferencesLoaded: PropTypes.bool\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(ListView, areEqual)\n","import ListView from './ListView'\n\nexport default ListView\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport ListView from '../components/ListView'\n\nconst mapStateToProps = (state, props) => ({\n formDefinition: state.list.formDefinition,\n selection: state.selection.selection,\n currentPageIds: state.list.entities.map(e => e.__key),\n entityName: state.entityList.entityName,\n parent: state.entityList.parent,\n dataLoadingInProgress: state.list.inProgress,\n showSelectionController: state.selection.showSelectionController,\n searchFormPosition: state.input.searchFormPosition,\n showActions: state.input.showActions,\n sorting: state.list.sorting,\n sortable: state.list.sortable,\n columnDisplayPreferences: state.preferences.columns,\n preferencesLoaded: state.preferences.preferencesLoaded,\n cellRenderers: state.input.cellRenderers\n})\n\nexport default connect(mapStateToProps, null)(injectIntl(ListView))\n","import styled from 'styled-components'\nimport {scale, StyledScrollbar} from 'tocco-ui'\n\nexport const TopPositioning = styled.div`\n height: 100%;\n display: grid;\n row-gap: 8px;\n grid-template-areas:\n 'search'\n 'list';\n grid-auto-rows: auto minmax(${({searchFormType}) => searchFormType === 'simple' ? 'auto' : '400px'}, 1fr);\n\n /* remove bottom space and set width in modal */\n ${({searchFormType}) => searchFormType !== 'simple' && `\n grid-template-columns: minmax(100%, 700px);\n `\n}\n`\n\nexport const LeftPositioning = styled.div`\n display: grid;\n column-gap: 1rem;\n ${({isCollapsed}) => !isCollapsed\n ? `\n grid: 'search list' / minmax(350px, 16%) auto;\n `\n : `\n grid: 'search list' / 25px auto;\n `\n }\n\n @media (max-width: 600px) {\n column-gap: 8px;\n }\n`\n\nexport const SearchGrid = styled.div`\n grid-area: search;\n overflow-y: auto;\n\n /* Limit height when positioned top */\n ${/* sc-selector */TopPositioning} & {\n max-height: 200px;\n padding-right: ${scale.space(-0.5)};\n ${StyledScrollbar}\n }\n`\n\nexport const ListGrid = styled.div`\n grid-area: list;\n display: flex;\n`\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport SearchViewContainer from '../../containers/SearchViewContainer'\nimport ListViewContainer from '../../containers/ListViewContainer'\nimport {TopPositioning, LeftPositioning, ListGrid, SearchGrid} from './StyledComponents'\nimport searchFormTypes, {searchFormTypePropTypes} from '../../util/searchFormTypes'\n\nconst EntityList = ({\n searchFormType,\n searchFormCollapsed,\n searchFormPosition,\n setSearchFormCollapsed\n}) => {\n const toggleCollapse = () => {\n setSearchFormCollapsed(!searchFormCollapsed)\n }\n\n if (searchFormType === searchFormTypes.NONE) {\n return <ListViewContainer/>\n }\n\n const PositioningContainer = searchFormPosition === 'left' ? LeftPositioning : TopPositioning\n\n return (\n <PositioningContainer searchFormType={searchFormType} isCollapsed={searchFormCollapsed}>\n <SearchGrid>\n <SearchViewContainer isCollapsed={searchFormCollapsed} toggleCollapse={toggleCollapse}/>\n </SearchGrid>\n <ListGrid searchFormType={searchFormType}>\n <ListViewContainer/>\n </ListGrid>\n </PositioningContainer>\n )\n}\n\nEntityList.propTypes = {\n searchFormType: searchFormTypePropTypes,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n searchFormCollapsed: PropTypes.bool,\n setSearchFormCollapsed: PropTypes.func\n}\n\nexport default EntityList\n","import {connect} from 'react-redux'\nimport {injectIntl} from 'react-intl'\n\nimport EntityList from './EntityList'\nimport {initialize, setSearchFormCollapsed} from '../../modules/entityList/actions'\nimport {initialize as initializeSearchForm} from '../../modules/searchForm/actions'\nimport {loadPreferences} from '../../modules/preferences/actions'\n\nconst mapActionCreators = {\n initialize,\n initializeSearchForm,\n loadPreferences,\n setSearchFormCollapsed\n}\n\nconst mapStateToProps = state => ({\n searchFormType: state.input.searchFormType,\n searchFormPosition: state.input.searchFormPosition,\n searchFormCollapsed: state.entityList.searchFormCollapsed\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(EntityList))\n","import EntityList from './EntityListContainer'\n\nexport default EntityList\n","import {\n setSearchFormType,\n setFormName,\n setEntityName,\n setParent,\n setSearchFormPosition,\n setSearchFormCollapsedInitialValue\n} from './modules/entityList/actions'\nimport {\n setDisableSimpleSearch,\n setSimpleSearchFields\n} from './modules/searchForm/actions'\nimport {\n setLimit,\n setSearchFilters,\n setFormDefinition as setListFormDefinition,\n setShowLink,\n setSortable,\n setInputTql,\n setInputKeys,\n setInputSearchFilters\n} from './modules/list/actions'\nimport {setSelection} from './modules/selection/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\nexport const reloadOptions = {\n ALL: 3,\n DATA: 2,\n NOTHING: 1\n}\n\nexport const getReloadOption = input => {\n return Object.keys(input).reduce((res, key) => {\n const actionSetting = actionSettings.find(aS => aS.name === key)\n if (actionSetting && actionSetting.reload > res) {\n return actionSetting.reload\n }\n return res\n }, reloadOptions.NOTHING)\n}\n\nconst actionSettings = [\n {\n name: 'entityName',\n action: setEntityName,\n argsFactory: input => [input.entityName],\n reload: reloadOptions.ALL\n },\n {\n name: 'formName',\n action: setFormName,\n argsFactory: input => [input.formName],\n reload: reloadOptions.ALL\n },\n {\n name: 'limit',\n action: setLimit,\n argsFactory: input => [input.limit],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFilters',\n action: setSearchFilters,\n argsFactory: input => [input.searchFilters],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormType',\n action: setSearchFormType,\n argsFactory: input => [input.searchFormType],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormPosition',\n action: setSearchFormPosition,\n argsFactory: input => [input.searchFormPosition],\n reload: reloadOptions.DATA\n },\n {\n name: 'disableSimpleSearch',\n action: setDisableSimpleSearch,\n argsFactory: input => [input.disableSimpleSearch],\n reload: reloadOptions.DATA\n },\n {\n name: 'simpleSearchFields',\n action: setSimpleSearchFields,\n argsFactory: input => [input.simpleSearchFields],\n reload: reloadOptions.DATA\n },\n {\n name: 'selection',\n type: 'boolean',\n action: setSelection,\n argsFactory: input => [input.selection],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'parent',\n action: setParent,\n argsFactory: input => [input.parent],\n reload: reloadOptions.DATA\n },\n {\n name: 'listFormDefinition',\n action: setListFormDefinition,\n argsFactory: input => [input.listFormDefinition],\n reload: reloadOptions.ALL\n },\n {\n name: 'showLink',\n action: setShowLink,\n argsFactory: input => [input.showLink],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'sortable',\n action: setSortable,\n argsFactory: input => [input.sortable],\n reload: reloadOptions.NOTHING\n },\n {\n name: 'tql',\n action: setInputTql,\n argsFactory: input => [input.tql],\n reload: reloadOptions.DATA\n },\n {\n name: 'keys',\n action: setInputKeys,\n argsFactory: input => [input.keys],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFilters',\n action: setInputSearchFilters,\n argsFactory: input => [input.searchFilters],\n reload: reloadOptions.DATA\n },\n {\n name: 'searchFormCollapsed',\n action: setSearchFormCollapsedInitialValue,\n argsFactory: input => [input.searchFormCollapsed],\n reload: reloadOptions.NOTHING\n }\n]\n","import {put} from 'redux-saga/effects'\n\nimport {navigateToCreate, navigateToAction, toggleMarkings} from './modules/list/actions'\n\nexport default input => ({\n new: function* () {\n yield put(navigateToCreate(input.parent && input.parent.relationName))\n },\n fullscreen: function* (definition, selection) {\n yield put(navigateToAction(definition, selection))\n },\n mark: function* (definition, selection) {\n yield put(toggleMarkings(selection))\n }\n})\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport {reducer as reducerUtil, navigationStrategy} from 'tocco-util'\nimport {\n appFactory,\n notification,\n errorLogging,\n actionEmitter,\n externalEvents,\n actions,\n formData\n} from 'tocco-app-extensions'\nimport _pickBy from 'lodash/pickBy'\nimport _isEqual from 'lodash/isEqual'\nimport _isEmpty from 'lodash/isEmpty'\nimport SimpleFormApp from 'tocco-simple-form/src/main'\n\nimport reducers, {sagas} from './modules/reducers'\nimport {reloadData, reloadAll} from './modules/entityList/actions'\nimport {refresh} from './modules/list/actions'\nimport EntityList from './components/EntityList'\nimport {getDispatchActions, getReloadOption, reloadOptions} from './input'\nimport {selectionStylePropType} from './util/selectionStyles'\nimport customActions from './customActions'\nimport {searchFormTypePropTypes} from './util/searchFormTypes'\n\nconst packageName = 'entity-list'\n\nconst EXTERNAL_EVENTS = [\n 'onRowClick',\n 'emitAction',\n 'onSelectChange',\n 'onStoreCreate',\n 'onSearchChange',\n 'onSearchFormCollapsedChange'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <EntityList/>\n\n let store = input.store\n\n const allCustomActions = {\n ...customActions(input),\n ...(input.customActions || {})\n }\n\n const context = {\n viewName: 'list',\n formName: input.formName,\n ...(input.contextParams || {})\n }\n\n if (!store) {\n store = appFactory.createStore(reducers, sagas, input, packageName)\n\n externalEvents.addToStore(store, events)\n actionEmitter.addToStore(store, events.emitAction)\n errorLogging.addToStore(store, false)\n notification.addToStore(store, false)\n actions.addToStore(store, {\n formApp: SimpleFormApp,\n listApp: EntityListApp,\n customActions: allCustomActions,\n appComponent: input.actionAppComponent,\n navigationStrategy: input.navigationStrategy,\n context\n })\n formData.addToStore(store, {listApp: EntityListApp, navigationStrategy: input.navigationStrategy})\n\n store.dispatch(externalEvents.fireExternalEvent('onStoreCreate', store))\n } else {\n store.dispatch(refresh())\n }\n\n const app = appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: getDispatchActions(input),\n publicPath,\n textResourceModules: ['component', 'common']\n }\n )\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 return app\n}\n\n(() => {\n if (__DEV__ && __PACKAGE_NAME__ === 'entity-list') {\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('id', input)\n appFactory.renderApp(app.component)\n } else {\n appFactory.registerAppInRegistry(packageName, initApp)\n }\n})()\n\nconst getEvents = props =>\n EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\nclass EntityListApp extends React.Component {\n constructor(props) {\n super(props)\n this.app = initApp(props.id, props, getEvents(props))\n }\n\n componentDidUpdate(prevProps) {\n const changedProps = _pickBy(this.props, (value, key) => !_isEqual(value, prevProps[key]))\n if (changedProps.store) {\n this.app = initApp(this.props.id, this.props, getEvents(this.props))\n } else if (!_isEmpty(changedProps)) {\n getDispatchActions(changedProps).forEach(action => {\n this.app.store.dispatch(action)\n })\n\n const reloadOption = getReloadOption(changedProps)\n if (reloadOption === reloadOptions.ALL) {\n this.app.store.dispatch(reloadAll())\n } else if (reloadOption === reloadOptions.DATA) {\n this.app.store.dispatch(reloadData())\n }\n }\n }\n\n render() {\n return this.app.component\n }\n}\n\nEntityListApp.propTypes = {\n id: PropTypes.string.isRequired,\n entityName: PropTypes.string.isRequired,\n formName: PropTypes.string.isRequired,\n store: PropTypes.object,\n limit: PropTypes.number,\n searchFormType: searchFormTypePropTypes,\n searchFormPosition: PropTypes.oneOf(['top', 'left']),\n searchFilters: PropTypes.arrayOf(PropTypes.string),\n preselectedSearchFields: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.string,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.arrayOf(PropTypes.number),\n PropTypes.arrayOf(PropTypes.string)\n ]),\n hidden: PropTypes.bool\n })\n ),\n tql: PropTypes.string,\n keys: PropTypes.arrayOf(PropTypes.string),\n disableSimpleSearch: PropTypes.bool,\n simpleSearchFields: PropTypes.string,\n onSelectChange: PropTypes.func,\n selectionStyle: selectionStylePropType,\n selection: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number])),\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {}),\n selectOnRowClick: PropTypes.bool,\n parent: PropTypes.shape({\n id: PropTypes.string,\n value: PropTypes.string\n }),\n actionAppComponent: PropTypes.func,\n navigationStrategy: navigationStrategy.propTypes,\n contextParams: PropTypes.object\n}\n\nexport default EntityListApp\n","export const INITIALIZE_QUESTION_FORM = 'simpleForm/INITIALIZE_QUESTION_FORM'\nexport const ADVANCED_SEARCH_UPDATE = 'simpleForm/ADVANCED_SEARCH_UPDATE'\nexport const SET_FIELD_DEFINITIONS = 'simpleForm/SET_FIELD_DEFINITIONS'\r\n\nexport const SUBMIT = 'simpleForm/SUBMIT'\nexport const CANCEL = 'simpleForm/CANCEL'\n\nexport const initializeForm = () => ({\n type: INITIALIZE_QUESTION_FORM,\n payload: {\n }\n})\n\nexport const submit = () => ({\n type: SUBMIT\n})\n\nexport const cancel = () => ({\n type: CANCEL\n})\n\nexport const setFieldDefinitions = fieldDefinitions => ({\n type: SET_FIELD_DEFINITIONS,\n payload: {\n fieldDefinitions\n }\n})\n","import {reducer as reducerUtil} from 'tocco-util'\n\nimport * as actions from './actions'\n\nconst ACTION_HANDLERS = {\n [actions.SET_FIELD_DEFINITIONS]: reducerUtil.singleTransferReducer('fieldDefinitions')\n}\n\nconst initialState = {\n fieldDefinitions: null\n}\n\nexport default function reducer(state = initialState, action) {\n const handler = ACTION_HANDLERS[action.type]\n return handler ? handler(state, action) : state\n}\n","import reducer from './reducer'\nimport sagas from './sagas'\n\nexport {sagas}\nexport default reducer\n","import {actions as formActions, getFormValues, isValid} from 'redux-form'\nimport {CHANGE, INITIALIZE, UPDATE_SYNC_ERRORS} from 'redux-form/es/actionTypes'\nimport {externalEvents, form as formUtil} from 'tocco-app-extensions'\nimport {all, call, put, select, takeEvery, takeLatest} from 'redux-saga/effects'\n\nimport * as actions from './actions'\n\nconst FORM_ID = 'simpleForm'\nexport const inputSelector = state => state.input\nexport const selector = state => state.simpleForm\n\nexport default function* sagas() {\n yield all([\n takeEvery(actions.INITIALIZE_QUESTION_FORM, initialize),\n takeEvery(actions.SUBMIT, submit),\n takeEvery(actions.CANCEL, cancel),\n takeLatest(CHANGE, change),\n takeLatest(UPDATE_SYNC_ERRORS, change),\n takeLatest(INITIALIZE, change)\n ])\n}\n\nexport function* initialize() {\n const {form, defaultValues: inputDefaultValues} = yield select(inputSelector)\n const fieldDefinitions = yield call(formUtil.getFieldDefinitions, form)\n const fromDefaultValues = yield call(formUtil.getDefaultValues, fieldDefinitions)\n yield put(formActions.initialize(FORM_ID, {...fromDefaultValues, ...inputDefaultValues}))\n}\n\nexport function* submit() {\n const values = yield getValues()\n yield put(externalEvents.fireExternalEvent('onSubmit', {values}))\n}\n\nexport function* cancel() {\n const values = yield getValues()\n yield put(externalEvents.fireExternalEvent('onCancel', {values}))\n}\n\nexport function* change() {\n const values = yield getValues()\n const valid = yield select(isValid(FORM_ID))\n yield put(externalEvents.fireExternalEvent('onChange', {\n values,\n valid\n }))\n}\n\nfunction* getValues() {\n return Object.entries(yield select(getFormValues(FORM_ID)))\n .reduce((acc, [key, value]) => (\n {\n ...acc,\n [key.replace('--', '.')]: value\n }\n ), {})\n}\n","import {reducer as form} from 'redux-form'\n\nimport formReducer, {sagas as formSagas} from './simpleForm'\n\nexport default {\n simpleForm: formReducer,\n form\n}\n\nexport const sagas = [\n formSagas\n]\n","import styled from 'styled-components'\nimport {StyledButton} from 'tocco-ui'\n\nexport const StyledButtonsWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n\n ${StyledButton} {\n margin-right: 0;\n }\n`\n","import React, {useEffect} from 'react'\nimport PropTypes from 'prop-types'\nimport {form} from 'tocco-app-extensions'\nimport {Button} from 'tocco-ui'\nimport {reduxForm} from 'redux-form'\n\nimport {StyledButtonsWrapper} from './StyledComponents'\n\nconst REDUX_FORM_NAME = 'simpleForm'\n\nconst Form = ({\n initializeForm,\n intl, onCancel,\n onSubmit,\n handleSubmit: handleSubmitProp,\n form: formName,\n formDefinition,\n formValues,\n mappingType,\n mode,\n noButtons,\n submitting,\n submitText,\n cancelText\n}) => {\n const msg = id => intl.formatMessage({id})\n const handleCancel = () => onCancel()\n const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))\n // delay closing of the window so it won't close immediately with the click\n const handleSubmit = () => sleep(400).then(() => onSubmit())\n\n useEffect(() => {\n initializeForm()\n }, [])\n\n return (\n <form onSubmit={handleSubmitProp(handleSubmit)}>\n <form.FormBuilder\n entity={undefined}\n formName={formName}\n formDefinition={formDefinition}\n formValues={formValues}\n fieldMappingType={mappingType || 'editable'}\n mode={mode}\n />\n {!noButtons\n && <StyledButtonsWrapper>\n <Button\n disabled={submitting}\n ink=\"primary\"\n label={submitText || msg('client.simple-form.defaultOk')}\n pending={submitting}\n type=\"submit\"\n />\n <Button\n disabled={submitting}\n label={cancelText || msg('client.simple-form.defaultCancel')}\n onClick={handleCancel}\n />\n </StyledButtonsWrapper>\n }\n </form>\n )\n}\n\nForm.propTypes = {\n intl: PropTypes.object.isRequired,\n initializeForm: PropTypes.func.isRequired,\n handleSubmit: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n formDefinition: PropTypes.object.isRequired,\n submitting: PropTypes.bool.isRequired,\n cancelText: PropTypes.string,\n submitText: PropTypes.string,\n noButtons: PropTypes.bool,\n formValues: PropTypes.object,\n form: PropTypes.string,\n mappingType: PropTypes.oneOf(['editable', 'search', 'readonly']),\n mode: PropTypes.oneOf(['list', 'detail', 'create', 'update', 'search'])\n}\n\nexport default reduxForm({form: REDUX_FORM_NAME, destroyOnUnmount: false})(Form)\n","import Form from './Form'\n\nexport default Form\n","import {connect} from 'react-redux'\nimport {form} from 'tocco-app-extensions'\nimport {injectIntl} from 'react-intl'\n\nimport Form from '../../src/components/Form'\nimport {initializeForm, submit, cancel} from '../modules/simpleForm/actions'\n\nconst mapActionCreators = {\n initializeForm,\n onSubmit: submit,\n onCancel: cancel\n}\n\nconst mapStateToProps = (state, props) => ({\n noButtons: state.input.noButtons,\n title: state.input.title,\n description: state.input.description,\n submitText: state.input.submitText,\n cancelText: state.input.cancelText,\n formDefinition: state.input.form,\n validate: state.input.validate !== false ? form.syncValidation(state.simpleForm.fieldDefinitions) : () => {},\n listApp: state.input.listApp,\n mappingType: state.input.mappingType,\n mode: state.input.mode\n})\n\nexport default connect(mapStateToProps, mapActionCreators)(injectIntl(Form))\n","import React from 'react'\nimport {reducer as reducerUtil} from 'tocco-util'\nimport {appFactory, externalEvents, formData, notification, actionEmitter, form} from 'tocco-app-extensions'\nimport PropTypes from 'prop-types'\n\nimport reducers, {sagas} from './modules/reducers'\nimport {setFieldDefinitions} from './modules/simpleForm/actions'\nimport FormContainer from './containers/FormContainer'\nconst packageName = 'simple-form'\n\nconst EXTERNAL_EVENTS = [\n 'onSubmit',\n 'onCancel',\n 'onChange',\n 'emitAction'\n]\n\nconst initApp = (id, input, events = {}, publicPath) => {\n const content = <FormContainer listApp={input.listApp}/>\n\n const store = appFactory.createStore(reducers, sagas, input, packageName)\n actionEmitter.addToStore(store, events.emitAction)\n externalEvents.addToStore(store, events)\n formData.addToStore(store, {data: input.formData, listApp: input.listApp})\n notification.addToStore(store, false)\n\n const app = appFactory.createApp(\n packageName,\n content,\n store,\n {\n input,\n events,\n actions: [\n setFieldDefinitions(form.getFieldDefinitions(input.form))\n ],\n publicPath,\n textResourceModules: ['component', 'common']\n }\n )\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 return app\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 appFactory.renderApp(app.component)\n }\n }\n})()\n\nclass SimpleFormApp extends React.Component {\n constructor(props) {\n super(props)\n\n const events = EXTERNAL_EVENTS.reduce((events, event) => {\n if (props[event]) {\n events[event] = props[event]\n }\n return events\n }, {})\n\n this.app = initApp('id', props, events)\n }\n\n render() {\n return this.app.component\n }\n}\n\nSimpleFormApp.propTypes = {\n hideButton: PropTypes.bool,\n submitText: PropTypes.string,\n cancelText: PropTypes.string,\n form: PropTypes.object.isRequired,\n validate: PropTypes.bool,\n ...EXTERNAL_EVENTS.reduce((propTypes, event) => {\n propTypes[event] = PropTypes.func\n return propTypes\n }, {}),\n defaultValues: PropTypes.object\n}\n\nexport default SimpleFormApp\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\n\nconst StyledLayoutBox = styled.div`\n display: grid;\n height: fit-content;\n grid-template-rows: auto;\n grid-template-columns: 100%;\n margin-bottom: ${scale.space(0.25)};\n`\n\nexport default StyledLayoutBox\n","import PropTypes from 'prop-types'\nimport React, {useLayoutEffect, useRef} from 'react'\n\nconst checkboxValues = {\n CHECKED: 'checked',\n INDETERMINATE: 'indeterminate',\n UNCHECKED: 'unchecked'\n}\n\n/**\n * Use <MultiCheckbox> to display if none, some or all items of a portion are selected.\n */\nconst MultiCheckbox = ({value, id, onChange, label}) => {\n const inputEl = useRef(null)\n const handleOnChange = e => {\n if (value === checkboxValues.INDETERMINATE) {\n onChange(checkboxValues.UNCHECKED)\n } else {\n onChange(e.target.checked ? checkboxValues.CHECKED : checkboxValues.UNCHECKED)\n }\n }\n\n useLayoutEffect(() => {\n inputEl.current.indeterminate = (value === checkboxValues.INDETERMINATE)\n inputEl.current.checked = (value === checkboxValues.CHECKED)\n }, [value])\n\n return <input\n ref={inputEl}\n onChange={handleOnChange}\n id={id}\n type=\"checkbox\"\n aria-checked={value === 'checked'}\n aria-label={label}\n />\n}\n\nMultiCheckbox.propTypes = {\n /**\n * State with 'checked' if checkbox is checked. State with 'indeterminate' if checkbox\n * is neither checked nor unchecked.\n */\n value: PropTypes.oneOf(Object.values(checkboxValues)),\n /**\n * Id of the checkbox. Can be used in combination with the 'for' attribute of the label element\n */\n id: PropTypes.string,\n /**\n * Callback is executed on change. Callback receives new checkbox state, which is 'checked' or 'unchecked'.\n */\n onChange: PropTypes.func.isRequired,\n /**\n * Label to be used for the aria-label attribute. Improves Accessibility.\n */\n label: PropTypes.string\n}\n\nexport default MultiCheckbox\n","import MultiCheckbox from './MultiCheckbox'\n\nexport default MultiCheckbox\n","import styled from 'styled-components'\nimport {lighten} from 'polished'\n\nimport {\n theme\n} from '../utilStyles'\n\nconst StyledPanel = styled.div`\n && {\n background-color: ${theme.color('paper')};\n border: 1px\n ${({isFramed}) => isFramed ? 'solid' : 'none'}\n ${({theme}) => lighten(0.93, theme.colors.text)};\n }\n`\nexport default StyledPanel\n","import React, {useState} from 'react'\nimport PropTypes from 'prop-types'\n\nimport StyledPanel from './StyledPanel'\n\n/**\n * <Panel/> is used to conceal and display related content alternating by interaction and to\n * emphasize close relationship of content.\n */\nconst Panel = ({\n children,\n isFramed = true,\n controlledIsOpen,\n isOpenInitial = true,\n isToggleable = true,\n onToggle\n}) => {\n const [isOpen, setIsOpen] = useState(isOpenInitial)\n\n const controlled = typeof controlledIsOpen === 'boolean'\n\n const toggleOpenState = () => {\n if (isToggleable) {\n if (controlled) {\n if (typeof onToggle === 'function') {\n onToggle(!controlledIsOpen)\n }\n } else {\n setIsOpen(!isOpen)\n }\n }\n }\n\n return (\n <StyledPanel\n isFramed={isFramed}\n >\n {\n React.Children.map(children, child =>\n React.cloneElement(child, {\n isFramed,\n isOpen: controlled ? controlledIsOpen : isOpen,\n isToggleable,\n toggleOpenState: toggleOpenState\n })\n )\n }\n </StyledPanel>\n )\n}\n\nPanel.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is bordered.\n * Default value is 'true'.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is opened or not. If not set, the Panel manages it sate by itself.\n */\n controlledIsOpen: PropTypes.bool,\n /**\n * If component is not controlled a initial value can be set\n */\n isOpenInitial: PropTypes.bool,\n /**\n * Boolean to control if body can be opened or closed. Default value is 'true'.\n */\n isToggleable: PropTypes.bool,\n /**\n * Function is triggered if panel is opened or closed.\n */\n onToggle: PropTypes.func\n}\n\nexport default Panel\n","import styled from 'styled-components'\n\nimport {scale} from '../utilStyles'\nimport StyledPanel from './StyledPanel'\n\nconst StyledPanelGroup = styled.div`\n margin-bottom: ${scale.space(0)};\n\n && {\n ${/* sc-selector */StyledPanel}:not(:last-child) {\n margin-bottom: ${scale.space(-1)};\n }\n }\n`\n\nexport default StyledPanelGroup\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelGroup from './StyledPanelGroup'\n\nclass PanelGroup extends React.Component {\n state = {\n openPanelIndex: this.props.openPanelIndex\n }\n\n onToggle = (index, open) => {\n this.setState({\n openPanelIndex: open === true ? index : undefined\n })\n }\n\n render() {\n return (\n <StyledPanelGroup>\n {\n React.Children.map(this.props.children, (child, i) =>\n React.cloneElement(child, {\n controlledIsOpen: this.state.openPanelIndex === i,\n onToggle: this.onToggle.bind(this, i)\n })\n )\n }\n </StyledPanelGroup>\n )\n }\n}\n\nPanelGroup.propTypes = {\n children: PropTypes.node,\n /**\n * Define a panel which is initially opened (zero-based index).\n */\n openPanelIndex: PropTypes.number\n}\n\nexport default PanelGroup\n","import styled from 'styled-components'\n\nconst StyledPanelBody = styled.div`\n && {\n padding: 0 ${({isFramed}) => isFramed ? '10px' : 0};\n display: ${({isOpen}) => isOpen ? 'block' : 'none'};\n\n > div {\n padding: ${({isFramed}) => isFramed ? '10px' : 0} 0 0 0;\n }\n\n table {\n position: static;\n }\n }\n`\nexport default StyledPanelBody\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelBody from './StyledPanelBody'\n\n/**\n * Only <Panel.Body/> is affected by the visibility state.\n */\n\nconst PanelBody = ({children, isFramed, isOpen}) =>\n <StyledPanelBody\n isFramed={isFramed}\n isOpen={isOpen}\n >\n <div>\n {children}\n </div>\n </StyledPanelBody>\n\nPanelBody.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is initially opened.\n * Value is always overridden by parent element.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is initially opened. Value is always overridden by parent element.\n */\n isOpen: PropTypes.bool\n}\n\nexport default PanelBody\n","import styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {shadeColor, scale, theme} from '../utilStyles'\n\nconst declareDivider = ({theme, isOpen, isFramed}) => {\n const cssShared = `\n &:first-child {\n border-bottom-color: ${shadeColor(_get(theme, 'colors.paper'), 1)};\n border-bottom-style: ${isFramed ? 'solid' : 'none'};\n }\n\n &:last-child,\n &:nth-child(3) {\n border-top-color: ${shadeColor(_get(theme, 'colors.paper'), 1)};\n border-top-style: ${isFramed ? 'solid' : 'none'};\n }\n `\n\n if (isOpen) {\n return `\n ${cssShared}\n &:first-child {\n border-bottom-width: 1px;\n }\n\n &:last-child,\n &:nth-child(3) {\n border-top-width: 1px;\n }\n `\n } else {\n return `\n ${cssShared}\n &:first-child {\n border-bottom-width: 0;\n }\n\n &:last-child {\n border-top-width: 0;\n }\n\n &:nth-child(3) {\n border-top-width: 1px;\n }\n `\n }\n}\n\nexport const StyledIconWrapper = styled.span`\n display: none;\n font-size: ${scale.font(1)};\n\n &:hover {\n color: ${theme.color('secondaryLight')};\n }\n`\n\nconst StyledPanelHeaderFooter = styled.div`\n && {\n background-color: #f2f2f2;\n display: flex;\n padding: ${({isFramed}) => isFramed ? '4px 8px 4px 8px' : 0};\n align-items: center;\n\n &:hover {\n cursor: pointer;\n\n ${StyledIconWrapper} {\n display: block;\n }\n }\n\n > div {\n flex: 1 1 auto;\n }\n ${props => declareDivider(props)}\n }\n`\n\nexport default StyledPanelHeaderFooter\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\nimport StyledPanelHeaderFooter, {StyledIconWrapper} from './StyledPanelHeaderFooter'\nimport Icon from '../Icon'\n\n/**\n * <Panel.Header/> and <Panel.Footer/> contain by default a button to toggle the visibility state of <Panel.Body>.\n * Header and footer can contain any content. If both are displayed is up to the implementer.\n */\nconst PanelHeaderFooter = ({\n children,\n isFramed,\n isOpen,\n isToggleable,\n showToggler,\n toggleOpenState,\n options\n}) => (\n <StyledPanelHeaderFooter\n isFramed={isFramed}\n isOpen={isOpen}\n onClick={toggleOpenState}\n >\n <div>\n {React.Children.map(children, child => React.cloneElement(child))}\n </div>\n {isToggleable\n && showToggler\n && <StyledIconWrapper>\n <Icon\n icon={isOpen ? 'chevron-up' : 'chevron-down'}\n onClick={toggleOpenState}\n title={isOpen ? options.collapseButtonText : options.unfoldButtonText}\n />\n </StyledIconWrapper>\n }\n </StyledPanelHeaderFooter>\n)\n\nPanelHeaderFooter.defaultProps = {\n showToggler: true,\n options: {\n collapseButtonText: 'Hide information',\n unfoldButtonText: 'Show more information'\n }\n}\n\nPanelHeaderFooter.propTypes = {\n children: PropTypes.node,\n /**\n * Boolean to control if <Panel.Header/>, <Panel.Body/> and <Panel.Footer/> is initially opened.\n * Value is always overridden by parent element.\n */\n isFramed: PropTypes.bool,\n /**\n * Boolean to control if <Panel.Body/> is initially opened. Value is always overridden by parent element.\n */\n isOpen: PropTypes.bool,\n /**\n * Boolean to control if body can be opened or closed. Value is always overridden by parent element.\n */\n isToggleable: PropTypes.bool,\n /**\n * Show or hide button if needed. Default value is 'true'.\n */\n showToggler: PropTypes.bool,\n /**\n * Function executed on button click to control accordion. Is always passed from parent.\n */\n toggleOpenState: PropTypes.func,\n /* Define display text for buttons as option object (keys: collapseButtonText, unfoldButtonText). */\n options: PropTypes.shape({\n collapseButtonText: PropTypes.string,\n unfoldButtonText: PropTypes.string\n })\n}\n\nexport default PanelHeaderFooter\n","import Wrapper from './Panel'\nimport Group from './PanelGroup'\nimport Body from './PanelBody'\nimport HeaderFooter from './PanelHeaderFooter'\nimport StyledPanel from './StyledPanel'\nimport StyledPanelBody from './StyledPanelBody'\nimport StyledPanelHeaderFooter from './StyledPanelHeaderFooter'\n\nexport {\n StyledPanel,\n StyledPanelBody,\n StyledPanelHeaderFooter\n}\n\nexport default {\n Body,\n Footer: HeaderFooter,\n Group,\n Header: HeaderFooter,\n Wrapper\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {shadeColor} from '../'\n\nexport const StyledResizeHandle = styled.span`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n background: ${props => shadeColor(_get(props.theme, 'colors.paper'), 2)};\n opacity: 0;\n width: 3px;\n cursor: col-resize;\n`\n\nconst ResizingController = ({column, startResize}) => <StyledResizeHandle\n data-cy={`header-cell-${column.id}-resizing-controller`}\n onMouseDown={startResize(column)}\n/>\n\nResizingController.propTypes = {\n column: PropTypes.shape({\n resizable: PropTypes.bool,\n id: PropTypes.string\n }).isRequired,\n startResize: PropTypes.func.isRequired\n}\n\nexport default ResizingController\n","import styled, {css} from 'styled-components'\nimport _get from 'lodash/get'\n\nimport {\n declareFont,\n theme,\n shadeColor,\n StyledScrollbar,\n scale\n} from '../'\nimport {StyledResizeHandle} from './ResizingController'\nimport {generateShades} from '../utilStyles'\n\nconst borderColor = ({theme}) => shadeColor(_get(theme, 'colors.paper'), 2)\nconst basePadding = scale.space(-1.5)\n\nexport const StyledTableCell = styled.td`\n padding: ${basePadding};\n background-color: ${theme.color('paper')};\n border-bottom: 1px solid ${borderColor};\n align-content: center;\n box-sizing: content-box;\n`\n\nexport const StyledDnD = styled.div`\n padding: ${basePadding};\n width: 100%;\n display: flex;\n align-items: center;\n opacity: ${({isDragged}) => isDragged ? 0.2 : 1};\n`\n\nexport const StyledTableHeaderCell = styled.th`\n position: sticky;\n top: 0;\n background-color: ${theme.color('paper')};\n text-align: left;\n border-bottom: 2px solid ${borderColor};\n ${declareFont({fontWeight: theme.fontWeight('bold')})};\n user-select: none;\n cursor: ${({sortable}) => sortable ? 'pointer' : 'auto'};\n white-space: nowrap;\n display: flex;\n border-right: ${({isDraggedOver, theme}) => isDraggedOver ? `3px solid ${theme.colors.text}` : 'none'};\n ${({id}) => id === 'header-cell-navigation-column' && 'z-index: 1'};\n ${({isResizing, theme}) => isResizing && `\n background-color: ${generateShades(theme.colors.paper)[1]};\n\n > ${StyledResizeHandle} {\n opacity: 1;\n }\n `\n }\n ${({resizingColumn, theme}) => !resizingColumn && `\n &:hover {\n background-color: ${generateShades(theme.colors.paper)[2]};\n\n > ${StyledResizeHandle} {\n opacity: 1;\n }\n }\n `\n }\n ${({isResizing, sortable, fixedPosition, theme}) => !sortable\n ? `\n &:hover {\n background-color: ${theme.colors.paper};\n }\n `\n : !isResizing && !sortable && !fixedPosition && `\n &:hover {\n background-color: transparent;\n }\n `\n }\n`\n\nexport const PaginationContainer = styled.div`\n grid-row-start: pagination-start;\n height: 40px;\n display: flex;\n align-items: center;\n border-top: 1px solid ${borderColor};\n`\n\nconst selectionStyles = css`\n display: contents;\n ${({clickable}) => clickable && 'cursor: pointer;'}\n\n &.selected {\n > ${StyledTableCell} {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[2]};\n }\n }\n\n &.selectableRow:not(.selected):hover {\n > ${StyledTableCell} {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[2]};\n }\n }\n`\n\nexport const StyledSortingSpan = styled.span`\n height: 100%;\n margin-right: 2px;\n`\n\nexport const StyledFullRowProgress = styled.td`\n grid-column: 1 / -1;\n padding-top: ${basePadding};\n height: 50px;\n text-align: center;\n border: 0;\n`\n\nexport const StyledFullRow = styled.td`\n grid-column: 1 / -1;\n padding-top: ${basePadding};\n height: 50px;\n text-align: center;\n border: 0;\n ${declareFont()};\n`\n\nexport const StyledTableHead = styled.thead`\n ${selectionStyles}\n`\n\nexport const StyledTableRow = styled.tr`\n ${selectionStyles}\n\n &:nth-child(even) td {\n background-color: ${({theme}) => generateShades(theme.colors.paper)[1]};\n }\n`\n\nexport const StyledTableBody = styled.tbody`\n ${selectionStyles}\n`\n\nconst StyledTable = styled.table`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: auto;\n display: grid;\n border-collapse: collapse;\n grid-template-columns: ${({columns}) =>\n columns.map(column =>\n column.width\n ? column.width + 'px'\n : column.shrinkToContent\n ? 'max-content'\n : 'minmax(100px, auto)'\n ).join(' ')};\n grid-auto-rows: min-content;\n min-width: 100%;\n ${StyledScrollbar}\n`\n\nexport const StretchingTableContainer = styled.div`\n grid-row-start: table-start;\n position: relative;\n`\n\nexport const StyledTableWrapper = styled.div`\n display: grid;\n background-color: ${theme.color('paper')};\n grid-template-rows: [table-start] minmax(300px, 1fr) [pagination-start] auto auto;\n height: 100%;\n\n // reset external styles in old client\n input[type='checkbox'],\n input[type='radio'] {\n margin: 3px 3px 3px 4px !important;\n }\n\n @media screen and (max-height: 650px) {\n grid-template-rows: [table-start] 1fr [pagination-start] auto auto;\n }\n`\n\nexport const StyledDraggable = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n`\n\nexport default StyledTable\n","import styled from 'styled-components'\n\nimport Button from '../Button'\nimport {scale} from '../'\n\nexport const StyledPagination = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin-left: 5px;\n\n span {\n padding-right: 6px;\n }\n`\n\nexport const StyledPaginationButton = styled(Button)`\n padding: ${scale.space(-2)} ${scale.space(-0.8)};\n`\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage, injectIntl} from 'react-intl'\n\nimport ButtonGroup from '../ButtonGroup'\nimport Typography from '../Typography'\nimport {StyledPagination, StyledPaginationButton} from './StyledComponents'\n\n/**\n * Controlled Pagination component\n */\nconst Pagination = ({totalCount, recordsPerPage, currentPage, onPageChange, intl}) => {\n const totalPages = Math.ceil(totalCount / recordsPerPage)\n const start = (currentPage - 1) * recordsPerPage + 1\n const to = currentPage * recordsPerPage\n\n const msg = id => intl.formatMessage({id})\n\n return (\n <StyledPagination>\n {totalPages > 1\n && <ButtonGroup>\n <StyledPaginationButton\n disabled={currentPage === 1}\n title={msg('client.component.pagination.firstPageTitle')}\n icon=\"chevron-double-left\"\n onClick={() => onPageChange(1)}/>\n <StyledPaginationButton\n disabled={currentPage === 1}\n title={msg('client.component.pagination.prePageTitle')}\n icon=\"chevron-left\"\n onClick={() => onPageChange(currentPage - 1)}/>\n <StyledPaginationButton\n disabled={currentPage === totalPages}\n title={msg('client.component.pagination.nextPageTitle')}\n icon=\"chevron-right\"\n onClick={() => onPageChange(currentPage + 1)}/>\n <StyledPaginationButton\n disabled={currentPage === totalPages}\n title={msg('client.component.pagination.lastPageTitle')}\n icon=\"chevron-double-right\"\n onClick={() => onPageChange(totalPages)}/>\n </ButtonGroup>\n }\n\n <Typography.Span> <FormattedMessage id=\"client.component.pagination.text\" values={{\n start,\n to,\n total: totalCount\n }}/>\n </Typography.Span>\n </StyledPagination>\n )\n}\n\nPagination.propTypes = {\n intl: PropTypes.object.isRequired,\n /**\n * Currently displayed page\n */\n currentPage: PropTypes.number.isRequired,\n /**\n * Total of records available\n */\n totalCount: PropTypes.number.isRequired,\n /**\n * Limit for a page\n */\n recordsPerPage: PropTypes.number.isRequired,\n /**\n * Callback on page change with provided button, returns new page as single argument\n */\n onPageChange: PropTypes.func.isRequired\n}\n\nexport default injectIntl(Pagination)\n","import Pagination from './Pagination'\n\nexport default Pagination\n","import {useState} from 'react'\n\nconst removeAllTextSelections = () => {\n if (document.getSelection) {\n document.getSelection().removeAllRanges()\n }\n}\n\nexport default (selection = [], currentKeys, onSelectChange) => {\n const [lastSelected, setLastSelected] = useState(null)\n\n const isSelected = key => selection.includes(key)\n\n const selectionChange = (key, value, shiftSelection) => {\n if (Array.isArray(key)) {\n onSelectChange(key, value)\n setLastSelected(null)\n } else {\n if (shiftSelection) {\n removeAllTextSelections()\n\n const idxLastSelection = lastSelected ? currentKeys.findIndex(k => k === lastSelected) : 0\n const idxSelection = currentKeys.findIndex(k => k === key)\n onSelectChange(\n currentKeys.slice(Math.min(idxLastSelection, idxSelection), Math.max(idxLastSelection, idxSelection) + 1),\n value\n )\n } else {\n onSelectChange([key], value || !isSelected(key))\n setLastSelected(key)\n }\n }\n }\n\n return {\n isSelected,\n selectionChange\n }\n}\n","import PropTypes from 'prop-types'\n\nconst selectionStyles = {\n SINGLE: 'single',\n MULTI: 'multi',\n NONE: 'none'\n}\n\nconst selectionStylePropType = PropTypes.oneOf(Object.keys(selectionStyles).map(key => selectionStyles[key]))\n\nexport {\n selectionStyles as default,\n selectionStylePropType\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nconst SingleSelectCell = ({rowData, isSelected, selectionChange}) =>\n <div onClick={e => e.stopPropagation()}>\n <input type=\"radio\" checked={isSelected(rowData.__key)} onChange={e => {\n selectionChange(rowData.__key, e.target.value)\n }}/>\n </div>\n\nSingleSelectCell.propTypes = {\n isSelected: PropTypes.func.isRequired,\n rowData: PropTypes.shape({\n __key: PropTypes.string.isRequired\n }).isRequired,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default SingleSelectCell\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {MultiCheckbox} from '../../'\nimport {rowDataPropType} from '../propTypes'\n\nconst MultiSelectCell = ({rowData, isSelected, selectionChange, rowIdx}) => {\n const rowSelectionState = rowData => isSelected(rowData.__key) ? 'checked' : 'unchecked'\n const rowSelectionChange = rowData => value => selectionChange(rowData.__key, value === 'checked')\n\n return <div onClick={e => {\n if (e.shiftKey) {\n selectionChange(rowData.__key, true, true)\n }\n e.stopPropagation()\n }}\n data-cy=\"list-selection-checkbox\"\n >\n <MultiCheckbox\n value={rowSelectionState(rowData)}\n onChange={rowSelectionChange(rowData)}\n label={`${rowData.__model} ${rowIdx + 1}`}\n id={'list-selection-checkbox ' + rowData.__key}/>\n </div>\n}\n\nMultiSelectCell.propTypes = {\n isSelected: PropTypes.func.isRequired,\n rowData: rowDataPropType.isRequired,\n rowIdx: PropTypes.number,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default MultiSelectCell\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {MultiCheckbox} from '../../'\nimport {dataPropType} from '../propTypes'\n\nconst MultiSelectHeader = ({data, isSelected, selectionChange}) => {\n const allKeys = data.map(e => e.__key)\n const allRowsSelectionChange = v => {\n selectionChange(allKeys, v === 'checked')\n }\n\n const allRowsSelectionState = allKeys.every(k => isSelected(k))\n ? 'checked'\n : allKeys.some(k => isSelected(k))\n ? 'indeterminate'\n : 'unchecked'\n return data.length === 0\n ? null\n : <MultiCheckbox value={allRowsSelectionState} onChange={allRowsSelectionChange}/>\n}\n\nMultiSelectHeader.propTypes = {\n isSelected: PropTypes.func.isRequired,\n data: dataPropType.isRequired,\n selectionChange: PropTypes.func.isRequired\n}\n\nexport default MultiSelectHeader\n","import React from 'react'\n\nimport selectionStyles from './selectionStyles'\nimport SingleSelectCell from './SingleSelectCell'\nimport MultiSelectCell from './MultiSelectCell'\nimport MultiSelectHeader from './MultiSelectHeader'\n\nexport const getSelectionCell = (selectionStyle, columns, isSelected, selectionChange) => {\n if (selectionStyle && selectionStyle !== selectionStyles.NONE) {\n return selectionStyle === selectionStyles.MULTI\n ? getMultiSelectionCell(isSelected, selectionChange)\n : getSingleSelectionCell(isSelected, selectionChange)\n }\n return null\n}\n\nconst getSingleSelectionCell = (isSelected, selectionChange) => ({\n id: 'single-selection',\n width: 30,\n resizable: false,\n fixedPosition: true,\n dynamic: true,\n sorting: {\n sortable: false\n },\n HeaderRenderer: () => null,\n CellRenderer: props => <SingleSelectCell {...props} isSelected={isSelected} selectionChange={selectionChange}/>\n})\n\nconst getMultiSelectionCell = (isSelected, selectionChange) => ({\n id: 'multi-selection',\n dynamic: true,\n resizable: false,\n fixedPosition: true,\n width: 30,\n sorting: {\n sortable: false\n },\n HeaderRenderer: props => <MultiSelectHeader {...props} isSelected={isSelected} selectionChange={selectionChange}/>,\n CellRenderer: props => <MultiSelectCell {...props} isSelected={isSelected} selectionChange={selectionChange}/>\n})\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nimport {Icon} from '../'\nimport {StyledSortingSpan} from './StyledTable'\n\nconst SortingState = ({column}) =>\n column.sorting && column.sorting.sortRank && column.sorting.order\n ? <StyledSortingSpan>\n <Icon icon={`sort-${column.sorting.order === 'asc' ? 'up' : 'down'}`}/>\n {column.sorting.sortRank > 1 && <span>{column.sorting.sortRank}</span>}\n </StyledSortingSpan>\n : null\n\nSortingState.propTypes = {\n column: PropTypes.shape({\n sorting: PropTypes.shape({\n sortable: PropTypes.bool,\n sortRank: PropTypes.number,\n order: PropTypes.oneOf(['asc', 'desc'])\n })\n }).isRequired\n}\n\nexport default SortingState\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {useDnD} from 'tocco-util'\n\nimport {StyledDnD, StyledTableHead, StyledTableHeaderCell, StyledTableRow, StyledDraggable} from './StyledTable'\nimport SortingState from './SortingState'\nimport ResizingController from './ResizingController'\nimport {columnPropType, dataPropType} from './propTypes'\nimport useResize from './useResize'\n\nconst ThContent = ({column, data}) =>\n column.HeaderRenderer\n ? <column.HeaderRenderer column={column} data={data}/>\n : <div dangerouslySetInnerHTML={{__html: column.label}} title={column.label}/>\n\nThContent.propTypes = {\n data: dataPropType,\n column: columnPropType\n}\n\nconst TableHeader = ({columns, data, onColumnPositionChange, onSortingChange, tableEl, resizeCallback}) => {\n const {dndEvents, dndState} = useDnD(onColumnPositionChange, columns)\n\n const {resizingColumn, startResize} = useResize(tableEl, resizeCallback)\n\n const thOnClick = column => e => {\n if (!resizingColumn && column.sorting && column.sorting.sortable) {\n onSortingChange(column.id, e.shiftKey)\n }\n }\n\n return <StyledTableHead>\n <StyledTableRow>\n {columns.map(column => {\n const key = `header-cell-${column.id}`\n return <StyledTableHeaderCell\n key={key}\n data-cy={key}\n id={key}\n onClick={thOnClick(column)}\n resizingColumn={resizingColumn}\n isResizing={resizingColumn && column.id === resizingColumn.id}\n sortable={column.sorting && column.sorting.sortable}\n isDraggedOver={dndState.currentlyDragOver === column.id && dndState.currentlyDragging !== column.id}\n >\n <StyledDraggable\n id={`header-cell-drop-${column.id}`}\n key={`header-cell-drop-${column.id}`}\n {...(!column.fixedPosition && {\n draggable: true,\n ...dndEvents(column.id)\n })}\n >\n <StyledDnD\n isDragged={dndState.currentlyDragging === column.id}\n >\n <SortingState column={column}/>\n <ThContent column={column} data={data}/>\n </StyledDnD>\n </StyledDraggable>\n {column.resizable && <ResizingController column={column} startResize={startResize}/>}\n </StyledTableHeaderCell>\n }\n )}\n </StyledTableRow>\n </StyledTableHead>\n}\n\nTableHeader.propTypes = {\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n data: dataPropType,\n onColumnPositionChange: PropTypes.func,\n onSortingChange: PropTypes.func,\n tableEl: PropTypes.shape({current: PropTypes.object}),\n resizeCallback: PropTypes.func\n}\n\nexport default TableHeader\n","import {useState} from 'react'\n\nexport default (tableElRef, resizeCallback) => {\n const [resizingColumn, setResizingColumn] = useState(null)\n\n const startResize = column => () => {\n setResizingColumn(column)\n tmpColResizing = column\n window.addEventListener('mousemove', onMouseMove)\n window.addEventListener('mouseup', onMouseUp)\n }\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove)\n window.removeEventListener('mouseup', onMouseUp)\n setTimeout(() => {\n setResizingColumn(null)\n }, 100)\n }\n\n let lastPositionX\n let tmpColResizing\n const onMouseMove = e => requestAnimationFrame(() => {\n if (lastPositionX) {\n const diff = e.clientX - lastPositionX\n const thEl = tableElRef.current.querySelector(`th[id='header-cell-${tmpColResizing.id}']`)\n const width = Math.max(50, thEl.offsetWidth + diff)\n resizeCallback(tmpColResizing.id, width)\n }\n\n lastPositionX = e.clientX\n })\n\n return {resizingColumn, startResize}\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\n\nimport {StyledTableCell} from './StyledTable'\nimport {Typography} from '../index'\nimport {columnPropType, rowDataPropType} from './propTypes'\n\nconst StaticCell = React.memo(({column, rowData, rowIdx}) => {\n return <StyledTableCell\n {...column.rightAligned === true && {style: {textAlign: 'right'}}}\n data-cy=\"list-cell\"\n >\n {column.CellRenderer\n ? <column.CellRenderer rowData={rowData} column={column} rowIdx={rowIdx}/>\n : <Typography.Span>{rowData[column.id]}</Typography.Span>\n }\n </StyledTableCell>\n})\n\nStaticCell.propTypes = {\n rowData: rowDataPropType.isRequired,\n column: columnPropType.isRequired,\n rowIdx: PropTypes.number\n}\n\nconst areEqual = (prevProps, nextProps) => {\n if (!prevProps.column.dynamic) {\n return true\n }\n const diff = Object.keys(js.difference(prevProps, nextProps))\n return diff.length === 0\n}\n\nexport default React.memo(StaticCell, areEqual)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {FormattedMessage} from 'react-intl'\n\nimport {Typography, LoadingSpinner} from '../'\nimport {StyledFullRow, StyledFullRowProgress, StyledTableBody, StyledTableRow} from './StyledTable'\nimport StaticCell from './StaticCell'\nimport {columnPropType, dataPropType} from './propTypes'\n\nconst InProgressRow = () => <StyledTableRow>\n <StyledFullRowProgress>\n <LoadingSpinner size=\"20\"/>\n <Typography.P>\n <FormattedMessage id=\"client.component.table.dataLoading\"/>\n </Typography.P>\n </StyledFullRowProgress>\n</StyledTableRow>\n\nconst NoDataRow = () => <StyledTableRow>\n <StyledFullRow>\n <Typography.Span>\n <FormattedMessage id=\"client.component.table.noData\"/>\n </Typography.Span>\n </StyledFullRow>\n</StyledTableRow>\n\nconst TableBody = ({data, columns, isSelected, selectionChange, dataLoadingInProgress, onRowClick, clickable}) => {\n const trOnClick = entity => e => {\n if (e.shiftKey) {\n selectionChange(entity.__key, true, true)\n } else if (e.metaKey || e.ctrlKey) {\n selectionChange(entity.__key)\n } else if (clickable && onRowClick) {\n onRowClick(entity.__key)\n }\n }\n\n return <StyledTableBody>\n {\n dataLoadingInProgress\n ? <InProgressRow/>\n : data.length > 0\n ? data.map((rowData, idx) =>\n <StyledTableRow\n key={`list-row-${rowData.__key}`}\n className={`selectableRow ${isSelected(rowData.__key) && 'selected'}`}\n onClick={trOnClick(rowData)}\n clickable={clickable}\n data-cy=\"list-row\"\n >\n {\n columns.map(column =>\n <StaticCell\n key={`table-static-cell-${rowData.__key}-${column.id}`}\n selected={isSelected(rowData.__key)}\n rowData={rowData}\n column={column}\n rowIdx={idx}\n />\n )\n }\n </StyledTableRow>\n )\n : <NoDataRow/>\n }\n </StyledTableBody>\n}\n\nTableBody.propTypes = {\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n data: dataPropType,\n isSelected: PropTypes.func.isRequired,\n selectionChange: PropTypes.func,\n dataLoadingInProgress: PropTypes.bool,\n onRowClick: PropTypes.func,\n clickable: PropTypes.bool\n}\n\nexport default TableBody\n","import React, {useEffect, useRef, useState} from 'react'\nimport PropTypes from 'prop-types'\nimport {js} from 'tocco-util'\n\nimport StyledTable, {PaginationContainer, StretchingTableContainer, StyledTableWrapper} from './StyledTable'\nimport {Pagination} from '../'\nimport useSelection from './selection/useSelection'\nimport {selectionStylePropType} from './selection/selectionStyles'\nimport {getSelectionCell} from './selection/selectionColumnEnhancer'\nimport {columnPropType, dataPropType, keyPropType} from './propTypes'\nimport TableHeader from './TableHeader'\nimport TableBody from './TableBody'\n\nconst Table = props => {\n const {\n selection,\n data,\n onSelectionChange,\n selectionStyle,\n paginationInfo,\n onColumnPositionChange,\n onSortingChange,\n dataLoadingInProgress,\n onRowClick,\n clickable,\n onPageChange\n } = props\n const [columns, setColumns] = useState(props.columns)\n const tableEl = useRef(null)\n\n const resizeCallback = (columnId, width) => {\n setColumns([...columns.map(c => c.id === columnId\n ? {\n ...c,\n width\n }\n : c)])\n }\n\n const {isSelected, selectionChange}\n = useSelection(selection, data ? data.map(e => e.__key) : [], onSelectionChange)\n\n useEffect(() => {\n const selectionColumn = getSelectionCell(selectionStyle, props.columns, isSelected, selectionChange)\n setColumns([...(selectionColumn ? [selectionColumn] : []), ...props.columns])\n }, [props.columns, selection])\n\n const showPagination = paginationInfo\n && (paginationInfo.totalCount - paginationInfo.recordsPerPage) > 0\n\n return <StyledTableWrapper>\n <StretchingTableContainer>\n <StyledTable ref={tableEl} columns={columns}>\n <TableHeader\n columns={columns}\n data={data}\n resizeCallback={resizeCallback}\n onColumnPositionChange={onColumnPositionChange}\n tableEl={tableEl}\n onSortingChange={onSortingChange}\n />\n <TableBody\n columns={columns}\n data={data}\n isSelected={isSelected}\n selectionChange={selectionChange}\n dataLoadingInProgress={dataLoadingInProgress}\n onRowClick={onRowClick}\n clickable={clickable}\n />\n </StyledTable>\n </StretchingTableContainer>\n {showPagination && <PaginationContainer>\n <Pagination\n onPageChange={onPageChange}\n currentPage={paginationInfo.currentPage}\n totalCount={paginationInfo.totalCount}\n recordsPerPage={paginationInfo.recordsPerPage}\n />\n </PaginationContainer>}\n </StyledTableWrapper>\n}\n\nTable.propTypes = {\n /**\n * Array of column definitions. Determines how the cells are rendered.\n */\n columns: PropTypes.arrayOf(columnPropType).isRequired,\n /**\n * List of data to be displayed in the table. Should contain a __key property.\n */\n data: dataPropType,\n /**\n * True if data loading is in process.\n */\n dataLoadingInProgress: PropTypes.bool,\n /**\n * Used to display pagination\n */\n paginationInfo: PropTypes.shape({\n totalCount: PropTypes.number,\n currentPage: PropTypes.number,\n recordsPerPage: PropTypes.number\n }),\n /**\n * Determines if a select row is added\n */\n selectionStyle: selectionStylePropType,\n /**\n * List of selected keys\n */\n selection: PropTypes.arrayOf(keyPropType),\n /**\n * Boolean flag to disable clicking on rows\n */\n clickable: PropTypes.bool,\n /**\n * Callback for selection changes\n */\n onSelectionChange: PropTypes.func,\n /**\n * Callback on page change\n */\n onPageChange: PropTypes.func,\n /**\n * Callback if a column is drag and dropped to a new position\n */\n onColumnPositionChange: PropTypes.func,\n /**\n * Callback if sorting changed\n */\n onSortingChange: PropTypes.func,\n /**\n * Callback if a row is clicked\n */\n onRowClick: PropTypes.func\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(Table, areEqual)\n","import _pick from 'lodash/pick'\nimport _get from 'lodash/get'\nimport _set from 'lodash/set'\nimport _reduce from 'lodash/reduce'\nimport _isObject from 'lodash/isObject'\n\nconst metaFields = {\n KEY: '__key',\n MODEL: '__model',\n VERSION: '__version'\n}\n\nexport const relationFieldTypes = ['single-select-box', 'multi-select-box', 'single-remote-field', 'multi-remote-field']\nexport const relevantRelationAttributes = ['key', 'display', 'model', 'version']\n\nconst typeValueExtractor = (type, value) => {\n switch (type) {\n case 'entity':\n return value ? _pick(value, relevantRelationAttributes) : null\n case 'entity-list':\n return value.length > 0 ? value.map(childValue => _pick(childValue, relevantRelationAttributes)) : null\n case 'login':\n return _get(value, 'username')\n case 'longitude':\n case 'latitude':\n return _get(value, 'value')\n default:\n return value\n }\n}\n\n/**\n * Transforms a entity object into a flatten structure wil only one hierarchy of properties.\n * @param {object} entity - Entity as retrieved by the rest endpoint.\n */\nexport const getFlattenEntity = entity => ({\n [metaFields.KEY]: entity.key,\n [metaFields.MODEL]: entity.model,\n [metaFields.VERSION]: entity.version,\n ...flattenPaths(entity.paths)\n})\n\nexport const flattenPaths = (paths, currentPath = []) =>\n _reduce(\n paths,\n (acc, path, pathId) => {\n let subPaths = {}\n if (path.value) {\n if (Array.isArray(path.value)) {\n subPaths = path.value.reduce((acc, v) => {\n const flatten = flattenPaths(v.paths, [...currentPath, pathId])\n const combinedArrayVales = _reduce(flatten, (acc2, val, key) =>\n ({...acc2, [key]: [...(acc[key] || []), val]}), {})\n return {...acc, ...combinedArrayVales}\n }, {})\n } else {\n subPaths = flattenPaths(path.value.paths, [...currentPath, pathId])\n }\n }\n\n return {...acc, [[...currentPath, pathId].join('.')]: typeValueExtractor(path.type, path.value), ...subPaths}\n },\n {}\n )\n\n/**\n * Transforms a flatten entity back to a api compatible entity object. Only regards fields that are marked as dirty.\n * @param {object} flattenEntity - Entity that was prior transformed with 'getFlattenEntity'\n * @param {array} dirtyFields - Optional list of dirty field names (paths). If undefined, all paths are applied\n */\nexport const toEntity = (flattenEntity, dirtyFields) => {\n const ignoredPath = path => (Object.values(metaFields).includes(path))\n || (dirtyFields && !dirtyFields.some(dirtyField => dirtyField === path || dirtyField.startsWith(path + '.')))\n\n const valueSimplifier = value => {\n if (Array.isArray(value)) {\n return value.map(v => valueSimplifier(v))\n }\n\n return _isObject(value) ? _pick(value, ['key', 'version', 'id']) : value\n }\n\n const paths = Object.keys(flattenEntity).reduce((acc, path) => {\n if (!ignoredPath(path)) {\n const t = path.split('.').join('.paths.')\n return _set(acc, t, valueSimplifier(flattenEntity[path]))\n }\n return acc\n }, {})\n\n return {\n model: flattenEntity[metaFields.MODEL],\n key: flattenEntity[metaFields.KEY],\n version: flattenEntity[metaFields.VERSION],\n paths\n }\n}\n","const isDisplayableChild = child => !child.hidden\n\nconst getSortingAttributes = (column, sorting) => {\n const idx = sorting && sorting.findIndex(s => s.field === column.id)\n return idx >= 0\n ? {\n sortRank: idx + 1,\n order: sorting[idx].order\n }\n : null\n}\n\nconst rightAlignedTypes = ['counter', 'decimal', 'double', 'integer', 'latitude', 'long', 'longitude', 'moneyamount',\n 'percent', 'serial', 'sorting', 'version']\n\nconst isRightAligned = column =>\n column.children && column.children.length === 1 && rightAlignedTypes.includes(column.children[0].dataType)\n\n/**\n * Transforms nice form column definitions in a tocco-ui table compatible format.\n * @param {array} columns - columns from table form definition\n * @param {array} sorting - sorting array with field and order attributes\n * @param {function} cellRenderer - Function to return rendered cell given data and column definition\n */\nexport const getColumnDefinition = (columns, sorting, cellRenderer, ...args) => {\n if (!columns) {\n return []\n }\n return columns\n .filter(column => !column.hidden)\n .filter(column => column.children.filter(isDisplayableChild).length > 0)\n .map((c, idx) => (\n {\n idx: idx,\n id: c.id,\n label: c.label,\n sorting: {\n sortable: c.sortable,\n ...getSortingAttributes(c, sorting)\n },\n children: c.children.filter(isDisplayableChild),\n resizable: !c.widthFixed,\n rightAligned: isRightAligned(c),\n CellRenderer: ({rowData, column}) => column.children.map(child => cellRenderer(child, rowData, ...args))\n }\n ))\n}\n","import {getFlattenEntity, flattenPaths, toEntity, relationFieldTypes, relevantRelationAttributes} from './entities'\nimport {getDisplayRequest, getPathDisplayRequest} from './display'\nimport {getColumnDefinition} from './table'\n\nexport default {\n relationFieldTypes,\n relevantRelationAttributes,\n getFlattenEntity,\n flattenPaths,\n toEntity,\n getPathDisplayRequest,\n getDisplayRequest,\n getColumnDefinition\n}\n","import _get from 'lodash/get'\nimport _set from 'lodash/set'\n\nconst alreadyLoaded = (model, key, lazyData) => {\n return !!_get(lazyData, ['defaultDisplays', model, key], '')\n}\n\nconst alreadyInRequest = (model, key, request) => {\n return _get(request, [model], []).includes(key)\n}\n\n/**\n * Gets a request object to retrieve all the displays of the given paths within the entities.\n *\n * @param {array} entities - List of all entities.\n * @param {object} relationPaths - Field that need a display to be loaded\n * @param {object} lazyData - Optional object with the already loaded displays to shrink the request.\n */\nexport const getPathDisplayRequest = (entities, relationPaths, lazyData) => {\n const request = {}\n entities.forEach(entity => {\n relationPaths.forEach(field => {\n if (entity[field]) {\n const fieldValue = entity[field]\n const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue]\n\n values.forEach(value => {\n const {model, key} = value\n\n if (!alreadyLoaded(model, key, lazyData) && !alreadyInRequest(model, key, request)) {\n _set(request, [model], [..._get(request, [model], []), key])\n }\n })\n }\n })\n })\n\n return request\n}\n\n/**\n * Gets a request object to retrieve all displays of the entities.\n *\n * @param {array} entities - List of all entities.\n */\nexport const getDisplayRequest = entities => (\n entities.reduce((acc, val) => ({\n ...acc,\n [val.model]: [...(acc[val.model] || []), val.key]\n }\n ), {})\n)\n","import _isObject from 'lodash/isObject'\nimport moment from 'moment'\n\nconst isDefined = v => v !== null && v !== undefined && v !== ''\n\nexport const getTql = (path, value, fieldType) => {\n if (!isDefined(value)) {\n return null\n }\n\n const type = fieldType || guessType(value)\n value = rangeMappings(type)(value)\n\n const isRangeValue = value && typeof value === 'object' && value.isRangeValue\n const typeHandler = typeHandlers(type)\n\n if (isRangeValue) {\n return handleRangeValue(value, typeHandler, path)\n } else {\n return typeHandler(path, value, '==')\n }\n}\n\nconst handleRangeValue = (value, typeHandler, path) => (\n [\n ...(isDefined(value.from) ? [typeHandler(path, value.from, '>=')] : []),\n ...(isDefined(value.to) ? [typeHandler(path, value.to, value.exclusive ? '<' : '<=')] : [])\n ].join(' and ')\n)\n\nconst rangeMappings = type => {\n switch (type) {\n case 'datetime':\n case 'createts':\n case 'updatets':\n return value => {\n const momentValue = moment(value, 'YYYY-MM-DD', true)\n if (momentValue.isValid()) {\n return {\n from: value,\n to: momentValue.add(1, 'd'),\n isRangeValue: true,\n exclusive: true\n }\n } else {\n return value\n }\n }\n default:\n return value => value\n }\n}\n\nconst typeHandlers = type => {\n switch (type) {\n case 'multi-select-box':\n case 'multi-remote-field':\n return (path, value) => `KEYS(\"${path}\",${value.map(v => v.key).join(',')})`\n case 'single-remote-field':\n case 'single-select-box':\n return (path, value) => `${path}.pk == ${value.key}`\n case 'fulltext-search':\n return (path, value) => path === 'txtFulltext'\n ? `(fulltext(\"${value}\") or fulltext(\"${value}*\"))`\n : `(fulltext(\"${value}\", ${path}) or fulltext(\"${value}*\", ${path}))`\n case 'birthdate':\n case 'date':\n case 'create_timestamp':\n return (path, value, comp) => `${path} ${comp} date:\"${value}\"`\n case 'datetime':\n case 'createts':\n case 'updatets':\n return (path, value, comp) => `${path} ${comp} datetime:\"${moment(value).utc().format('YYYY-MM-DD HH:mm')}\"`\n case 'time':\n return (path, value, comp) => `${path} ${comp} time:\"${moment(value, 'HH:mm').format('HH:mm:ss.sss')}\"`\n case 'compressed-text':\n case 'string':\n case 'createuser':\n case 'updateuser':\n return (path, value) => `${path} ~= \"${value}\"`\n case 'boolean':\n return (path, value) => value === false ? null : `${path} == ${value}`\n case 'marking':\n return (path, value) => value === false ? null : `exists(${path})`\n default:\n return (path, value, comp) => `${path} ${comp} ${value}`\n }\n}\n\n// For fields that are not in the search form (e.g. parent and preselectedSearchFields)\nconst guessType = value => {\n if (_isObject(value) && value.key) {\n return 'single-select-box'\n }\n\n if (Array.isArray(value) && value.every(v => !!v.key)) {\n return 'multi-select-box'\n }\n\n return 'string'\n}\n","import {getTql} from './tqlBuilder'\n\nexport default {getTql}\n","import {useState} from 'react'\n\nconst initialState = {\n currentlyDragging: null,\n currentlyDragOver: null\n}\n\nexport default (changePosition, columns) => {\n const [state, setState] = useState(initialState)\n\n const events = columnId => ({\n onDragStart: e => {\n setState({...state, currentlyDragging: columnId})\n },\n onDragEnter: e => {\n if (state.currentlyDragOver !== columnId) {\n setState({...state, currentlyDragOver: columnId})\n }\n },\n onDragOver: e => {\n e.preventDefault()\n e.stopPropagation()\n return true\n },\n onDrop: e => {\n changePosition(state.currentlyDragging, state.currentlyDragOver, columns)\n setState(initialState)\n e.stopPropagation()\n },\n onDragEnd: e => {\n setState(initialState)\n }\n })\n\n return {dndEvents: events, dndState: state}\n}\n","import useDnD from './useDnD'\n\nexport default useDnD\n"],"sourceRoot":""}