@gisce/react-ooui 2.11.0 → 2.11.2

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,"file":"react-ooui.es.js","sources":["../src/widgets/base/Label.tsx","../src/common/Field.tsx","../src/ui/ConfirmDialog.tsx","../src/context/FormContext.tsx","../src/helpers/iconMapper.ts","../src/widgets/base/Button.tsx","../src/widgets/custom/ButtonGroup.tsx","../src/hooks/useWindowDimensions.ts","../src/ConnectionProvider.ts","../src/helpers/errorHelper.ts","../src/ui/ActionErrorDialog.tsx","../src/widgets/modals/TranslationModal.tsx","../src/common/ButtonWithTooltip.tsx","../src/ui/InfoDialog.tsx","../src/widgets/base/Char.tsx","../src/widgets/base/Selection.tsx","../src/widgets/base/Boolean.tsx","../src/helpers/filesHelper.ts","../src/widgets/base/Image.tsx","../src/widgets/custom/FiberGrid.tsx","../src/helpers/treeHelper.tsx","../src/helpers/one2manyHelper.ts","../src/widgets/custom/Timeline.tsx","../src/locales/ca_ES.ts","../src/locales/en_US.ts","../src/locales/es_ES.ts","../src/locales/index.ts","../src/context/ConfigContext.tsx","../src/widgets/views/Dashboard/dashboardHelper.ts","../src/hooks/useFormGraphData.ts","../src/ui/CenteredSpinner.tsx","../src/ui/ErrorAlert.tsx","../src/hooks/useNetworkRequest.ts","../src/widgets/views/Graph/GraphIndicatorComp.tsx","../src/widgets/views/Graph/GraphIndicator.tsx","../src/widgets/views/Graph/useGraphData.tsx","../src/helpers/dayjs.ts","../src/widgets/views/Graph/GraphDefaults.ts","../src/widgets/views/Graph/GraphChartComp.tsx","../src/widgets/views/Graph/GraphChart.tsx","../src/models/constants.ts","../src/context/ActionViewContext.tsx","../src/widgets/views/Graph/Graph.tsx","../src/models/erpFeature.ts","../src/widgets/views/Graph/useServerGraphData.tsx","../src/widgets/views/Graph/GraphServer.tsx","../src/context/TabManagerContext.tsx","../src/widgets/views/Graph/GraphCard.tsx","../src/widgets/custom/Indicator.tsx","../src/helpers/formHelper.ts","../src/widgets/custom/Tag.tsx","../src/widgets/custom/Tags.tsx","../src/widgets/WidgetFactory.tsx","../src/helpers/containerHelper.ts","../src/widgets/containers/Container.tsx","../src/ui/UnsavedChangesDialog.tsx","../src/ui/FormErrorsDialog.tsx","../src/ui/WarningDialog.tsx","../src/context/FormModalContext.tsx","../src/context/ContentRootContext.tsx","../src/helpers/fieldsHelper.ts","../src/widgets/views/Form.tsx","../src/widgets/modals/FormModal.tsx","../src/widgets/views/searchFilter/DateRangePicker.tsx","../src/common/TimePicker.tsx","../src/widgets/views/searchFilter/DateTimeRangePicker.tsx","../src/widgets/base/Float.tsx","../src/widgets/base/Integer.tsx","../src/widgets/views/searchFilter/PairFields.tsx","../src/widgets/base/MultiSelection.tsx","../src/widgets/views/searchFilter/SearchField.tsx","../src/widgets/views/searchFilter/SearchBottomBar.tsx","../src/widgets/views/searchFilter/SearchParams.tsx","../src/helpers/searchHelper.ts","../src/widgets/views/searchFilter/SearchFilter.tsx","../src/helpers/dynamicColumnsHelper.ts","../src/common/SelectAllRecordsRow.tsx","../src/helpers/timeHelper.ts","../src/widgets/base/ProgressBar.tsx","../src/widgets/base/many2one/Many2oneSuffixOoui.tsx","../src/widgets/base/many2one/Many2oneSuffix.tsx","../src/widgets/base/many2one/Many2oneTree.tsx","../src/widgets/base/ReferenceTree.tsx","../src/widgets/custom/Avatar.tsx","../src/common/DatePicker.tsx","../src/widgets/views/Tree/treeComponents.tsx","../src/widgets/views/Tree/Tree.tsx","../src/hooks/useSearch.ts","../src/widgets/views/SearchTree.tsx","../src/ui/GenericErrorDialog.tsx","../src/widgets/modals/SearchModal.tsx","../src/widgets/base/many2one/Many2one.tsx","../src/context/One2manyContext.tsx","../src/ui/AsyncConfirmModal.tsx","../src/ui/asyncConfirm.tsx","../src/ui/RemoveItemDialog.tsx","../src/ui/UnlinkItemDialog.tsx","../src/widgets/base/one2many/One2manyTopBar.tsx","../src/widgets/base/one2many/One2manyInput.tsx","../src/widgets/base/one2many/useOne2manyDomain.ts","../src/widgets/base/one2many/useOne2manyTree.ts","../src/widgets/base/one2many/useOne2manyForm.ts","../src/widgets/base/one2many/useOne2manyItems.ts","../src/widgets/base/one2many/One2manyForm.tsx","../src/widgets/base/one2many/useOne2manyRemove.ts","../src/widgets/base/one2many/useOne2manyFormModal.ts","../src/widgets/base/one2many/useOne2manySearchModal.ts","../src/widgets/base/one2many/useOne2manyColumnStorage.ts","../src/widgets/base/one2many/One2manyTree.tsx","../src/widgets/base/one2many/One2manyInputInfinite.tsx","../src/widgets/base/one2many/One2many.tsx","../src/widgets/base/FloatTime.tsx","../src/widgets/containers/Group.tsx","../src/widgets/containers/Notebook.tsx","../src/widgets/base/Text.tsx","../src/widgets/base/Separator.tsx","../src/hooks/useExport.ts","../src/widgets/modals/ExportModal.tsx","../src/widgets/base/Date.tsx","../src/widgets/base/DateTime.tsx","../src/widgets/base/Time.tsx","../src/widgets/base/Reference.tsx","../src/widgets/base/Binary.tsx","../src/actionbar/ChangeViewButton.tsx","../src/actionbar/ActionButton.tsx","../src/actionbar/NewButton.tsx","../src/ui/RefreshItemDialog.tsx","../src/helpers/logInfoHelper.tsx","../src/actionbar/AttachmentsButtonWrapper.tsx","../src/actionbar/AttachmentsButton.tsx","../src/actionbar/FormActionBar.tsx","../src/widgets/base/LinkInput.tsx","../src/widgets/base/Url.tsx","../src/widgets/base/Email.tsx","../src/ui/GoToResourceModal.tsx","../src/actionbar/ButtonWithBadge.tsx","../src/actionbar/GraphActionBar.tsx","../src/ui/TitleHeader.tsx","../src/views/actionViews/GraphActionView.tsx","../src/views/actionViews/FormActionView.tsx","../src/actionbar/SearchBar.tsx","../src/actionbar/TreeActionBar.tsx","../src/views/actionViews/TreeActionView.tsx","../src/context/DashboardActionContext.tsx","../src/actionbar/DashboardActionBar.tsx","../src/views/actionViews/DashboardActionView.tsx","../src/helpers/viewHelper.ts","../src/views/ActionView.tsx","../src/widgets/views/DashboardGrid/DashboardGrid.tsx","../src/widgets/views/Dashboard/DashboardTree.tsx","../src/widgets/views/Dashboard/DashboardForm.tsx","../src/widgets/views/Dashboard/Dashboard.tsx","../src/widgets/custom/MultiCheckbox.tsx","../src/widgets/custom/Markdown.tsx","../src/widgets/custom/Radio.tsx","../src/widgets/custom/Switch.tsx","../src/widgets/custom/Steps.tsx","../src/widgets/custom/CodeEditor.tsx","../src/widgets/custom/Comments.tsx","../src/widgets/custom/HTMLPreview.tsx","../src/widgets/custom/Alert.tsx","../src/views/Welcome.tsx","../src/views/RootView.tsx","../src/views/tabs/Tab.tsx","../src/views/TabSelector.tsx","../src/views/TabContent.tsx","../src/views/CurrentTabContent.tsx","../src/ui/FavouriteButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tooltip, Typography, theme } from \"antd\";\nimport { WidgetProps } from \"@/types\";\nimport { QuestionCircleOutlined } from \"@ant-design/icons\";\nimport { Label as LabelOoui } from \"@gisce/ooui\";\nimport { Interweave } from \"interweave\";\nconst { Text, Title } = Typography;\nconst { useToken } = theme;\n\ntype Props = WidgetProps & {\n align?: \"left\" | \"center\" | \"right\";\n responsiveBehaviour?: boolean;\n};\n\nconst alignClass = {\n left: \"justify-start\",\n center: \"justify-center\",\n right: \"justify-end\",\n};\n\nconst Label = (props: Props) => {\n const { ooui, align, responsiveBehaviour } = props;\n const { label, tooltip, fieldForLabel, labelSize, labelType } =\n ooui as LabelOoui;\n const addColon = fieldForLabel !== null;\n const labelText = addColon && label.length > 1 ? label + \" :\" : label;\n const responsiveAlign = responsiveBehaviour ? \"left\" : \"right\";\n const labelAlgin = align || (fieldForLabel ? responsiveAlign : \"left\");\n const { token } = useToken();\n\n const TextType = labelSize === undefined ? Text : Title;\n\n return (\n <div\n className={`flex flex-row items-center pb-1 pt-1 ${alignClass[labelAlgin]}`}\n >\n {tooltip && (\n <Tooltip title={tooltip}>\n <QuestionCircleOutlined\n className=\"pr-1 text-xs\"\n style={{\n color: token.colorPrimary,\n }}\n />\n </Tooltip>\n )}\n <span className=\"pr-2\">\n <TextType level={labelSize} type={labelType as any}>\n <Interweave content={labelText} />\n </TextType>\n </span>\n </div>\n );\n};\n\nexport default Label;\n","import React, { useContext } from \"react\";\nimport { Form, Row, Col } from \"antd\";\nimport { Field as FieldOoui, Label as LabelOoui } from \"@gisce/ooui\";\nimport Label from \"@/widgets/base/Label\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nexport default function Field({\n ooui,\n children,\n layout = \"horizontal\",\n valuePropName,\n showLabel = false,\n alignLabel = \"left\",\n required = false,\n type,\n validator,\n}: {\n ooui: FieldOoui;\n children?: React.ReactNode;\n layout?: \"horizontal\" | \"vertical\";\n valuePropName?: string;\n showLabel?: boolean;\n alignLabel?: \"left\" | \"center\" | \"right\";\n required?: boolean;\n type?: any;\n validator?: any;\n}) {\n const { id, label, tooltip } = ooui;\n const { t } = useLocale();\n\n const rules = required\n ? [\n {\n required: true,\n message: t(\"fillRequiredField\"),\n type,\n validator,\n },\n ]\n : undefined;\n\n const formItem = () => (\n <Form.Item\n className=\"mb-0\"\n name={id}\n valuePropName={valuePropName}\n rules={rules}\n help={ooui.tooltipInline ? ooui.tooltip : null}\n >\n {children}\n </Form.Item>\n );\n\n if (!showLabel) {\n return formItem();\n }\n\n const labelWidget = (\n <Label\n ooui={\n new LabelOoui({\n name: id + \"_label\",\n string: label,\n help: ooui.tooltipInline ? false : tooltip,\n fieldForLabel: id,\n })\n }\n align={alignLabel}\n />\n );\n\n const horizontalMode = () => {\n return (\n <Row align=\"middle\" className=\"pb-1 pt-1\">\n <Col className=\"ml-2\" flex=\"7rem\">\n <div className=\"flex flex-col items-end\">{labelWidget}</div>\n </Col>\n <Col flex=\"auto\">{formItem()}</Col>\n </Row>\n );\n };\n\n const verticalMode = () => {\n return (\n <>\n {labelWidget}\n {formItem()}\n </>\n );\n };\n\n return layout === \"horizontal\" ? horizontalMode() : verticalMode();\n}\n","import { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { confirm } = Modal;\n\nconst showDialog = ({\n onOk,\n confirmMessage,\n okText,\n cancelText,\n t,\n}: {\n onOk: () => void;\n confirmMessage: string;\n okText?: string;\n cancelText?: string;\n t: (key: string) => string;\n}) => {\n confirm({\n title: t(\"confirmation\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: confirmMessage,\n okText: okText || t(\"ok\"),\n cancelText: cancelText || t(\"cancel\"),\n onOk,\n });\n};\n\nexport default showDialog;\n","import React, { useRef, useState } from \"react\";\nimport { FormView } from \"..\";\n\nexport type FormContextType = {\n activeId?: number;\n activeModel: string;\n setFieldValue: (field: string, value?: string) => void;\n getFieldValue: (field: string) => string;\n executeButtonAction: ({\n type,\n action,\n context,\n }: {\n type: string;\n action: string;\n context?: any;\n }) => Promise<void>;\n getContext: () => Promise<any>;\n getValues: () => Promise<any>;\n getPlainValues: () => { [key: string]: any };\n getFields: () => Promise<any>;\n domain: any[];\n submitForm?: (options?: {\n callOnSubmitSucceed?: boolean;\n }) => Promise<{ succeed: boolean; id: number }>;\n fetchValues?: () => void;\n formHasChanges?: () => boolean;\n elementHasLostFocus?: () => void;\n formView?: FormView;\n};\n\nexport const FormContext = React.createContext<FormContextType | null>(null);\n\ntype FormProviderProps = FormContextType & {\n children: React.ReactNode;\n};\n\nconst FormProvider = (props: FormProviderProps): any => {\n const {\n children,\n activeId,\n activeModel,\n setFieldValue,\n getFieldValue,\n executeButtonAction,\n getContext,\n getValues,\n getPlainValues,\n domain,\n submitForm,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n getFields,\n formView,\n } = props;\n\n return (\n <FormContext.Provider\n value={{\n domain,\n getValues,\n getPlainValues,\n getFields,\n activeId,\n activeModel,\n setFieldValue,\n getFieldValue,\n executeButtonAction,\n getContext,\n submitForm,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n formView,\n }}\n >\n {children}\n </FormContext.Provider>\n );\n};\n\nexport default FormProvider;\n","import React, { CSSProperties } from \"react\";\nimport * as AntIcons from \"@ant-design/icons\";\nimport * as TablerIcons from \"@tabler/icons-react\";\nimport Icon from \"@ant-design/icons\";\n\ntype TablerKey = keyof typeof TablerIcons;\ntype AntKey = keyof typeof AntIcons;\n\nconst iconMapping: { [key: string]: string } = {\n \"terp-purchase\": \"ShoppingCart\",\n \"terp-graph\": \"PieChart\",\n \"terp-crm\": \"Contacts\",\n \"terp-hr\": \"Friends\",\n \"terp-account\": \"BuildingBank\",\n \"terp-project\": \"Checklist\",\n \"terp-administration\": \"Adjustments\",\n \"terp-partner\": \"Team\",\n \"terp-mrp\": \"Build\",\n \"terp-product\": \"Shopping\",\n STOCK_JUSTIFY_FILL: \"UnorderedList\",\n STOCK_INDENT: \"IndentIncrease\",\n STOCK_HELP: \"Question\",\n STOCK_GO_UP: \"ArrowUp\",\n STOCK_SORT_DESCENDING: \"SortDescending\",\n STOCK_ADD: \"Plus\",\n STOCK_GOTO_LAST: \"FastForward\",\n STOCK_FIND: \"Search\",\n STOCK_PROPERTIES: \"Control\",\n STOCK_DIALOG_INFO: \"Info\",\n STOCK_FLOPPY: \"Usb\",\n STOCK_JUSTIFY_CENTER: \"AlignCenter\",\n STOCK_GO_BACK: \"ArrowLeft\",\n STOCK_UNDERLINE: \"Underline\",\n STOCK_BOLD: \"Bold\",\n STOCK_APPLY: \"Check\",\n STOCK_ZOOM_OUT: \"ZoomOut\",\n STOCK_STRIKETHROUGH: \"Strikethrough\",\n STOCK_MEDIA_REWIND: \"Backward\",\n STOCK_PRINT: \"Printer\",\n STOCK_NO: \"Close\",\n STOCK_GOTO_FIRST: \"FastBackward\",\n STOCK_CLOSE: \"Close\",\n STOCK_REMOVE: \"Minus\",\n STOCK_CUT: \"Scissor\",\n STOCK_DIALOG_AUTHENTICATION: \"Safety\",\n STOCK_ZOOM_FIT: \"Expand\",\n STOCK_JUMP_TO: \"Select\",\n STOCK_HARDDISK: \"Hdd\",\n STOCK_SAVE_AS: \"Save\",\n STOCK_UNDO: \"Undo\",\n STOCK_JUSTIFY_RIGHT: \"AlignRight\",\n STOCK_DIALOG_ERROR: \"CloseCircle\",\n STOCK_INDEX: \"Profile\",\n STOCK_GOTO_BOTTOM: \"VerticalAlignBottom\",\n STOCK_MEDIA_NEXT: \"StepForward\",\n STOCK_REDO: \"Redo\",\n STOCK_COPY: \"Copy\",\n STOCK_MEDIA_PAUSE: \"Pause\",\n STOCK_GO_FORWARD: \"ArrowRight\",\n STOCK_UNDELETE: \"Undo\",\n STOCK_EXECUTE: \"Setting\",\n STOCK_SAVE: \"Save\",\n STOCK_DIALOG_QUESTION: \"QuestionCircle\",\n STOCK_SORT_ASCENDING: \"SortAscending\",\n STOCK_REFRESH: \"Reload\",\n STOCK_MEDIA_FORWARD: \"Forward\",\n STOCK_STOP: \"Border\",\n STOCK_PRINT_PREVIEW: \"Printer\",\n STOCK_HOME: \"Home\",\n STOCK_PASTE: \"CarryOut\",\n STOCK_ZOOM_100: \"ZoomIn\",\n STOCK_FIND_AND_REPLACE: \"FileSearch\",\n STOCK_DIALOG_WARNING: \"Warning\",\n STOCK_ZOOM_IN: \"ZoomIn\",\n STOCK_CONVERT: \"Export\",\n STOCK_ITALIC: \"Italic\",\n STOCK_YES: \"Check\",\n STOCK_MEDIA_PLAY: \"PlayCircle\",\n STOCK_MEDIA_RECORD: \"VideoCamera\",\n STOCK_MEDIA_PREVIOUS: \"StepBackward\",\n STOCK_NEW: \"FileAdd\",\n STOCK_CANCEL: \"Close\",\n STOCK_DISCONNECT: \"Api\",\n STOCK_JUSTIFY_LEFT: \"AlignLeft\",\n STOCK_FILE: \"File\",\n STOCK_QUIT: \"Logout\",\n STOCK_EDIT: \"Edit\",\n STOCK_CONNECT: \"Api\",\n STOCK_GO_DOWN: \"CaretDown\",\n STOCK_NETWORK: \"Apartment\",\n STOCK_OK: \"Check\",\n STOCK_GOTO_TOP: \"VerticalAlignTop\",\n STOCK_ABOUT: \"Star\",\n STOCK_COLOR_PICKER: \"Aim\",\n STOCK_SELECT_FONT: \"FontSize\",\n STOCK_DELETE: \"Delete\",\n STOCK_DND: \"FileText\",\n STOCK_CLEAR: \"CloseSquare\",\n STOCK_UNINDENT: \"AlignLeft\",\n STOCK_PREFERENCES: \"Setting\",\n};\n\nexport default (\n key: string,\n props?: { className?: any; style: CSSProperties },\n) => {\n if (key.indexOf(\"gtk-\") !== -1) {\n const rootIcon = key.replace(\"gtk-\", \"\").replace(/\\-/g, \"_\");\n key = `STOCK_${rootIcon.toUpperCase()}`;\n }\n\n if (iconMapping.hasOwnProperty(key)) {\n return getIconForKey(iconMapping[key], props);\n }\n\n return getIconForKey(key, props);\n};\n\nfunction toCamelCase(key: string): string {\n return `${key\n .split(\"-\")\n .map((word) =>\n word.replace(\n /\\w\\S*/g,\n (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(),\n ),\n )\n .join(\"\")}`;\n}\n\nfunction getIconForKey(\n key: string,\n props?: { className?: any; style: CSSProperties },\n) {\n let IconCamelCase = key.charAt(0).toUpperCase() + key.slice(1); // Capitalize first letter\n if (IconCamelCase.indexOf(\"-\") !== -1) {\n IconCamelCase = toCamelCase(IconCamelCase);\n }\n\n const antKey: AntKey = `${IconCamelCase}Outlined` as any;\n if (AntIcons[antKey]) {\n return () =>\n React.createElement(AntIcons[antKey] as any, {\n ...props,\n });\n }\n\n const tablerKey: TablerKey = `Icon${IconCamelCase}` as any;\n if (TablerIcons[tablerKey]) {\n const TablerIcon = () =>\n React.createElement(TablerIcons[tablerKey] as any, {\n fill: \"transparent\",\n size: props?.style?.fontSize || 17,\n });\n const CustomIcon = () =>\n React.createElement(Icon, {\n component: TablerIcon,\n ...props,\n });\n return CustomIcon;\n }\n\n return undefined;\n}\n","import React, { useContext, useState } from \"react\";\nimport Field from \"@/common/Field\";\nimport { Button as AntButton } from \"antd\";\nimport { Button as ButtonOoui } from \"@gisce/ooui\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n ooui: ButtonOoui;\n};\n\nexport const Button = (props: Props) => {\n const { ooui } = props;\n const {\n id,\n label,\n activated,\n buttonType,\n confirmMessage,\n icon,\n context,\n readOnly,\n } = ooui;\n const formContext = useContext(FormContext) as FormContextType;\n const { executeButtonAction } = formContext || {};\n const [isRunning, setIsRunning] = useState<boolean>(false);\n const { t } = useLocale();\n\n async function onClick_confirm() {\n setIsRunning(true);\n await executeButtonAction({ type: buttonType, action: id, context });\n setIsRunning(false);\n }\n\n function onClick() {\n if (confirmMessage) {\n showConfirmDialog({\n confirmMessage,\n t,\n onOk: () => {\n onClick_confirm();\n },\n });\n return;\n }\n\n onClick_confirm();\n }\n\n function getButtonIcon() {\n if (isRunning) return <LoadingOutlined />;\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <Field ooui={ooui}>\n <AntButton\n block\n disabled={!activated || readOnly || isRunning}\n onClick={onClick}\n icon={getButtonIcon()}\n type={ooui.primary ? \"primary\" : \"default\"}\n danger={ooui.danger}\n style={{ whiteSpace: \"normal\", height: \"auto\" }}\n >\n {label}\n </AntButton>\n </Field>\n );\n};\n","import React, { useContext, useState } from \"react\";\nimport Field from \"@/common/Field\";\nimport { DownOutlined, LoadingOutlined } from \"@ant-design/icons\";\nimport { Dropdown, Menu } from \"antd\";\nimport { Button } from \"@/widgets/base/Button\";\nimport {\n ButtonGroup as ButtonGroupOoui,\n Button as ButtonOoui,\n Field as FieldOoui,\n} from \"@gisce/ooui\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype ButtonGroupProps = {\n ooui: ButtonGroupOoui;\n};\n\ntype ItemsProps = {\n ooui: ButtonOoui[];\n executeButtonAction: any;\n};\n\nexport const ButtonGroup = (props: ButtonGroupProps) => {\n const { ooui } = props;\n const { defaultButton, secondaryButtons } = ooui;\n const {\n id,\n caption,\n activated,\n buttonType,\n confirmMessage,\n icon,\n primary,\n context,\n readOnly,\n } = defaultButton || {};\n const formContext = useContext(FormContext) as FormContextType;\n const { executeButtonAction } = formContext || {};\n const [isRunning, setIsRunning] = useState<boolean>(false);\n const { t } = useLocale();\n\n function getButtonIcon() {\n if (isRunning) return <LoadingOutlined />;\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n async function onClick_confirm() {\n if (buttonType && id) {\n setIsRunning(true);\n await executeButtonAction({ type: buttonType, action: id, context });\n setIsRunning(false);\n }\n }\n\n function onClick() {\n if (confirmMessage) {\n showConfirmDialog({\n confirmMessage,\n t,\n onOk: () => {\n onClick_confirm();\n },\n });\n return;\n }\n\n onClick_confirm();\n }\n if (ooui.buttons.length === 0) {\n return null;\n } else if (ooui.buttons.length > 1) {\n return (\n <Field ooui={new FieldOoui({ ...{ ooui } })}>\n <Dropdown.Button\n disabled={!activated || readOnly}\n onClick={onClick}\n icon={<DownOutlined />}\n type={primary ? \"primary\" : undefined}\n // danger={danger ? true : undefined} This works but typescript\n // doesn't accept\n overlay={\n <Items\n ooui={secondaryButtons}\n executeButtonAction={executeButtonAction}\n />\n }\n >\n {getButtonIcon()}\n {caption}\n </Dropdown.Button>\n </Field>\n );\n } else if (defaultButton) {\n return <Button ooui={defaultButton} />;\n }\n};\n\nconst Items = (props: ItemsProps) => {\n const { t } = useLocale();\n const { ooui, executeButtonAction } = props;\n if (!ooui) {\n return null;\n }\n const items = ooui.map((button) => {\n const {\n id,\n caption,\n activated,\n buttonType,\n confirmMessage,\n icon,\n context,\n readOnly,\n danger,\n } = button;\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n async function onClick_confirm() {\n setIsRunning(true);\n await executeButtonAction({ type: buttonType, action: id, context });\n setIsRunning(false);\n }\n\n function onClick() {\n if (confirmMessage) {\n showConfirmDialog({\n confirmMessage,\n t,\n onOk: () => {\n onClick_confirm();\n },\n });\n return;\n }\n\n onClick_confirm();\n }\n\n function getButtonIcon() {\n if (isRunning) return <LoadingOutlined />;\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <Menu.Item\n key={`menuitem-${caption}`}\n disabled={!activated || readOnly}\n onClick={onClick}\n icon={getButtonIcon()}\n danger={danger}\n >\n {caption}\n </Menu.Item>\n );\n });\n return <Menu>{items}</Menu>;\n};\n","import { useState, useEffect } from \"react\";\n\nconst MODAL_WIDTH_CONSTANT = 0.7;\n\nfunction getWindowDimensions() {\n const { innerWidth: width, innerHeight: height } = window;\n return {\n width,\n height,\n };\n}\n\nexport default function useWindowDimensions() {\n const [windowDimensions, setWindowDimensions] = useState(\n getWindowDimensions(),\n );\n\n useEffect(() => {\n function handleResize() {\n setWindowDimensions(getWindowDimensions());\n }\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n return {\n modalWidth: windowDimensions.width * MODAL_WIDTH_CONSTANT,\n modalHeight: windowDimensions.height,\n width: windowDimensions.width,\n height: windowDimensions.height,\n };\n}\n","import { ConnectionProviderType } from \"@/types\";\n\nexport default class ConnectionProvider {\n private static handler: ConnectionProviderType;\n\n public static init(handler: ConnectionProviderType): void {\n ConnectionProvider.handler = handler;\n }\n\n public static getHandler(): ConnectionProviderType {\n if (!ConnectionProvider.handler) {\n throw \"Must call init() first with a valid ConnectionProvider instance\";\n }\n return ConnectionProvider.handler;\n }\n}\n","export const parseError = (errorResponse: string) => {\n let message;\n let type;\n let title;\n\n if (\n typeof errorResponse === \"string\" &&\n errorResponse.indexOf(\" -- \") !== -1 &&\n errorResponse.indexOf(\"\\n\\n\") !== -1\n ) {\n const splitted = errorResponse.split(\"\\n\\n\");\n message = splitted[1].replace(/\\n/g, \"<br />\");\n const args = splitted[0].split(\" -- \");\n type = args[0];\n title = args[1];\n } else {\n message = errorResponse;\n type = \"error\";\n title = \"Error\";\n }\n\n return {\n type,\n message,\n title,\n };\n};\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { ExclamationCircleOutlined, WarningOutlined } from \"@ant-design/icons\";\nimport { parseError } from \"@/helpers/errorHelper\";\n\nconst { error, warning } = Modal;\n\nconst showDialog = (err: string) => {\n const { message, type, title } = parseError(err);\n\n const iconComponent =\n type === \"error\" ? <ExclamationCircleOutlined /> : <WarningOutlined />;\n\n const modalType = type === \"error\" ? error : warning;\n\n modalType({\n title,\n icon: iconComponent,\n centered: true,\n content: message,\n });\n};\n\nexport default showDialog;\n","import React, { useContext, useEffect, useRef, useState } from \"react\";\nimport { Modal, Button, Divider, Row, Space, Spin, Col } from \"antd\";\nimport {\n CheckOutlined,\n CloseOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport TextArea from \"antd/lib/input/TextArea\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\n\ntype TranslationModalProps = {\n visible: boolean;\n model: string;\n id: number;\n field: string;\n onCloseModal: () => void;\n onSubmitSucceed: () => void;\n};\n\ntype Lang = {\n code: string;\n name: string;\n};\n\ntype ValuesForLangs = {\n [key: string]: string;\n};\n\nexport const TranslationModal = (props: TranslationModalProps) => {\n const { visible, onCloseModal, model, id, field, onSubmitSucceed } = props;\n\n const { modalWidth } = useWindowDimensions();\n const { t } = useLocale();\n const [langs, setLangs] = useState<Lang[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [submitLoading, setSubmitLoading] = useState(false);\n const [valuesForLangs, setValuesForLangs] = useState<ValuesForLangs>({});\n\n const originalValuesForLangs = useRef<ValuesForLangs>();\n\n useEffect(() => {\n if (visible) {\n fetchData();\n } else {\n setValuesForLangs({});\n }\n }, [visible]);\n\n async function fetchData() {\n setIsLoading(true);\n\n try {\n const langs = await getLangs();\n await getValuesForLangs(langs);\n } catch (err) {\n showErrorDialog(err as any);\n }\n\n setIsLoading(false);\n }\n\n async function getLangs() {\n const results: any[] = (await ConnectionProvider.getHandler().search({\n params: [[\"translatable\", \"=\", \"1\"]],\n fieldsToRetrieve: [\"code\", \"name\"],\n model: \"res.lang\",\n })) as any;\n\n const langs = results.map((item: any) => {\n return {\n code: item.code,\n name: item.name,\n };\n });\n\n setLangs?.(langs);\n return langs;\n }\n\n async function getValuesForLangs(langs: Lang[]) {\n const retrievedValuesForLang: ValuesForLangs = {};\n\n for (const lang of langs) {\n const retrievedValue = (\n await ConnectionProvider.getHandler().readObjects({\n model,\n ids: [id],\n fieldsToRetrieve: [field],\n context: { lang: lang.code },\n })\n )[0];\n retrievedValuesForLang[lang.code] = retrievedValue[field] || \"\";\n }\n\n originalValuesForLangs.current = retrievedValuesForLang;\n setValuesForLangs(retrievedValuesForLang);\n }\n\n function getInputsForLangs() {\n return langs.map((lang: Lang, i: number) => {\n return (\n <Row key={i} style={{ paddingBottom: 20 }}>\n <Col flex=\"8rem\" style={{ paddingRight: 10 }}>\n {lang.name}\n </Col>\n <Col flex=\"auto\">\n <TextArea\n rows={4}\n value={valuesForLangs[lang.code] || \"\"}\n onChange={(event: any) => {\n setValuesForLangs({\n ...valuesForLangs,\n [lang.code]: event.target.value,\n });\n }}\n disabled={submitLoading}\n />\n </Col>\n </Row>\n );\n });\n }\n\n async function onSubmit() {\n setSubmitLoading(true);\n\n try {\n for (const langCode of Object.keys(valuesForLangs)) {\n if (\n valuesForLangs[langCode] !== originalValuesForLangs.current![langCode]\n ) {\n await ConnectionProvider.getHandler().update({\n model,\n id,\n values: { [field]: valuesForLangs[langCode] },\n context: {\n lang: langCode,\n },\n fields: {},\n });\n }\n }\n } catch (err) {\n showErrorDialog(err as any);\n }\n\n setSubmitLoading(false);\n onSubmitSucceed();\n }\n\n function content() {\n if (isLoading) {\n return <Spin />;\n }\n\n return (\n <>\n {getInputsForLangs()}\n <Divider />\n <Row justify=\"end\">\n <Space>\n <Button\n icon={<CloseOutlined />}\n onClick={onCloseModal}\n disabled={submitLoading}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n icon={submitLoading ? <LoadingOutlined /> : <CheckOutlined />}\n disabled={submitLoading}\n onClick={onSubmit}\n style={{ marginLeft: 15 }}\n type=\"primary\"\n >\n {t(\"ok\")}\n </Button>\n </Space>\n </Row>\n </>\n );\n }\n\n return (\n <Modal\n title={t(\"translate\")}\n centered\n width={modalWidth}\n open={visible}\n closable={true}\n onCancel={onCloseModal}\n footer={null}\n destroyOnClose\n maskClosable={false}\n >\n {content()}\n </Modal>\n );\n};\n","import React from \"react\";\nimport { Button, Tooltip, ButtonProps } from \"antd\";\n\nexport type Props = ButtonProps & {\n tooltip: string;\n};\n\nfunction ButtonWithTooltip(props: Props) {\n const { tooltip, ...restProps } = props;\n\n return (\n <Tooltip title={tooltip}>\n <Button {...restProps} />\n </Tooltip>\n );\n}\n\nexport default ButtonWithTooltip;\n","import { Modal } from \"antd\";\n\nconst { info } = Modal;\n\nconst showDialog = (content: any) => {\n info({\n title: \"\",\n centered: true,\n content,\n });\n};\n\nexport default showDialog;\n","import React, { CSSProperties, useContext, useState } from \"react\";\nimport { Col, Input, Row, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport { TranslationModal } from \"../modals/TranslationModal\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { TranslationOutlined } from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport showInfo from \"@/ui/InfoDialog\";\nconst { useToken } = theme;\n\ntype CharProps = WidgetProps & {\n isSearchField?: boolean;\n};\n\nexport const Char = (props: CharProps) => {\n const { ooui, isSearchField = false } = props;\n const { id, readOnly, isPassword, required, translatable } = ooui as CharOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n let input = (\n <Input\n disabled={readOnly || (translatable && !isSearchField)}\n id={id}\n style={requiredStyle}\n maxLength={(ooui as CharOoui).size}\n onBlur={elementHasLostFocus}\n />\n );\n\n if (isPassword) {\n input = (\n <Input.Password\n disabled={readOnly}\n id={id}\n onBlur={elementHasLostFocus}\n />\n );\n }\n\n if (translatable && !readOnly && !isSearchField) {\n input = <TranslatableChar field={id} requiredStyle={requiredStyle} />;\n }\n\n return (\n <Field required={required} {...props}>\n {input}\n </Field>\n );\n};\n\nconst TranslatableChar = ({\n value,\n field,\n requiredStyle,\n onChange,\n}: {\n value?: string;\n field: string;\n requiredStyle: CSSProperties | undefined;\n onChange?: (value: string) => void;\n}) => {\n const formContext = useContext(FormContext) as FormContextType;\n const {\n activeId,\n activeModel,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n } = formContext || {};\n const [translationModalVisible, setTranslationModalVisible] = useState(false);\n const { t } = useLocale();\n\n if (!activeId) {\n return (\n <>\n <Row gutter={8} wrap={false}>\n <Col flex=\"auto\">\n <Input\n value={value}\n id={field}\n style={requiredStyle}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n onBlur={elementHasLostFocus}\n />\n </Col>\n <Col flex=\"none\">\n <ButtonWithTooltip\n tooltip={t(\"translate\")}\n icon={<TranslationOutlined />}\n onClick={async () => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n } else {\n showInfo(t(\"enterTextBeforeTranslate\"));\n }\n }}\n >\n {t(\"translate\")}\n </ButtonWithTooltip>\n </Col>\n </Row>\n </>\n );\n }\n\n return (\n <>\n <div\n onClick={() => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n return;\n }\n\n if (!translationModalVisible) {\n setTranslationModalVisible(true);\n }\n }}\n >\n <Input\n value={value}\n disabled={true}\n id={field}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n onBlur={elementHasLostFocus}\n style={{ cursor: \"pointer\", pointerEvents: \"none\", ...requiredStyle }}\n />\n </div>\n <TranslationModal\n id={activeId!}\n model={activeModel}\n field={field}\n visible={translationModalVisible}\n onCloseModal={() => {\n setTranslationModalVisible(false);\n }}\n onSubmitSucceed={() => {\n setTranslationModalVisible(false);\n fetchValues?.();\n }}\n />\n </>\n );\n};\n","import React from \"react\";\nimport { Select, theme } from \"antd\";\nimport styled from \"styled-components\";\n\nimport Field from \"@/common/Field\";\nimport { Selection as SelectionOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\nconst { Option } = Select;\n\nexport const Selection = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <SelectionInput {...props} />\n </Field>\n );\n};\n\ntype SelectionInputProps = WidgetProps & {\n onChange?: (value: any) => void;\n value?: string;\n};\n\nexport const SelectionInput = (props: SelectionInputProps) => {\n const { ooui, onChange, value } = props;\n const { selectionValues, readOnly, required } = ooui as SelectionOoui;\n\n const values = Array.from(selectionValues.entries());\n\n const options =\n values &&\n values.length &&\n values.map((entry: string[]) => {\n const [key, value] = entry;\n return (\n <Option key={key} value={key}>\n {value}\n </Option>\n );\n });\n\n const CustomSelect: any = required && !readOnly ? RequiredSelect : Select;\n\n return (\n <CustomSelect\n disabled={readOnly}\n onChange={onChange}\n value={value}\n optionFilterProp=\"children\"\n filterOption={(input: string, option: any) =>\n option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0\n }\n showSearch\n >\n {options}\n </CustomSelect>\n );\n};\n\nconst RequiredSelect = styled(Select)`\n &.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n background-color: ${mapToken.colorPrimaryBg};\n }\n`;\n","import React from \"react\";\nimport { Checkbox as AntCheckbox, theme } from \"antd\";\nimport styled from \"styled-components\";\n\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\nexport const Boolean = (props: WidgetProps) => {\n const { ooui } = props;\n const { id, readOnly, required } = ooui;\n\n return (\n <Field {...props} valuePropName=\"checked\">\n <BooleanInput id={id} readOnly={readOnly} required={required} />\n </Field>\n );\n};\n\nconst BooleanInput = (props: any) => {\n const { required, readOnly, ...restProps } = props;\n\n const CustomCheckbox: any =\n required && !readOnly ? RequiredCheckbox : AntCheckbox;\n\n return (\n <div className=\"flex flex-row\">\n <CustomCheckbox disabled={readOnly} {...restProps} />\n </div>\n );\n};\n\nconst RequiredCheckbox = styled(AntCheckbox)`\n .ant-checkbox-inner {\n background-color: ${mapToken.colorPrimaryBg};\n }\n\n .ant-checkbox-checked .ant-checkbox-inner {\n background-color: ${mapToken.colorPrimary};\n }\n`;\n","import { fileTypeFromBuffer } from \"file-type-buffer-browser\";\n\nexport function getFilesize(base64string: string) {\n const buffer = Buffer.from(base64string, \"base64\");\n const inKbs = buffer.length / 1e3;\n return `${Math.round((inKbs + Number.EPSILON) * 100) / 100} KB`;\n}\n\nexport async function getMimeType(base64string: string) {\n const mimeInfo = await fileTypeFromBuffer(\n Buffer.from(base64string, \"base64\"),\n );\n if (!mimeInfo) {\n return {\n mime: \"text/plain\",\n ext: \"txt\",\n };\n }\n\n return mimeInfo;\n}\n\nexport const toBase64 = (file: File): Promise<string> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = (e: any) => resolve(e.target.result.split(\",\")[1]);\n reader.onerror = (error) => reject(error);\n });\n\nexport function openBase64InNewTab(data: string, mimeType: string) {\n const byteCharacters = atob(data);\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const byteArray = new Uint8Array(byteNumbers);\n const file = new Blob([byteArray], { type: mimeType + \";base64\" });\n const fileURL = URL.createObjectURL(file);\n window.open(fileURL);\n}\n","import React, { useContext, useRef } from \"react\";\nimport { Row, Space } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Image as ImageOoui } from \"@gisce/ooui\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport {\n FolderOpenOutlined,\n DownloadOutlined,\n ClearOutlined,\n} from \"@ant-design/icons\";\n\nimport { toBase64, getMimeType } from \"@/helpers/filesHelper\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n ooui: ImageOoui;\n};\n\nexport const Image = (props: Props) => {\n const { ooui } = props;\n const { required, id } = ooui;\n\n const Icon: React.ElementType = iconMapper(id) as any;\n\n if (Icon) {\n return <Icon />;\n }\n\n return (\n <Field required={required} {...props}>\n <ImageInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface ImageInputProps {\n ooui: ImageOoui;\n value?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport const ImageInput = (props: ImageInputProps) => {\n const { ooui, value, onChange } = props;\n const { readOnly } = ooui as ImageOoui;\n const inputFile = useRef(null);\n const { t } = useLocale();\n\n const triggerChange = (changedValue?: string) => {\n onChange?.(changedValue);\n };\n\n async function downloadFile() {\n const fileType = await getMimeType(value!);\n const linkSource = `data:${fileType?.mime};base64,${value}`;\n const downloadLink = document.createElement(\"a\");\n\n downloadLink.href = linkSource;\n downloadLink.download = `image.${fileType?.ext}`;\n downloadLink.click();\n }\n\n async function onChangeFile(event: any) {\n event.stopPropagation();\n event.preventDefault();\n const file = event.target.files[0];\n const b64: string = await toBase64(file);\n triggerChange(b64);\n }\n\n function clearFile() {\n triggerChange(undefined);\n }\n\n return (\n <>\n <Row gutter={8} wrap={false} justify=\"center\">\n {value && (\n <img\n src={`data:image/*;base64,${value}`}\n style={{ maxWidth: \"100px\" }}\n />\n )}\n <input\n type=\"file\"\n id=\"file\"\n ref={inputFile}\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={onChangeFile}\n />\n </Row>\n <Row gutter={8} wrap={false} justify=\"center\" className=\"pt-5\">\n <Space>\n <ButtonWithTooltip\n tooltip={t(\"uploadNewImage\")}\n icon={<FolderOpenOutlined />}\n disabled={readOnly}\n onClick={() => {\n const fileUploadField = inputFile.current as any;\n fileUploadField.click();\n }}\n />\n <ButtonWithTooltip\n tooltip={t(\"download\")}\n disabled={!value}\n onClick={downloadFile}\n icon={<DownloadOutlined />}\n />\n <ButtonWithTooltip\n tooltip={t(\"clear\")}\n disabled={readOnly || !value}\n onClick={clearFile}\n icon={<ClearOutlined />}\n />\n </Space>\n </Row>\n </>\n );\n};\n","import React from \"react\";\nimport Field from \"@/common/Field\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport { GridUi } from \"@gisce/fiber-diagram\";\n\nexport const FiberGrid = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as CharOoui;\n\n return (\n <Field required={required} {...props}>\n <FiberGridInput />\n </Field>\n );\n};\n\ninterface FiberGridInputProps {\n value?: string;\n onChange?: (value: string) => void;\n}\n\nexport const FiberGridInput = (props: FiberGridInputProps) => {\n const { value, onChange } = props;\n\n if (!value) {\n return null;\n }\n\n // Validate string json\n try {\n JSON.parse(value);\n } catch (e) {\n console.error(e);\n return null;\n }\n\n return (\n <GridUi\n inputJson={value}\n onChange={(newValue) => {\n if (onChange) {\n onChange(newValue);\n }\n }}\n />\n );\n};\n","import {\n Tree as TreeOoui,\n Selection,\n Many2one,\n Boolean,\n Reference,\n} from \"@gisce/ooui\";\nimport { TreeView, Column } from \"@/types\";\n\nconst getTree = (treeView: TreeView): TreeOoui => {\n const xml = treeView.arch;\n const fields = treeView.fields;\n const tree = new TreeOoui(fields);\n tree.parse(xml);\n return tree;\n};\n\nfunction canRenderValue(value: any): boolean {\n return (\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n value === null ||\n value === undefined ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\nconst getTableColumns = (\n tree: TreeOoui,\n components: any,\n context: any,\n): Column[] => {\n const tableColumns = tree.columns.map((column) => {\n const type = column.type;\n const key = column.id;\n const component = components?.[type];\n let render;\n\n if (component) {\n render = (value: any) => {\n return component({ value, key, ooui: column, context });\n };\n } else {\n render = (value: any) => {\n return canRenderValue(value) ? (\n value\n ) : (\n <p style={{ color: \"red\" }}>\n Unsupported widget value for a Tree cell:\n <pre>\n <strong>\n Type: {type} - Value: {JSON.stringify(value)}\n </strong>\n </pre>\n </p>\n );\n };\n }\n\n return {\n key,\n dataIndex: key,\n title: column.label,\n render,\n sorter: (a: any, b: any) => {\n let aItem = a[key] || \"\";\n let bItem = b[key] || \"\";\n\n if (type === \"many2one\") {\n aItem = a[key]?.value || \"\";\n bItem = b[key]?.value || \"\";\n }\n\n if (aItem < bItem) return -1;\n if (aItem > bItem) return 1;\n return 0;\n },\n };\n });\n return tableColumns;\n};\n\nconst getTableItems = (treeOoui: TreeOoui, results: any[]): any[] => {\n const tableItems = results.map((item: any) => {\n const parsedItem: any = {};\n Object.keys(item).forEach((key) => {\n if (key === \"id\") {\n parsedItem[key] = item[key];\n } else {\n const widget = treeOoui.findById(key);\n\n if (widget instanceof Reference) {\n parsedItem[key] = item[key];\n } else if (widget instanceof Selection) {\n parsedItem[key] = item[key];\n } else if (widget instanceof Many2one) {\n parsedItem[key] = item[key] &&\n Array.isArray(item[key]) &&\n item[key].length === 2 && {\n model: widget.relation,\n id: item[key][0],\n value: item[key][1],\n };\n } else if (widget instanceof Boolean) {\n parsedItem[key] = item[key];\n } else if (widget) {\n parsedItem[key] = item[key] === false ? \"\" : item[key];\n } else {\n parsedItem[key] = item[key];\n }\n }\n });\n return parsedItem;\n });\n\n return tableItems;\n};\n\nfunction itemHasBooleans({ values, fields }: { values: any; fields: any }) {\n if (!fields) {\n return false;\n }\n return Object.keys(values).some((key) => {\n return fields[key] !== undefined && fields[key].type === \"boolean\";\n });\n}\n\nfunction convertBooleansToNumeric({\n values,\n fields,\n}: {\n values: any;\n fields: any;\n}) {\n if (!fields) {\n return values;\n }\n const filteredValues: any = {};\n Object.keys(values).forEach((key) => {\n if (fields[key] !== undefined && fields[key].type === \"boolean\") {\n filteredValues[key] = values[key] === true ? 1 : 0;\n }\n });\n return { ...values, ...filteredValues };\n}\n\nfunction getColorMap(colorsValue: any) {\n return getItemsAttributes(colorsValue, \"colors\");\n}\n\nfunction getStatusMap(values: any) {\n return getItemsAttributes(values, \"status\");\n}\n\nfunction getItemsAttributes(attributes: object[], attribute: string) {\n if (!attributes) {\n return undefined;\n }\n const map: any = {};\n attributes.forEach((entry: any) => {\n map[entry.id] = entry[attribute];\n });\n return map;\n}\n\nfunction sortResults({\n resultsToSort,\n sorter,\n fields,\n}: {\n resultsToSort: any[];\n sorter: any;\n fields: any;\n}) {\n if (!sorter) {\n return resultsToSort;\n }\n\n const { id: field, desc } = sorter;\n const order = desc === false ? \"ascend\" : \"descend\";\n\n const type = fields[field].type;\n\n const sortFn = (a: any, b: any) => {\n let aItem = a[field] || \"\";\n let bItem = b[field] || \"\";\n\n if (type === \"many2one\") {\n aItem = a[field]?.[1] || \"\";\n bItem = b[field]?.[1] || \"\";\n }\n\n if (aItem === bItem) {\n return 0;\n }\n\n if (order === \"ascend\") {\n return aItem > bItem ? 1 : -1;\n }\n\n return aItem < bItem ? 1 : -1;\n };\n\n return resultsToSort.sort(sortFn);\n}\n\nfunction hasActualValues(obj: Record<string, any>): boolean {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (obj[key] !== undefined) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport {\n getTableColumns,\n getTableItems,\n getTree,\n convertBooleansToNumeric,\n itemHasBooleans,\n getColorMap,\n getStatusMap,\n sortResults,\n hasActualValues,\n};\n","import { One2manyItem } from \"@/widgets/base/one2many/One2manyInput\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { TreeView, View, ViewType } from \"@/types\";\nimport { getColorMap, getTree } from \"./treeHelper\";\n\ntype ReadObjectValuesOptions = {\n items: One2manyItem[];\n model: string;\n context?: any;\n currentView: ViewType;\n formView: {\n fields: any;\n };\n treeView: {\n arch?: string;\n fields: any;\n };\n};\n\nconst readObjectValues = async (\n options: ReadObjectValuesOptions,\n): Promise<[One2manyItem[], any]> => {\n const {\n items,\n model,\n formView,\n treeView,\n context,\n currentView = {},\n } = options;\n\n const operationsToRead = [\"original\", \"pendingLink\"];\n\n const temporalItems: One2manyItem = items.filter(\n (item) => !operationsToRead.includes(item.operation!),\n );\n\n // We get a number array of id's\n const idsToFetch = items\n .filter((item) => operationsToRead.includes(item.operation!))\n .map((item) => item.id) as number[];\n\n const fieldsToRetrieve: { [key: string]: any } = {\n form: formView.fields,\n tree: treeView.fields,\n };\n\n let values = [];\n let evaluatedColorsForTree;\n\n if (currentView === \"tree\" && treeView?.arch) {\n const colors = getTree(treeView as TreeView)?.colors;\n const results = await ConnectionProvider.getHandler().readEvalUiObjects({\n model,\n ids: idsToFetch,\n arch: treeView?.arch!,\n fields: treeView!.fields,\n context,\n attrs: colors && {\n colors,\n },\n });\n values = results[0];\n evaluatedColorsForTree = getColorMap(results[1]);\n } else {\n values = await ConnectionProvider.getHandler().readObjects({\n model,\n ids: idsToFetch,\n fields: fieldsToRetrieve[currentView as string],\n context,\n });\n }\n\n const filteredValues = values.map((result: any) => {\n const resultFormValues: any = {};\n Object.keys(result).forEach((key) => {\n if (\n fieldsToRetrieve[currentView as string].hasOwnProperty(key) ||\n key === \"id\"\n ) {\n resultFormValues[key] = result[key];\n }\n });\n return resultFormValues;\n });\n\n // We fill the values property of the One2manyItem with the retrieved values from the API\n const originalItemsWithFetchedValues: One2manyItem[] = items.map((item) => {\n const fetchedItemValues = filteredValues.find(\n (itemValues: any) => itemValues.id === item.id,\n );\n\n const itemWithFetchedValues = {\n ...item,\n };\n\n if (currentView === \"form\") {\n itemWithFetchedValues[\"values\"] = fetchedItemValues;\n } else if (currentView === \"tree\") {\n itemWithFetchedValues[\"treeValues\"] = fetchedItemValues;\n }\n return itemWithFetchedValues;\n });\n\n return [\n originalItemsWithFetchedValues.concat(temporalItems),\n evaluatedColorsForTree,\n ];\n};\n\ntype RemoveItemOptions = {\n model: string;\n activeId: number;\n fieldName: string;\n idsToRemove: number[];\n fields: any;\n isMany2many: boolean;\n};\n\nconst removeItems = async (options: RemoveItemOptions) => {\n const { model, activeId, fieldName, idsToRemove, fields, isMany2many } =\n options;\n\n const values: any = {};\n values[fieldName] = [];\n\n for (const idToRemove of idsToRemove) {\n values[fieldName].push([isMany2many ? 3 : 2, idToRemove]);\n }\n\n await ConnectionProvider.getHandler().update({\n model,\n id: activeId,\n values,\n fields,\n });\n};\n\ntype LinkItemOptions = {\n model: string;\n activeId: number;\n fieldName: string;\n id: number;\n fields: any;\n};\n\nconst linkItem = async (options: LinkItemOptions) => {\n const { model, activeId, fieldName, id, fields } = options;\n\n const values: any = {};\n values[fieldName] = [[4, id]];\n\n await ConnectionProvider.getHandler().update({\n model,\n id: activeId,\n values,\n fields,\n });\n};\n\nconst getNextPendingId = (items: One2manyItem[]) => {\n const negativeIds: number[] = items\n .filter((item) => item.id && item.id < 0)\n .map((item) => item.id!);\n if (negativeIds.length === 0) {\n return -1;\n } else {\n return Math.min(...negativeIds) - 1;\n }\n};\n\nconst convertToPlain2ManyValues = (values: any, fields: any) => {\n const result: any = {};\n Object.keys(values).forEach((key) => {\n if (\n fields.hasOwnProperty(key) &&\n (fields[key].type === \"one2many\" || fields[key].type === \"many2many\") &&\n values[key] &&\n values[key]?.items\n ) {\n result[key] = values[key].items.filter(\n (item: One2manyItem) => item.operation !== \"pendingRemove\",\n );\n } else {\n result[key] = values[key];\n }\n });\n return result;\n};\n\nexport const convertFrom2ManyRawValues = ({\n values,\n fields,\n}: {\n values: any;\n fields: any;\n}) => {\n const formattedValues: any = {};\n\n Object.keys(values).forEach((key) => {\n if (\n Object.prototype.hasOwnProperty.call(fields, key) &&\n (fields[key].type === \"one2many\" || fields[key].type === \"many2many\") &&\n values[key] &&\n !values[key]?.items &&\n Array.isArray(values[key])\n ) {\n const itemsId = values[key];\n formattedValues[key] = {\n items: itemsId.map((itemId: number) => ({\n operation: \"pendingLink\",\n id: itemId,\n })),\n };\n } else {\n formattedValues[key] = values[key];\n }\n });\n return formattedValues;\n};\n\nfunction filterDuplicateItems(items: any) {\n const ids = items.map((o: any) => o.id);\n const filtered = items.filter((item: any, index: number) => {\n const { id } = item;\n return !ids.includes(id, index + 1);\n });\n return filtered;\n}\n\nfunction getValuesForFields({\n values,\n fields,\n}: {\n values: any;\n fields: string[];\n}) {\n const result: any = {};\n fields.forEach((field) => {\n if (values[field]) {\n result[field] = values[field];\n }\n });\n return result;\n}\n\nexport {\n readObjectValues,\n removeItems,\n linkItem,\n getNextPendingId,\n convertToPlain2ManyValues,\n filterDuplicateItems,\n getValuesForFields,\n};\n","import React, { useContext, useState } from \"react\";\nimport { Timeline as TimelineOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { One2manyItem, One2manyValue } from \"../base/one2many/One2manyInput\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { Views, ViewType } from \"@/types\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Spin, Alert, Timeline as AntTimeline } from \"antd\";\nimport { readObjectValues } from \"@/helpers/one2manyHelper\";\nimport { FormModal } from \"../modals/FormModal\";\n\ntype TimelineProps = {\n ooui: TimelineOoui;\n};\n\ntype TimelineInputProps = TimelineProps & {\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n views: Views;\n};\n\nexport const Timeline = (props: TimelineProps) => {\n const { ooui } = props;\n const { relation, context, views: oouiViews } = ooui;\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<string>();\n const [views, setViews] = useState<Views>(new Map<string, any>());\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [ooui]);\n\n const getViewData = async (type: ViewType) => {\n if (oouiViews && oouiViews[type]) {\n return oouiViews[type];\n }\n return await ConnectionProvider.getHandler().getView({\n model: relation,\n type,\n context: { ...getContext?.(), ...context },\n });\n };\n\n const fetchData = async () => {\n setIsLoading(true);\n setError(undefined);\n\n try {\n const formView = await getViewData(\"form\");\n const treeView = await getViewData(\"tree\");\n views.set(\"form\", formView);\n views.set(\"tree\", treeView);\n setViews(views);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (isLoading) {\n return <Spin />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <Field type={\"array\"} {...props}>\n <TimelineInput ooui={ooui} views={views} />\n </Field>\n );\n};\n\nexport const TimelineInput = (props: TimelineInputProps) => {\n const { value, views, ooui, onChange } = props;\n const { items = [] } = value || {};\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [modalItem, setModalItem] = useState<One2manyItem>();\n const { relation, context, readOnly, summaryField, titleField } = ooui;\n const itemsToShow = items.filter((item) => item.values);\n\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [items]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n items: changedValue,\n });\n };\n\n async function fetchData() {\n setIsLoading(true);\n setError(undefined);\n\n try {\n const [itemsWithValues] = await readObjectValues({\n treeView: {\n fields: views.get(\"tree\").fields,\n arch: views.get(\"tree\").arch,\n },\n formView: {\n fields: views.get(\"form\").fields,\n },\n model: relation,\n items,\n context: { ...getContext?.(), ...context },\n currentView: \"form\",\n });\n\n triggerChange(itemsWithValues);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoading(false);\n }\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n if (isLoading) {\n return <Spin />;\n }\n\n return (\n <>\n <AntTimeline style={{ padding: \"1rem\" }}>\n {itemsToShow.map((item, index) => {\n return (\n <div key={index}>\n <AntTimeline.Item key={index}>\n <div\n style={{ display: \"inline-block\", cursor: \"pointer\" }}\n onClick={() => {\n setModalItem(\n itemsToShow.find(\n (searchItem) => item.id === searchItem.id,\n ),\n );\n setShowFormModal(true);\n }}\n >\n <strong>{item.values?.[titleField]}</strong>\n </div>\n <br />\n <div\n style={{ display: \"inline-block\", cursor: \"pointer\" }}\n onClick={() => {\n setModalItem(\n itemsToShow.find(\n (searchItem) => item.id === searchItem.id,\n ),\n );\n setShowFormModal(true);\n }}\n >\n {item.values?.[summaryField]}\n </div>\n </AntTimeline.Item>\n </div>\n );\n })}\n </AntTimeline>\n <FormModal\n formView={views.get(\"form\")}\n model={relation}\n id={modalItem?.id}\n values={modalItem?.values}\n defaultValues={modalItem?.defaultValues}\n visible={showFormModal}\n onSubmitSucceed={() => {\n setShowFormModal(false);\n }}\n parentContext={{ ...getContext?.(), ...context }}\n onCancel={() => {\n setShowFormModal(false);\n }}\n readOnly={readOnly}\n postSaveAction={fetchData}\n />\n </>\n );\n};\n","export default {\n true: \"Sí\",\n false: \"No\",\n simple_search: \"Búsqueda simple\",\n advanced_search: \"Búsqueda avançada\",\n search: \"Buscar\",\n parameters: \"Paràmetres\",\n limit: \"Limit\",\n first: \"Primer\",\n no_results: \"No hi ha resultats\",\n summary:\n \"Mostrant resultats des de {from} fins {to} d'un total de {total} registres\",\n welcome: \"Benvingut\",\n attachments: \"Adjunts\",\n addNewAttachment: \"Afegir nou adjunt\",\n listAllAttachments: \"Veure tots els adjunts\",\n viewAs: \"Veure com\",\n confirmRemoveItem: \"Estàs segur de volguer eliminar aquest item?\",\n save: \"Desar\",\n delete: \"Eliminar\",\n refresh: \"Refrescar\",\n previous: \"Anterior\",\n next: \"Següent\",\n actions: \"Accions\",\n reports: \"Informes\",\n related: \"Relacionat\",\n new: \"Nou\",\n fillRequiredField: \"Siusplau, omple aquest camp obligatori\",\n fillRequiredFields: \"Siusplau, omple tots els camps obligatoris\",\n generatingReport: \"Generant informe...\",\n confirmation: \"Confirmació\",\n ok: \"D'acord\",\n cancel: \"Cancel·lar\",\n formHasErrors: \"El formulari té errors\",\n unsavedChanges: \"Hi ha canvis sense guardar\",\n confirmRefreshWithoutSave:\n \"Estàs segur de volguer refrescar la pàgina sense guardar els canvis?\",\n discardAndRefresh: \"Descarta els canvis i refresca\",\n removeItems: \"Elimina el registre/s\",\n confirmRemove: \"Estàs segur de volguer eliminar els registre/s seleccionats?\",\n yesConfirmRemove: \"Sí, elimina\",\n unlinkItems: \"Desenllaça registre/s\",\n confirmUnlink:\n \"Estàs segur de volguer desenllaçar els registre/s seleccionats?\",\n yesConfirmUnlink: \"Sí, desenllaça\",\n confirmCloseWithoutSave:\n \"Estàs segur de volguer tancar aquesta finestra sense guardar?\",\n closeWithoutSaving: \"Tancar sense guardar\",\n action: \"Acció\",\n report: \"Informe\",\n selectAction: \"Selecciona una acció\",\n download: \"Descarrega\",\n clear: \"Neteja\",\n open: \"Obre\",\n uploadNewImage: \"Puja una nova imatge\",\n noCurrentEntries: \"No hi ha registres\",\n duplicate: \"Duplicar\",\n downloadingAttachment: \"Descarregant adjunt...\",\n tree: \"llista\",\n form: \"formulari\",\n favorites: \"Els meus favorits\",\n edit_favorites: \"Edita els favorits\",\n no_favorites: \"No tens favorits guardats\",\n register: \"Registre\",\n of: \"de\",\n editingDocument: \"Editant document\",\n showLogs: \"Veure logs\",\n createdBy: \"Creat per l'usuari\",\n creationDate: \"Data creació\",\n lastUpdatedBy: \"Última modificació per\",\n lastUpdatedDate: \"Data última modificació\",\n goToResourceId: \"Vés al recurs amb ID\",\n searchId: \"ID de cerca:\",\n searchIdHelp: \"Es pot utiltizar un ID o una llista d'IDs separats per comes\",\n idNotFound: \"No es troba aquesta id de recurs per l'objecte\",\n selectedRegisters: \"registres seleccionats\",\n translate: \"Traduïr\",\n enterTextBeforeTranslate:\n \"Introdueix algun text al camp abans d'afegir traduccions\",\n saveBeforeTranslate:\n \"Heu de desar el registre abans d'afegir les traduccions\",\n configDashboard: \"Configurar panell\",\n moveDashboard: \"Moure items del panell\",\n openAttachment: \"Veure detall de l'adjunt\",\n openAttachmentLink: \"Obrir enllaç de l'adjunt\",\n uninformed: \"Sense informar\",\n totalRegisters: \"Registres totals:\",\n total: \"Total:\",\n export: \"Exportar\",\n selectAtLeastOneField: \"Selecciona almenys un camp per a l'exportació\",\n printScreen: \"Imprimir pantalla\",\n advancedExport: \"Exportació avançada\",\n savedRegisters: \"Registre guardat correctament\",\n errorWhileSavingForm: \"Error en guardar el formulari\",\n autor: \"Autor\",\n recordsSelected:\n \"Hi ha {numberOfSelectedRows} registres seleccionats en aquesta pàgina.\",\n selectAllRecords: \"Seleccionar tots els {totalRecords} registres.\",\n allRecordsSelected: \"Hi ha {totalRecords} registres seleccionats.\",\n openInSameWindow: \"Obrir en la pestanya actual\",\n openInNewTab: \"Obrir en una nova pestanya\",\n};\n","export default {\n true: \"Yes\",\n false: \"No\",\n simple_search: \"Simple search\",\n advanced_search: \"Advanced search\",\n search: \"Search\",\n parameters: \"Parameters\",\n limit: \"Limit\",\n first: \"First\",\n no_results: \"No results\",\n summary: \"Showing registers from {from} to {to} of {total} registers\",\n welcome: \"Welcome\",\n attachments: \"Attachments\",\n addNewAttachment: \"Add new attachment\",\n listAllAttachments: \"View all the attachments\",\n viewAs: \"View as\",\n confirmRemoveItem: \"Are you sure to remove this item?\",\n save: \"Save\",\n delete: \"Delete\",\n refresh: \"Refresh\",\n previous: \"Previous\",\n next: \"Next\",\n actions: \"Actions\",\n reports: \"Reports\",\n related: \"Related\",\n new: \"New\",\n fillRequiredField: \"Please fill this required field\",\n fillRequiredFields: \"Please fill all the required fields\",\n generatingReport: \"Generating report...\",\n confirmation: \"Confirmation\",\n ok: \"OK\",\n cancel: \"Cancel\",\n formHasErrors: \"Form has errors\",\n unsavedChanges: \"There are unsaved changes\",\n confirmRefreshWithoutSave:\n \"Do you really want to refresh this window without saving?\",\n discardAndRefresh: \"Discard changes and refresh\",\n removeItems: \"Remove item/s\",\n confirmRemove: \"Are you sure you want to remove the selected item/s?\",\n yesConfirmRemove: \"Yes, remove\",\n unlinkItems: \"Unlink item/s\",\n confirmUnlink: \"Are you sure you want to unlink the selected item/s?\",\n yesConfirmUnlink: \"Yes, unlink\",\n confirmCloseWithoutSave:\n \"Do you really want to close this window without saving?\",\n closeWithoutSaving: \"Close without saving\",\n action: \"Action\",\n report: \"Report\",\n selectAction: \"Select an action\",\n download: \"Download\",\n clear: \"Clear\",\n open: \"Open\",\n uploadNewImage: \"Upload new image\",\n noCurrentEntries: \"No current entries\",\n duplicate: \"Duplicate\",\n downloadingAttachment: \"Downloading attachment...\",\n tree: \"list\",\n form: \"form\",\n favorites: \"My shortcuts\",\n edit_favorites: \"Edit shortcuts\",\n no_favorites: \"You don't have any shortcuts saved yet\",\n register: \"Register\",\n of: \"of\",\n editingDocument: \"Editing document\",\n showLogs: \"Show logs\",\n createdBy: \"Created by user\",\n creationDate: \"Creation date\",\n lastUpdatedBy: \"Last modified by\",\n lastUpdatedDate: \"Date of last modification\",\n goToResourceId: \"Go to resource ID\",\n searchId: \"Search ID:\",\n searchIdHelp: \"You can use an ID or a list of IDs separated by commas.\",\n idNotFound: \"Resource ID does not exist for this object!\",\n selectedRegisters: \"selected registers\",\n translate: \"Translate\",\n enterTextBeforeTranslate:\n \"Enter some text to the related field before adding translations\",\n saveBeforeTranslate: \"You must save the record before adding translations\",\n configDashboard: \"Setup dashboard\",\n moveDashboard: \"Move dashboard items\",\n openAttachment: \"Open attachment detail\",\n openAttachmentLink: \"Open attachment link\",\n uninformed: \"Uninformed\",\n totalRegisters: \"Total registers:\",\n total: \"Total:\",\n export: \"Export\",\n selectAtLeastOneField: \"Select at least one field for the export\",\n printScreen: \"Print screen\",\n advancedExport: \"Advanced export\",\n savedRegisters: \"Record successfully saved\",\n errorWhileSavingForm: \"Error while saving form\",\n author: \"Author\",\n recordsSelected:\n \"Hi ha {numberOfSelectedRows} registres seleccionats en aquesta pàgina.\",\n selectAllRecords: \"Seleccionar tots els {totalRecords} registres.\",\n allRecordsSelected: \"Hi ha {totalRecords} registres seleccionats.\",\n openInSameWindow: \"Open in the current tab\",\n openInNewTab: \"Open in a new tab\",\n};\n","export default {\n true: \"Sí\",\n false: \"No\",\n simple_search: \"Búsqueda simple\",\n advanced_search: \"Búsqueda avanzada\",\n search: \"Buscar\",\n parameters: \"Parametros\",\n limit: \"Límite\",\n first: \"Primero\",\n no_results: \"No hay resultados\",\n summary:\n \"Mostrando resultado desde {from} hasta {to} de un total de {total} registros\",\n welcome: \"Bienvenido\",\n attachments: \"Adjuntos\",\n addNewAttachment: \"Añadir nuevo adjunto\",\n listAllAttachments: \"Ver todos los adjuntos\",\n viewAs: \"Ver cómo\",\n confirmRemoveItem: \"Estás seguro de querer eliminar éste registro?\",\n save: \"Guardar\",\n delete: \"Eliminar\",\n refresh: \"Refrescar\",\n previous: \"Anterior\",\n next: \"Siguiente\",\n actions: \"Acciones\",\n reports: \"Informes\",\n related: \"Relacionado\",\n new: \"Nuevo\",\n fillRequiredField: \"Por favor, rellena éste campo obligatorio\",\n fillRequiredFields: \"Por favor, rellena todos los campos obligatorios\",\n generatingReport: \"Generando informe...\",\n confirmation: \"Confirmación\",\n ok: \"De acuerdo\",\n cancel: \"Cancelar\",\n formHasErrors: \"El formulario tiene errores\",\n unsavedChanges: \"Hay cambios sin guardar\",\n confirmRefreshWithoutSave:\n \"Estás seguro de querer refrescar la página sin guardar los cambios?\",\n discardAndRefresh: \"Descarta los cambios y refresca\",\n removeItems: \"Eliminar el registro/s\",\n confirmRemove:\n \"Estás seguro de querer eliminar los registro/s seleccionados?\",\n yesConfirmRemove: \"Sí, elimina\",\n unlinkItems: \"Desenlaza registro/s\",\n confirmUnlink:\n \"Estás seguro de querer desenlazar los registro/s seleccionados?\",\n yesConfirmUnlink: \"Sí, desenlaza\",\n confirmCloseWithoutSave:\n \"Estás seguro de querer cerrar ésta ventana sin cerrar?\",\n closeWithoutSaving: \"Cerrar sin guardar\",\n action: \"Acción\",\n report: \"Informe\",\n selectAction: \"Selecciona una acción\",\n download: \"Descarga\",\n clear: \"Limpiar\",\n open: \"Abrir\",\n uploadNewImage: \"Subir una nueva imágen\",\n noCurrentEntries: \"No hay registros\",\n duplicate: \"Duplicar\",\n downloadingAttachment: \"Descargando adjunto...\",\n tree: \"lista\",\n form: \"formulario\",\n favorites: \"Mis favoritos\",\n edit_favorites: \"Edita los favoritos\",\n no_favorites: \"No tienes favoritos guardados\",\n register: \"Registro\",\n of: \"de\",\n editingDocument: \"Editando documento\",\n showLogs: \"Ver logs\",\n createdBy: \"Creado por el usuario\",\n creationDate: \"Fecha creación\",\n lastUpdatedBy: \"Última modificación por\",\n lastUpdatedDate: \"Fecha última modificación\",\n goToResourceId: \"Ir al recurso con ID\",\n searchId: \"ID de búsqueda:\",\n searchIdHelp:\n \"Se puede utilizar un ID o una lista de IDs separados por comas\",\n idNotFound: \"No se encuentra ésta ID de recursos para el objeto\",\n selectedRegisters: \"registros seleccionados\",\n translate: \"Traducir\",\n enterTextBeforeTranslate:\n \"Introduce algun texto en el campo antes de añadir traducciones\",\n saveBeforeTranslate:\n \"Tienes que guardar el registro antes de añadir las traducciones\",\n configDashboard: \"Configurar panel\",\n moveDashboard: \"Mover items del panel\",\n openAttachment: \"Ver detalle del adjunto\",\n openAttachmentLink: \"Abrir enlace del adjunto\",\n uninformed: \"Sin informar\",\n totalRegisters: \"Registros totales:\",\n total: \"Total:\",\n export: \"Exportar\",\n selectAtLeastOneField: \"Selecciona al menos un campo para la exportación\",\n printScreen: \"Imprimir pantalla\",\n advancedExport: \"Exportación avanzada\",\n savedRegisters: \"Registro guardado correctamente\",\n errorWhileSavingForm: \"Error al guardar el formulario\",\n author: \"Autor\",\n recordsSelected:\n \"Hay {numberOfSelectedRows} registros seleccionados en ésta página.\",\n selectAllRecords: \"Seleccionar todos los {totalRecords} registros.\",\n allRecordsSelected: \"Hay {totalRecords} registros seleccionados.\",\n openInSameWindow: \"Abrir en la pestaña actual\",\n openInNewTab: \"Abrir en una nueva pestaña\",\n};\n","import ca_ES from \"@/locales/ca_ES\";\nimport en_US from \"@/locales/en_US\";\nimport es_ES from \"@/locales/es_ES\";\nimport { Strings } from \"@gisce/react-formiga-components\";\n\nexport const strings: Strings = {\n ca_ES,\n en_US,\n es_ES,\n};\n","import React, { memo, useContext, useMemo } from \"react\";\nimport { ErpFeatureKeys, ErpFeaturesMap } from \"@/models/erpFeature\";\nimport {\n FormigaConfigProvider,\n Locale,\n Strings,\n mergeStrings,\n} from \"@gisce/react-formiga-components\";\nimport { strings } from \"@/locales\";\n\ntype ConfigContextProps = ConfigContextValues & {\n locale: Locale;\n localizedStrings?: Strings;\n};\n\ntype ConfigContextValues = {\n erpFeatures: ErpFeaturesMap;\n globalValues?: Record<string, any>;\n rootContext?: Record<string, any>;\n devMode?: boolean;\n};\n\nconst defaultConfigContext: ConfigContextValues = {\n erpFeatures: {},\n globalValues: {},\n rootContext: {},\n devMode: false,\n};\n\nexport const ConfigContext =\n React.createContext<ConfigContextValues>(defaultConfigContext);\n\nexport const useConfigContext = () => {\n const context = useContext(ConfigContext);\n\n if (!context) {\n throw new Error(\n \"useConfigContext must be used within a ConfigContextProvider\",\n );\n }\n\n return context;\n};\n\nexport const useFeatureIsEnabled = (featureKey: ErpFeatureKeys): boolean => {\n const { erpFeatures } = useConfigContext();\n return !!erpFeatures[featureKey];\n};\n\nexport const ConfigContextProvider = memo(\n ({\n erpFeatures,\n locale,\n localizedStrings = {},\n globalValues,\n rootContext,\n devMode,\n children,\n }: ConfigContextProps & { children?: React.ReactNode }) => {\n const providerValue = useMemo(\n () => ({\n erpFeatures,\n globalValues,\n rootContext,\n devMode,\n }),\n [erpFeatures, globalValues, rootContext, devMode],\n );\n\n return (\n <ConfigContext.Provider value={providerValue}>\n <FormigaConfigProvider\n locale={locale}\n localizedStrings={mergeStrings(strings, localizedStrings)}\n >\n {children}\n </FormigaConfigProvider>\n </ConfigContext.Provider>\n );\n },\n);\nConfigContextProvider.displayName = \"ConfigContextProvider\";\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { parseContext } from \"@gisce/ooui\";\nimport { nanoid } from \"nanoid\";\n\nexport async function fetchAction({\n actionId,\n rootContext = {},\n globalValues = {},\n}: {\n actionId: number;\n rootContext?: any;\n globalValues?: any;\n}): Promise<any> {\n const actionType = \"ir.actions.act_window\";\n const action = `${actionType},${actionId}`;\n\n const dataForAction = await ConnectionProvider.getHandler().getActionData({\n action,\n context: rootContext,\n });\n\n const parsedContext = parseContext({\n context: dataForAction.context,\n values: globalValues,\n fields: {},\n });\n\n const parsedDomain = dataForAction.domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain: dataForAction.domain,\n values: globalValues,\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n const {\n res_model: model,\n views,\n name: title,\n limit,\n view_type,\n } = dataForAction;\n const treeExpandable = view_type === \"tree\";\n\n const finalViews = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n\n if (!id) {\n const { view_id } = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context: { ...rootContext, ...parsedContext },\n });\n finalViews.push([view_id, viewType]);\n } else {\n finalViews.push(viewArray);\n }\n }\n\n const [id, type] = finalViews[0];\n const initialView = { id, type };\n\n return {\n title,\n actionId,\n actionType,\n key: nanoid(),\n views,\n model,\n context: { ...rootContext, ...parsedContext },\n domain: parsedDomain,\n initialView,\n limit,\n treeExpandable,\n };\n}\n","import { useContext, useEffect, useMemo, useState } from \"react\";\nimport { useConfigContext } from \"@/context/ConfigContext\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { fetchAction } from \"@/widgets/views/Dashboard/dashboardHelper\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\n\nexport const useFormGraphData = (actionId: number) => {\n const [error, setError] = useState<any>();\n const [loading, setLoading] = useState<boolean>(true);\n const [actionData, setActionData] = useState<any>();\n const [treeShortcut, setTreeShortcut] = useState<ShortcutApi>();\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext, getValues, activeId } = formContext || {};\n const { globalValues, rootContext } = useConfigContext();\n const context = useMemo(() => {\n return { ...getContext?.(), ...rootContext };\n }, [getContext, rootContext]);\n\n const fetchData = async () => {\n setError(undefined);\n setLoading(true);\n try {\n const result = await fetchAction({\n actionId,\n rootContext: context,\n globalValues: {\n ...globalValues,\n ...getValues(),\n },\n });\n const { views } = result as any;\n\n const treeView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"tree\";\n });\n if (treeView) {\n const [id, type] = treeView;\n const {\n actionId: action_id,\n actionType: action_type,\n title: name,\n model: res_model,\n } = result;\n\n setTreeShortcut({\n action_id,\n action_type,\n name,\n res_id: false,\n res_model,\n view_id: id,\n view_type: type,\n overrideUnsettedLimit: true,\n values: {\n active_id: activeId,\n active_ids: [activeId],\n },\n });\n }\n setActionData(result);\n } catch (err) {\n setError(err);\n }\n setLoading(false);\n };\n\n return { actionData, treeShortcut, loading, error, fetchData };\n};\n","import { Spin } from \"antd\";\n\nexport const CenteredSpinner = () => {\n return (\n <div\n style={{\n width: \"100%\",\n display: \"flex\",\n height: \"100%\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <Spin />\n </div>\n );\n};\n","import { parseError } from \"@/helpers/errorHelper\";\nimport { Alert } from \"antd\";\nimport React from \"react\";\nimport { Interweave } from \"interweave\";\n\nexport const ErrorAlert = ({\n error,\n className,\n}: {\n error: any;\n className?: string;\n}) => {\n let messageContent;\n let messageType = \"error\";\n\n if (\n typeof error === \"string\" &&\n error.indexOf(\" -- \") !== -1 &&\n error.indexOf(\"\\n\\n\") !== -1\n ) {\n const { message, type, title } = parseError(error);\n messageContent = <Interweave content={`${title}<br />${message}`} />;\n messageType = type;\n } else {\n messageContent = error.message\n ? JSON.stringify(error.message)\n : JSON.stringify(error);\n }\n return (\n <Alert\n className={className}\n message={messageContent}\n type={messageType as any}\n banner\n />\n );\n};\n","import { nanoid } from \"nanoid\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport const useNetworkRequest = (\n fn: (payload: any, requestConfig: any) => Promise<any>,\n): [(payload: any) => Promise<any>, (requestId?: string) => void] => {\n const abortControllersRef = useRef<Map<string, AbortController>>(new Map());\n\n useEffect(() => {\n return () => {\n cancelRequest();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const fetchData = useCallback(\n async (payload: any, manualRequestId?: string) => {\n const requestId = manualRequestId || nanoid();\n if (abortControllersRef.current.has(requestId)) {\n abortControllersRef.current.get(requestId)?.abort();\n }\n\n const abortController = new AbortController();\n abortControllersRef.current.set(requestId, abortController);\n\n try {\n return await fn(payload, {\n signal: abortController.signal,\n });\n } finally {\n abortControllersRef.current.delete(requestId);\n }\n },\n [fn],\n );\n\n const cancelRequest = useCallback((requestId?: string) => {\n if (requestId) {\n abortControllersRef.current.get(requestId)?.abort();\n abortControllersRef.current.delete(requestId);\n } else {\n abortControllersRef.current.forEach((controller) => controller.abort());\n abortControllersRef.current.clear();\n }\n }, []);\n\n return [fetchData, cancelRequest];\n};\n","import { useState } from \"react\";\nimport Measure from \"react-measure\";\nimport Title from \"antd/lib/typography/Title\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { Col, Row } from \"antd\";\n\nconst fontGrowFactor = 0.7;\nconst minFontSize = 30;\n\nexport type GraphIndicatorCompProps = {\n value: number;\n totalValue?: number;\n percent?: number;\n color?: string;\n icon?: string;\n suffix?: string;\n showPercent?: boolean;\n};\n\nexport const GraphIndicatorComp = (props: GraphIndicatorCompProps) => {\n const [height, setHeight] = useState<number>(0);\n const [width, setWidth] = useState<number>(0);\n\n const { value, totalValue, percent, color, icon, suffix, showPercent } =\n props;\n\n return (\n <Measure\n bounds\n onResize={(contentRect) => {\n setHeight(contentRect.bounds?.height!);\n setWidth(contentRect.bounds?.width!);\n }}\n >\n {({ measureRef }) => {\n if (showPercent) {\n return (\n <PercentageIndicator\n value={value!}\n total={totalValue!}\n percent={percent!}\n measureRef={measureRef}\n height={height}\n width={width}\n color={color}\n icon={icon}\n suffix={suffix}\n />\n );\n } else {\n return (\n <CommonIndicator\n value={value!}\n total={totalValue}\n measureRef={measureRef}\n height={height}\n width={width}\n color={color}\n icon={icon}\n suffix={suffix}\n />\n );\n }\n }}\n </Measure>\n );\n};\n\nfunction getTextWidth(text: string, font: string) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n\n context!.font = font || getComputedStyle(document.body).font;\n return context!.measureText(text).width;\n}\n\nfunction CommonIndicator({\n measureRef,\n width,\n height,\n total,\n value,\n color,\n icon,\n suffix,\n}: {\n measureRef: any;\n width: number;\n height: number;\n total: number | undefined;\n value: number;\n color: string | undefined;\n icon?: string;\n suffix?: string;\n}) {\n let fontSize =\n height * fontGrowFactor < minFontSize\n ? minFontSize\n : height * fontGrowFactor;\n\n const localeValue = value?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n\n const totalValue = total?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n\n let finalValue = total ? `${localeValue}/${totalValue}` : `${localeValue}`;\n\n if (suffix) {\n finalValue += \" \" + suffix;\n }\n\n let tw = getTextWidth(\n finalValue,\n `bold ${Math.floor(fontSize * 1.03)}px sans-serif`,\n );\n\n if (icon) {\n tw = tw * 2;\n }\n\n if (tw >= width * 0.85) {\n const maxFontSize = ((width * 0.85) / tw) * fontSize;\n fontSize = maxFontSize;\n }\n\n const IconElement: any =\n icon && iconMapper(icon, { style: { fontSize: fontSize * 0.7 } });\n\n return (\n <div\n ref={measureRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n }}\n >\n <Title style={{ fontSize, margin: 0, color }}>\n {IconElement && <IconElement style={{ fontSize: fontSize * 0.7 }} />}\n {IconElement ? ` ${finalValue}` : finalValue}\n </Title>\n </div>\n );\n}\n\nfunction PercentageIndicator({\n measureRef,\n height,\n width,\n percent,\n total,\n value,\n color,\n icon,\n suffix,\n}: {\n measureRef: any;\n height: number;\n width: number;\n percent: number;\n total: number;\n value: number;\n color: string | undefined;\n icon?: string;\n suffix?: string;\n}) {\n const twoLinesHeight = height * 0.65;\n let fontSize =\n twoLinesHeight * fontGrowFactor < minFontSize\n ? minFontSize\n : twoLinesHeight * fontGrowFactor;\n\n const localeValue = value?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n\n let finalValue = total\n ? `${localeValue}/${total?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}`\n : `${localeValue}`;\n\n if (suffix) {\n finalValue += \" \" + suffix;\n }\n\n const percentValue = `${percent?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}%`;\n\n let tw = getTextWidth(\n percentValue,\n `bold ${Math.floor(fontSize * 1.03)}px sans-serif`,\n );\n\n if (icon) {\n tw = tw * 1.5;\n }\n\n if (tw >= width * 0.85 || fontSize * 2 < twoLinesHeight) {\n const maxFontSize = ((width * 0.85) / tw) * fontSize;\n fontSize = maxFontSize;\n }\n\n const IconElement: any = icon && iconMapper(icon, { style: { fontSize } });\n\n return (\n <div\n ref={measureRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n flexDirection: \"column\",\n padding: \"0.2rem\",\n }}\n >\n <Row align={\"middle\"}>\n {IconElement && (\n <Col style={{ fontSize: fontSize * 1, color, paddingRight: \"10px\" }}>\n <IconElement />\n </Col>\n )}\n <Col>\n <Title style={{ fontSize: fontSize * 0.8, margin: 0, color }}>\n {IconElement ? ` ${percent}%` : `${percent}%`}\n </Title>\n <Title\n style={{\n fontSize: fontSize * 0.4,\n margin: 0,\n color,\n textAlign: \"center\",\n }}\n >\n {finalValue}\n </Title>\n </Col>\n </Row>\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Alert } from \"antd\";\nimport { Operator, graphProcessor } from \"@gisce/ooui\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { GraphIndicatorComp } from \"./GraphIndicatorComp\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nconst { getValueForOperator } = graphProcessor;\n\nexport type GraphInidicatorProps = {\n model: string;\n domain: any;\n context: any;\n colorCondition?: string | null;\n totalDomain?: string;\n showPercent?: boolean;\n icon?: string;\n suffix?: string;\n field?: string;\n operator?: Operator;\n manualIds?: number[];\n};\n\nexport const GraphIndicator = (props: GraphInidicatorProps) => {\n const {\n model,\n domain,\n context,\n colorCondition,\n totalDomain,\n showPercent = false,\n icon: iconProps,\n suffix,\n field,\n operator,\n manualIds,\n } = props;\n const [loading, setLoading] = useState(false);\n const [value, setValue] = useState<number>();\n const [percent, setPercent] = useState<number>();\n const [totalValue, setTotalValue] = useState<number>();\n const [color, setColor] = useState<string>();\n const [icon, setIcon] = useState<string>();\n const [error, setError] = useState<string>();\n\n const [searchAllIds] = useNetworkRequest(\n ConnectionProvider.getHandler().searchAllIds,\n );\n const [readObjects] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n const [searchCount] = useNetworkRequest(\n ConnectionProvider.getHandler().searchCount,\n );\n const [evalDomain] = useNetworkRequest(\n ConnectionProvider.getHandler().evalDomain,\n );\n const [parseCondition] = useNetworkRequest(\n ConnectionProvider.getHandler().parseCondition,\n );\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model, colorCondition]);\n\n async function fetchValue({\n domain,\n isTotal,\n }: {\n domain: any;\n isTotal: boolean;\n }) {\n if (isTotal) {\n return await fetchTotalValue({ domain });\n }\n\n if (field && operator) {\n const resultIds =\n manualIds ||\n (await searchAllIds({\n params: domain,\n model,\n context,\n }));\n\n const results = await readObjects({\n model,\n ids: resultIds,\n fieldsToRetrieve: [field],\n context,\n });\n\n return getValueForOperator({\n values: results.map((r: any) => r[field]),\n operator,\n });\n } else {\n return manualIds\n ? manualIds.length\n : await searchCount({\n model,\n params: domain,\n context,\n });\n }\n }\n\n async function fetchTotalValue({ domain }: { domain: any }) {\n if (field && operator) {\n const resultIds = await searchAllIds({\n params: domain,\n model,\n context,\n });\n\n const results = await readObjects({\n model,\n ids: resultIds,\n fieldsToRetrieve: [field],\n context,\n });\n\n return getValueForOperator({\n values: results.map((r: any) => r[field]),\n operator,\n });\n } else {\n return await searchCount({\n model,\n params: domain,\n context,\n });\n }\n }\n async function fetchData() {\n setLoading(true);\n setError(undefined);\n let totalRetrievedValue;\n let percent;\n\n try {\n const retrievedValue = await fetchValue({ domain, isTotal: false });\n\n setValue(retrievedValue);\n\n if (totalDomain) {\n const parsedDomain = await evalDomain({\n domain: totalDomain,\n values: {},\n context,\n });\n totalRetrievedValue = await fetchValue({\n domain: parsedDomain,\n isTotal: true,\n });\n\n setTotalValue(totalRetrievedValue);\n }\n\n if (totalRetrievedValue) {\n percent =\n Math.round((retrievedValue / totalRetrievedValue) * 100 * 100) / 100;\n setPercent(percent);\n } else {\n setPercent(0);\n }\n\n if (colorCondition) {\n const conditionEval = await parseCondition({\n condition: colorCondition,\n values: { value: retrievedValue, percent },\n context,\n });\n setColor(conditionEval);\n }\n\n if (iconProps) {\n if (iconProps.indexOf(\":\") !== -1) {\n const iconEval = await parseCondition({\n condition: iconProps,\n values: { value: retrievedValue, percent },\n context,\n });\n setIcon(iconEval);\n } else {\n setIcon(iconProps);\n }\n }\n setError(undefined);\n } catch (err) {\n setError(JSON.stringify(err));\n }\n\n setLoading(false);\n }\n\n if (loading) {\n return <CenteredSpinner />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <GraphIndicatorComp\n value={value!}\n totalValue={totalValue!}\n percent={percent!}\n color={color}\n icon={icon}\n suffix={suffix}\n showPercent={showPercent}\n />\n );\n};\n","import { useCallback, useState } from \"react\";\nimport {\n parseGraph,\n GraphChart as GraphChartOoui,\n graphProcessor,\n graphFieldUtils,\n GraphType,\n} from \"@gisce/ooui\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\n\nconst { processGraphData } = graphProcessor;\nconst { getFieldsToRetrieve } = graphFieldUtils;\n\nexport type GraphDataQueryOpts = {\n model: string;\n domain?: any;\n context?: any;\n limit?: number;\n manualIds?: number[];\n};\n\nexport type GraphDataOpts = GraphDataQueryOpts & {\n xml: string;\n uninformedString: string;\n};\n\nexport const useGraphData = (opts: GraphDataOpts) => {\n const {\n model,\n domain = [],\n context = {},\n xml,\n limit,\n uninformedString,\n manualIds,\n } = opts;\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<any>();\n const [processedValues, setProcessedValues] = useState<any>();\n const [evaluatedEntries, setEvaluatedEntries] = useState<any[]>();\n const [type, setType] = useState<GraphType>(\"line\");\n const [getFields] = useNetworkRequest(\n ConnectionProvider.getHandler().getFields,\n );\n const [readObjects] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n const [search] = useNetworkRequest(ConnectionProvider.getHandler().search);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n\n // // First we parse the xml with ooui library\n const ooui = parseGraph(xml) as GraphChartOoui;\n setType(ooui.type || \"line\");\n\n // // Then we fetch the data\n const fieldsToRetrieve = getFieldsToRetrieve({ ooui });\n let values, fields;\n\n try {\n // Use connection provider or whatever service you need to use\n ({ values, fields } = await retrieveData({\n model,\n domain,\n context,\n limit,\n order: ooui.timerange ? ooui.x.name : null,\n fields: fieldsToRetrieve,\n manualIds,\n methods: {\n getFields,\n readObjects,\n search,\n },\n }));\n } catch (e) {\n setError(\"Error fetching graph data values: \" + JSON.stringify(e));\n setLoading(false);\n return;\n }\n\n try {\n if (!values || !fields) {\n setError(\"No values or fields returned\");\n setLoading(false);\n return {\n loading,\n error,\n type,\n values: processedValues,\n evaluatedEntries,\n fetchData,\n };\n }\n\n setEvaluatedEntries(values);\n const _processedValues = processGraphData({\n ooui,\n values,\n fields,\n options: {\n uninformedString,\n },\n });\n setError(undefined);\n setProcessedValues(_processedValues);\n } catch (e) {\n setError(\"Error processing graph data: \" + e);\n setLoading(false);\n return;\n }\n\n setLoading(false);\n }, [\n context,\n domain,\n error,\n evaluatedEntries,\n getFields,\n limit,\n loading,\n manualIds,\n model,\n processedValues,\n readObjects,\n search,\n type,\n uninformedString,\n xml,\n ]);\n\n return {\n loading,\n error,\n type,\n values: processedValues,\n evaluatedEntries,\n fetchData,\n };\n};\n\nasync function getFieldsForModel({\n model,\n context,\n fields,\n getFields,\n}: {\n model: string;\n context: any;\n fields: string[];\n getFields: (payload: any) => Promise<any>;\n}) {\n const viewData = await getFields({\n model,\n context,\n fields,\n });\n return viewData;\n}\n\nasync function retrieveData({\n fields,\n model,\n domain,\n context,\n order,\n limit,\n manualIds,\n methods,\n}: {\n fields: string[];\n model: string;\n domain: any;\n context: any;\n order: string | null;\n limit?: number;\n manualIds?: number[];\n methods: {\n getFields: (payload: any) => Promise<any>;\n readObjects: (payload: any) => Promise<any>;\n search: (payload: any) => Promise<any>;\n };\n}) {\n const { getFields, readObjects, search } = methods;\n\n const fieldsDefinition = await getFieldsForModel({\n model,\n context,\n fields,\n getFields,\n });\n\n if (manualIds) {\n let values: any[] = (await readObjects({\n model,\n ids: manualIds,\n fieldsToRetrieve: fields,\n context,\n })) as any;\n\n if (order) {\n values = [...values].sort((a, b) => a[order] - b[order]);\n }\n\n return {\n values,\n fields: fieldsDefinition,\n };\n }\n\n const values: any[] = (await search({\n model,\n params: domain,\n fieldsToRetrieve: fields,\n context,\n limit,\n order,\n })) as any;\n return {\n values,\n fields: fieldsDefinition,\n };\n}\n","import dayjs from \"dayjs\";\n\nimport advancedFormat from \"dayjs/plugin/advancedFormat\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport isoWeek from \"dayjs/plugin/isoWeek\";\nimport timezone from \"dayjs/plugin/timezone\";\nimport duration from \"dayjs/plugin/duration\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport weekday from \"dayjs/plugin/weekday\";\nimport localeData from \"dayjs/plugin/localeData\";\n\ndayjs.extend(advancedFormat);\ndayjs.extend(customParseFormat);\ndayjs.extend(isoWeek);\ndayjs.extend(timezone);\ndayjs.extend(duration);\ndayjs.extend(relativeTime);\ndayjs.extend(weekday);\ndayjs.extend(localeData);\n\nexport default dayjs;\n","import dayjs from \"@/helpers/dayjs\";\n\nconst formatter = (graphType: \"pie\" | \"default\" | \"barGrouped\") => {\n return (object: any) => {\n const formattedValue = object.value.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n const name = graphType === \"pie\" ? object.x : object.type;\n return { name, value: formattedValue };\n };\n};\n\nconst axisFormatter = (value: any) => {\n if (typeof value === \"string\" && stringIsValidNumeric(value)) {\n return parseFloat(value).toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n } else if (isNumber(value)) {\n return value.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n } else if (isValidDateString(value)) {\n const dateType = getDateType(value);\n if (dateType === null) {\n return value;\n }\n return dayjs(value, (dateFormats.input as any)[dateType]).format(\n (dateFormats.output as any)[dateType],\n );\n } else {\n return value;\n }\n};\n\nconst stringIsValidNumeric = (value: string) => {\n const regex = /^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$/;\n return regex.test(value);\n};\n\nexport const isNumber = (value: any) => {\n return typeof value === \"number\" && !isNaN(value);\n};\n\nconst DefaultGraphOptions = {\n default: {\n padding: \"auto\",\n xAxis: {\n tickCount: 5,\n label: {\n formatter: axisFormatter,\n },\n },\n yAxis: {\n label: {\n formatter: axisFormatter,\n },\n },\n legend: {\n maxWidthRatio: 0.5,\n maxItemWidth: 1000,\n },\n tooltip: {\n formatter: formatter(\"default\"),\n },\n },\n pie: {\n autoFit: true,\n appendPadding: 10,\n radius: 0.9,\n label: null,\n legend: {\n maxWidthRatio: 0.5,\n maxItemWidth: 1000,\n },\n tooltip: {\n formatter: formatter(\"pie\"),\n },\n interactions: [\n {\n type: \"element-active\",\n },\n ],\n },\n barGrouped: {\n isGroup: true,\n legend: {\n maxWidthRatio: 0.5,\n maxItemWidth: 1000,\n },\n tooltip: {\n formatter: formatter(\"barGrouped\"),\n },\n xAxis: {\n label: {\n formatter: axisFormatter,\n },\n },\n yAxis: {\n label: {\n formatter: axisFormatter,\n },\n },\n label: {\n position: \"middle\",\n layout: [\n {\n type: \"interval-adjust-position\",\n },\n {\n type: \"interval-hide-overlap\",\n },\n {\n type: \"adjust-color\",\n },\n ],\n },\n },\n};\n\nfunction isValidDateString(variable: any): boolean {\n // Check if the variable is defined and is a string\n if (typeof variable !== \"string\" || variable === undefined) {\n return false;\n }\n\n // Check if the string is a valid date\n const date = new Date(variable);\n return date.toString() !== \"Invalid Date\";\n}\n\nconst dateFormats = {\n input: {\n hours: \"YYYY-MM-DD HH:mm\",\n days: \"YYYY-MM-DD\",\n weeks: \"YYYY-[W]WW\",\n months: \"YYYY-MM\",\n years: \"YYYY\",\n },\n output: {\n hours: \"DD/MM/YYYY HH:mm\",\n days: \"DD/MM/YYYY\",\n weeks: \"[W]WW/YYYY\",\n months: \"MM/YYYY\",\n years: \"YYYY\",\n },\n};\n\nfunction getDateType(dateString: string): string | null {\n for (const format in dateFormats.input) {\n const isValidFormat = dayjs(\n dateString,\n (dateFormats.input as any)[format],\n true,\n ).isValid();\n if (isValidFormat) {\n return format;\n }\n }\n\n return null;\n}\n\nexport const PieLabelOptions = {\n inner: {\n label: {\n type: \"inner\",\n offset: \"-30%\",\n style: {\n fontSize: 12,\n textAlign: \"center\",\n },\n },\n },\n spider: {\n label: {\n type: \"spider\",\n labelHeight: 28,\n },\n },\n};\n\nexport const calculateAdjustedPiePercentages = (items: any[]) => {\n const total = items.reduce((acc, item) => acc + item.value, 0);\n const rawPercentages = items.map((item) => (item.value / total) * 100);\n const roundedPercentages = rawPercentages.map((p) => Math.round(p));\n const sumOfRounded = roundedPercentages.reduce((acc, num) => acc + num, 0);\n const error = 100 - sumOfRounded;\n\n for (let i = 0; i < Math.abs(error); i++) {\n if (error > 0) {\n roundedPercentages[i % roundedPercentages.length]++;\n } else {\n roundedPercentages[i % roundedPercentages.length]--;\n }\n }\n\n return items.map((item, index) => ({\n x: item.x,\n percent: roundedPercentages[index],\n }));\n};\n\nexport default DefaultGraphOptions;\n","import { Line, Column, Pie } from \"@ant-design/plots\";\nimport GraphDefaults, {\n PieLabelOptions,\n calculateAdjustedPiePercentages,\n} from \"./GraphDefaults\";\nimport { Typography } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { GraphType } from \"@gisce/ooui\";\n\nconst { Text } = Typography;\n\nconst types = {\n line: Line,\n bar: Column,\n pie: Pie,\n};\n\nexport type GraphCompProps = {\n type: GraphType;\n data: any[];\n isGroup: boolean;\n isStack: boolean;\n numItems: number;\n};\n\nexport const GraphChartComp = ({\n type,\n data,\n isGroup,\n isStack,\n numItems,\n}: GraphCompProps) => {\n const { t } = useLocale();\n\n const pieTotal = useMemo(() => {\n if (type !== \"pie\") {\n return undefined;\n }\n const mustShowPieTotal = data.reduce(\n (acc: number, obj: any) => (obj.operator === \"+\" ? acc + obj.value : 0),\n 0,\n );\n if (mustShowPieTotal === 0) {\n return undefined;\n }\n return data.reduce((acc: number, obj: any) => acc + obj.value, 0);\n }, [data, type]);\n\n const piePercents = useMemo(() => {\n if (type !== \"pie\") {\n return undefined;\n }\n return calculateAdjustedPiePercentages(data);\n }, [data, type]);\n\n const getPercentValueForX = useCallback(\n (x: string) => {\n if (!piePercents) {\n return;\n }\n const matchedDataEntry = piePercents.find((d) => d.x === x);\n const value = matchedDataEntry?.percent || 0;\n const percent = `${value.toFixed(0)}%`;\n return `${percent}`;\n },\n [piePercents],\n );\n\n const pieItemValueFormatter = useMemo(() => {\n if (piePercents === undefined) {\n return undefined;\n }\n return {\n formatter: (_: unknown, item: any) => {\n return getPercentValueForX(item.id);\n },\n };\n }, [piePercents]);\n\n const pieLabelFormatter = useCallback(\n ({ percent, x }: { percent: number; x: string }) => {\n // Hide labels for percents lower than 0.07\n if (percent < 0.07) {\n return \"\";\n }\n return getPercentValueForX(x);\n },\n [piePercents],\n );\n\n const Chart = (types as any)[type!];\n\n if (!Chart) {\n return <>{`Unknown graph type: ${type}`}</>;\n }\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"1rem\",\n gap: \"10px\",\n }}\n >\n <div style={{ textAlign: \"right\" }}>\n <Text type=\"secondary\">\n {`${t(\"totalRegisters\")} ${numItems.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}`}\n </Text>\n </div>\n {pieTotal && (\n <div style={{ textAlign: \"right\" }}>\n <Text type=\"secondary\">\n {`${t(\"total\")} ${pieTotal.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}`}\n </Text>\n </div>\n )}\n <div style={{ width: \"100%\", height: \"100%\", overflow: \"hidden\" }}>\n <Chart\n {...getGraphProps({\n type,\n data,\n isGroup,\n isStack,\n pieItemValueFormatter,\n pieLabelFormatter,\n })}\n />\n </div>\n </div>\n );\n};\n\ntype GetGraphPropsType = {\n type: string;\n isStack: boolean;\n isGroup: boolean;\n data: any[];\n width?: number;\n height?: number;\n pieItemValueFormatter?: any;\n pieLabelFormatter?: any;\n};\n\nfunction getGraphProps(props: GetGraphPropsType) {\n const {\n type,\n data,\n isGroup,\n isStack,\n pieItemValueFormatter,\n pieLabelFormatter,\n } = props;\n let graphProps = { ...(GraphDefaults as any)[type] };\n\n if (!graphProps) {\n graphProps = { ...(GraphDefaults as any)[\"default\"] };\n }\n\n graphProps.data = data;\n\n if (type === \"pie\") {\n graphProps.colorField = \"x\";\n graphProps.angleField = \"value\";\n\n graphProps = { ...graphProps, ...PieLabelOptions.inner };\n\n graphProps.legend.itemValue = pieItemValueFormatter;\n graphProps.label.content = pieLabelFormatter;\n } else {\n graphProps.xField = \"x\";\n graphProps.yField = \"value\";\n graphProps.seriesField = \"type\";\n\n graphProps.isGroup = isGroup;\n\n if (isStack) {\n graphProps.isStack = true;\n graphProps.groupField = \"stacked\";\n }\n }\n return graphProps;\n}\n","import { useGraphData } from \"./useGraphData\";\nimport { Alert } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { GraphChartComp } from \"./GraphChartComp\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nexport type GraphChartProps = {\n model: string;\n domain: any;\n context: any;\n xml: string;\n limit?: number;\n manualIds?: number[];\n};\n\nexport const GraphChart = (props: GraphChartProps) => {\n const { model, domain, context, xml, limit, manualIds } = props;\n const { t } = useLocale();\n\n const { error, loading, values, type, evaluatedEntries, fetchData } =\n useGraphData({\n model,\n xml,\n limit,\n domain,\n context,\n uninformedString: t(\"uninformed\"),\n manualIds,\n });\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [xml, model, limit, context, domain]);\n\n if (loading || !values) {\n return <CenteredSpinner />;\n }\n\n const { data, isGroup, isStack } = values;\n\n if (error) {\n return <Alert message={error} type=\"error\" banner />;\n }\n\n return (\n <GraphChartComp\n type={type}\n data={data}\n isGroup={isGroup}\n isStack={isStack}\n numItems={evaluatedEntries!.length}\n />\n );\n};\n","export const DEFAULT_SEARCH_LIMIT = 80;\n","import { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\nimport { View } from \"@/types\";\nimport { createContext, useEffect, useState } from \"react\";\n\nexport type ActionViewContextType = {\n title: string;\n availableViews: View[];\n currentView: View;\n setCurrentView: (view: View) => void;\n formIsSaving?: boolean;\n setFormIsSaving?: (value: boolean) => void;\n formHasChanges?: boolean;\n setFormHasChanges?: (value: boolean) => void;\n onFormSave?: () => Promise<{ succeed: boolean; id: number }>;\n formRef?: any;\n searchTreeRef?: any;\n onNewClicked: () => void;\n currentId?: number;\n setCurrentId?: (id?: number) => void;\n currentItemIndex?: number;\n setCurrentItemIndex?: (value?: number) => void;\n results?: any[];\n setResults?: (value: any[]) => void;\n currentModel?: string;\n removingItem?: boolean;\n setRemovingItem?: (value: boolean) => void;\n formIsLoading?: boolean;\n setFormIsLoading?: (value: boolean) => void;\n treeIsLoading?: boolean;\n setTreeIsLoading?: (value: boolean) => void;\n graphIsLoading?: boolean;\n setGraphIsLoading?: (value: boolean) => void;\n attachments?: any;\n setAttachments?: (value: any) => void;\n selectedRowItems?: any[];\n setSelectedRowItems?: (value: any[]) => void;\n duplicatingItem?: boolean;\n setDuplicatingItem?: (value: boolean) => void;\n searchParams?: any[];\n setSearchParams?: (value: any[]) => void;\n searchVisible?: boolean;\n setSearchVisible?: (value: boolean) => void;\n sorter: any;\n setSorter: (sorter: any) => void;\n totalItems: number;\n setTotalItems: (totalItems: number) => void;\n searchTreeNameSearch?: string;\n setSearchTreeNameSearch?: (searchString?: string) => void;\n previousView?: View;\n setPreviousView?: (view: View) => void;\n goToResourceId?: (ids: number[], openInSameTab?: boolean) => Promise<void>;\n searchValues?: any;\n setSearchValues?: (value: any) => void;\n limit?: number;\n setLimit?: (value: number) => void;\n setTitle?: (value: string) => void;\n};\n\nexport const ActionViewContext = createContext<ActionViewContextType | null>(\n null,\n);\n\ntype ActionViewProviderProps = ActionViewContextType & {\n children: React.ReactNode;\n};\n\nconst ActionViewProvider = (props: ActionViewProviderProps): any => {\n const {\n children,\n currentView,\n title: titleProps,\n setCurrentView,\n availableViews,\n formRef,\n searchTreeRef,\n onNewClicked,\n currentId,\n setCurrentId,\n setResults,\n results,\n currentItemIndex,\n setCurrentItemIndex,\n currentModel,\n sorter,\n setSorter,\n totalItems,\n setTotalItems,\n setSelectedRowItems,\n selectedRowItems,\n searchTreeNameSearch,\n setSearchTreeNameSearch,\n goToResourceId,\n limit: limitProps,\n } = props;\n\n const [formIsSaving, setFormIsSaving] = useState<boolean>(false);\n const [formHasChanges, setFormHasChanges] = useState<boolean>(false);\n const [removingItem, setRemovingItem] = useState<boolean>(false);\n const [formIsLoading, setFormIsLoading] = useState<boolean>(true);\n const [treeIsLoading, setTreeIsLoading] = useState<boolean>(true);\n const [attachments, setAttachments] = useState<any>([]);\n const [duplicatingItem, setDuplicatingItem] = useState<boolean>(false);\n const [searchParams, setSearchParams] = useState<any[]>([]);\n const [searchVisible, setSearchVisible] = useState<boolean>(false);\n const [graphIsLoading, setGraphIsLoading] = useState<boolean>(true);\n const [previousView, setPreviousView] = useState<View>();\n const [searchValues, setSearchValues] = useState<any>({});\n const [limit, setLimit] = useState<number>(\n limitProps !== undefined ? limitProps : DEFAULT_SEARCH_LIMIT,\n );\n const [title, setTitle] = useState<string>(titleProps);\n\n useEffect(() => {\n if (results && results.length > 0 && !currentItemIndex) {\n setCurrentItemIndex?.(0);\n setCurrentId?.(results[0].id);\n }\n }, [results]);\n\n useEffect(() => {\n setLimit(limitProps !== undefined ? limitProps : DEFAULT_SEARCH_LIMIT);\n }, [limitProps]);\n\n useEffect(() => {\n if (availableViews.length === 1) {\n setPreviousView(availableViews[0]);\n } else if (availableViews.length > 1) {\n setPreviousView(\n availableViews.filter(\n (view) => view.view_id !== currentView.view_id,\n )[0],\n );\n }\n }, [availableViews]);\n\n useEffect(() => {\n if (\n previousView?.view_id === currentView.view_id &&\n availableViews.length > 1\n ) {\n setPreviousView(\n availableViews.filter(\n (view) => view.view_id !== currentView.view_id,\n )[0],\n );\n }\n }, [currentView]);\n\n const callOnFormSave = async () => {\n return await (formRef.current as any)?.submitForm();\n };\n\n return (\n <ActionViewContext.Provider\n value={{\n title,\n currentView,\n setCurrentView,\n availableViews,\n formIsSaving,\n setFormIsSaving,\n formHasChanges,\n setFormHasChanges,\n formRef,\n searchTreeRef,\n onFormSave: callOnFormSave,\n onNewClicked,\n currentId,\n setCurrentId,\n currentItemIndex,\n setCurrentItemIndex,\n results,\n setResults,\n currentModel,\n removingItem,\n setRemovingItem,\n formIsLoading,\n setFormIsLoading,\n treeIsLoading,\n setTreeIsLoading,\n attachments,\n setAttachments,\n selectedRowItems,\n setSelectedRowItems,\n duplicatingItem,\n setDuplicatingItem,\n setSearchParams,\n searchParams,\n searchVisible,\n setSearchVisible,\n sorter,\n setSorter,\n totalItems,\n setTotalItems,\n searchTreeNameSearch,\n setSearchTreeNameSearch,\n setGraphIsLoading,\n graphIsLoading,\n previousView,\n setPreviousView,\n goToResourceId,\n searchValues,\n setSearchValues,\n limit,\n setLimit,\n setTitle,\n }}\n >\n {children}\n </ActionViewContext.Provider>\n );\n};\n\nexport default ActionViewProvider;\n","import {\n useState,\n useEffect,\n useContext,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n Graph as GraphOoui,\n parseGraph,\n GraphIndicator as GraphIndicatorOoui,\n GraphIndicatorField,\n} from \"@gisce/ooui\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { GraphIndicator } from \"./GraphIndicator\";\nimport { GraphChart } from \"./GraphChart\";\nimport { GraphView } from \"@/types\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nexport type GraphProps = {\n view_id: number;\n model: string;\n domain: any;\n context: any;\n limit?: number;\n manualIds?: number[];\n};\n\nconst GraphComp = (props: GraphProps, ref: any) => {\n const { view_id, model, context, domain, limit, manualIds } = props;\n const [loading, setLoading] = useState(false);\n const [graphOoui, setGraphOoui] = useState<GraphOoui>();\n const [graphXml, setGraphXml] = useState<string>();\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { setGraphIsLoading = undefined } = actionViewContext || {};\n\n const [getView] = useNetworkRequest(ConnectionProvider.getHandler().getView);\n\n useImperativeHandle(ref, () => ({\n refresh: () => {\n fetchData();\n },\n }));\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [view_id]);\n\n async function fetchData() {\n setLoading(true);\n setGraphIsLoading?.(true);\n\n try {\n const viewData = (await getView({\n model,\n id: view_id,\n type: \"graph\",\n context,\n })) as GraphView;\n\n setGraphXml(viewData.arch);\n const graph = parseGraph(viewData.arch);\n setGraphOoui(graph);\n setLoading(false);\n setGraphIsLoading?.(false);\n } catch (err) {\n console.error(err);\n setLoading(false);\n setGraphIsLoading?.(false);\n return <>{JSON.stringify(err)}</>;\n }\n }\n\n if (loading || !graphOoui) {\n return <CenteredSpinner />;\n }\n\n switch (graphOoui.type) {\n case \"indicatorField\":\n case \"indicator\": {\n const indicator = graphOoui as GraphIndicatorOoui;\n const indicatorFieldopts =\n indicator.type === \"indicatorField\"\n ? {\n field: (indicator as GraphIndicatorField).field,\n operator: (indicator as GraphIndicatorField).operator,\n }\n : {};\n\n return (\n <GraphIndicator\n showPercent={indicator.showPercent}\n totalDomain={indicator.totalDomain!}\n colorCondition={indicator.color}\n model={model}\n context={context}\n domain={domain}\n icon={indicator.icon!}\n suffix={indicator.suffix!}\n manualIds={manualIds}\n {...indicatorFieldopts}\n />\n );\n }\n case \"line\":\n case \"bar\":\n case \"pie\": {\n return (\n <GraphChart\n model={model}\n context={context}\n domain={domain}\n xml={graphXml!}\n limit={limit}\n manualIds={manualIds}\n />\n );\n }\n default: {\n return <>{`Graph ${graphOoui.type} not implemented`}</>;\n }\n }\n};\n\nexport const Graph = forwardRef(GraphComp);\n","export enum ErpFeatureKeys {\n FEATURE_VIEW_JSON_ATTRS = \"view_json_attrs\",\n FEATURE_ADVANCED_EXPORT = \"export_data2\",\n FEATURE_OMNISEARCH = \"omnisearch\",\n FEATURE_READFORVIEW = \"read_for_view\",\n // ... add more features here\n}\n\nexport const ErpAllFeatureKeys: string[] = Object.values(ErpFeatureKeys);\n\nexport type ErpFeaturesMap = {\n [key in ErpFeatureKeys]?: boolean;\n};\n","import { useCallback, useState } from \"react\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { GraphType } from \"@gisce/ooui\";\n\nexport type GraphDataQueryOpts = {\n model: string;\n domain?: any;\n context?: any;\n view_id: number;\n manualIds?: number[];\n};\n\nexport type GraphResponse = {\n num_items: number;\n type: GraphType;\n};\n\nexport type GraphResponseChart = GraphResponse & {\n data: any;\n isGroup: boolean;\n isStack: boolean;\n};\n\nexport type GraphResponseIndicator = GraphResponse & {\n total: number;\n value: number;\n color?: string;\n icon?: string;\n percent?: number;\n suffix?: string;\n};\n\nexport const useServerGraphData = (opts: GraphDataQueryOpts) => {\n const { model, domain = [], context = {}, view_id, manualIds } = opts;\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<any>();\n const [graphData, setGraphData] = useState<\n GraphResponseChart | GraphResponseIndicator\n >();\n const [readForView] = useNetworkRequest(\n ConnectionProvider.getHandler().readForView,\n );\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n\n // We must check if we have manualIds in order to populate domain with them\n if (manualIds) {\n domain.push([\"id\", \"in\", manualIds]);\n }\n\n try {\n const graphData = await readForView({\n model,\n domain,\n context,\n view_id,\n });\n setGraphData(graphData);\n } catch (e) {\n setError(\"Error reading graph data from server: \" + e);\n }\n setLoading(false);\n }, [context, domain, manualIds, model, readForView, view_id]);\n\n return {\n loading,\n error,\n fetchData,\n graphData,\n };\n};\n","import { useEffect, useContext, forwardRef, useImperativeHandle } from \"react\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { Alert } from \"antd\";\nimport {\n GraphResponseChart,\n GraphResponseIndicator,\n useServerGraphData,\n} from \"./useServerGraphData\";\nimport { GraphIndicatorComp } from \"./GraphIndicatorComp\";\nimport { isNumber } from \"./GraphDefaults\";\nimport { GraphChartComp } from \"./GraphChartComp\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nexport type GraphProps = {\n view_id: number;\n model: string;\n domain: any;\n context: any;\n manualIds?: number[];\n};\n\nconst GraphComp = (props: GraphProps, ref: any) => {\n const { view_id, model, context, domain, manualIds } = props;\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { setGraphIsLoading = undefined } = actionViewContext || {};\n\n const { error, loading, graphData, fetchData } = useServerGraphData({\n view_id,\n model,\n domain,\n context,\n manualIds,\n });\n\n useEffect(() => {\n setGraphIsLoading?.(loading);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loading]);\n\n useImperativeHandle(ref, () => ({\n refresh: () => {\n fetchData();\n },\n }));\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [view_id]);\n\n if (loading || !graphData) {\n return <CenteredSpinner />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n switch (graphData.type) {\n case \"indicatorField\":\n case \"indicator\": {\n const { value, total, percent, icon, color, suffix } =\n graphData as GraphResponseIndicator;\n\n return (\n <GraphIndicatorComp\n value={value}\n totalValue={total}\n percent={percent}\n color={color}\n icon={icon}\n suffix={suffix}\n showPercent={isNumber(percent)}\n />\n );\n }\n case \"line\":\n case \"bar\":\n case \"pie\": {\n const chart = graphData as GraphResponseChart;\n return (\n <GraphChartComp\n type={chart.type}\n data={chart.data}\n isGroup={chart.isGroup}\n isStack={chart.isStack}\n numItems={chart.num_items}\n />\n );\n }\n default: {\n return <>{`Graph ${graphData.type} not implemented`}</>;\n }\n }\n};\n\nexport const GraphServer = forwardRef(GraphComp);\n","import { InitialViewData, View, ViewType } from \"@/types\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport React, { useState } from \"react\";\n\nexport type TabManagerContextType = {\n openAction: ({\n domain,\n context,\n model,\n views,\n title,\n target,\n initialView,\n action_id,\n action_type,\n res_id,\n values,\n forced_values,\n }: {\n domain: any;\n context: any;\n model: string;\n views: any[];\n title: string;\n target: string;\n initialView: InitialViewData;\n action_id: number;\n action_type: string;\n res_id?: number | boolean;\n values?: any;\n forced_values?: any;\n }) => void;\n openRelate: ({\n relateData,\n fields,\n values,\n action_id,\n action_type,\n }: {\n relateData: any;\n fields: any;\n values: any;\n action_id: number;\n action_type: string;\n }) => void;\n openDefaultActionForModel: ({\n model,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain,\n }: {\n model: string;\n values?: any;\n forced_values?: any;\n initialViewType?: ViewType;\n res_id?: number;\n domain?: any;\n }) => void;\n activeKey: string;\n onChangeTab: (key: string) => void;\n onRemoveTab: (key: string) => void;\n openShortcut: (shortcut: ShortcutApi) => void;\n tabs: any[];\n currentView?: View;\n setCurrentView?: (view?: View) => void;\n currentId?: number;\n setCurrentId?: (id?: number) => void;\n};\n\nexport const TabManagerContext =\n React.createContext<TabManagerContextType | null>(null);\n\ntype TabManagerProviderProps = TabManagerContextType & {\n children: React.ReactNode;\n};\n\nconst TabManagerProvider = (props: TabManagerProviderProps): any => {\n const {\n children,\n openAction,\n openRelate,\n openDefaultActionForModel,\n openShortcut,\n activeKey,\n onChangeTab,\n onRemoveTab,\n tabs,\n } = props;\n\n const [currentView, setCurrentView] = useState<View>();\n const [currentId, setCurrentId] = useState<number>();\n\n return (\n <TabManagerContext.Provider\n value={{\n openAction,\n openRelate,\n openDefaultActionForModel,\n activeKey,\n openShortcut,\n onChangeTab,\n onRemoveTab,\n tabs,\n currentId,\n currentView,\n setCurrentId,\n setCurrentView,\n }}\n >\n {children}\n </TabManagerContext.Provider>\n );\n};\n\nexport default TabManagerProvider;\n","import { ExportOutlined } from \"@ant-design/icons\";\nimport { Row, Col, Typography, theme } from \"antd\";\nimport ErrorBoundary from \"antd/es/alert/ErrorBoundary\";\nimport { GraphCardProps } from \"./GraphCard.types\";\nconst { useToken } = theme;\n\nconst { Text } = Typography;\n\nexport const GraphCard = (props: GraphCardProps) => {\n const { title, children, action, openAction, parms } = props;\n const { token } = useToken();\n\n const hasDragAndDrop = Object.keys(parms).length > 0;\n\n return (\n <div\n className={hasDragAndDrop ? \"shadow-md\" : undefined}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n border: \"1px solid #eee\",\n backgroundColor: \"white\",\n borderRadius: token.borderRadius,\n }}\n >\n <Row\n align=\"middle\"\n style={{\n borderBottom: \"1px solid #ddd\",\n backgroundColor: token.colorPrimaryBg,\n }}\n wrap={false}\n >\n <Col\n flex=\"auto\"\n className=\"draggable-head\"\n style={{\n fontWeight: \"bold\",\n padding: \"0.5rem\",\n cursor: hasDragAndDrop ? \"grab\" : undefined,\n overflow: \"hidden\",\n }}\n >\n <Text ellipsis={true}>{title}</Text>\n </Col>\n {action && (\n <Col flex=\"25px\" style={{ padding: \"0.5rem\" }}>\n <Row justify=\"end\" align=\"middle\">\n <ExportOutlined\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n openAction?.(action);\n }}\n />\n </Row>\n </Col>\n )}\n </Row>\n <div style={{ padding: hasDragAndDrop ? undefined : 10 }}>\n <ErrorBoundary>{children}</ErrorBoundary>\n </div>\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { Tooltip, theme, Statistic, Card } from \"antd\";\nimport { Indicator as IndicatorOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport Field from \"@/common/Field\";\nimport { QuestionCircleOutlined } from \"@ant-design/icons\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useFormGraphData } from \"@/hooks/useFormGraphData\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\nimport { ErrorAlert } from \"@/ui/ErrorAlert\";\nimport { Graph } from \"../views/Graph/Graph\";\nimport ErrorBoundary from \"antd/es/alert/ErrorBoundary\";\nimport { useFeatureIsEnabled } from \"@/context/ConfigContext\";\nimport { ErpFeatureKeys } from \"@/models/erpFeature\";\nimport { GraphServer } from \"../views/Graph/GraphServer\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { GraphCard } from \"../views/Graph\";\nconst { useToken } = theme;\n\ntype IndicatorProps = WidgetProps & {\n ooui: IndicatorOoui;\n value?: number;\n};\n\nexport const Indicator = (props: IndicatorProps) => {\n const { ooui } = props;\n\n const hasActionId = ooui.actionId !== undefined;\n\n return (\n <Field ooui={ooui}>\n {hasActionId ? (\n <ErrorBoundary>\n <GraphIndicatorInput ooui={ooui} />\n </ErrorBoundary>\n ) : (\n <IndicatorInput ooui={ooui} />\n )}\n </Field>\n );\n};\n\ntype IndicatorInputProps = {\n ooui: IndicatorOoui;\n value?: any;\n};\n\nconst IndicatorInput = (props: IndicatorInputProps) => {\n const { token } = useToken();\n const { ooui, value } = props;\n const title = (\n <>\n <span>{ooui.label} </span>\n {ooui.tooltip && (\n <Tooltip title={ooui.tooltip}>\n <QuestionCircleOutlined\n className=\"pr-1 text-xs\"\n style={{ color: token.colorPrimaryBg }}\n />\n </Tooltip>\n )}\n </>\n );\n const Icon: React.ElementType = iconMapper(ooui.icon) as any;\n let formattedValue = value;\n if (ooui.selectionValues.size) {\n formattedValue = ooui.selectionValues.get(value);\n } else if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n const field = (\n <Statistic\n title={title}\n prefix={Icon && <Icon />}\n suffix={ooui.suffix}\n value={formattedValue}\n />\n );\n if (ooui.card) {\n return <Card>{field}</Card>;\n } else {\n return field;\n }\n};\n\nconst GraphIndicatorInput = (props: IndicatorInputProps) => {\n const { ooui } = props;\n const { actionId } = ooui;\n\n const { actionData, treeShortcut, loading, error, fetchData } =\n useFormGraphData(actionId!);\n\n const readForViewEnabled = useFeatureIsEnabled(\n ErpFeatureKeys.FEATURE_READFORVIEW,\n );\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openShortcut } = tabManagerContext || {};\n\n useEffect(() => {\n if (!ooui) {\n return;\n }\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ooui]);\n\n if (error) {\n return <ErrorAlert error={error} />;\n }\n\n const { id, model, limit, domain, context, initialView } = actionData || {};\n\n const GraphComponent = readForViewEnabled ? GraphServer : Graph;\n\n return (\n <GraphCard\n id={id}\n parms={{}}\n title={actionData?.title || \"\"}\n action={treeShortcut}\n openAction={openShortcut as any}\n >\n {loading && <CenteredSpinner />}\n {!loading && (\n <GraphComponent\n view_id={initialView.id}\n model={model}\n context={context}\n domain={domain}\n limit={limit}\n />\n )}\n </GraphCard>\n );\n};\n","import { One2manyItem } from \"@/widgets/base/one2many/One2manyInput\";\nimport { Form as FormOoui } from \"@gisce/ooui\";\n\nconst filteredValues = (values: any, fields: any) => {\n if (!fields) {\n return values;\n }\n const filteredValues: any = {};\n Object.keys(values).forEach((key) => {\n if (fields[key] === undefined) {\n // console.log(`${key} is not in fields`);\n filteredValues[key] = values[key];\n } else if (values[key] === false && fields[key].type !== \"boolean\") {\n // Do nothing - filter the field.\n } else if (fields[key].type === \"boolean\") {\n const boolValue = values[key];\n if (boolValue === 0) {\n filteredValues[key] = false;\n } else if (boolValue === 1) {\n filteredValues[key] = true;\n } else {\n filteredValues[key] = values[key];\n }\n } else {\n filteredValues[key] = values[key];\n }\n });\n return filteredValues;\n};\n\nexport const processValues = (values: any, fields: any) => {\n const filterBooleans = filteredValues(values, fields);\n return filterBooleans;\n};\n\nexport const getTouchedValues = ({\n source,\n target,\n fields,\n}: {\n source: any;\n target: any;\n fields: any;\n}) => {\n const differences: any = {};\n Object.keys(target).forEach((key) => {\n const is2Many = fields[key]\n ? fields[key].type === \"one2many\" || fields[key].type === \"many2many\"\n : false;\n\n if (is2Many) {\n const sourceValue = JSON.stringify(source[key]);\n const targetValue = JSON.stringify(target[key]);\n if (sourceValue === targetValue) {\n return;\n }\n\n const nonOriginalItems =\n target[key]?.items?.filter(\n (item: One2manyItem) => item.operation !== \"original\",\n ) || [];\n\n if (nonOriginalItems.length > 0) {\n differences[key] = target[key];\n }\n } else if (Array.isArray(target[key])) {\n if (fields[key].type === \"many2one\") {\n if (\n !isValidMany2OneValue(source[key]) &&\n !isValidMany2OneValue(target[key])\n ) {\n // eslint-disable-next-line no-useless-return\n return;\n } else if (!Array.isArray(source[key])) {\n // This will mean the source many2one value is a numeric id\n const numericId = source[key];\n const [targetNumericId] = target[key];\n if (numericId !== targetNumericId) {\n differences[key] = target[key];\n }\n } else {\n const sourceValue = JSON.stringify(source[key]);\n const targetValue = JSON.stringify(target[key]);\n if (sourceValue !== targetValue) {\n differences[key] = target[key];\n }\n }\n } else {\n const sourceValue = JSON.stringify(source[key]);\n const targetValue = JSON.stringify(target[key]);\n if (sourceValue !== targetValue) {\n differences[key] = target[key];\n }\n }\n } else if (source[key] === undefined && target[key] !== undefined) {\n differences[key] = target[key];\n } else if (source[key] !== target[key]) {\n if (target[key] === undefined) {\n differences[key] = null;\n } else {\n differences[key] = target[key];\n }\n }\n });\n return differences;\n};\n\nexport const checkFieldsType = ({\n changedFields,\n formOoui,\n types,\n}: {\n changedFields: string[];\n formOoui: FormOoui;\n types: string[];\n}) => {\n const valuesChecked = changedFields.map((key) => {\n const fieldType = formOoui?.findById(key)?.type!;\n return types.includes(fieldType);\n });\n return valuesChecked.some((i) => i === true);\n};\n\nexport const mergeFieldsDomain = ({\n fieldsDomain,\n fields,\n}: {\n fieldsDomain: any;\n fields: any;\n}) => {\n const output: any = {};\n\n Object.keys(fields).forEach((key) => {\n output[key] = fields[key];\n\n if (fieldsDomain[key]) {\n output[key].domain = fieldsDomain[key];\n }\n });\n\n return output;\n};\n\nexport const getValuesForDomain = (domain: any[]) => {\n const values: any = {};\n\n if (!domain || !Array.isArray(domain) || domain?.length === 0) {\n return {};\n }\n\n domain.forEach((entry) => {\n if (entry?.[1] === \"=\") {\n values[entry[0]] = entry[2];\n }\n });\n\n return values;\n};\n\nexport const getOnChangePayload = ({\n onChangeFieldActionArgs,\n values,\n parentValues = {},\n}: {\n onChangeFieldActionArgs: any[];\n values: any;\n parentValues?: any;\n}) => {\n const payload: any = {};\n onChangeFieldActionArgs.forEach((arg: string) => {\n const splittedArg = arg.split(\"\");\n\n if (arg === \"True\") {\n payload[arg] = true;\n } else if (arg === \"False\") {\n payload[arg] = false;\n } else if (values[arg]) {\n payload[arg] = values[arg];\n } else if (\n splittedArg[0] === \"'\" &&\n splittedArg[splittedArg.length - 1] === \"'\" &&\n splittedArg.filter((i: string) => i === \"'\").length === 2\n ) {\n payload[arg] = arg.replace(/'/g, \"\");\n } else if (splittedArg.includes(\"'\")) {\n // This is a string with a variable in it.\n // TODO: pending implement.\n payload[arg] = arg;\n } else if (arg.indexOf(\"parent.\") !== -1) {\n const parentKey = arg.replace(\"parent.\", \"\");\n payload[arg] = parentValues[parentKey] || false;\n } else {\n payload[arg] = false;\n }\n });\n return payload;\n};\n\nexport const mergeSearchFields = (searchFields: any[]) => {\n const mergedSearchFields = {\n primary: [],\n secondary: [],\n };\n\n searchFields.forEach((sf) => {\n if (!sf) {\n return;\n }\n\n mergedSearchFields.primary = mergedSearchFields.primary.concat(sf.primary);\n mergedSearchFields.secondary = mergedSearchFields.secondary.concat(\n sf.secondary,\n );\n });\n\n return {\n primary: mergedSearchFields.primary.filter(onlyUnique),\n secondary: mergedSearchFields.secondary.filter(onlyUnique),\n };\n};\n\nfunction onlyUnique(value: any, index: number, self: any) {\n return self.indexOf(value) === index;\n}\n\nexport const transformPlainMany2Ones = ({\n values,\n fields,\n}: {\n values: any;\n fields: any;\n}) => {\n const reformattedValues: { [key: string]: any } = {};\n\n Object.keys(values).forEach((key) => {\n const value = values[key];\n\n if (\n fields[key] &&\n fields[key].type === \"many2one\" &&\n value &&\n Array.isArray(value) &&\n value.length === 2\n ) {\n reformattedValues[key] = value[0];\n } else {\n reformattedValues[key] = value;\n }\n });\n\n return reformattedValues;\n};\n\nexport const colorFromString = (text: string) => {\n let hash = 0;\n text = text.toString().padEnd(10, \"0\");\n for (let i = 0; i < text.length; i++) {\n hash = text.charCodeAt(i) + ((hash << 5) - hash);\n }\n let hexColour = \"#\";\n for (let i = 0; i < 3; i++) {\n const value = (hash >> (i * 8)) & 0xff;\n hexColour += (\"00\" + value.toString(16)).slice(-2);\n }\n return hexColour;\n};\n\nexport const colorTextFromBackground = (color: string) => {\n function getRGB(c: string): number {\n return parseInt(c, 16) || parseInt(c);\n }\n\n function getsRGB(c: string) {\n return getRGB(c) / 255 <= 0.03928\n ? getRGB(c) / 255 / 12.92\n : Math.pow((getRGB(c) / 255 + 0.055) / 1.055, 2.4);\n }\n\n function getLuminance(hexColor: string) {\n return (\n 0.2126 * getsRGB(hexColor.substr(1, 2)) +\n 0.7152 * getsRGB(hexColor.substr(3, 2)) +\n 0.0722 * getsRGB(hexColor.substr(-2))\n );\n }\n\n function getContrast(f: string, b: string) {\n const L1 = getLuminance(f);\n const L2 = getLuminance(b);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n }\n\n function getTextColor(bgColor: string) {\n const whiteContrast = getContrast(bgColor, \"#ffffff\");\n const blackContrast = getContrast(bgColor, \"#000000\");\n\n return whiteContrast > blackContrast ? \"#ffffff\" : \"#000000\";\n }\n\n return getTextColor(color);\n};\n\nexport const stringFormat = (text: string, values: any): string => {\n return text.replace(/\\{([^}]+)\\}/g, (match, key) =>\n values[key] !== undefined ? values[key] : match,\n );\n};\n\nconst isValidMany2OneValue = (value: any) => {\n if (!Array.isArray(value)) {\n return false;\n }\n\n if (value.length !== 2) {\n return false;\n }\n\n if (value[0] === undefined && value[1] === \"\") {\n return false;\n }\n\n return true;\n};\n","import React from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { Tag as AntdTag, TagProps } from \"antd\";\nimport { isPresetStatusColor, isPresetColor } from \"antd/lib/_util/colors\";\nimport { colorFromString } from \"@/helpers/formHelper\";\n\nexport const Tag = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <TagInput {...props} />\n </Field>\n );\n};\n\nexport const TagInput = (props: any) => {\n const { ooui, value } = props;\n let formattedValue = value;\n let colorValue = value;\n if (ooui.selectionValues.size) {\n formattedValue = ooui.selectionValues.get(value);\n } else if (Array.isArray(value)) {\n colorValue = value[0];\n formattedValue = value[1];\n }\n if (!value) {\n return null;\n }\n const color =\n ooui.colors === \"auto\"\n ? colorFromString(colorValue)\n : ooui.colors[colorValue] || colorFromString(colorValue);\n return <CustomTag color={color}>{formattedValue}</CustomTag>;\n};\n\nexport const CustomTag = (props: TagProps) => {\n let { color } = props;\n let style = {};\n if (!isPresetStatusColor(props.color) && !isPresetColor(props.color)) {\n style = {\n color,\n borderColor: color,\n borderStyle: \"solid\",\n borderWidth: \"1px\",\n };\n color = `${color}20`;\n }\n return (\n <AntdTag {...props} style={style} color={color}>\n {props.children}\n </AntdTag>\n );\n};\n","import React, { useContext, useState } from \"react\";\nimport { Tags as TagsOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { One2manyItem, One2manyValue } from \"../base/one2many/One2manyInput\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { Alert, Select } from \"antd\";\nimport { colorFromString, transformPlainMany2Ones } from \"@/helpers/formHelper\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { CustomTag } from \"@/widgets/custom/Tag\";\n\ntype TagsProps = WidgetProps & {\n ooui: TagsOoui;\n};\n\ntype TagsInputProps = TagsProps & {\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n};\n\nexport const Tags = (props: TagsProps) => {\n const { ooui } = props;\n\n return (\n <Field type={\"array\"} {...props}>\n <TagsInput ooui={ooui} />\n </Field>\n );\n};\n\nexport const TagsInput = (props: TagsInputProps) => {\n const { value, ooui, onChange } = props;\n const { items = [] } = value || {};\n const itemsToShow = items\n .filter((item) => item.operation !== \"pendingRemove\")\n .map((item) => item.id) as number[];\n\n const [options, setOptions] = useState<any[]>([]);\n const [error, setError] = useState<string>();\n const [isLoadingOptions, setIsLoadingOptions] = useState<boolean>(false);\n const { relation, context, readOnly, field } = ooui;\n\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchOptions();\n }, [items]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n items: changedValue,\n });\n };\n\n async function fetchOptions() {\n setIsLoadingOptions(true);\n let params: any[] = [];\n try {\n if (readOnly) {\n params = [[\"id\", \"in\", itemsToShow]];\n }\n if (ooui.domain) {\n const evaluatedDomain =\n await ConnectionProvider.getHandler().evalDomain({\n domain: ooui.domain,\n values: transformPlainMany2Ones({\n fields: formContext?.getFields(),\n values: formContext.getPlainValues(),\n }),\n fields: formContext?.getFields(),\n context: formContext.getContext(),\n });\n params = [...params, ...evaluatedDomain];\n }\n\n const optionsRead = await ConnectionProvider.getHandler().search({\n model: relation,\n params,\n fieldsToRetrieve: [field],\n context: { ...getContext?.(), ...context },\n });\n const options = optionsRead.map((item: any) => {\n const value = item[field];\n let formattedValue = value;\n if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n return { label: formattedValue, value: item.id };\n });\n setOptions(options);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoadingOptions(false);\n }\n }\n\n const onChangeSelected = (ids: number[]) => {\n const newItems: One2manyItem[] = items.map((item) => {\n if (ids.includes(item.id as number)) {\n if (item.operation === \"pendingRemove\") {\n return {\n ...item,\n operation: \"pendingLink\",\n };\n } else {\n return item;\n }\n } else {\n return { id: item.id, operation: \"pendingRemove\" };\n }\n });\n const currentIds = newItems.map((item) => item.id);\n ids\n .filter((id) => !currentIds.includes(id))\n .forEach((id) => {\n newItems.push({ id, operation: \"pendingLink\" });\n });\n triggerChange(newItems);\n };\n\n const tagRender = (props: any) => {\n const { label, closable, onClose } = props;\n const onPreventMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.preventDefault();\n event.stopPropagation();\n };\n const color = colorFromString(label);\n return (\n <CustomTag\n color={color}\n onMouseDown={onPreventMouseDown}\n closable={closable}\n onClose={onClose}\n closeIcon={<span style={{ color }}>X</span>}\n >\n {label}\n </CustomTag>\n );\n };\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <>\n <div className=\"flex flex-row\">\n <Select\n mode=\"multiple\"\n value={options.length ? itemsToShow : []}\n tagRender={tagRender}\n bordered={!readOnly}\n disabled={readOnly}\n options={options}\n onChange={onChangeSelected}\n loading={isLoadingOptions}\n filterOption={(value, element) =>\n element.label.toLowerCase().includes(value.toString())\n }\n ></Select>\n </div>\n </>\n );\n};\n","import {\n Notebook,\n Group,\n Label,\n Char,\n Text,\n Button,\n ButtonGroup,\n Selection,\n Many2one,\n Boolean,\n Integer,\n Float,\n Date,\n DateTime,\n Time,\n One2many,\n Separator,\n Form,\n Tree,\n Reference,\n Binary,\n Url,\n Email,\n FloatTime,\n ProgressBar,\n MultiCheckbox,\n Markdown,\n Radio,\n Switch,\n Steps,\n Tag,\n CodeEditor,\n CommentsTimelineField,\n HTMLPreview,\n Alert,\n} from \"@/index\";\nimport { Image } from \"./base/Image\";\nimport { FiberGrid } from \"./custom/FiberGrid\";\nimport { Timeline } from \"./custom/Timeline\";\nimport { Indicator } from \"./custom/Indicator\";\nimport { Tags } from \"./custom/Tags\";\nimport { createElement } from \"react\";\n\nconst getWidgetType = (type: string) => {\n switch (type) {\n case \"form\":\n return Form;\n case \"tree\":\n return Tree;\n case \"notebook\":\n return Notebook;\n case \"group\":\n return Group;\n case \"label\":\n return Label;\n case \"char\":\n return Char;\n case \"text\":\n return Text;\n case \"button\":\n return Button;\n case \"buttonGroup\":\n return ButtonGroup;\n case \"selection\":\n return Selection;\n case \"many2one\":\n return Many2one;\n case \"boolean\":\n return Boolean;\n case \"integer\":\n return Integer;\n case \"float\":\n return Float;\n case \"progressbar\":\n return ProgressBar;\n case \"date\":\n return Date;\n case \"datetime\":\n return DateTime;\n case \"time\":\n return Time;\n case \"one2many\":\n case \"one2many_list\":\n case \"many2many\":\n return One2many;\n case \"separator\":\n return Separator;\n case \"reference\":\n return Reference;\n case \"binary\":\n return Binary;\n case \"image\":\n return Image;\n case \"url\":\n return Url;\n case \"email\":\n return Email;\n case \"float_time\":\n return FloatTime;\n case \"fiber_grid\":\n return FiberGrid;\n case \"timeline\":\n return Timeline;\n case \"indicator\":\n return Indicator;\n case \"tags\":\n return Tags;\n case \"tag\":\n return Tag;\n case \"multicheckbox\":\n return MultiCheckbox;\n case \"markdown\":\n return Markdown;\n case \"radio\":\n return Radio;\n case \"switch\":\n return Switch;\n case \"steps\":\n return Steps;\n case \"codeeditor\":\n return CodeEditor;\n case \"comments_timeline\":\n return CommentsTimelineField;\n case \"html_preview\":\n return HTMLPreview;\n case \"alert\":\n return Alert;\n default:\n return undefined;\n }\n};\n\nconst createReactWidget = (props: any) => {\n const { ooui } = props;\n const { type }: { type: string } = ooui;\n\n const widgetClass: any = getWidgetType(type);\n\n if (!widgetClass) {\n return null;\n }\n\n return createElement(widgetClass, props);\n};\n\nexport { createReactWidget };\n","import { Widget, Label, Field, Container } from \"@gisce/ooui\";\n\nconst getSpanStyleForItem = ({\n item,\n responsiveBehaviour,\n}: {\n item: Widget;\n responsiveBehaviour: boolean;\n}) => {\n return {\n gridColumnStart: \"span \" + (responsiveBehaviour ? 1 : item.colspan),\n };\n};\n\nconst fillRowWithEmptiesToFit = ({\n row,\n mustFillWithEmpties,\n numberOfColumns,\n}: {\n row: any;\n mustFillWithEmpties: boolean;\n numberOfColumns: number;\n}) => {\n const rowWithEmptiesToFit: any = [];\n let totalColSpan = 0;\n\n const isLastItemAndMustFit = (columnIndex: number) => {\n return (\n columnIndex + 1 === row.length &&\n totalColSpan < numberOfColumns &&\n !mustFillWithEmpties\n );\n };\n\n row.map((item: Widget, columnIndex: number) => {\n totalColSpan += item.colspan;\n\n if (isLastItemAndMustFit(columnIndex)) {\n const gapsToAdjust = numberOfColumns - totalColSpan;\n item.colspan = item.colspan + gapsToAdjust;\n totalColSpan += gapsToAdjust;\n }\n\n rowWithEmptiesToFit.push(item);\n\n if (isLastItemAndMustFit(columnIndex)) {\n const gapsToFill = numberOfColumns - totalColSpan;\n for (let i = 0; i < gapsToFill; i += 1) {\n rowWithEmptiesToFit.push(new Label({ string: \"\" }));\n }\n }\n });\n\n return rowWithEmptiesToFit;\n};\n\nconst expandWidgetsIfNeeded = ({\n row,\n numberOfColumns,\n}: {\n row: any;\n numberOfColumns: number;\n}) => {\n return row.map((item: Widget) => {\n if ((item as any)._mustExpand) {\n (item as any).colspan = numberOfColumns;\n return item;\n }\n return item;\n });\n};\n\nconst getSingleRowTemplateColumns = (\n row: Widget[],\n numberOfColumns: number,\n) => {\n const gridOptions = row.map((item: Widget) => {\n if (item instanceof Label && (item as Label).fieldForLabel) {\n return \"auto\";\n }\n if (item instanceof Container) {\n return \"auto\";\n }\n return \"1fr\";\n });\n\n if (gridOptions.length < numberOfColumns) {\n const columnsToAdd = numberOfColumns - gridOptions.length;\n for (let i = 0; i < columnsToAdd; i++) {\n gridOptions.push(\"1fr\");\n }\n }\n return gridOptions.join(\" \");\n};\n\nconst getTemplateColumns = (columns: number, fieldInRows: boolean) => {\n // We check if we have any label+field inside (fieldInRows) the container.\n // In this scenario, we must format the grid accordingly\n // Otherwise, the grid will divide uniformly (auto)\n const odd = fieldInRows ? \"1fr\" : \"auto\";\n const even = \"auto\";\n let templateColumns = \"\";\n for (let i = 0; i < columns; i++) {\n templateColumns += i % 2 ? odd : even;\n if (i + 1 < columns) {\n templateColumns += \" \";\n }\n }\n return templateColumns;\n};\n\nconst getMaxColspanForRows = (rows: Widget[][]) => {\n const maxColspan = rows.map((row: Widget[]) => {\n return row.reduce((prev, current) => {\n return prev + current.colspan;\n }, 0);\n });\n return maxColspan.reduce((a, b) => {\n return Math.max(a, b);\n });\n};\n\nconst rowsHaveAnyField = (rows: Widget[][]) => {\n let found = false;\n\n rows.map((row: Widget[]) => {\n row.map((item: Widget) => {\n if (item instanceof Field) {\n found = true;\n }\n });\n });\n\n return found;\n};\n\nexport {\n fillRowWithEmptiesToFit,\n getSpanStyleForItem,\n expandWidgetsIfNeeded,\n getMaxColspanForRows,\n rowsHaveAnyField,\n getSingleRowTemplateColumns,\n getTemplateColumns,\n};\n","import React from \"react\";\nimport { Container as ContainerOoui, Widget, Label } from \"@gisce/ooui\";\nimport { createReactWidget } from \"@/widgets/WidgetFactory\";\n\nimport {\n getTemplateColumns,\n fillRowWithEmptiesToFit,\n getSpanStyleForItem,\n expandWidgetsIfNeeded,\n getMaxColspanForRows,\n getSingleRowTemplateColumns,\n} from \"@/helpers/containerHelper\";\n\ntype Props = {\n container: ContainerOoui;\n responsiveBehaviour: boolean;\n};\n\nconst Container = (props: Props): React.ReactElement => {\n const { container, responsiveBehaviour } = props;\n const { rows } = container;\n let { columns } = container;\n\n // We check for the largest colspan for each row\n // And if the value is smaller than the columns value\n // We adjust the columns value\n const maxColspanForRows = getMaxColspanForRows(rows);\n if (maxColspanForRows < columns) {\n columns = maxColspanForRows;\n }\n\n let fieldInRows = false;\n let firstRow: Widget[] = [];\n\n const content = rows.map((row: Widget[], i) => {\n const rowWithoutInvisibleFields = row.filter((widget) => {\n return !widget.invisible;\n });\n\n const rowWithExpandedItems = expandWidgetsIfNeeded({\n row: rowWithoutInvisibleFields,\n numberOfColumns: columns,\n });\n\n let rowWithEmptiesToFit = rowWithExpandedItems;\n if (\n i === 0 ||\n !(row.length === 1 && row.some((widget) => widget.type === \"group\"))\n ) {\n rowWithEmptiesToFit = fillRowWithEmptiesToFit({\n row: rowWithExpandedItems,\n numberOfColumns: columns,\n mustFillWithEmpties: responsiveBehaviour,\n });\n\n firstRow = firstRow.concat(rowWithEmptiesToFit);\n }\n\n return rowWithEmptiesToFit.map((item: Widget) => {\n // We check if we have any label+field inside the container.\n // In this scenario, we must format the grid accordingly\n // Otherwise, the grid will divide uniformly\n if (item instanceof Label && (item as Label).fieldForLabel) {\n fieldInRows = true;\n }\n\n return (\n <div\n key={item.key}\n style={{\n ...getSpanStyleForItem({ item, responsiveBehaviour }),\n minWidth: 0,\n }}\n >\n {createReactWidget({\n ooui: item,\n responsiveBehaviour,\n })}\n </div>\n );\n });\n });\n\n const templateColumns =\n rows.length === 1\n ? getSingleRowTemplateColumns(firstRow, columns)\n : getTemplateColumns(columns, fieldInRows);\n const gridStyle = {\n display: \"grid\",\n alignItems: \"center\",\n gridTemplateColumns: responsiveBehaviour ? \"auto\" : templateColumns,\n gap: \"1rem\",\n minHeight: 0,\n minWidth: 0,\n };\n\n return <div style={gridStyle}>{content}</div>;\n};\n\nexport default Container;\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { confirm } = Modal;\n\nconst showDialog = ({\n onOk,\n onCancel,\n t,\n}: {\n onOk: () => void;\n onCancel?: () => void;\n t: (key: string) => string;\n}) => {\n confirm({\n title: t(\"unsavedChanges\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmCloseWithoutSave\"),\n okText: t(\"closeWithoutSaving\"),\n onOk,\n onCancel,\n cancelText: t(\"cancel\"),\n });\n};\n\nexport default showDialog;\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { error } = Modal;\n\nconst showDialog = (t: (key: string) => string) => {\n error({\n title: t(\"formHasErrors\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"fillRequiredFields\"),\n });\n};\n\nexport default showDialog;\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { WarningOutlined } from \"@ant-design/icons\";\n\nconst { warning } = Modal;\n\nconst showDialog = (title: string, message: string, onOk?: () => void) => {\n warning({\n title,\n icon: <WarningOutlined />,\n centered: true,\n content: message,\n onOk,\n });\n};\n\nexport default showDialog;\n","import React from \"react\";\n\nexport type FormModalContextType = {\n setTitle?: (title: string) => void;\n};\n\nexport const FormModalContext =\n React.createContext<FormModalContextType | null>(null);\n\ntype FormModalProviderProps = FormModalContextType & {\n children: React.ReactNode;\n};\n\nconst FormModalProvider = (props: FormModalProviderProps): any => {\n const { children, setTitle } = props;\n\n return (\n <FormModalContext.Provider\n value={{\n setTitle,\n }}\n >\n {children}\n </FormModalContext.Provider>\n );\n};\n\nexport default FormModalProvider;\n","import { FormView, GenerateReportOptions, ViewType } from \"@/types\";\nimport React, {\n useContext,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { openBase64InNewTab, getMimeType } from \"@/helpers/filesHelper\";\nimport { parseContext } from \"@gisce/ooui\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Modal, Spin } from \"antd\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { FormModal } from \"@/widgets/modals/FormModal\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { transformPlainMany2Ones, stringFormat } from \"@/helpers/formHelper\";\n\nexport type ContentRootContextType = {\n processAction: ({\n actionData,\n fields,\n values,\n context,\n }: {\n actionData: any;\n fields: any;\n values: any;\n context?: any;\n onRefreshParentValues?: () => void;\n }) => Promise<any>;\n globalValues?: any;\n};\n\ntype ActionModalOpts = {\n model?: string;\n domain?: any;\n context: any;\n formView?: FormView;\n actionData?: any;\n};\n\nexport const ContentRootContext =\n React.createContext<ContentRootContextType | null>(null);\n\ntype ContentRootProviderProps = {\n children: React.ReactNode;\n globalValues?: any;\n};\n\nconst callRefreshValues = async (fns: any[]) => {\n for (let i = 0; i < fns.length; i++) {\n await fns?.[i]?.();\n }\n};\n\nconst ContentRootProvider = (\n props: ContentRootProviderProps,\n ref: any,\n): any => {\n const { children, globalValues = {} } = props;\n const reportInProgressInterval = useRef<any>();\n const waitingForReport = useRef<boolean>();\n const [reportGenerating, setReportGenerating] = useState<boolean>(false);\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openAction } = tabManagerContext || {};\n const onRefreshParentValues = useRef<any>([]);\n const { t } = useLocale();\n\n useImperativeHandle(ref, () => ({\n openActionModal,\n }));\n\n // Action modal state\n const [actionModalVisible, setActionModalVisible] = useState<boolean>(false);\n\n const [actionModalOptions, setActionModalOptions] = useState<ActionModalOpts>(\n {\n context: {},\n },\n );\n\n async function generateReport(options: GenerateReportOptions) {\n const { reportData, fields, values, context = {} } = options;\n\n const {\n context: reportContext,\n model,\n datas = {},\n report_name,\n type,\n } = reportData;\n\n if (type !== \"ir.actions.report.xml\") {\n showErrorDialog(`${type} action not supported`);\n return;\n }\n\n const { ids } = datas || {};\n\n const idsToExecute = ids || [];\n\n const reportContextParsed =\n typeof reportContext === \"string\"\n ? parseContext({\n context: reportContext,\n fields,\n values,\n })\n : reportContext;\n\n try {\n const newReportId = await ConnectionProvider.getHandler().createReport({\n model,\n name: report_name,\n datas,\n ids: idsToExecute,\n context: { ...context, ...reportContextParsed },\n });\n\n setReportGenerating(true);\n\n waitingForReport.current = true;\n reportInProgressInterval.current = setInterval(() => {\n evaluateReportStatus(newReportId);\n }, 1000);\n } catch (err) {\n waitingForReport.current = false;\n clearInterval(reportInProgressInterval.current);\n showErrorDialog(err);\n setReportGenerating(false);\n }\n }\n\n async function evaluateReportStatus(id: any) {\n let reportState;\n try {\n reportState = await ConnectionProvider.getHandler().getReport({\n id,\n });\n if (reportState.state && waitingForReport.current === true) {\n waitingForReport.current = false;\n clearInterval(reportInProgressInterval.current);\n setReportGenerating(false);\n const fileType: any = await getMimeType(reportState.result);\n openBase64InNewTab(reportState.result, fileType.mime);\n }\n } catch (error) {\n waitingForReport.current = false;\n clearInterval(reportInProgressInterval.current);\n setReportGenerating(false);\n showErrorDialog(error.exception || error);\n }\n }\n\n async function processAction({\n actionData,\n fields,\n values,\n context,\n onRefreshParentValues: onRefreshParentValuesFn,\n }: {\n actionData: any;\n fields: any;\n values: any;\n context?: any;\n onRefreshParentValues?: any;\n }) {\n const { type } = actionData;\n onRefreshParentValues.current.push(onRefreshParentValuesFn);\n\n if (type === \"ir.actions.report.xml\") {\n return await generateReport({\n reportData: actionData,\n fields,\n values,\n context,\n });\n } else if (type === \"ir.actions.act_window\") {\n return await runAction({ actionData, fields, values, context });\n } else if (type === \"ir.actions.act_url\") {\n window.open(\n stringFormat(actionData.url, { ...values, context }),\n \"_blank\",\n );\n } else {\n showErrorDialog(`${type} action not supported`);\n return {};\n }\n }\n\n async function runAction({\n actionData: _actionData,\n fields = {},\n values = {},\n context = {},\n }: {\n actionData: any;\n fields?: any;\n values?: any;\n context?: any;\n }) {\n let actionData = _actionData;\n\n if (!_actionData.res_model) {\n actionData = (\n await ConnectionProvider.getHandler().readObjects({\n model: \"ir.actions.act_window\",\n ids: [parseInt(_actionData.id)],\n context,\n })\n )[0];\n }\n\n const responseContext =\n typeof actionData?.context === \"string\"\n ? parseContext({\n context: actionData.context,\n fields,\n values: { ...values, ...globalValues },\n })\n : actionData.context;\n\n const mergedContext = {\n ...context,\n ...responseContext,\n };\n\n let parsedDomain = [];\n\n if (actionData.domain) {\n parsedDomain = await ConnectionProvider.getHandler().evalDomain({\n domain: actionData.domain,\n values: transformPlainMany2Ones({\n fields,\n values: { ...values, ...globalValues },\n }),\n fields,\n context: mergedContext,\n });\n }\n\n // -- Possible values for target property --\n // * new ==> modal\n // * current ==> new tab\n // * undefined ==> new tab\n if (actionData.target === \"new\") {\n const formView = (await ConnectionProvider.getHandler().getView({\n model: actionData.res_model,\n type: \"form\",\n id: actionData?.view_id?.[0] || undefined,\n context: mergedContext,\n })) as FormView;\n\n openActionModal({\n domain: parsedDomain,\n model: actionData.res_model,\n formView,\n context: mergedContext,\n });\n\n return {};\n } else {\n const { initialView, views } = await getViewsAndInitialView({\n model: actionData.res_model,\n context: mergedContext,\n view_mode: actionData.view_mode,\n views: actionData.views,\n });\n\n openAction?.({\n target: \"current\",\n context: mergedContext,\n domain: parsedDomain,\n model: actionData.res_model,\n views,\n title: actionData.name,\n initialView,\n action_id: actionData.id,\n action_type: actionData.type,\n });\n\n return { closeParent: true };\n }\n }\n\n function openActionModal({\n domain,\n model,\n formView,\n context,\n actionData,\n }: {\n domain: any;\n model: string;\n formView: FormView;\n context: any;\n actionData?: any;\n }) {\n if (actionModalVisible) {\n openNewActionModal({ domain, model, formView, context, actionData });\n } else {\n setActionModalOptions({ domain, model, context, formView, actionData });\n setActionModalVisible(true);\n }\n }\n\n async function openNewActionModal({\n domain,\n model,\n formView,\n context,\n actionData,\n }: {\n domain: any;\n model: string;\n formView: FormView;\n context: any;\n actionData?: any;\n }) {\n setActionModalOptions({\n domain: undefined,\n model: undefined,\n context: {},\n formView: undefined,\n actionData: undefined,\n });\n setActionModalVisible(false);\n await new Promise((resolve) => setTimeout(resolve, 300));\n setActionModalOptions({ domain, model, context, formView, actionData });\n setActionModalVisible(true);\n }\n\n async function onFormModalSucceed() {\n callRefreshValues(onRefreshParentValues.current);\n onRefreshParentValues.current = [];\n setActionModalVisible(false);\n setActionModalOptions({\n domain: undefined,\n model: undefined,\n context: {},\n formView: undefined,\n actionData: undefined,\n });\n }\n\n return (\n <>\n <ContentRootContext.Provider\n value={{\n processAction,\n globalValues,\n }}\n >\n <>\n {children}\n <Modal\n title={t(\"generatingReport\")}\n open={reportGenerating}\n footer={null}\n closable={false}\n centered\n maskClosable={false}\n >\n <Spin />\n </Modal>\n <FormModal\n buttonModal\n parentContext={actionModalOptions.context}\n model={actionModalOptions.model!}\n formView={actionModalOptions.formView}\n visible={actionModalVisible}\n onSubmitSucceed={onFormModalSucceed}\n onCancel={() => {\n callRefreshValues(onRefreshParentValues.current);\n onRefreshParentValues.current = [];\n setActionModalVisible(false);\n setActionModalOptions({\n domain: undefined,\n model: undefined,\n context: {},\n formView: undefined,\n actionData: undefined,\n });\n }}\n showFooter={false}\n actionDomain={actionModalOptions.domain}\n isMenuAction={actionModalOptions?.actionData !== undefined}\n actionData={actionModalOptions?.actionData}\n />\n </>\n </ContentRootContext.Provider>\n </>\n );\n};\n\nasync function getViewsAndInitialView({\n views,\n view_mode,\n model,\n context,\n view_id,\n}: {\n views: any[];\n view_mode: string;\n model: string;\n context: any;\n view_id?: number;\n}) {\n const retriedViewData = [];\n let initialView;\n\n if (views) {\n for (const view of views) {\n const viewData = await ConnectionProvider.getHandler().getView({\n model,\n type: view[1],\n id: view[0],\n context,\n });\n retriedViewData.push([viewData.view_id, view[1]]);\n }\n } else {\n const viewTypes = view_mode.split(\",\");\n for (const viewType of viewTypes) {\n const viewData = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType as ViewType,\n context,\n });\n retriedViewData.push([viewData.view_id, viewType]);\n }\n }\n if (views && views.length > 0) {\n const [id, type] = views[0];\n initialView = {\n id,\n type,\n };\n } else if (!view_id) {\n const type = view_mode.split(\",\")[0];\n const [retrievedViewId] = retriedViewData.find(\n ([_, viewType]) => viewType === type,\n )!;\n initialView = { id: retrievedViewId, type };\n } else {\n initialView = {\n id: view_id,\n type: view_mode.split(\",\")[0],\n };\n }\n\n return { views: retriedViewData, initialView };\n}\n\nexport default forwardRef(ContentRootProvider);\n","export const mergeFieldsContext = (fields: any, contextFields: any) => {\n const output: any = {};\n\n Object.keys(fields).forEach((key) => {\n output[key] = fields[key];\n if (contextFields?.[key]) {\n output[key].context = contextFields[key];\n }\n });\n\n return output;\n};\n","import React, {\n useState,\n forwardRef,\n useImperativeHandle,\n useEffect,\n useRef,\n useContext,\n} from \"react\";\nimport { Form as FormOoui, parseContext } from \"@gisce/ooui\";\nimport {\n Form as AntForm,\n Button,\n Divider,\n Space,\n Row,\n Spin,\n message,\n} from \"antd\";\nimport Measure from \"react-measure\";\nimport { CheckOutlined, CloseOutlined } from \"@ant-design/icons\";\nimport debounce from \"lodash/debounce\";\n\nimport Container from \"@/widgets/containers/Container\";\nimport {\n processValues,\n getTouchedValues,\n checkFieldsType,\n mergeFieldsDomain,\n getValuesForDomain,\n getOnChangePayload,\n} from \"@/helpers/formHelper\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport formErrorsDialog from \"@/ui/FormErrorsDialog\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport showWarningDialog from \"@/ui/WarningDialog\";\nimport FormProvider, {\n FormContext,\n FormContextType,\n} from \"@/context/FormContext\";\nimport { FormView, One2manyItem } from \"@/index\";\nimport {\n FormModalContext,\n FormModalContextType,\n} from \"@/context/FormModalContext\";\n\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\n\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport {\n convertFrom2ManyRawValues,\n convertToPlain2ManyValues,\n} from \"@/helpers/one2manyHelper\";\nimport { ErrorAlert } from \"@/ui/ErrorAlert\";\nimport { mergeFieldsContext } from \"@/helpers/fieldsHelper\";\n\nexport type FormProps = {\n model: string;\n readOnly?: boolean;\n id?: number;\n formView?: FormView;\n values?: any;\n showFooter?: boolean;\n getDataFromAction?: boolean;\n mustClearAfterSave?: boolean;\n submitMode?: \"api\" | \"values\" | \"2many\";\n onSubmitSucceed?: (\n id?: number,\n values?: any,\n formValues?: any,\n x2manyPendingLink?: boolean,\n ) => void;\n onSubmitError?: (error: any) => void;\n onCancel?: () => void;\n onFieldsChange?: (values: any) => void;\n postSaveAction?: (event: any) => Promise<void>;\n insideButtonModal?: boolean;\n parentContext?: any;\n actionDomain?: any;\n visible?: boolean;\n rootForm?: boolean;\n defaultValues?: any;\n forcedValues?: any;\n parentWidth?: number;\n};\n\nconst WIDTH_BREAKPOINT = 800;\n\nfunction Form(props: FormProps, ref: any) {\n const {\n model,\n id,\n onCancel: propsOnCancel,\n onSubmitSucceed: propsOnSubmitSucceed,\n showFooter = false,\n getDataFromAction = false,\n onFieldsChange,\n onSubmitError: propsOnSubmitError,\n readOnly = false,\n mustClearAfterSave = false,\n submitMode = \"api\",\n values: valuesProps,\n formView: formViewProps,\n postSaveAction,\n insideButtonModal = false,\n parentContext = {},\n actionDomain,\n visible = true,\n rootForm = false,\n defaultValues,\n forcedValues = {},\n parentWidth,\n } = props;\n const { t } = useLocale();\n\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const [formOoui, setFormOoui] = useState<FormOoui>();\n const [antForm] = AntForm.useForm();\n const [arch, setArch] = useState<string>();\n const [fields, setFields] = useState<any>();\n const formModalContext = useContext(FormModalContext) as FormModalContextType;\n const [containerWidth, setContainerWidth] = useState<any>();\n const [defaultGetCalled, setDefaultGetCalled] = useState<boolean>(false);\n\n const createdId = useRef<number>();\n const originalFormValues = useRef<any>({});\n const lastAssignedValues = useRef<any>({});\n const warningIsShown = useRef<boolean>(false);\n const formSubmitting = useRef<boolean>(false);\n const x2manyPendingLink = useRef<boolean>(false);\n\n const widthToEvaluate =\n parentWidth !== undefined ? parentWidth : containerWidth;\n const responsiveBehaviour = widthToEvaluate < WIDTH_BREAKPOINT;\n\n const formContext = useContext(FormContext) as FormContextType;\n const { activeId: parentId, getPlainValues: getParentPlainValues } =\n formContext || {};\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const {\n setFormIsSaving = undefined,\n setFormHasChanges = undefined,\n setCurrentId = undefined,\n setFormIsLoading = undefined,\n setAttachments = undefined,\n title = undefined,\n setTitle = undefined,\n } = (rootForm ? actionViewContext : {}) || {};\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction, globalValues } = contentRootContext || {};\n\n useImperativeHandle(ref, () => ({\n submitForm,\n getFields,\n getValues,\n getPlainValues,\n getContext,\n fetchValues,\n cancelUnsavedChanges,\n clearAndReload: () => {\n createdId.current = undefined;\n setFormOoui(undefined);\n fetchData();\n },\n }));\n\n useEffect(() => {\n setError(undefined);\n\n if (!model && !formViewProps) {\n return;\n }\n\n if (!visible) {\n createdId.current = undefined;\n setFormOoui(undefined);\n return;\n }\n\n // In the case we set the id to undefined for creating a new item\n if (\n (id === undefined && fields) ||\n (id !== undefined && fields && id < 0)\n ) {\n createdId.current = undefined;\n setFormOoui(undefined);\n }\n\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, model, valuesProps, formViewProps, visible]);\n\n useEffect(() => {\n if (defaultGetCalled) {\n checkFieldsChanges({\n elementHasLostFocus: true,\n });\n setDefaultGetCalled(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [defaultGetCalled]);\n\n const onSubmitSucceed = (\n id?: number,\n values?: any,\n formValues?: any,\n x2manyPendingLink?: boolean,\n ) => {\n setFormHasChanges?.(false);\n setFormIsSaving?.(false);\n propsOnSubmitSucceed?.(id, values, formValues, x2manyPendingLink);\n setCurrentId?.(id);\n };\n\n const onCancel = () => {\n setFormIsSaving?.(false);\n propsOnCancel?.();\n };\n\n const onSubmitError = (error: any) => {\n setFormIsSaving?.(false);\n propsOnSubmitError?.(error);\n };\n\n function getCurrentId() {\n return id || createdId.current;\n }\n\n function getFields() {\n return fields;\n }\n\n function getValues() {\n const values = {\n ...getCurrentValues(fields),\n ...getAdditionalValues(),\n };\n\n for (const key in values) {\n if (values[key] === undefined) {\n delete values[key];\n }\n }\n\n return values;\n }\n\n function getPlainValues() {\n const values: any = getValues();\n const fields: any = getFields();\n const reformattedValues: { [key: string]: any } = {};\n\n Object.keys(values).forEach((key) => {\n const value = values[key];\n\n if (\n fields[key] &&\n fields[key].type === \"many2one\" &&\n value &&\n Array.isArray(value) &&\n value.length === 2\n ) {\n reformattedValues[key] = value[0];\n } else if (\n fields[key] &&\n (fields[key].type === \"one2many\" || fields[key].type === \"many2many\") &&\n value &&\n value.items\n ) {\n reformattedValues[key] = value.items\n .filter((item: One2manyItem) => item.operation !== \"pendingRemove\")\n .map((val: any) => val.id);\n } else {\n reformattedValues[key] = value;\n }\n });\n\n return reformattedValues;\n }\n\n function getFormValues() {\n const values = {\n ...getCurrentValues(fields),\n };\n\n for (const key in values) {\n if (values[key] === undefined) {\n delete values[key];\n }\n }\n\n return values;\n }\n\n function getContext() {\n return { ...parentContext, ...formOoui?.context };\n }\n\n function getActiveIdsContext() {\n const currentId = getCurrentId()!;\n\n if (!currentId) {\n return {};\n }\n return { active_id: getCurrentId()!, active_ids: [getCurrentId()!] };\n }\n\n function getAdditionalValues() {\n return {\n id: getCurrentId()!,\n active_id: getCurrentId()!,\n active_ids: [getCurrentId()!],\n parent_id: parentId,\n ...globalValues,\n };\n }\n\n const getDefaultValues = async (fields: any) => {\n const formContext = getCurrentId() ? formOoui?.context : {};\n return await ConnectionProvider.getHandler().defaultGet({\n model,\n fields,\n context: { ...parentContext, ...formContext },\n extraValues: defaultValues,\n });\n };\n\n const formHasChanges = () => {\n return (\n Object.keys(\n getTouchedValues({\n source: originalFormValues.current,\n target: getCurrentValues(fields),\n fields,\n }),\n ).length !== 0\n );\n };\n\n const getCurrentValues = (fields: any) => {\n const currentValues = antForm.getFieldsValue(true);\n return processValues(currentValues, fields);\n };\n\n const setFieldValue = (field: string, value?: string) => {\n assignNewValuesToForm({\n values: {\n ...processValues(antForm.getFieldsValue(true), fields),\n [field]: value,\n },\n fields,\n reset: false,\n });\n };\n\n const getFieldValue = (field: string) => {\n const values = antForm.getFieldsValue(true);\n return values[field];\n };\n\n async function checkIfFormHasErrors() {\n try {\n await antForm.validateFields();\n return false;\n } catch (verror) {\n message.error(t(\"fillRequiredFields\"));\n return true;\n }\n }\n const fetchData = async () => {\n setError(undefined);\n setFormIsLoading?.(true);\n\n let view;\n\n try {\n if (formViewProps) {\n view = { arch: formViewProps.arch, fields: formViewProps.fields };\n } else {\n view = await getFormView();\n }\n\n const { fields, arch } = view;\n setFields(fields);\n setArch(arch);\n\n await fetchValues({\n fields,\n arch,\n });\n } catch (err) {\n setError(err?.message ? err.message + err.stack : err);\n setFormIsLoading?.(false);\n // setLoading(false);\n }\n };\n\n type FetchValuesOptions = {\n fields?: any;\n arch?: string;\n forceRefresh?: boolean;\n };\n\n const fetchValues = async (options?: FetchValuesOptions) => {\n let values;\n let _fields;\n let _arch;\n let hasDefaultGetCalled;\n\n setFormIsLoading?.(true);\n setError(undefined);\n\n if (options?.fields) {\n _fields = options.fields;\n _arch = options.arch;\n } else {\n _fields = fields;\n _arch = arch;\n }\n\n if (valuesProps && options?.forceRefresh !== true) {\n values = valuesProps;\n } else {\n ({ values, defaultGetCalled: hasDefaultGetCalled } =\n await fetchValuesFromApi({\n fields: _fields,\n arch: _arch!,\n }));\n }\n\n if (actionDomain) {\n values = { ...getValuesForDomain(actionDomain), ...values };\n }\n\n originalFormValues.current = processValues(values, _fields);\n\n assignNewValuesToForm({\n values,\n fields: _fields,\n reset: true,\n isDefaultGet: hasDefaultGetCalled,\n });\n parseForm({ fields: _fields, arch: _arch!, values });\n setFormIsLoading?.(false);\n setFormHasChanges?.(false);\n\n if (hasDefaultGetCalled) {\n setDefaultGetCalled(true);\n }\n };\n\n const cancelUnsavedChanges = async () => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n if (formHasChanges()) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n onCancel?.();\n resolve(true);\n },\n onCancel: () => {\n resolve(false);\n },\n });\n } else {\n onCancel?.();\n resolve(true);\n }\n });\n };\n\n const getFormView = async (): Promise<FormView> => {\n if (getDataFromAction) {\n const action =\n await ConnectionProvider.getHandler().getActionStringForModel(model);\n const viewsForAction =\n await ConnectionProvider.getHandler().getViewsForAction({\n action,\n context: parentContext,\n });\n return viewsForAction.views.get(\"form\");\n }\n\n return (await ConnectionProvider.getHandler().getView({\n model,\n type: \"form\",\n context: parentContext,\n })) as FormView;\n };\n\n const assignNewValuesToForm = ({\n values: newValues,\n fields,\n reset,\n isDefaultGet = false,\n }: {\n values: any;\n fields: any;\n reset: boolean;\n isDefaultGet?: boolean;\n }) => {\n const currentValues = reset ? {} : antForm.getFieldsValue(true);\n const mergedValues = { ...currentValues, ...newValues };\n const valuesProcessed = processValues(mergedValues, fields);\n const fieldsToUpdate = Object.keys(fields).map((fieldName) => {\n const fieldValue =\n valuesProcessed[fieldName] !== undefined\n ? valuesProcessed[fieldName]\n : undefined;\n return {\n name: fieldName,\n touched: false,\n value: fieldValue,\n };\n });\n\n if (!isDefaultGet) {\n lastAssignedValues.current = valuesProcessed;\n }\n\n antForm.setFields(fieldsToUpdate);\n };\n\n const fetchValuesFromApi = async ({\n fields,\n arch,\n }: {\n fields: any;\n arch: string;\n }) => {\n let values = {};\n let defaultGetCalled = false;\n\n if (getCurrentId()!) {\n const ooui =\n formOoui ||\n getFormOoui({\n arch: arch!,\n fields,\n values: {},\n });\n values = (\n await ConnectionProvider.getHandler().readObjects({\n model,\n ids: [getCurrentId()!],\n fields: mergeFieldsContext(fields, ooui?.contextForFields),\n context: parentContext,\n })\n )[0];\n\n // If we are inside a modal, we don't want to fetch the attachments\n if (insideButtonModal) {\n return { values, defaultGetCalled };\n }\n const results = await ConnectionProvider.getHandler().search({\n params: [\n [\"res_model\", \"=\", model],\n [\"res_id\", \"=\", getCurrentId()!],\n ],\n fieldsToRetrieve: [\"id\", \"name\"],\n context: getContext(),\n model: \"ir.attachment\",\n });\n setAttachments?.(results);\n } else {\n setAttachments?.([]);\n values = await getDefaultValues(fields);\n defaultGetCalled = true;\n }\n return { values, defaultGetCalled };\n };\n\n const submitApi = async (options?: { callOnSubmitSucceed?: boolean }) => {\n const { callOnSubmitSucceed = true } = options || {};\n\n if (getCurrentId()) {\n const touchedValues = getTouchedValues({\n source: originalFormValues.current,\n target: getCurrentValues(fields),\n fields,\n });\n\n await ConnectionProvider.getHandler().update({\n model,\n id: getCurrentId()!,\n values: { ...touchedValues, ...forcedValues },\n fields,\n context: {\n ...parentContext,\n ...formOoui?.context,\n },\n });\n originalFormValues.current = getCurrentValues(fields);\n } else {\n const currentValues = getCurrentValues(fields);\n\n const newId = await ConnectionProvider.getHandler().create({\n model,\n values: { ...currentValues, ...forcedValues },\n fields,\n context: {\n ...parentContext,\n ...formOoui?.context,\n },\n });\n createdId.current = newId;\n originalFormValues.current = currentValues;\n }\n\n if (postSaveAction) {\n await postSaveAction([getCurrentId()]);\n }\n\n if (!insideButtonModal && callOnSubmitSucceed) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n }\n };\n\n const submitValues = async (options?: { callOnSubmitSucceed?: boolean }) => {\n const { callOnSubmitSucceed = true } = options || {};\n\n if (!insideButtonModal && callOnSubmitSucceed) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n }\n };\n\n const submitForm = async (options?: { callOnSubmitSucceed?: boolean }) => {\n let submitSucceed = false;\n const { callOnSubmitSucceed = true } = options || {};\n formSubmitting.current = true;\n\n setError(undefined);\n\n if (\n x2manyPendingLink.current &&\n !formHasChanges() &&\n getCurrentId()! &&\n callOnSubmitSucceed\n ) {\n formSubmitting.current = false;\n setFormHasChanges?.(false);\n onSubmitSucceed?.(\n getCurrentId(),\n getValues(),\n getFormValues(),\n x2manyPendingLink.current,\n );\n x2manyPendingLink.current = false;\n const currentId = getCurrentId()!;\n\n if (mustClearAfterSave) {\n createdId.current = undefined;\n assignNewValuesToForm({ values: {}, fields, reset: true });\n }\n\n return { succeed: true, id: currentId };\n }\n\n if (!formHasChanges() && getCurrentId()! && callOnSubmitSucceed) {\n formSubmitting.current = false;\n setFormHasChanges?.(false);\n onCancel?.();\n return { succeed: true, id: getCurrentId()! };\n }\n\n if (await checkIfFormHasErrors()) {\n formSubmitting.current = false;\n formErrorsDialog(t);\n return { succeed: false, id: getCurrentId()! };\n }\n\n setIsSubmitting(true);\n setFormIsSaving?.(true);\n\n try {\n if (submitMode === \"api\") {\n await submitApi(options);\n } else {\n await submitValues(options);\n }\n\n if (mustClearAfterSave) {\n createdId.current = undefined;\n assignNewValuesToForm({ values: {}, fields, reset: true });\n }\n\n await fetchValues({ forceRefresh: true });\n submitSucceed = true;\n message.success(t(\"savedRegisters\"));\n } catch (err) {\n formSubmitting.current = false;\n setIsSubmitting(false);\n setFormIsSaving?.(false);\n onSubmitError?.(err);\n message.error(t(\"errorWhileSavingForm\"));\n setError(err?.message ? err.message : err);\n } finally {\n formSubmitting.current = false;\n setFormIsSaving?.(false);\n setIsSubmitting(false);\n }\n\n return { succeed: submitSucceed, id: getCurrentId()! };\n };\n\n const getFormOoui = ({\n fields,\n arch,\n values,\n operationInProgress = false,\n }: {\n arch: string;\n fields: any;\n values: any;\n operationInProgress?: boolean;\n }) => {\n const ooui = new FormOoui(fields);\n // Here we must inject `values` to the ooui parser in order to evaluate arch+values and get the new form container\n ooui.parse(arch, {\n readOnly: readOnly || operationInProgress,\n values: convertToPlain2ManyValues(\n {\n ...values,\n ...getAdditionalValues(),\n },\n fields,\n ),\n });\n return ooui;\n };\n\n const parseForm = ({\n fields,\n arch,\n values,\n operationInProgress = false,\n }: {\n arch: string;\n fields: any;\n values: any;\n operationInProgress?: boolean;\n }) => {\n const ooui = getFormOoui({\n arch,\n fields,\n values,\n operationInProgress,\n });\n\n setFormOoui(ooui);\n\n if (ooui.string && ooui.string !== title) {\n setTitle?.(ooui.string);\n }\n\n if (formModalContext && ooui.string)\n formModalContext.setTitle?.(ooui.string);\n };\n\n const checkFieldsChanges = async ({\n elementHasLostFocus = false,\n }: {\n elementHasLostFocus?: boolean;\n }) => {\n if (formSubmitting.current) return;\n\n const touchedValues = getTouchedValues({\n source: lastAssignedValues.current,\n target: getCurrentValues(fields),\n fields,\n });\n\n const changedFields = Object.keys(touchedValues);\n\n if (changedFields.length !== 0) {\n // We check if there are any field of type text, email, url or char inside the changed values\n // in order to ignore the call, because it will fire when element lost focus\n if (\n checkFieldsType({\n changedFields,\n formOoui: formOoui!,\n types: [\n \"text\",\n \"codeeditor\",\n \"email\",\n \"url\",\n \"char\",\n \"float\",\n \"float_time\",\n \"integer\",\n \"many2one\",\n ],\n }) &&\n elementHasLostFocus !== true\n ) {\n /* empty */\n } else {\n const values = processValues(antForm.getFieldsValue(true), fields);\n lastAssignedValues.current = values;\n\n onFieldsChange?.(values);\n setFormHasChanges?.(true);\n\n evaluateChanges(changedFields);\n }\n }\n };\n\n const debouncedCheckFieldsChanges = debounce(checkFieldsChanges, 100);\n\n const evaluateChanges = async (changedFields: any) => {\n try {\n for (let i = 0; i < changedFields.length; i += 1) {\n const changedField = changedFields[i];\n await processFieldOnChange(changedField);\n }\n } catch (err) {\n showErrorDialog(err);\n }\n };\n\n const processFieldOnChange = async (fieldName: string) => {\n const onChangeFieldAction = formOoui?.onChangeFields[fieldName];\n\n if (!onChangeFieldAction) {\n parseForm({\n fields,\n arch: arch!,\n values: getCurrentValues(fields),\n });\n return;\n }\n\n const payload = getOnChangePayload({\n values: {\n ...getCurrentValues(fields),\n context: {\n ...parentContext,\n ...formOoui?.context,\n },\n },\n parentValues: getParentPlainValues?.(),\n onChangeFieldActionArgs: onChangeFieldAction.args,\n });\n\n const response = await ConnectionProvider.getHandler().executeOnChange({\n model,\n action: onChangeFieldAction.method,\n ids: getCurrentId()! ? [getCurrentId()!] : [],\n payload,\n fields,\n });\n\n if (response.value) {\n const processedValues = {\n ...getCurrentValues(fields),\n ...response.value,\n };\n\n const valuesWith2ManyValuesConverted = convertFrom2ManyRawValues({\n values: processedValues,\n fields,\n });\n\n parseForm({\n fields,\n arch: arch!,\n values: valuesWith2ManyValuesConverted,\n });\n\n assignNewValuesToForm({\n values: valuesWith2ManyValuesConverted,\n fields,\n reset: false,\n });\n }\n\n if (\n response.warning &&\n response.warning.title &&\n response.warning.message &&\n !warningIsShown.current\n ) {\n const { title, message } = response.warning;\n warningIsShown.current = true;\n showWarningDialog(title, message, () => {\n warningIsShown.current = false;\n });\n }\n\n if (response.domain && Object.keys(response.domain).length > 0) {\n const proccessedFields = mergeFieldsDomain({\n fieldsDomain: response.domain,\n fields,\n });\n\n parseForm({\n fields: proccessedFields,\n arch: arch!,\n values: getCurrentValues(proccessedFields),\n });\n setFields(proccessedFields);\n }\n };\n\n async function runObjectButton({\n action,\n context,\n }: {\n action: string;\n context: any;\n }) {\n const response = await ConnectionProvider.getHandler().execute({\n model,\n action,\n payload: [getCurrentId()!],\n context: {\n ...formOoui?.context,\n ...parentContext,\n ...context,\n },\n });\n\n if (\n typeof response === \"object\" &&\n response !== null &&\n Object.keys(response).length === 0 &&\n insideButtonModal\n ) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n } else if (\n response.type &&\n response.type === \"ir.actions.act_window_close\"\n ) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n } else if (response.type) {\n let responseContext = {};\n\n if (response.context) {\n responseContext = parseContext({\n context: response.context,\n fields,\n values: getValues(),\n });\n }\n\n await runAction({\n actionData: response,\n context: { ...context, ...responseContext },\n });\n } else {\n await fetchValues({ forceRefresh: true });\n }\n }\n\n async function runWorkflowButton({ action }: { action: string }) {\n const response = await ConnectionProvider.getHandler().executeWorkflow({\n model,\n action,\n payload: getCurrentId()!,\n });\n\n if (response.type && response.type === \"ir.actions.act_window_close\") {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n } else {\n await fetchValues({ forceRefresh: true });\n }\n }\n\n async function runActionButton({\n action,\n context,\n }: {\n action: string;\n context: any;\n }) {\n const actionData = (\n await ConnectionProvider.getHandler().readObjects({\n model: \"ir.actions.actions\",\n ids: [parseInt(action)],\n context: parentContext,\n })\n )[0];\n\n await runAction({ actionData, context });\n }\n\n async function runAction({\n actionData,\n context,\n }: {\n actionData: any;\n context: any;\n }) {\n const { closeParent } =\n (await processAction?.({\n actionData,\n fields,\n values: getValues(),\n context: {\n ...parentContext,\n ...formOoui?.context,\n ...context,\n },\n onRefreshParentValues: () => {\n fetchValues({ forceRefresh: true });\n },\n })) || {};\n\n if (!rootForm && closeParent) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n }\n }\n\n function elementHasLostFocus() {\n checkFieldsChanges({ elementHasLostFocus: true });\n }\n\n function updateOperationInProgress(value: boolean) {\n parseForm({\n fields,\n arch: arch!,\n values: getCurrentValues(fields),\n operationInProgress: value,\n });\n }\n\n async function executeButtonAction({\n type,\n action,\n context,\n }: {\n type: string;\n action: string;\n context?: any;\n }) {\n // If the type of the button it's a cancel, we just close our form\n if (type === \"cancel\") {\n onCancel?.();\n return;\n }\n\n // We check for required fields\n if (await checkIfFormHasErrors()) {\n formErrorsDialog(t);\n return;\n }\n\n let mustBlockButtons = false;\n\n try {\n if (!readOnly && (formHasChanges() || getCurrentId() === undefined)) {\n mustBlockButtons = true;\n updateOperationInProgress(true);\n if (submitMode === \"2many\") {\n await submitApi({ callOnSubmitSucceed: false });\n x2manyPendingLink.current = true;\n } else {\n await submitForm({ callOnSubmitSucceed: false });\n }\n }\n\n const additionalContext = x2manyPendingLink.current\n ? getActiveIdsContext()\n : {};\n\n const updatedContext = { ...context, ...additionalContext };\n\n if (type === \"object\") {\n await runObjectButton({ action, context: updatedContext });\n } else if (type === \"workflow\") {\n await runWorkflowButton({ action });\n } else if (type === \"action\") {\n await runActionButton({ action, context: updatedContext });\n }\n mustBlockButtons && updateOperationInProgress(false);\n } catch (err) {\n mustBlockButtons && updateOperationInProgress(false);\n showErrorDialog(err);\n }\n }\n\n const content = () => {\n if (!formOoui && !error) {\n return <Spin />;\n }\n\n if (!model && !formViewProps) {\n return null;\n }\n\n if (!visible) {\n return null;\n }\n\n return (\n <>\n <FormProvider\n getValues={getValues}\n getPlainValues={getPlainValues}\n getFields={getFields}\n domain={actionDomain}\n activeId={id}\n activeModel={model}\n setFieldValue={setFieldValue}\n getFieldValue={getFieldValue}\n executeButtonAction={executeButtonAction}\n getContext={getContext}\n submitForm={submitForm}\n fetchValues={fetchValues}\n formHasChanges={formHasChanges}\n elementHasLostFocus={elementHasLostFocus}\n formView={formViewProps}\n >\n <AntForm\n form={antForm}\n onFieldsChange={() => {\n debouncedCheckFieldsChanges({ elementHasLostFocus: false });\n }}\n component={false}\n >\n {formOoui && (\n <Container\n container={formOoui.container}\n responsiveBehaviour={responsiveBehaviour}\n />\n )}\n </AntForm>\n </FormProvider>\n </>\n );\n };\n\n const footer = () => {\n return (\n <>\n <Divider />\n <Row justify=\"end\">\n <Space>\n <Button\n icon={<CloseOutlined />}\n disabled={isSubmitting}\n onClick={async () => {\n await cancelUnsavedChanges();\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isSubmitting || readOnly}\n loading={isSubmitting}\n icon={<CheckOutlined />}\n onClick={async () => {\n await submitForm();\n }}\n type=\"primary\"\n >\n OK\n </Button>\n </Space>\n </Row>\n </>\n );\n };\n\n if (!visible) {\n return null;\n }\n\n return (\n <Measure\n bounds\n onResize={(contentRect) => {\n setContainerWidth(contentRect.bounds?.width!);\n }}\n >\n {({ measureRef }) => (\n <div className=\"pb-2\" ref={measureRef}>\n {error && <ErrorAlert className=\"mt-5 mb-10\" error={error} />}\n {content()}\n {showFooter && footer()}\n </div>\n )}\n </Measure>\n );\n}\n\nexport default forwardRef(Form);\n","import React, { useEffect, useState } from \"react\";\nimport { Button, Col, Modal, Row, Tooltip } from \"antd\";\nimport Form, { FormProps } from \"@/widgets/views/Form\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport FormModalProvider from \"@/context/FormModalContext\";\nimport { StarOutlined, StarFilled } from \"@ant-design/icons\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\ntype FormModalProps = FormProps & {\n visible: boolean;\n title?: string;\n buttonModal?: boolean;\n isMenuAction?: boolean;\n actionData?: any;\n};\n\nexport const FormModal = (props: FormModalProps) => {\n const {\n visible,\n id,\n title,\n buttonModal = false,\n onCancel,\n isMenuAction = false,\n actionData,\n ...rest\n } = props;\n\n const { model } = rest;\n\n const { modalWidth } = useWindowDimensions();\n const [formTitle, setFormTitle] = useState<string>(title!);\n const [isFavourite, setIsFavourite] = useState(false);\n const [currentShortcutId, setCurrentShortcutId] = useState<number>();\n const { action_id, res_id, action_type, view_id } = actionData || {};\n\n useEffect(() => {\n if (isMenuAction) {\n checkFavourite();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [actionData, isMenuAction]);\n\n async function checkFavourite() {\n const result = await ConnectionProvider.getHandler().isShortcutFavorite({\n action_id,\n action_type,\n view_id,\n res_id: res_id || false,\n });\n\n setIsFavourite(result !== false);\n\n if (result !== false) {\n setCurrentShortcutId(result as number);\n }\n }\n\n async function toggleFavourite() {\n if (isFavourite && currentShortcutId) {\n await ConnectionProvider.getHandler().removeFavourite({\n shortcut_id: currentShortcutId,\n });\n } else {\n const { action_id, res_id, action_type, view_id } = actionData;\n\n await ConnectionProvider.getHandler().addFavourite({\n action_id,\n action_type,\n view_id,\n res_id: res_id || false,\n });\n }\n\n setIsFavourite(!isFavourite);\n }\n\n function header() {\n return (\n <Row align=\"middle\">\n <Col>\n <Button\n type={isFavourite ? \"primary\" : \"default\"}\n icon={\n isFavourite ? (\n <StarFilled style={{ color: \"white\" }} />\n ) : (\n <StarOutlined />\n )\n }\n style={{ width: 30 }}\n onClick={toggleFavourite}\n ></Button>\n </Col>\n <Col style={{ paddingLeft: 10 }}>{formTitle}</Col>\n </Row>\n );\n }\n\n const contentWidth = modalWidth * 0.95;\n return (\n <FormModalProvider setTitle={setFormTitle}>\n <Modal\n title={isMenuAction ? header() : formTitle}\n centered\n width={modalWidth}\n open={visible}\n footer={null}\n destroyOnClose\n onCancel={onCancel}\n maskClosable={false}\n >\n <Form\n key={`${model}-${id}-${action_id}-${res_id}-${action_type}-${view_id}-${title}`}\n id={id}\n showFooter={true}\n insideButtonModal={buttonModal}\n onCancel={onCancel}\n parentWidth={contentWidth}\n {...rest}\n />\n </Modal>\n </FormModalProvider>\n );\n};\n","import { DatePicker } from \"antd\";\n\nimport React from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\nexport const DateRangePicker = (props: WidgetProps) => {\n return (\n <Field {...props} layout={\"vertical\"}>\n <DatePicker.RangePicker\n allowEmpty={[true, true]}\n format={\"DD/MM/YYYY\"}\n ></DatePicker.RangePicker>\n </Field>\n );\n};\n","import { TimePicker as AntTimePicker } from \"antd\";\nimport { useRef } from \"react\";\nimport { Dayjs } from \"dayjs\";\n\ninterface TimePickerProps {\n value?: Dayjs | null;\n onChange: (newValue: Dayjs | null, timestring?: string) => void;\n numberOfSelectsToHide?: number;\n [key: string]: any; // Accept any additional props\n}\n\nexport const TimePicker = ({\n value,\n onChange,\n numberOfSelectsToHide = 2,\n ...rest\n}: TimePickerProps) => {\n const picker = useRef<any>();\n const pickerSelectedTimes = useRef(0);\n return (\n <AntTimePicker\n {...rest}\n ref={picker}\n value={value}\n onChange={onChange}\n showNow={false}\n changeOnBlur={true}\n onSelect={(newValue) => {\n onChange?.(newValue);\n pickerSelectedTimes.current += 1;\n if (pickerSelectedTimes.current === numberOfSelectsToHide) {\n picker.current?.blur();\n pickerSelectedTimes.current = 0;\n }\n }}\n />\n );\n};\n","import { DatePicker, Row, Col } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Field as FieldOoui, Label as LabelOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport Label from \"@/widgets/base/Label\";\nimport { TimePicker } from \"../../../common/TimePicker\";\n\nexport const DateTimeRangePicker = (props: WidgetProps) => {\n const { ooui, showLabel = false } = props;\n const { label, id } = ooui;\n\n const fields = [\n new FieldOoui({\n name: id + \"#date\",\n label: \"\",\n }),\n new FieldOoui({\n name: id + \"#time\",\n label: \"\",\n }),\n ];\n\n return (\n <>\n {showLabel && (\n <Label\n ooui={\n new LabelOoui({\n name: id + \"_label\",\n string: label,\n help: ooui.tooltip,\n fieldForLabel: id,\n })\n }\n align={\"left\"}\n />\n )}\n <Row align={\"bottom\"} className=\"p-0\">\n <Col className=\"mr-2\">\n <Field {...props} ooui={fields[0]} showLabel={false}>\n <DatePicker.RangePicker\n className=\"w-60\"\n allowEmpty={[true, true]}\n format={\"DD/MM/YYYY\"}\n ></DatePicker.RangePicker>\n </Field>\n </Col>\n <Col>\n <Field {...props} ooui={fields[1]} showLabel={false}>\n <TimeRangePicker />\n </Field>\n </Col>\n </Row>\n </>\n );\n};\n\nconst TimeRangePicker = ({\n value,\n onChange,\n}: {\n value?: any;\n onChange?: (newValue: any) => void;\n}) => {\n return (\n <div style={{ marginTop: 5 }}>\n <TimePicker\n placeholder=\"Start time\"\n format={\"HH:mm\"}\n style={{ width: 115, marginRight: 10 }}\n value={value?.[0]}\n onChange={(newValue) => {\n onChange?.([newValue, value?.[1]]);\n }}\n />\n <TimePicker\n placeholder=\"End time\"\n style={{ width: 115 }}\n format={\"HH:mm\"}\n value={value?.[1]}\n onChange={(newValue) => {\n onChange?.([value?.[0], newValue]);\n }}\n />\n </div>\n );\n};\n","import React, { useContext } from \"react\";\nimport { InputNumber, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Float as FloatOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\nexport const Float = (props: WidgetProps) => {\n const { ooui } = props;\n const { id, decimalDigits, readOnly, required } = ooui as FloatOoui;\n const { token } = useToken();\n\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n return (\n <Field required={required} type={\"number\"} {...props}>\n <InputNumber\n disabled={readOnly}\n className={\"w-full\"}\n style={requiredStyle}\n id={id}\n precision={decimalDigits}\n formatter={(value) => {\n return `${value}`.replace(/[^0-9.-]+/g, \"\");\n }}\n decimalSeparator={\".\"}\n onBlur={elementHasLostFocus}\n wheel={false}\n />\n </Field>\n );\n};\n","import React, { useContext } from \"react\";\nimport { InputNumber, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\ntype IntegerProps = WidgetProps & {\n onChange?: (newValue: number) => void;\n};\n\nexport const Integer = (props: IntegerProps) => {\n const { ooui, onChange } = props;\n const { id, readOnly, required } = ooui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n return (\n <Field required={required} type={\"number\"} {...props}>\n <InputNumber\n id={id}\n className={\"w-full \"}\n disabled={readOnly}\n formatter={(value) => {\n // Check if value is not undefined and is a valid number\n if (value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\" && !isNaN(parseFloat(value))) {\n const truncatedValue = Math.trunc(parseFloat(value));\n return `${truncatedValue}`.replace(/[^0-9\\-]+/g, \"\");\n } else if (typeof value === \"number\") {\n const truncatedValue = Math.trunc(value);\n return `${truncatedValue}`.replace(/[^0-9\\-]+/g, \"\");\n }\n\n return \"\";\n }}\n onChange={(newValue: any) => {\n const newNumber = newValue as number;\n onChange?.(newNumber);\n }}\n onBlur={elementHasLostFocus}\n precision={0}\n style={requiredStyle}\n wheel={false}\n />\n </Field>\n );\n};\n","import React from \"react\";\nimport { Row, Col } from \"antd\";\nimport { Float } from \"@/widgets/base/Float\";\nimport { Integer } from \"@/widgets/base/Integer\";\nimport { Integer as IntegerOoui, Label as LabelOoui } from \"@gisce/ooui\";\nimport Label from \"@/widgets/base/Label\";\nimport { WidgetProps } from \"@/types\";\n\ntype Props = {\n ooui: any;\n};\n\nexport function PairFields(props: WidgetProps): React.ReactElement {\n const { ooui, showLabel } = props;\n const { id, label, tooltip } = ooui;\n const Widget = ooui instanceof IntegerOoui ? Integer : Float;\n\n const getWidget = (suffix: string) => {\n return (\n <Widget\n ooui={{\n ...(ooui as any),\n id: id + suffix,\n label: \"\",\n tooltip: undefined,\n }}\n layout=\"vertical\"\n />\n );\n };\n\n return (\n <>\n {showLabel && (\n <Label\n ooui={\n new LabelOoui({\n name: id + \"_label\",\n string: label,\n help: tooltip,\n fieldForLabel: id,\n })\n }\n align={\"left\"}\n />\n )}\n <Row align={\"bottom\"} className=\"mt-0\" wrap={false}>\n <Col>{getWidget(\"#from\")}</Col>\n <Col className=\"pb-1\">\n <span className=\"pl-2 pr-2 h-full\"> - </span>\n </Col>\n <Col>{getWidget(\"#to\")}</Col>\n </Row>\n </>\n );\n}\n","import React from \"react\";\nimport { Select, theme } from \"antd\";\nimport styled from \"styled-components\";\n\nimport Field from \"@/common/Field\";\nimport { Selection as SelectionOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\nconst { Option } = Select;\n\nexport const MultiSelection = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <MultiSelectionInput {...props} />\n </Field>\n );\n};\n\ntype SelectionInputProps = WidgetProps & {\n onChange?: (value: any) => void;\n value?: string[];\n};\n\nexport const MultiSelectionInput = (props: SelectionInputProps) => {\n const { ooui, onChange, value } = props;\n const { selectionValues, readOnly, required } = ooui as SelectionOoui;\n\n const values = Array.from(selectionValues.entries());\n\n const options =\n values &&\n values.length &&\n values\n .filter((optionValueKeyPair) => {\n const [optionKey] = optionValueKeyPair;\n if (!value) {\n return true;\n }\n return !value.includes(optionKey);\n })\n .map((entry: string[]) => {\n const [key, value] = entry;\n return (\n <Option key={key} value={value}>\n {value}\n </Option>\n );\n });\n\n const CustomSelect: any = required && !readOnly ? RequiredSelect : Select;\n\n function handleChange(changedValues: string[]) {\n const keysForChangedValues = changedValues.map((changedValue) => {\n const entry = values.find(([key, value]) => changedValue === value);\n return entry && entry[0];\n });\n\n if (keysForChangedValues.length === 0) {\n onChange?.(undefined);\n return;\n }\n\n onChange?.(keysForChangedValues);\n }\n\n return (\n <CustomSelect\n disabled={readOnly}\n onChange={handleChange}\n value={value?.map((key) => selectionValues.get(key))}\n mode=\"multiple\"\n showArrow={true}\n >\n {options}\n </CustomSelect>\n );\n};\n\nconst RequiredSelect = styled(Select)`\n &.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n background-color: ${mapToken.colorPrimaryBg};\n }\n`;\n","import React, { useContext } from \"react\";\n\nimport { Char } from \"@/widgets/base/Char\";\nimport { Selection } from \"@/widgets/base/Selection\";\nimport { DateRangePicker } from \"./DateRangePicker\";\nimport { DateTimeRangePicker } from \"./DateTimeRangePicker\";\nimport { PairFields } from \"./PairFields\";\n\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nimport {\n Field,\n SearchFieldTypes,\n Selection as SelectionOoui,\n} from \"@gisce/ooui\";\nimport { MultiSelection } from \"@/widgets/base/MultiSelection\";\n\ntype Props = {\n field: Field;\n};\n\nexport function SearchField(props: Props) {\n const { field } = props;\n field.readOnly = false;\n field.required = false;\n\n const { t } = useLocale();\n\n const widgetType = field.type;\n\n switch (widgetType) {\n case SearchFieldTypes.boolean: {\n const ooui = new SelectionOoui({\n name: field._id,\n string: field.label,\n selection: [\n [\"true\", t(\"true\")],\n [\"false\", t(\"false\")],\n ],\n });\n\n return <Selection layout=\"vertical\" ooui={ooui} showLabel />;\n }\n case SearchFieldTypes.float:\n case SearchFieldTypes.progressbar:\n case SearchFieldTypes.float_time:\n case SearchFieldTypes.integer: {\n return <PairFields ooui={field} showLabel />;\n }\n case SearchFieldTypes.date: {\n return <DateRangePicker ooui={field} layout=\"vertical\" showLabel />;\n }\n case SearchFieldTypes.datetime: {\n return <DateTimeRangePicker ooui={field} layout=\"vertical\" showLabel />;\n }\n case SearchFieldTypes.selection: {\n return <MultiSelection layout=\"vertical\" ooui={field} showLabel />;\n }\n default: {\n return <Char ooui={field} layout=\"vertical\" showLabel isSearchField />;\n }\n }\n}\n","import { ReactElement, useContext } from \"react\";\n\nimport { Row, Col, Button } from \"antd\";\nimport {\n DownOutlined,\n UpOutlined,\n SearchOutlined,\n ClearOutlined,\n} from \"@ant-design/icons\";\n\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n advancedFilter: boolean;\n isSearching: boolean;\n onAdvancedFilterToggle: () => void;\n onClear: () => void;\n};\n\nexport function SearchBottomBar(props: Props): ReactElement {\n const { onAdvancedFilterToggle, advancedFilter, onClear, isSearching } =\n props;\n\n const { t } = useLocale();\n\n return (\n <Row>\n <Col span={12} className=\"text-left pt-4 pb-2 pl-2\">\n <a className=\"text-xs\" onClick={onAdvancedFilterToggle}>\n {advancedFilter ? (\n <UpOutlined className=\"pr-1\" />\n ) : (\n <DownOutlined className=\"pr-1\" />\n )}\n {advancedFilter ? t(\"simple_search\") : t(\"advanced_search\")}\n </a>\n </Col>\n <Col span={12} className=\"text-right pb-2\">\n <Button className=\"mr-5\" icon={<ClearOutlined />} onClick={onClear}>\n {t(\"clear\")}\n </Button>\n <Button\n icon={<SearchOutlined />}\n loading={isSearching}\n className=\"mr-2\"\n type=\"primary\"\n htmlType=\"submit\"\n >\n {t(\"search\")}\n </Button>\n </Col>\n </Row>\n );\n}\n","import React, { useContext } from \"react\";\n\nimport { Integer } from \"@/widgets/base/Integer\";\nimport { Row, Space } from \"antd\";\nimport { Integer as IntegerOoui } from \"@gisce/ooui\";\n\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype SearchParamsProps = {\n onLimitChange?: (limit: number) => void;\n};\n\nexport function SearchParams(props: SearchParamsProps): React.ReactElement {\n const { onLimitChange } = props;\n const { t } = useLocale();\n\n const limitOoui = new IntegerOoui({ name: \"limit\" });\n const offsetOoui = new IntegerOoui({ name: \"offset\" });\n return (\n <div className=\"pl-2 pt-2\">\n <Row key={\"count_params\"}>{t(\"parameters\")}</Row>\n <Space align=\"center\">\n {t(\"limit\") + \" :\"}\n <Integer\n ooui={limitOoui}\n onChange={(newValue: number) => {\n onLimitChange?.(newValue);\n }}\n />\n {t(\"first\") + \" :\"}\n <Integer ooui={offsetOoui} />\n </Space>\n </div>\n );\n}\n","const convertBooleanParamIfNeeded = (value: any) => {\n if ((typeof value === \"string\" && value === \"true\") || value === \"false\") {\n return value === \"true\";\n }\n return value;\n};\n\nexport const getParamsForFields = (values: any, widgetContainer: any) => {\n const filteredValues = removeUndefinedFields(values);\n const groupedDateTime = groupDateTimeValuesIfNeeded(filteredValues);\n const groupedValues = ungroupDateValuesIfNeeded(\n groupedDateTime,\n widgetContainer,\n );\n\n const params = [\n ...Object.keys(groupedValues).map((key) => {\n return getParamForField(key, groupedValues[key], widgetContainer);\n }),\n ];\n\n // This is needed because in case of datetime we receive an array of arrays\n const paramsForFields = params.reduce((acc, curVal) => {\n if (Array.isArray(curVal[0])) {\n return acc.concat(curVal);\n }\n return [...acc, curVal];\n }, []);\n\n return paramsForFields;\n};\n\nconst getParamForField = (key: string, value: any, widgetContainer: any) => {\n const filteredKey = key.split(\"#\")[0];\n const type = widgetContainer.findById(filteredKey)?.type;\n\n if (\n type === \"char\" ||\n type === \"text\" ||\n type === \"many2one\" ||\n type === \"many2many\" ||\n type === \"one2many\"\n ) {\n return [key, \"ilike\", value];\n } else if (\n type === \"float\" ||\n type === \"integer\" ||\n type === \"float_time\" ||\n type === \"progressbar\"\n ) {\n const operator = key.indexOf(\"#from\") !== -1 ? \">=\" : \"<=\";\n return [filteredKey, operator, value];\n } else if (type === \"date\") {\n const operator = key.indexOf(\"#from\") !== -1 ? \">=\" : \"<=\";\n return [filteredKey, operator, value.format(\"YYYY-MM-DD\")];\n } else if (type === \"datetime\") {\n const filteredValues = [];\n if (value[0]) {\n filteredValues.push([filteredKey, \">=\", value[0]]);\n }\n if (value[1]) {\n filteredValues.push([filteredKey, \"<=\", value[1]]);\n }\n return filteredValues;\n } else if (type === \"selection\") {\n return [\n key,\n \"in\",\n value.map((valueEntry: string) =>\n convertBooleanParamIfNeeded(valueEntry),\n ),\n ];\n } else {\n return [key, \"=\", convertBooleanParamIfNeeded(value)];\n }\n};\n\nconst getDatetimeDateFields = (values: any) => {\n return Object.keys(values).filter((key) => {\n return key.indexOf(\"#date\") !== -1;\n });\n};\n\nconst removeDateTimeSingleFields = (values: any) => {\n const newValues = { ...values };\n Object.keys(newValues).forEach(\n (key) =>\n (key.indexOf(\"#time\") !== -1 || key.indexOf(\"#date\") !== -1) &&\n delete newValues[key],\n );\n return newValues;\n};\n\nexport const groupDateTimeValuesIfNeeded = (values: any) => {\n const newValues: any = { ...removeDateTimeSingleFields(values) };\n\n const datetimeDateFields = getDatetimeDateFields(values);\n\n datetimeDateFields.forEach((field) => {\n const datePair = values[field];\n const baseKey = field.split(\"#\")[0];\n const timeKey = baseKey + \"#time\";\n const timePair = values[timeKey];\n\n let from, to;\n\n if (datePair[0] !== null) {\n const dateValueFrom = datePair[0].format(\"YYYY-MM-DD\");\n from = dateValueFrom;\n\n if (timePair && timePair[0] !== null) {\n const timeValueFrom = timePair[0].format(\"HH:mm:ss\");\n from = from + \" \" + timeValueFrom;\n }\n }\n\n if (datePair[1] !== null) {\n const dateValueTo = datePair[1].format(\"YYYY-MM-DD\");\n to = dateValueTo;\n\n if (timePair && timePair[1] !== null) {\n const timeValueTo = timePair[1].format(\"HH:mm:ss\");\n to = to + \" \" + timeValueTo;\n }\n }\n\n newValues[baseKey + \"#datetime\"] = [from, to];\n });\n\n return newValues;\n};\n\nconst ungroupDateValuesIfNeeded = (values: any, widgetContainer: any) => {\n const dateFields = Object.keys(values).filter((key) => {\n const widget = widgetContainer.findById(key);\n return widget && widget.type === \"date\";\n });\n\n const newValues: any = { ...values };\n\n dateFields.forEach((key) => {\n delete newValues[key];\n if (values[key][0] !== null) {\n newValues[key + \"#from\"] = values[key][0];\n }\n\n if (values[key][1] !== null) {\n newValues[key + \"#to\"] = values[key][1];\n }\n });\n\n return newValues;\n};\n\nexport const removeUndefinedFields = (values: any) => {\n const newValues = { ...values };\n Object.keys(newValues).forEach(\n (key) =>\n (newValues[key] === undefined ||\n newValues[key] === null ||\n newValues[key] === \"\") &&\n delete newValues[key],\n );\n return newValues;\n};\n\nexport const getUniqueFieldsForParams = (params: any[]) => {\n const uniqueFields: any = {};\n\n params.forEach((param) => {\n if (Array.isArray(param) && param[0]) {\n uniqueFields[param[0]] = true;\n } else {\n uniqueFields[param] = true;\n }\n });\n\n return Object.keys(uniqueFields);\n};\n\nexport const mergeParams = (searchParams: any[], domainParams: any[]) => {\n const finalParams = [...searchParams];\n const uniqueParams = getUniqueFieldsForParams(searchParams);\n\n domainParams.forEach((element) => {\n if (Array.isArray(element) && element[0]) {\n if (!uniqueParams.includes(element[0])) {\n finalParams.push(element);\n }\n } else if (!uniqueParams.includes(element)) {\n finalParams.push(element);\n }\n });\n\n return finalParams;\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { Form, Row, Col, Alert, theme } from \"antd\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\n\nimport {\n SearchFilter as SearchFilterOoui,\n Container,\n Field,\n} from \"@gisce/ooui\";\n\nimport { SearchField } from \"./SearchField\";\nimport { SearchBottomBar } from \"./SearchBottomBar\";\nimport { SearchFields } from \"@/types\";\nimport { SearchParams } from \"./SearchParams\";\n\nimport { getParamsForFields } from \"@/helpers/searchHelper\";\nimport Measure from \"react-measure\";\nconst { useToken } = theme;\n\ntype Props = {\n fields: any;\n searchFields: SearchFields;\n onClear: () => void;\n onSubmit: (values: any) => void;\n isSearching: boolean;\n limit: number;\n offset: number;\n onLimitChange?: (limit: number) => void;\n searchVisible?: boolean;\n setSearchFilterHeight?: (height: number) => void;\n searchError?: string;\n searchValues?: any;\n showLimitOptions?: boolean;\n};\n\nfunction SearchFilter(props: Props) {\n const {\n fields,\n searchFields = { primary: [], secondary: [] },\n onClear,\n onSubmit,\n isSearching,\n offset,\n limit,\n onLimitChange,\n searchVisible,\n setSearchFilterHeight,\n searchError,\n searchValues,\n showLimitOptions = true,\n } = props;\n\n const [simpleSearchFields, setSimpleSearchFields] = useState<Container>();\n const [advancedSearchFields, setAdvancedSearchFields] = useState<Container>();\n const [advancedFilter, setAdvancedFilter] = useState(false);\n const sfo = useRef<SearchFilterOoui>();\n const { token } = useToken();\n\n const [form] = Form.useForm();\n\n useEffect(() => {\n form.setFieldsValue(searchValues);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchValues]);\n\n const getRowsAndCols = () => {\n if (!advancedSearchFields) {\n return;\n }\n\n const fields = advancedFilter ? advancedSearchFields : simpleSearchFields;\n const rows = fields?.rows;\n\n return rows?.map((row, i) => {\n return (\n <Row key={i}>\n {row.map((item, j) => {\n return (\n <Col xs={24} className=\"p-2\" xl={6} key={j}>\n <SearchField field={item as Field} />\n </Col>\n );\n })}\n </Row>\n );\n });\n };\n\n useDeepCompareEffect(() => {\n setAdvancedFilter(false);\n sfo.current = new SearchFilterOoui(searchFields, fields);\n sfo.current.parse();\n setSimpleSearchFields(sfo.current._simpleSearchContainer);\n setAdvancedSearchFields(sfo.current._advancedSearchContainer);\n }, [fields, searchFields]);\n\n const rows = getRowsAndCols();\n\n const onFinish = (values: any) => {\n const { limit, offset } = values;\n delete values.offset;\n delete values.limit;\n const newParams = getParamsForFields(\n values,\n sfo.current?._advancedSearchContainer,\n );\n\n onSubmit({ params: newParams, offset, limit, searchValues: values });\n };\n\n return (\n <Measure\n bounds\n onResize={(contentRect) => {\n setSearchFilterHeight?.(contentRect.bounds?.height!);\n }}\n >\n {({ measureRef }) => (\n <div ref={measureRef}>\n <div style={{ display: searchVisible ? \"block\" : \"none\" }}>\n <Form\n className=\"p-3 shadow-md\"\n style={{ borderRadius: token.borderRadius }}\n form={form}\n onFinish={onFinish}\n initialValues={{ offset, limit }}\n >\n {rows}\n {advancedFilter && showLimitOptions && (\n <SearchParams onLimitChange={onLimitChange} />\n )}\n <SearchBottomBar\n advancedFilter={advancedFilter}\n onAdvancedFilterToggle={() => {\n setAdvancedFilter(!advancedFilter);\n }}\n onClear={() => {\n form.resetFields();\n onClear();\n }}\n isSearching={isSearching}\n />\n </Form>\n {searchError && (\n <Alert\n className=\"mt-10\"\n message={searchError}\n type=\"error\"\n banner\n />\n )}\n <div className=\"pb-5\" />\n </div>\n </div>\n )}\n </Measure>\n );\n}\n\nexport default SearchFilter;\n","/**\n * This function calculate the width of a string based on its length\n * @param {String} text\n * @param {String} font\n */\nconst getTextWidth = (text: string, font = \"14px -apple-system\") => {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n context!.font = font;\n const metrics = context!.measureText(text);\n return Math.round((metrics.width + 80) * 1.5);\n};\n\n/**\n * This function calculates the width of each column based in all CELL VALUES\n * @param {Array} columns\n * @param {Array} source\n * @param {Number} maxWidthPerCell\n */\nexport const calculateColumnsWidth = (\n columns: any,\n source: any,\n maxWidthPerCell = 500,\n) => {\n if (columns.length === 0) {\n return { columns };\n }\n\n // First we calculate the width for each column\n // The column width is based on its string length\n\n const columnsWithWidth = columns.map((column: any) =>\n Object.assign(column, {\n width: getTextWidth(column.title),\n }),\n );\n\n // Since we have a minimum width (column's width already calculated),\n // now we are going to verify if the cell value is bigger\n // than the column width which is already set\n\n source.map((entry: any) => {\n columnsWithWidth.map((column: any, indexColumn: number) => {\n const columnWidth = column.width;\n const cellValue = (entry[column.key] as string) || \"\";\n\n // Get the string width based on chars length\n let cellWidth = getTextWidth(cellValue);\n\n // Verify if the cell value is smaller than column's width\n if (cellWidth < columnWidth) cellWidth = columnWidth;\n\n // Verify if the cell value width is bigger than our max width flag\n if (cellWidth > maxWidthPerCell) cellWidth = maxWidthPerCell;\n\n // Update the column width\n columnsWithWidth[indexColumn].width = cellWidth;\n });\n });\n\n // Sum of all columns width to determine the table max width\n const tableWidth = columnsWithWidth\n .map((column: any) => column.width)\n .reduce((a: any, b: any) => {\n return a + b;\n });\n\n return {\n columns: columnsWithWidth,\n source,\n tableWidth,\n };\n};\n","import styled from \"styled-components\";\nimport React, { useContext, useState } from \"react\";\nimport { Spin } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport Link from \"antd/es/typography/Link\";\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const SelectAllRecordsRow = ({\n numberOfVisibleSelectedRows,\n totalRecords,\n numberOfTotalRows,\n onSelectAllRecords,\n numberOfRealSelectedRows,\n}: {\n numberOfVisibleSelectedRows: number;\n totalRecords: number;\n numberOfTotalRows: number;\n numberOfRealSelectedRows: number;\n onSelectAllRecords: () => Promise<void>;\n}) => {\n const [loading, setLoading] = useState(false);\n const { t } = useLocale();\n\n const translations = {\n recordsSelected: t(\"recordsSelected\"),\n selectAllRecords: t(\"selectAllRecords\"),\n allRecordsSelected: t(\"allRecordsSelected\"),\n };\n\n if (numberOfTotalRows === 0) {\n return null;\n }\n\n if (\n numberOfVisibleSelectedRows < numberOfTotalRows &&\n numberOfRealSelectedRows <= numberOfTotalRows\n ) {\n return null;\n }\n\n if (totalRecords === numberOfVisibleSelectedRows) {\n return null;\n }\n\n const handleClick = async (event: any) => {\n event.preventDefault(); // prevent the default action (navigation) from happening\n event.stopPropagation();\n setLoading(true);\n await onSelectAllRecords();\n setLoading(false);\n };\n\n const selectRowsComponent = (\n <span>\n {translations.recordsSelected.replace(\n \"{numberOfSelectedRows}\",\n numberOfVisibleSelectedRows.toString(),\n ) + \" \"}\n\n {loading ? (\n <Spin />\n ) : (\n <Link onClick={handleClick} style={{ fontWeight: 600 }}>\n {translations.selectAllRecords.replace(\n \"{totalRecords}\",\n totalRecords.toString(),\n )}\n </Link>\n )}\n </span>\n );\n\n const allRowsAreSelected = (\n <span style={{ fontWeight: 600 }}>\n {translations.allRecordsSelected.replace(\n \"{totalRecords}\",\n numberOfRealSelectedRows.toString(),\n ) + \" \"}\n </span>\n );\n\n return (\n <Container>\n {numberOfRealSelectedRows > numberOfTotalRows\n ? allRowsAreSelected\n : selectRowsComponent}\n </Container>\n );\n};\n","function parseStringToFloat(text?: string) {\n if (!text) {\n return undefined;\n }\n\n try {\n if (text.includes(\":\")) {\n const splitted = text.trim().split(\":\");\n return (\n Math.round(\n (parseInt(splitted[0]) + parseInt(splitted[1]) / 60.0) * 10000,\n ) / 10000\n );\n } else {\n return parseFloat(text.trim());\n }\n } catch (err) {\n return 0;\n }\n}\n\nfunction parseFloatToString(num?: number) {\n if (num === undefined) {\n return undefined;\n }\n\n let finalString;\n let hours = Math.floor(Math.abs(num));\n let mins = Math.round((Math.abs(num) % 1) * 100) / 100;\n\n if (mins >= 1) {\n hours = hours + 1;\n mins = 0.0;\n } else {\n mins = mins * 60;\n }\n\n const hoursString = hours.toLocaleString(\"en-US\", {\n minimumIntegerDigits: 2,\n maximumFractionDigits: 0,\n useGrouping: false,\n });\n const minsStrings = mins.toLocaleString(\"en-US\", {\n minimumIntegerDigits: 2,\n maximumFractionDigits: 0,\n useGrouping: false,\n });\n\n finalString = `${hoursString}:${minsStrings}`;\n\n if (num < 0) {\n finalString = \"-\" + finalString;\n }\n\n return finalString;\n}\n\nexport { parseStringToFloat, parseFloatToString };\n","import React from \"react\";\nimport { Progress } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport styled from \"styled-components\";\n\nexport const ProgressBar = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <ProgressBarInput />\n </Field>\n );\n};\n\nexport const ProgressBarInput = ({ value }: { value?: number }) => {\n const textValue = `${(value || 0).toLocaleString(\"en-US\", {\n minimumIntegerDigits: 1,\n maximumFractionDigits: 4,\n useGrouping: false,\n })}%`;\n\n return (\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\" }}>\n <StyledProgress percent={value} />\n <div style={{ flexGrow: 1, paddingLeft: 10 }}>{textValue}</div>\n </div>\n );\n};\n\nconst StyledProgress = styled(Progress)`\n .ant-progress-outer {\n margin-right: 0px;\n padding-right: 0px;\n }\n .ant-progress-text {\n display: none;\n }\n`;\n","import { Fragment, useCallback, useState } from \"react\";\nimport {\n PrinterOutlined,\n ThunderboltOutlined,\n EnterOutlined,\n} from \"@ant-design/icons\";\nimport {\n useLocale,\n DropdownMenuGroup,\n DropdownMenuItem,\n Many2OneSuffixModal,\n Many2OneSuffix as Many2OneSuffixUi,\n} from \"@gisce/react-formiga-components\";\n\nexport type Action = Record<string, any> & {\n id: number;\n name: string;\n type: string;\n context: any;\n domain: any;\n};\n\nexport type ActionRelatePrint = {\n actionItems: Action[];\n relateItems: Action[];\n printItems: Action[];\n};\n\nexport type Many2OneSuffixOnItemClickOpts = {\n item: DropdownMenuItem;\n type: \"action\" | \"print\" | \"relate\";\n};\n\ntype Many2oneSuffixProps = {\n onRetrieveData: () => Promise<\n | {\n actionItems: Action[];\n relateItems: Action[];\n printItems: Action[];\n }\n | undefined\n >;\n onItemClick?: (opts: Many2OneSuffixOnItemClickOpts) => void;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport const Many2oneSuffixOoui = ({\n onRetrieveData,\n onItemClick,\n onOpenChange,\n}: Many2oneSuffixProps) => {\n const [actionModalVisible, setActionModalVisible] = useState<boolean>(false);\n const [printModalVisible, setPrintModalVisible] = useState<boolean>(false);\n const { t } = useLocale();\n const [data, setData] = useState<{\n actionItems: Action[];\n relateItems: Action[];\n printItems: Action[];\n }>();\n\n const fetchMenuItems = useCallback(async (): Promise<DropdownMenuGroup[]> => {\n const {\n actionItems = [],\n relateItems = [],\n printItems = [],\n } = (await onRetrieveData()) || {};\n setData({ actionItems, relateItems, printItems });\n return [\n {\n sticky: true,\n items: [\n {\n id: \"action\",\n name: t(\"action\"),\n disabled: !actionItems || actionItems.length === 0,\n icon: <ThunderboltOutlined />,\n },\n {\n id: \"print\",\n name: t(\"report\"),\n disabled: !printItems || printItems.length === 0,\n icon: <PrinterOutlined />,\n },\n {\n id: \"divider\",\n type: \"divider\",\n },\n ],\n },\n {\n label: t(\"related\"),\n icon: <EnterOutlined />,\n items: relateItems as DropdownMenuItem[],\n },\n ];\n }, [t, onRetrieveData]);\n\n return (\n <Fragment>\n <Many2OneSuffixUi\n onRetrieveData={fetchMenuItems}\n onItemClick={(item) => {\n if (item.id === \"action\") {\n setActionModalVisible(true);\n } else if (item.id === \"print\") {\n setPrintModalVisible(true);\n } else {\n onItemClick?.({ item, type: \"relate\" });\n }\n }}\n onOpenChange={(open) => {\n onOpenChange?.(open);\n if (!open) {\n setActionModalVisible(false);\n setPrintModalVisible(false);\n }\n }}\n />\n <Many2OneSuffixModal\n visible={actionModalVisible}\n items={data?.actionItems as DropdownMenuItem[]}\n onItemClicked={(item) => {\n setActionModalVisible(false);\n onItemClick?.({ item, type: \"action\" });\n }}\n onCancel={() => setActionModalVisible(false)}\n />\n <Many2OneSuffixModal\n visible={printModalVisible}\n items={data?.printItems as DropdownMenuItem[]}\n onItemClicked={(item) => {\n setPrintModalVisible(false);\n onItemClick?.({ item, type: \"print\" });\n }}\n onCancel={() => setPrintModalVisible(false)}\n />\n </Fragment>\n );\n};\n","import { useCallback, useContext, useEffect, useState } from \"react\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { FormView } from \"@/types\";\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { processValues } from \"@/helpers/formHelper\";\nimport { parseContextFields, parseDomainFields } from \"@gisce/ooui\";\nimport {\n ActionRelatePrint,\n Many2OneSuffixOnItemClickOpts,\n Many2oneSuffixOoui,\n} from \"./Many2oneSuffixOoui\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\n\ntype Props = {\n id: number;\n model: string;\n context?: any;\n};\n\nexport const Many2oneSuffix = (props: Props) => {\n const { id, model, context = {} } = props;\n const [formView, setFormView] = useState<FormView>();\n const [targetValues, setTargetValues] = useState<any>();\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openRelate } = tabManagerContext || {};\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n\n const [getView, cancelGetViewRequest] = useNetworkRequest(\n ConnectionProvider.getHandler().getView,\n );\n const [readObjects, cancelReadObjectsRequest] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n\n const cancelRequests = useCallback(() => {\n cancelGetViewRequest();\n cancelReadObjectsRequest();\n }, [cancelGetViewRequest, cancelReadObjectsRequest]);\n\n const fetchData = useCallback(async (): Promise<\n ActionRelatePrint | undefined\n > => {\n const formView = (await getView({\n model,\n type: \"form\",\n context,\n })) as FormView;\n setFormView(formView);\n\n // We get all the fields that are used in context or domains of each action\n // In order to get the data of the target record\n const fields = getFieldsToRetrieve(formView);\n\n let values = {};\n\n if (fields.length > 0) {\n const objectValues = (\n await readObjects({\n model,\n ids: [id],\n fieldsToRetrieve: fields,\n context,\n })\n )?.[0];\n values = { ...objectValues };\n }\n values = { ...processValues(values, fields), active_id: id };\n setTargetValues(values);\n\n if (!formView || !formView.toolbar) {\n return undefined;\n }\n\n return {\n actionItems: formView.toolbar.action,\n relateItems: formView.toolbar.relate,\n printItems: formView.toolbar.print,\n };\n }, [context, getView, id, model, readObjects]);\n\n // If there is no id (no record attached to the Many2one), we don't show the suffix\n if (!id) {\n return null;\n }\n\n function handleMenuClick({ item, type }: Many2OneSuffixOnItemClickOpts) {\n const commonParams = {\n values: targetValues,\n fields: formView!.fields,\n };\n\n switch (type) {\n case \"action\":\n processAction?.({\n actionData: item,\n context: { active_id: id, active_ids: [id] },\n ...commonParams,\n });\n break;\n\n case \"print\":\n processAction?.({\n actionData: {\n ...item,\n datas: { ...item.datas, ids: [id] },\n },\n ...commonParams,\n });\n break;\n\n case \"relate\":\n openRelate({\n relateData: item,\n action_id: item.id as number,\n action_type: item.type!,\n ...commonParams,\n });\n break;\n }\n }\n\n return (\n <Many2oneSuffixOoui\n onRetrieveData={fetchData}\n onItemClick={handleMenuClick}\n onOpenChange={(open) => {\n if (!open) {\n cancelRequests();\n }\n }}\n />\n );\n};\n\nexport const getFieldsToRetrieve = (formView: FormView): string[] => {\n const { toolbar } = formView;\n const fieldNames = [\"action\", \"relate\", \"print\"];\n\n const extractedFields = fieldNames.flatMap((fieldName) => {\n const toolbarField = toolbar[fieldName];\n return (\n toolbarField?.flatMap((item: any) => {\n const fields = [];\n if (\"context\" in item) fields.push(...parseContextFields(item.context));\n if (\"domain\" in item) fields.push(...parseDomainFields(item.domain));\n return fields;\n }) || []\n );\n });\n\n return [\n ...new Set(extractedFields.filter((field) => field in formView.fields)),\n ];\n};\n","import { Space } from \"antd\";\nimport React from \"react\";\nimport { Many2oneSuffix } from \"./Many2oneSuffix\";\n\nexport type Many2oneTreeProps = { m2oField: any };\n\nexport const Many2oneTree = (props: Many2oneTreeProps): React.ReactElement => {\n const { m2oField } = props;\n if (!m2oField) {\n return <></>;\n }\n return (\n <Space>\n <>{m2oField.value}</>\n <Many2oneSuffix id={m2oField.id} model={m2oField.model} />\n </Space>\n );\n};\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { Space } from \"antd\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Many2oneSuffix } from \"./many2one/Many2oneSuffix\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\n\nexport type ReferenceTreeProps = {\n value: string;\n context?: any;\n selectionValues?: any;\n};\n\nexport const ReferenceTree = (\n props: ReferenceTreeProps,\n): React.ReactElement => {\n const { value, context, selectionValues } = props;\n const [name, setName] = useState();\n const [loading, setLoading] = useState(false);\n\n const [model, id] = value ? value.split(\",\") : [];\n const intId = parseInt(id);\n\n const fetchName = useCallback(async () => {\n if (!value) {\n return;\n }\n if (value && name) {\n return;\n }\n setLoading(true);\n const nameResponse = await ConnectionProvider.getHandler().execute({\n action: \"name_get\",\n payload: [intId],\n model,\n context,\n });\n setName(nameResponse[0][1]);\n setLoading(false);\n }, [value, name]);\n\n useEffect(() => {\n fetchName();\n }, [value]);\n\n if (!value && !loading) {\n return <></>;\n }\n\n if (loading) {\n return <LoadingOutlined />;\n }\n\n const selectionDescription = selectionValues.get(model);\n\n return (\n <Space>\n <>{`${selectionDescription}:`}</>\n <>{name}</>\n <Many2oneSuffix id={intId} model={model} />\n </Space>\n );\n};\n","import React from \"react\";\nimport { WidgetProps } from \"@/types\";\nimport { Avatar as AntdAvatar, Tooltip } from \"antd\";\nimport { Avatar as AvatarOoui } from \"@gisce/ooui\";\nimport { colorFromString } from \"@/helpers/formHelper\";\n\ntype AvatarProps = WidgetProps & {\n ooui: AvatarOoui;\n value?: any;\n};\n\nconst Avatar = (props: AvatarProps): React.ReactElement | null => {\n const { ooui, value } = props;\n if (!value) {\n return null;\n }\n let formattedValue = value;\n if (ooui.selectionValues.size) {\n formattedValue = ooui.selectionValues.get(value);\n } else if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n const text = formattedValue\n .toString()\n .split(\" \")\n .filter((word: string) => word.length > 1)\n .slice(0, 3)\n .map((word: string) => word[0].toUpperCase())\n .join(\"\");\n const backgroundColor = colorFromString(formattedValue);\n return (\n <Tooltip title={formattedValue}>\n <AntdAvatar alt={formattedValue} style={{ backgroundColor }}>\n {text}\n </AntdAvatar>\n </Tooltip>\n );\n};\n\nexport default Avatar;\n","import { DatePicker as AntDatePicker, theme } from \"antd\";\n\nimport React from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { Date as DateOoui } from \"@gisce/ooui\";\nimport dayjs from \"@/helpers/dayjs\";\nconst { useToken } = theme;\n\ntype DatePickerProps = WidgetProps & {\n showTime?: boolean;\n};\n\nexport const DatePickerConfig = {\n date: {\n placeholder: \"__/__/____\",\n dateDisplayFormat: \"DD/MM/YYYY\",\n dateInternalFormat: \"YYYY-MM-DD\",\n },\n time: {\n placeholder: \"__/__/____ __:__:__\",\n dateDisplayFormat: \"DD/MM/YYYY HH:mm:ss\",\n dateInternalFormat: \"YYYY-MM-DD HH:mm:ss\",\n },\n};\n\nconst DatePicker = (props: DatePickerProps) => {\n const { ooui, showTime = false } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} {...props}>\n <DatePickerInput ooui={ooui} showTime={showTime} />\n </Field>\n );\n};\n\ninterface DatePickerInputProps {\n ooui: DateOoui;\n value?: undefined | string;\n onChange?: (value: undefined | string) => void;\n showTime?: boolean;\n}\n\nconst DatePickerInput: React.FC<DatePickerInputProps> = (\n props: DatePickerInputProps,\n) => {\n const { value, onChange, ooui, showTime } = props;\n const { id, readOnly, required } = ooui as DateOoui;\n const { token } = useToken();\n\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n\n const mode = showTime ? \"time\" : \"date\";\n\n const triggerChange = (changedValue: undefined | string) => {\n onChange?.(changedValue);\n };\n\n const onValueStringChange = (momentDate: any) => {\n if (momentDate === null || momentDate === undefined) {\n triggerChange(momentDate);\n return;\n }\n\n triggerChange(momentDate.format(DatePickerConfig[mode].dateInternalFormat));\n };\n\n const dateValue = value\n ? dayjs(value, DatePickerConfig[mode].dateInternalFormat)\n : undefined;\n\n return (\n <AntDatePicker\n style={{ width: \"100%\", ...requiredStyle }}\n placeholder={\n showTime\n ? DatePickerConfig.time.placeholder\n : DatePickerConfig.date.placeholder\n }\n disabled={readOnly}\n id={id}\n picker={\"date\"}\n showTime={showTime}\n format={DatePickerConfig[mode].dateDisplayFormat}\n value={dateValue}\n onChange={onValueStringChange}\n showNow={false}\n showToday={false}\n changeOnBlur={true}\n />\n );\n};\n\nexport default DatePicker;\n","import { ReactElement, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Checkbox, Spin } from \"antd\";\nimport { parseFloatToString } from \"@/helpers/timeHelper\";\nimport { ProgressBarInput } from \"../../base/ProgressBar\";\nimport { One2manyValue } from \"../../base/one2many/One2manyInput\";\nimport { Interweave } from \"interweave\";\nimport { Many2oneTree } from \"../../base/many2one/Many2oneTree\";\nimport { ReferenceTree } from \"../../base/ReferenceTree\";\nimport dayjs from \"@/helpers/dayjs\";\nimport Avatar from \"../../custom/Avatar\";\nimport { CustomTag, TagInput } from \"../../custom/Tag\";\nimport { DatePickerConfig } from \"@/common/DatePicker\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { colorFromString } from \"@/helpers/formHelper\";\n\nexport const BooleanComponent = ({\n value,\n}: {\n value: boolean;\n}): ReactElement => {\n return useMemo(\n () => (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignContent: \"center\",\n }}\n >\n <Checkbox checked={value} disabled />\n </div>\n ),\n [value],\n );\n};\n\nexport const Many2OneComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => <Many2oneTree m2oField={value} />, [value]);\n};\n\nexport const TextComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(\n () => (\n <Interweave\n content={value?.toString().replace(/(?:\\r\\n|\\r|\\n)/g, \"<br>\")}\n />\n ),\n [value],\n );\n};\n\nexport const DateComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => {\n if (!value || (value && value.length === 0)) return <></>;\n\n const formattedValue = dayjs(\n value,\n DatePickerConfig.date.dateInternalFormat,\n ).format(DatePickerConfig.date.dateDisplayFormat);\n return <>{formattedValue}</>;\n }, [value]);\n};\n\nexport const DateTimeComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => {\n if (!value || (value && value.length === 0)) return <></>;\n const formattedValue = dayjs(\n value,\n DatePickerConfig.time.dateInternalFormat,\n ).format(DatePickerConfig.time.dateDisplayFormat);\n return <>{formattedValue}</>;\n }, [value]);\n};\n\nexport const One2ManyComponent = ({\n value,\n}: {\n value: One2manyValue;\n}): ReactElement => {\n return useMemo(() => {\n const length = Array.isArray(value?.items) ? value?.items.length : 0;\n return <>{`( ${length} )`}</>;\n }, [value]);\n};\n\nexport const ProgressBarComponent = ({\n value,\n}: {\n value: any;\n}): ReactElement => {\n return useMemo(() => <ProgressBarInput value={value} />, [value]);\n};\n\nexport const FloatTimeComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => <>{parseFloatToString(value)}</>, [value]);\n};\n\nexport const NumberComponent = ({ value }: { value: number }): ReactElement => {\n return useMemo(\n () => <div style={{ textAlign: \"right\" }}>{value}</div>,\n [value],\n );\n};\n\nexport const ImageComponent = ({ value }: { value: string }): ReactElement => {\n return useMemo(\n () => (\n <img\n src={`data:image/*;base64,${value}`}\n style={{ maxWidth: \"50px\", padding: \"5px\" }}\n />\n ),\n [value],\n );\n};\n\nexport const TagComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(() => <TagInput ooui={ooui} value={value} />, [ooui, value]);\n};\n\nexport const SelectionComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(() => {\n let selectionKey = value;\n\n if (Array.isArray(value) && value.length === 2) {\n selectionKey = value[0];\n }\n return <>{ooui.selectionValues.get(selectionKey)}</>;\n }, [ooui, value]);\n};\n\nexport const ReferenceComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(\n () => (\n <ReferenceTree\n value={value}\n selectionValues={ooui.selectionValues}\n context={context}\n />\n ),\n [context, ooui.selectionValues, value],\n );\n};\n\nexport const AvatarComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(() => <Avatar ooui={ooui} value={value} />, [ooui, value]);\n};\n\nexport const TagsComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n const [values, setValues] = useState<Array<{ id: number; name: string }>>([]);\n const [loading, setLoading] = useState<boolean>(false);\n const { relation, field } = ooui;\n\n const loadValues = useCallback(async () => {\n try {\n setLoading(true);\n const optionsRead = await ConnectionProvider.getHandler().search({\n model: relation,\n params: [[\"id\", \"in\", value.items.map((v: any) => v.id)]],\n fields: [field],\n context,\n });\n setValues(\n optionsRead.map((i: any) => {\n return { id: i.id, name: i[field] };\n }),\n );\n } catch (error) {\n console.error(\"Error loading data\", error);\n } finally {\n setLoading(false);\n }\n }, [context, field, relation, value.items]);\n\n useEffect(() => {\n if (value?.items && value?.items.length > 0) {\n loadValues();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value?.items]);\n\n const tags = useMemo(\n () =>\n values.map((entry) => {\n const { id, name } = entry;\n const color = colorFromString(name);\n return (\n <CustomTag key={`${id}`} color={color}>\n {name}\n </CustomTag>\n );\n }),\n [values],\n );\n\n return useMemo(() => {\n if (loading) {\n return <Spin />;\n }\n return (\n <div\n style={{\n maxWidth: \"300px\",\n whiteSpace: \"break-spaces\",\n lineHeight: \"30px\",\n }}\n >\n {tags}\n </div>\n );\n }, [tags, loading]);\n};\n\nexport const COLUMN_COMPONENTS = {\n boolean: BooleanComponent,\n many2one: Many2OneComponent,\n text: TextComponent,\n one2many: One2ManyComponent,\n many2many: One2ManyComponent,\n progressbar: ProgressBarComponent,\n float_time: FloatTimeComponent,\n image: ImageComponent,\n integer: NumberComponent,\n float: NumberComponent,\n reference: ReferenceComponent,\n tag: TagComponent,\n selection: SelectionComponent,\n date: DateComponent,\n datetime: DateTimeComponent,\n avatar: AvatarComponent,\n tags: TagsComponent,\n};\n","import {\n forwardRef,\n memo,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Pagination as AntPagination, Row, Col, Spin, Badge } from \"antd\";\nimport {\n getTree,\n getTableColumns,\n getTableItems,\n hasActualValues,\n} from \"@/helpers/treeHelper\";\nimport { Tree as TreeOoui } from \"@gisce/ooui\";\nimport { TreeView } from \"@/types\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { calculateColumnsWidth } from \"@/helpers/dynamicColumnsHelper\";\nimport { Table as GisceTable, TableRef } from \"@gisce/react-formiga-table\";\nimport {\n PlusSquareOutlined,\n MinusSquareOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { SelectAllRecordsRow } from \"@/common/SelectAllRecordsRow\";\nimport { COLUMN_COMPONENTS } from \"./treeComponents\";\nimport ErrorBoundary from \"antd/es/alert/ErrorBoundary\";\n\ntype Props = {\n total?: number;\n limit: number;\n page?: number;\n loading: boolean;\n treeView: TreeView;\n results: any[];\n showPagination?: boolean;\n onRequestPageChange?: (page: number, pageSize?: number) => void;\n onRowClicked?: (record: any) => void;\n onRowSelectionChange?: (selectedRowKeys: any[]) => void;\n selectedRowKeys?: number[];\n scrollY?: number;\n colorsForResults?: { [key: number]: string };\n statusForResults?: { [key: number]: string };\n onChangeSort?: (results: any) => void;\n sorter?: any;\n onFetchChildrenForRecord?: (item: any) => Promise<any[]>;\n childField?: string;\n rootTree?: boolean;\n context?: any;\n readonly?: boolean;\n onSelectAllRecords?: () => Promise<void>;\n};\n\nexport const UnmemoizedTree = forwardRef<TableRef, Props>(\n (props: Props, ref) => {\n const {\n page = 1,\n limit,\n total,\n treeView,\n results,\n onRequestPageChange,\n loading,\n onRowClicked,\n showPagination = true,\n selectedRowKeys = [],\n onRowSelectionChange,\n scrollY,\n colorsForResults = {},\n statusForResults = {},\n onChangeSort,\n sorter,\n onFetchChildrenForRecord,\n childField,\n rootTree = false,\n context,\n readonly,\n onSelectAllRecords,\n } = props;\n\n const tableRef = useRef<TableRef>(null);\n\n const [items, setItems] = useState<any[]>([]);\n\n const errorInParseColors = useRef<boolean>(false);\n\n const [treeOoui, setTreeOoui] = useState<TreeOoui>();\n\n const { t } = useLocale();\n const internalLimit = useRef(limit);\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { title = undefined, setTitle = undefined } =\n (rootTree ? actionViewContext : {}) || {};\n\n const columns = useMemo(() => {\n if (!treeOoui) {\n return undefined;\n }\n\n return getTableColumns(\n treeOoui,\n {\n ...COLUMN_COMPONENTS,\n },\n context,\n );\n }, [context, treeOoui]);\n\n useImperativeHandle(ref, () => ({\n unselectAll: () => {\n tableRef.current?.unselectAll();\n },\n }));\n\n useEffect(() => {\n const treeOoui = getTree(treeView);\n setTreeOoui(treeOoui);\n if (treeOoui.string && title !== treeOoui.string) {\n setTitle?.(treeOoui.string);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [treeView, title]);\n\n useEffect(() => {\n if (!treeOoui) {\n return;\n }\n errorInParseColors.current = false;\n const items = getTableItems(treeOoui, results);\n setItems(items);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results]);\n\n useEffect(() => {\n internalLimit.current = limit;\n }, [limit]);\n\n const from = (page - 1) * internalLimit.current + 1;\n const to = from - 1 + items.length;\n const summary =\n total === undefined\n ? null\n : total === 0\n ? t(\"no_results\")\n : t(\"summary\")\n .replace(\"{from}\", from?.toString())\n .replace(\"{to}\", to?.toString())\n .replace(\"{total}\", total?.toString());\n\n const pagination = useMemo(() => {\n if (!showPagination || treeView.isExpandable) {\n return null;\n }\n\n const numberOfVisibleSelectedRows = items?.filter(\n (entry) => selectedRowKeys && selectedRowKeys.includes(entry.id),\n ).length;\n\n return loading ? null : total === undefined ? (\n <Spin className=\"pb-4\" />\n ) : (\n <Row align=\"bottom\" className=\"pb-4\">\n <Col span={onSelectAllRecords ? 8 : 12}>\n <AntPagination\n total={total}\n pageSize={\n internalLimit.current === 0 ? total : internalLimit.current\n }\n current={page}\n showSizeChanger={false}\n onChange={onRequestPageChange}\n />\n </Col>\n {onSelectAllRecords && (\n <Col span={8} className=\"text-center\">\n <SelectAllRecordsRow\n numberOfVisibleSelectedRows={numberOfVisibleSelectedRows}\n numberOfRealSelectedRows={selectedRowKeys?.length || 0}\n numberOfTotalRows={items.length}\n totalRecords={total || 0}\n onSelectAllRecords={onSelectAllRecords}\n />\n </Col>\n )}\n <Col span={onSelectAllRecords ? 8 : 12} className=\"text-right\">\n {summary}\n </Col>\n </Row>\n );\n }, [\n items,\n loading,\n onRequestPageChange,\n onSelectAllRecords,\n page,\n selectedRowKeys,\n showPagination,\n summary,\n total,\n treeView.isExpandable,\n ]);\n\n const sums = useMemo(() => {\n if (!treeOoui) {\n return null;\n }\n const sumFields = treeOoui.columns\n .filter((it) => it.sum !== undefined)\n .map((it) => {\n return { label: it.sum, field: it.id };\n });\n\n if (!sumFields || sumFields.length === 0) {\n return null;\n }\n\n const summary: string[] = [];\n const sumItems =\n selectedRowKeys?.length > 0\n ? items.filter((result: any) => {\n return selectedRowKeys.includes(result.id);\n })\n : items;\n\n sumFields.forEach((sumField) => {\n const total = sumItems.reduce((prev, current) => {\n if (current[sumField.field] && !isNaN(current[sumField.field]))\n return prev + current[sumField.field];\n else return prev;\n }, 0);\n\n summary.push(`${sumField.label}: ${Math.round(total * 100) / 100}`);\n });\n\n return <div className=\"p-1 pb-0 pl-2 mt-2 \">{summary.join(\", \")}</div>;\n }, [items, selectedRowKeys, treeOoui]);\n\n const dataTable = useMemo(() => {\n if (treeOoui !== null && columns && columns.length > 0) {\n const maxWidthPerCell = 600;\n return calculateColumnsWidth(columns, items, maxWidthPerCell);\n }\n return undefined;\n }, [columns, items, treeOoui]);\n\n const adjustedHeight = useMemo(() => {\n if (\n scrollY &&\n treeOoui?.columns.some((it: any) => it.sum !== undefined)\n ) {\n return scrollY - 30;\n }\n return scrollY;\n }, [scrollY, treeOoui?.columns]);\n\n if (treeOoui === null || !dataTable || dataTable?.columns?.length === 0) {\n return <Spin style={{ padding: \"2rem\" }} />;\n }\n\n return (\n <ErrorBoundary>\n {pagination}\n <GisceTable\n ref={tableRef}\n height={adjustedHeight!}\n columns={dataTable.columns}\n dataSource={items}\n loading={loading}\n loadingComponent={<Spin />}\n onRowStyle={(record: any) => {\n if (colorsForResults![record.id]) {\n return { color: colorsForResults![record.id] };\n }\n return undefined;\n }}\n onRowStatus={\n hasActualValues(statusForResults)\n ? (record: any) => {\n if (statusForResults![record.id]) {\n return <Badge color={statusForResults[record.id]} />;\n }\n return undefined;\n }\n : undefined\n }\n onRowDoubleClick={onRowClicked}\n onRowSelectionChange={onRowSelectionChange}\n onChangeSort={onChangeSort}\n sorter={sorter}\n readonly={readonly}\n expandableOpts={\n onFetchChildrenForRecord\n ? {\n expandIcon: PlusSquareOutlined,\n collapseIcon: MinusSquareOutlined,\n loadingIcon: LoadingOutlined,\n onFetchChildrenForRecord,\n childField: childField!,\n }\n : undefined\n }\n />\n {sums}\n </ErrorBoundary>\n );\n },\n);\n\nexport const Tree = memo(UnmemoizedTree);\nTree.displayName = \"Tree\";\nUnmemoizedTree.displayName = \"UnmemoizedTree\";\n","import { mergeParams } from \"@/helpers/searchHelper\";\nimport {\n getColorMap,\n getStatusMap,\n getTableItems,\n getTree,\n sortResults,\n} from \"@/helpers/treeHelper\";\nimport { useState, useCallback, useRef } from \"react\";\nimport { ConnectionProvider, FormView, TreeView } from \"..\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype UseSearchOpts = {\n model: string;\n setSearchTreeNameSearch?: (searchString?: string) => void;\n setSelectedRowItems?: (value: any[]) => void;\n searchParams?: any[];\n setSearchParams?: (value: any[]) => void;\n setSearchVisible?: (value: boolean) => void;\n setTreeIsLoading?: (value: boolean) => void;\n nameSearch?: string;\n searchNameGetDoneRef?: any;\n context?: any;\n setActionViewTotalItems?: (totalItems: number) => void;\n formView: FormView;\n treeView: TreeView;\n sorter: any;\n setSorter?: (sorter: any) => void;\n setCurrentItemIndex?: (value?: number) => void;\n setResultsActionView?: (value: any[]) => void;\n resultsActionView?: any[];\n domain: any;\n currentId?: number;\n limit?: number;\n setLimit?: (value: number) => void;\n setSearchValues?: (value: any) => void;\n clearSelection?: () => void;\n};\n\nexport const useSearch = (opts: UseSearchOpts) => {\n const {\n model,\n setSearchTreeNameSearch,\n setSelectedRowItems,\n setSearchParams,\n setSearchVisible,\n setTreeIsLoading,\n nameSearch,\n searchNameGetDoneRef,\n context,\n setActionViewTotalItems,\n treeView,\n formView,\n sorter,\n setSorter,\n setCurrentItemIndex,\n setResultsActionView,\n resultsActionView,\n domain,\n currentId,\n limit,\n setLimit,\n searchParams = [],\n setSearchValues,\n clearSelection,\n } = opts;\n\n const [tableRefreshing, setTableRefreshing] = useState<boolean>(false);\n const [searchFilterLoading, setSearchFilterLoading] =\n useState<boolean>(false);\n const [searchError, setSearchError] = useState<string>();\n const [page, setPage] = useState<number>(1);\n const [offset, setOffset] = useState<number>(0);\n const [totalItems, setTotalItems] = useState<number>();\n const [resultsInternal, setResultsInternal] = useState<any>([]);\n const [colorsForResults, setColorsForResults] = useState<any>(undefined);\n const [statusForResults, setStatusForResults] = useState<any>(undefined);\n const internalLimit = useRef(limit || DEFAULT_SEARCH_LIMIT);\n\n const originalResults = useRef<any[]>([]);\n\n const setResults = useCallback(\n (results: any) => {\n setResultsActionView?.([...results]);\n setResultsInternal([...results]);\n },\n [setResultsActionView],\n );\n\n const getResults = useCallback(() => {\n if (!resultsActionView) {\n return resultsInternal;\n }\n return resultsActionView;\n }, [resultsActionView, resultsInternal]);\n\n const searchByNameSearch = useCallback(async () => {\n const searchResults = await ConnectionProvider.getHandler().nameSearch({\n model,\n payload: nameSearch,\n limit: internalLimit.current,\n attrs: domain,\n context,\n });\n\n setTotalItems(searchResults.length);\n setActionViewTotalItems?.(searchResults.length);\n\n if (searchResults.length > 0) {\n const resultsIds = searchResults.map((item: any) => {\n return item?.[0];\n });\n\n const { colors, status } = getTree(treeView!);\n const attrs: any = {};\n if (colors) {\n attrs.colors = colors;\n }\n if (status) {\n attrs.status = status;\n }\n\n const resultsWithData =\n await ConnectionProvider.getHandler().readEvalUiObjects({\n model,\n ids: resultsIds,\n arch: treeView?.arch!,\n fields: treeView!.field_parent\n ? { ...treeView!.fields, [treeView!.field_parent]: {} }\n : treeView!.fields,\n context,\n attrs,\n });\n const resultsData = resultsWithData[0];\n\n originalResults.current = [...resultsData];\n\n setColorsForResults(getColorMap(resultsWithData[1]));\n setStatusForResults(getStatusMap(resultsWithData[1]));\n\n const newResultIds = resultsData.map((item: any) => item.id);\n\n const resultsSorted =\n sorter !== undefined\n ? sortResults({\n resultsToSort: resultsData,\n sorter,\n fields: { ...treeView!.fields, ...formView!.fields },\n })\n : [...originalResults.current];\n\n setResults(resultsSorted);\n\n if (newResultIds.length > 0) {\n setCurrentItemIndex?.(0);\n } else {\n setCurrentItemIndex?.(undefined);\n }\n } else {\n setResults([]);\n setCurrentItemIndex?.(undefined);\n }\n setTableRefreshing(false);\n searchNameGetDoneRef.current = true;\n }, [\n setResults,\n searchNameGetDoneRef,\n nameSearch,\n model,\n context,\n domain,\n treeView,\n formView,\n sorter,\n setCurrentItemIndex,\n setActionViewTotalItems,\n ]);\n\n const searchResults = useCallback(\n async (opts?: { params: any; newOffset?: number }) => {\n const { params, newOffset } = opts || {};\n\n const mergedParams = mergeParams(params || searchParams, domain);\n const { colors, status } = getTree(treeView!);\n const attrs: any = {};\n if (colors) {\n attrs.colors = colors;\n }\n if (status) {\n attrs.status = status;\n }\n\n const { totalItems, results, attrsEvaluated } =\n await ConnectionProvider.getHandler().searchForTree({\n params: mergedParams,\n limit: internalLimit.current,\n offset: newOffset || offset,\n model,\n fields: treeView!.field_parent\n ? { ...treeView!.fields, [treeView!.field_parent]: {} }\n : treeView!.fields,\n context,\n attrs,\n });\n setColorsForResults(getColorMap(attrsEvaluated));\n setStatusForResults(getStatusMap(attrsEvaluated));\n\n originalResults.current = [...results];\n\n const resultsSorted =\n sorter !== undefined\n ? sortResults({\n resultsToSort: results,\n sorter,\n fields: { ...treeView!.fields, ...formView!.fields },\n })\n : [...originalResults.current];\n\n setResults(resultsSorted);\n\n if (resultsActionView && resultsSorted.length > 0) {\n const newCurrentItemIndex = resultsSorted.findIndex(\n (item) => currentId === item.id,\n );\n\n if (newCurrentItemIndex === -1) {\n setCurrentItemIndex?.(0);\n } else {\n setCurrentItemIndex?.(newCurrentItemIndex);\n }\n } else {\n setCurrentItemIndex?.(undefined);\n }\n setTableRefreshing(false);\n\n const totalItemsValue = await totalItems;\n\n setTotalItems(totalItemsValue);\n setActionViewTotalItems?.(totalItemsValue);\n },\n [\n setCurrentItemIndex,\n resultsActionView,\n setResults,\n currentId,\n model,\n context,\n domain,\n treeView,\n formView,\n sorter,\n setActionViewTotalItems,\n offset,\n searchParams,\n ],\n );\n\n const fetchResults = useCallback(\n async (opts?: { params: any; newOffset?: number }) => {\n try {\n setTableRefreshing(true);\n setTreeIsLoading?.(true);\n if (nameSearch && !searchNameGetDoneRef.current) {\n await searchByNameSearch();\n } else {\n await searchResults(opts);\n }\n clearSelection?.();\n } catch (error) {\n setSearchError(typeof error === \"string\" ? error : error.message);\n setTableRefreshing(false);\n } finally {\n setSelectedRowItems?.([]);\n setSearchFilterLoading(false);\n setTreeIsLoading?.(false);\n }\n },\n [\n clearSelection,\n nameSearch,\n searchByNameSearch,\n searchNameGetDoneRef,\n searchResults,\n setSelectedRowItems,\n setTreeIsLoading,\n ],\n );\n\n const changeSort = useCallback(\n (newSorter: any) => {\n if (JSON.stringify(newSorter) === JSON.stringify(sorter)) return;\n setSorter?.(newSorter);\n const sortedResults =\n newSorter !== undefined\n ? sortResults({\n resultsToSort: getResults(),\n sorter: newSorter,\n fields: { ...treeView.fields, ...formView.fields },\n })\n : [...originalResults.current];\n setResults(sortedResults);\n },\n [\n sorter,\n setSorter,\n getResults,\n treeView?.fields,\n formView?.fields,\n setResults,\n ],\n );\n\n const submit = useCallback(\n (opts: {\n params: any;\n limit: number;\n offset: number;\n searchValues: any;\n }) => {\n const { params, searchValues, limit: newLimit, offset: newOffset } = opts;\n\n if (tableRefreshing) return;\n setSearchTreeNameSearch?.(undefined);\n setSelectedRowItems?.([]);\n setSearchValues?.(searchValues);\n setSearchParams?.(params);\n setSearchVisible?.(false);\n setSearchFilterLoading(true);\n setSearchError(undefined);\n setPage(1);\n\n if (newLimit) {\n internalLimit.current = newLimit;\n setLimit?.(newLimit);\n }\n if (newOffset) setOffset(newOffset);\n fetchResults({\n params,\n newOffset,\n });\n },\n [\n tableRefreshing,\n setSearchTreeNameSearch,\n setSelectedRowItems,\n setSearchValues,\n setSearchParams,\n setSearchVisible,\n fetchResults,\n setLimit,\n ],\n );\n\n const requestPageChange = useCallback(\n (page: number) => {\n setTableRefreshing(true);\n setPage(page);\n setOffset((page - 1) * limit!);\n },\n [setTableRefreshing, limit, setOffset, setPage],\n );\n\n const clear = useCallback(() => {\n if (tableRefreshing) return;\n setSearchTreeNameSearch?.(undefined);\n setSearchParams?.([]);\n setSearchValues?.({});\n setSearchError(undefined);\n setOffset(0);\n setPage(1);\n setLimit?.(limit || DEFAULT_SEARCH_LIMIT);\n }, [\n tableRefreshing,\n setSearchTreeNameSearch,\n setSearchParams,\n setSearchValues,\n setLimit,\n limit,\n ]);\n\n const fetchChildrenForRecord = useCallback(\n async (record: any) => {\n const child_id = record[treeView?.field_parent || \"child_id\"];\n\n const children = await ConnectionProvider.getHandler().readObjects({\n model,\n ids: child_id,\n fields: treeView!.field_parent\n ? { ...treeView!.fields, [treeView!.field_parent]: {} }\n : treeView!.fields,\n context,\n });\n\n setResults([...getResults(), ...children]);\n\n return getTableItems(getTree(treeView!), children);\n },\n [treeView, model, context, getResults, setResults],\n );\n\n const getAllIds = useCallback(async () => {\n return await ConnectionProvider.getHandler().searchAllIds({\n params: mergeParams(searchParams, domain),\n model,\n context,\n totalItems,\n });\n }, [model, context, totalItems, searchParams, domain]);\n\n return {\n submit,\n clear,\n fetchResults,\n tableRefreshing,\n searchFilterLoading,\n searchError,\n page,\n offset,\n limit: internalLimit.current,\n getResults,\n requestPageChange,\n changeSort,\n fetchChildrenForRecord,\n colorsForResults,\n statusForResults,\n totalItems,\n getAllIds,\n };\n};\n","import {\n useEffect,\n useState,\n useRef,\n useContext,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useCallback,\n} from \"react\";\nimport { Alert, Spin } from \"antd\";\n\nimport SearchFilter from \"@/widgets/views/searchFilter/SearchFilter\";\nimport { Tree } from \"@/widgets/views/Tree\";\nimport { FormView, TreeView } from \"@/types/index\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport { mergeSearchFields } from \"@/helpers/formHelper\";\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { useSearch } from \"@/hooks/useSearch\";\nimport { TableRef } from \"@gisce/react-formiga-table\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype OnRowClickedData = {\n id: number;\n model: string;\n formView: FormView;\n treeView: TreeView;\n};\n\ntype Props = {\n model?: string;\n formView?: FormView;\n treeView?: TreeView;\n onRowClicked: (data: OnRowClickedData) => void;\n nameSearch?: string;\n treeScrollY?: number;\n domain?: any;\n visible?: boolean;\n rootTree?: boolean;\n parentContext?: any;\n onChangeSelectedRowKeys?: (selectedRowKeys: any) => void;\n};\n\nfunction SearchTree(props: Props, ref: any) {\n const {\n model,\n formView: formViewProps,\n treeView: treeViewProps,\n onRowClicked,\n nameSearch,\n treeScrollY,\n domain = [],\n visible = true,\n rootTree = false,\n parentContext = {},\n onChangeSelectedRowKeys,\n } = props;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [initialFetchDone, setInitialFetchDone] = useState<boolean>(false);\n\n const searchNameGetDoneRef = useRef(false);\n const tableRef = useRef<TableRef>(null);\n\n const [currentModel, setCurrentModel] = useState<string>();\n const [treeView, setTreeView] = useState<TreeView>();\n const [formView, setFormView] = useState<FormView>();\n\n const [initialError, setInitialError] = useState<string>();\n\n const [searchFilterHeight, setSearchFilterHeight] = useState<number>(200);\n\n const expandableClickActionData = useRef<any>();\n\n const { height } = useWindowDimensions();\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const {\n setResults: setResultsActionView = undefined,\n setCurrentItemIndex = undefined,\n currentId = undefined,\n results: resultsActionView = undefined,\n selectedRowItems = undefined,\n setSelectedRowItems = undefined,\n searchParams = [],\n setSearchParams = undefined,\n searchVisible = true,\n setSearchVisible = undefined,\n sorter = undefined,\n setSorter = undefined,\n setTotalItems: setActionViewTotalItems = undefined,\n setSearchTreeNameSearch = undefined,\n setTreeIsLoading = undefined,\n searchValues = {},\n setSearchValues = undefined,\n limit = DEFAULT_SEARCH_LIMIT,\n setLimit = undefined,\n } = (rootTree ? actionViewContext : {}) || {};\n\n const changeSelectedRowKeys = useCallback(\n (newSelectedRowKeys: any[]) => {\n setSelectedRowItems?.(newSelectedRowKeys.map((id: number) => ({ id })));\n onChangeSelectedRowKeys?.(newSelectedRowKeys);\n },\n [onChangeSelectedRowKeys, setSelectedRowItems],\n );\n\n const {\n submit,\n clear,\n fetchResults,\n tableRefreshing,\n searchFilterLoading,\n searchError,\n page,\n limit: limitUsedInSearch,\n offset,\n getResults,\n requestPageChange,\n changeSort,\n fetchChildrenForRecord,\n colorsForResults,\n statusForResults,\n totalItems,\n getAllIds,\n } = useSearch({\n model: currentModel!,\n setSearchTreeNameSearch,\n setSelectedRowItems: changeSelectedRowKeys,\n setSearchParams,\n setSearchValues,\n searchParams,\n setSearchVisible,\n setTreeIsLoading,\n nameSearch,\n searchNameGetDoneRef,\n context: parentContext,\n formView: formView!,\n treeView: treeView!,\n sorter,\n setSorter,\n setCurrentItemIndex,\n setResultsActionView,\n resultsActionView,\n domain,\n currentId,\n setActionViewTotalItems,\n limit,\n setLimit,\n clearSelection: tableRef.current?.unselectAll,\n });\n\n useImperativeHandle(ref, () => ({\n refreshResults: () => {\n searchNameGetDoneRef.current = false;\n fetchResults();\n },\n getFields: () => treeView?.fields,\n getDomain: () => domain,\n }));\n\n useEffect(() => {\n if (!initialFetchDone) {\n return;\n }\n\n if (visible && treeView) {\n searchNameGetDoneRef.current = false;\n fetchResults();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [page, offset, initialFetchDone, visible, nameSearch, treeView]);\n\n const fetchData = async () => {\n setInitialFetchDone(false);\n setIsLoading(true);\n setInitialError(undefined);\n setTreeIsLoading?.(true);\n\n try {\n await fetchModelData();\n setInitialFetchDone(true);\n } catch (error) {\n setInitialError(error);\n setTreeIsLoading?.(false);\n } finally {\n setIsLoading(false);\n }\n };\n\n const fetchModelData = async () => {\n setCurrentModel(model);\n\n let _formView = formViewProps;\n\n if (!formViewProps) {\n _formView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"form\",\n context: parentContext,\n })) as FormView;\n }\n\n let _treeView = treeViewProps;\n\n if (!treeViewProps) {\n _treeView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"tree\",\n context: parentContext,\n })) as TreeView;\n }\n\n setFormView(_formView as FormView);\n setTreeView(_treeView as TreeView);\n };\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model]);\n\n const onSearchTreeLimitChange = useCallback(\n (newLimit: number) => {\n setLimit?.(newLimit);\n },\n [setLimit],\n );\n\n const treeButOpen = useCallback(\n async (record: any) => {\n const { id } = record;\n\n if (!expandableClickActionData.current) {\n expandableClickActionData.current =\n await ConnectionProvider.getHandler().treeButOpen({\n id: treeView!.view_id,\n model: currentModel!,\n context: parentContext,\n });\n }\n\n const actionData: any = expandableClickActionData.current[0][2];\n\n await processAction?.({\n actionData,\n fields: treeView!.fields,\n values: {\n active_id: id,\n ...record,\n },\n context: parentContext,\n });\n },\n [currentModel, parentContext, processAction, treeView],\n );\n\n const onRowClickedHandler = useCallback(\n async (record: any) => {\n const { id } = record;\n\n if (treeView?.isExpandable) {\n try {\n await treeButOpen(record);\n } catch (err) {\n showErrorDialog(err);\n }\n return;\n }\n\n onRowClicked({\n id,\n model: currentModel!,\n formView: formView!,\n treeView: treeView!,\n });\n },\n [currentModel, formView, onRowClicked, treeButOpen, treeView],\n );\n\n const selectAllRecords = useCallback(async () => {\n const allIds = await getAllIds();\n setSelectedRowItems?.(allIds.map((id: number) => ({ id })));\n onChangeSelectedRowKeys?.(allIds);\n }, [getAllIds, onChangeSelectedRowKeys, setSelectedRowItems]);\n\n const calculatedTableHeight = useMemo(() => {\n if (treeView?.isExpandable) {\n return height - 160;\n }\n return height - (searchFilterHeight + 240);\n }, [height, searchFilterHeight, treeView?.isExpandable]);\n\n const selectedRowKeys = useMemo(\n () => selectedRowItems?.map((item) => item.id),\n [selectedRowItems],\n );\n\n const content = useCallback(() => {\n if (!treeView || !formView) {\n return null;\n }\n\n return (\n <>\n <SearchFilter\n fields={{ ...formView.fields, ...treeView.fields }}\n searchFields={mergeSearchFields([\n formView.search_fields,\n treeView.search_fields,\n ])}\n onClear={clear}\n limit={limit}\n offset={offset}\n isSearching={searchFilterLoading}\n onSubmit={submit}\n onLimitChange={onSearchTreeLimitChange}\n setSearchFilterHeight={setSearchFilterHeight}\n searchError={searchError}\n searchVisible={searchVisible}\n searchValues={searchValues}\n />\n <Tree\n ref={tableRef}\n context={parentContext}\n total={totalItems}\n limit={limitUsedInSearch}\n page={page}\n treeView={treeView}\n results={getResults()}\n onRequestPageChange={requestPageChange}\n loading={tableRefreshing}\n onRowClicked={onRowClickedHandler}\n scrollY={treeScrollY || calculatedTableHeight}\n colorsForResults={colorsForResults}\n statusForResults={statusForResults}\n selectedRowKeys={selectedRowKeys}\n onRowSelectionChange={changeSelectedRowKeys}\n sorter={sorter}\n onChangeSort={changeSort}\n onFetchChildrenForRecord={\n treeView.isExpandable ? fetchChildrenForRecord : undefined\n }\n childField={treeView.field_parent}\n rootTree={rootTree}\n onSelectAllRecords={selectAllRecords}\n />\n </>\n );\n }, [\n calculatedTableHeight,\n changeSelectedRowKeys,\n changeSort,\n clear,\n colorsForResults,\n fetchChildrenForRecord,\n formView,\n getResults,\n limit,\n limitUsedInSearch,\n offset,\n onRowClickedHandler,\n onSearchTreeLimitChange,\n page,\n parentContext,\n requestPageChange,\n rootTree,\n searchError,\n searchFilterLoading,\n searchValues,\n searchVisible,\n selectAllRecords,\n selectedRowKeys,\n sorter,\n statusForResults,\n submit,\n tableRefreshing,\n totalItems,\n treeScrollY,\n treeView,\n ]);\n\n const error = initialError || searchError;\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <div style={!visible ? { display: \"none\" } : {}}>\n {isLoading ? <Spin /> : content()}\n </div>\n );\n}\n\nexport default forwardRef(SearchTree);\n","import { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { error } = Modal;\n\nexport const showErrorDialog = (message: string) => {\n error({\n title: \"Error\",\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: message,\n });\n};\n\nexport const showErrorExceptionDialog = (error: any) => {\n const messageContent = error.message\n ? JSON.stringify(error.message)\n : JSON.stringify(error);\n showErrorDialog(messageContent);\n};\n","import { useCallback, useState } from \"react\";\nimport { Modal, Button, Divider, Row, Space } from \"antd\";\nimport { FormModal } from \"./FormModal\";\nimport SearchTree from \"@/widgets/views/SearchTree\";\nimport {\n FileAddOutlined,\n CloseOutlined,\n CheckOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { showErrorDialog } from \"@/ui/GenericErrorDialog\";\n\ntype SearchSelectionProps = {\n visible: boolean;\n model: string;\n nameSearch?: string;\n onSelectValues: (values: number[]) => Promise<void>;\n onCloseModal: () => void;\n domain?: any;\n context?: any;\n};\n\nexport const SearchModal = (props: SearchSelectionProps) => {\n const {\n visible,\n onCloseModal: onCloseModalProps,\n onSelectValues: onSelectValuesProps,\n model,\n nameSearch,\n domain,\n context = {},\n } = props;\n const [showCreateModal, setShowCreateModal] = useState<boolean>(false);\n\n const { modalWidth, modalHeight } = useWindowDimensions();\n const { t } = useLocale();\n const [selectedRowKeys, setSelectedRowKeys] = useState<any[]>([]);\n const [operationInProgress, setOperationInProgress] =\n useState<boolean>(false);\n\n const onSelectValues = useCallback(\n async (keys: any[]) => {\n setOperationInProgress(true);\n try {\n await onSelectValuesProps(keys);\n } catch (err) {\n showErrorDialog(err);\n }\n setOperationInProgress(false);\n },\n [onSelectValuesProps],\n );\n\n const onCloseModal = async () => {\n await new Promise((resolve) => setTimeout(resolve, 5));\n onCloseModalProps();\n };\n\n const onRowClicked = async (event: any) => {\n const { id } = event;\n onSelectValues([id]);\n };\n\n function submit() {\n if (selectedRowKeys.length === 0) {\n onCloseModal();\n return;\n }\n\n void onSelectValues(selectedRowKeys);\n }\n\n const content = () => {\n return (\n <>\n <SearchTree\n model={model}\n nameSearch={nameSearch}\n onRowClicked={onRowClicked}\n treeScrollY={modalHeight * 0.3}\n domain={domain}\n parentContext={context}\n onChangeSelectedRowKeys={setSelectedRowKeys}\n />\n <Divider />\n <Row justify=\"end\">\n <Space>\n <Button\n disabled={operationInProgress}\n icon={<FileAddOutlined />}\n onClick={() => {\n setShowCreateModal(true);\n }}\n >\n {t(\"new\")}\n </Button>\n <Button\n disabled={operationInProgress}\n icon={\n operationInProgress ? <LoadingOutlined /> : <CheckOutlined />\n }\n onClick={() => {\n submit();\n }}\n type=\"primary\"\n >\n {t(\"ok\")}\n </Button>\n <Button icon={<CloseOutlined />} onClick={onCloseModal}>\n {t(\"cancel\")}\n </Button>\n </Space>\n </Row>\n </>\n );\n };\n\n return (\n <>\n <Modal\n title={t(\"search\")}\n centered\n width={modalWidth}\n open={visible && !showCreateModal}\n closable={true}\n onCancel={onCloseModal}\n footer={null}\n destroyOnClose\n maskClosable={false}\n >\n {content()}\n </Modal>\n <FormModal\n model={model}\n visible={showCreateModal}\n parentContext={context}\n onSubmitSucceed={(id?: number) => {\n setShowCreateModal(false);\n onCloseModal();\n onSelectValues([id!]);\n }}\n onCancel={() => {\n setShowCreateModal(false);\n onCloseModal();\n }}\n />\n </>\n );\n};\n","import React, { useState, useRef, useEffect, useContext } from \"react\";\nimport { Input, Button, Row, Col, theme } from \"antd\";\nimport {\n SearchOutlined,\n FolderOpenOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport styled from \"styled-components\";\n\nimport {\n Many2one as Many2oneOoui,\n transformDomainForChildWidget,\n} from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { SearchModal } from \"@/widgets/modals/SearchModal\";\nimport { FormModal } from \"@/widgets/modals/FormModal\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Many2oneSuffix } from \"./Many2oneSuffix\";\nimport { showErrorDialog } from \"@/ui/GenericErrorDialog\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\ntype Props = {\n ooui: Many2oneOoui;\n onOpenDetailClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n onSearchClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n};\n\nexport const Many2one = (props: Props) => {\n const { ooui } = props;\n const { required } = ooui;\n const validator = async (_: any, value: any) => {\n if (!value) throw new Error();\n if (!Array.isArray(value)) throw new Error();\n if (Array.isArray(value) && !value[0]) throw new Error();\n };\n\n return (\n <Field required={required} type={\"array\"} validator={validator} {...props}>\n <Many2oneInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface Many2oneInputProps {\n ooui: Many2oneOoui;\n value?: any[];\n onChange?: (value: any[]) => void;\n}\n\nexport const Many2oneInput: React.FC<Many2oneInputProps> = (\n props: Many2oneInputProps,\n) => {\n const { value, onChange, ooui } = props;\n const {\n required,\n relation,\n readOnly,\n context,\n id: fieldName,\n domain: widgetDomain,\n } = ooui;\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: mapToken.colorPrimaryBg }\n : undefined;\n const [showSearchModal, setShowSearchModal] = useState<boolean>(false);\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [searching, setSearching] = useState<boolean>(false);\n const [searchText, setSearchText] = useState<string>();\n const searchButtonTappedRef = useRef<boolean>(false);\n const [inputText, setInputText] = useState<string>(\"\");\n const inputTextRef = useRef<string>();\n const formContext = useContext(FormContext) as FormContextType;\n const { domain, getValues, getFields, getContext, elementHasLostFocus } =\n formContext || {};\n const transformedDomain = useRef<any[]>([]);\n const [searchDomain, setSearchDomain] = useState<any>([]);\n\n const id = (value && value[0]) || undefined;\n const text = (value && value[1]) || \"\";\n\n useEffect(() => {\n if (!Array.isArray(value) && value) {\n fetchNameAndUpdate(value as any);\n }\n }, [value]);\n\n useEffect(() => {\n if (id && text.length === 0) {\n fetchNameAndUpdate(id);\n } else if (id && text.length > 0) {\n setInputText(text);\n } else if (!id && !text) {\n setInputText(inputTextRef.current || \"\");\n }\n }, [value]);\n\n const triggerChange = (changedValue: any[]) => {\n onChange?.(changedValue);\n elementHasLostFocus?.();\n };\n\n const onValueStringChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n inputTextRef.current = e.target.value;\n triggerChange([undefined, \"\"]);\n };\n\n const onElementLostFocus = async () => {\n if (!searching && inputText !== text) {\n // Debounce this event to give time to the search button onClick to set the flag\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n // If the focus is lost because the user tapped the search button, we don't need to do nothing here\n if (searchButtonTappedRef.current) {\n triggerChange([undefined, \"\"]);\n return;\n }\n\n setSearching(true);\n\n try {\n if (transformedDomain.current && transformedDomain.current.length > 0) {\n tryFetchFirstResultOrShowSearch(inputTextRef.current as string);\n } else {\n const results: any[] =\n await ConnectionProvider.getHandler().nameSearch({\n model: relation,\n payload: inputTextRef.current as string,\n context: { ...getContext?.(), ...context },\n });\n\n if (results.length === 1) {\n inputTextRef.current = undefined;\n triggerChange(results[0]);\n } else {\n tryFetchFirstResultOrShowSearch(inputTextRef.current as string);\n }\n }\n } catch (err) {\n showErrorDialog(err);\n } finally {\n setSearching(false);\n }\n }\n };\n\n const tryFetchFirstResultOrShowSearch = async (text: string) => {\n await parseDomain();\n\n if (transformedDomain.current && transformedDomain.current.length > 0) {\n const resultIds = await ConnectionProvider.getHandler().searchAllIds({\n params: transformedDomain.current,\n model: relation,\n context: { ...getContext?.(), ...context },\n totalItems: 2,\n });\n\n if (resultIds.length === 1) {\n fetchNameAndUpdate(resultIds[0]);\n } else {\n setSearchText(text);\n setShowSearchModal(true);\n }\n return;\n }\n\n setSearchText(text);\n setShowSearchModal(true);\n };\n\n const fetchNameAndUpdate = async (id: number) => {\n setSearching(true);\n\n try {\n const value = await ConnectionProvider.getHandler().execute({\n action: \"name_get\",\n payload: [id],\n model: relation,\n context: { ...getContext?.(), ...context },\n });\n\n triggerChange([id, value[0][1]]);\n } catch (err) {\n showErrorDialog(err);\n } finally {\n setSearching(false);\n }\n };\n\n async function parseDomain() {\n if (widgetDomain) {\n transformedDomain.current =\n await ConnectionProvider.getHandler().evalDomain({\n domain: widgetDomain,\n values: transformPlainMany2Ones({\n fields: getFields(),\n values: getValues(),\n }),\n fields: getFields(),\n context: getContext(),\n });\n }\n\n if (domain && domain.length > 0) {\n transformedDomain.current = transformedDomain.current.concat(\n transformDomainForChildWidget({\n domain,\n widgetFieldName: fieldName,\n }),\n );\n }\n\n setSearchDomain(transformedDomain.current);\n }\n\n async function onKeyDown(event: any) {\n if (event.keyCode === 13) {\n event.preventDefault();\n event.stopPropagation();\n await onElementLostFocus();\n } else if (event.code === \"Backspace\" && id !== undefined) {\n event.preventDefault();\n event.stopPropagation();\n triggerChange([undefined, \"\"]);\n }\n }\n\n const CustomInput: any = required && !readOnly ? RequiredInput : Input;\n\n return (\n <Row gutter={8} wrap={false}>\n <Col flex=\"auto\" style={{ paddingRight: 0 }}>\n <CustomInput\n type=\"text\"\n value={inputText}\n disabled={readOnly}\n onChange={onValueStringChange}\n style={{\n ...requiredStyle,\n ...{ borderTopRightRadius: 0, borderBottomRightRadius: 0 },\n }}\n onBlur={onElementLostFocus}\n onKeyDown={onKeyDown}\n suffix={\n <Many2oneSuffix\n id={id}\n model={relation}\n context={{ ...getContext?.(), ...context }}\n />\n }\n />\n </Col>\n <Col flex=\"none\" style={{ paddingRight: 0, paddingLeft: 0 }}>\n <Button\n icon={<FolderOpenOutlined />}\n disabled={id === undefined || text === \"\" || inputText === undefined}\n onClick={() => {\n setShowFormModal(true);\n }}\n style={{ borderRadius: 0 }}\n tabIndex={-1}\n />\n </Col>\n <Col flex=\"none\" style={{ paddingLeft: 0 }}>\n <Button\n icon={searching ? <LoadingOutlined /> : <SearchOutlined />}\n disabled={readOnly || searching}\n onClick={() => {\n searchButtonTappedRef.current = true;\n tryFetchFirstResultOrShowSearch(text);\n }}\n style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0 }}\n tabIndex={-1}\n />\n </Col>\n <SearchModal\n model={relation}\n domain={searchDomain}\n context={{ ...getContext?.(), ...context }}\n visible={showSearchModal}\n nameSearch={!id ? searchText : undefined}\n onSelectValues={async (ids: number[]) => {\n setShowSearchModal(false);\n fetchNameAndUpdate(ids[0]);\n searchButtonTappedRef.current = false;\n inputTextRef.current = undefined;\n }}\n onCloseModal={() => {\n setShowSearchModal(false);\n searchButtonTappedRef.current = false;\n }}\n />\n <FormModal\n model={relation}\n parentContext={{ ...getContext?.(), ...context }}\n id={value && value[0]}\n visible={showFormModal}\n onSubmitSucceed={(id?: number) => {\n setShowFormModal(false);\n fetchNameAndUpdate(id!);\n }}\n onCancel={() => {\n setShowFormModal(false);\n }}\n mustClearAfterSave={true}\n readOnly={readOnly}\n />\n </Row>\n );\n};\n\nconst RequiredInput = styled(Input)`\n .ant-input {\n background-color: ${mapToken.colorPrimaryBg};\n }\n`;\n","import { ViewType } from \"@/types\";\nimport React, { useState } from \"react\";\n\nexport type One2manyContextType = {\n currentView: ViewType;\n setCurrentView: (view: ViewType) => void;\n itemIndex: number;\n setItemIndex: (value: number) => void;\n manualTriggerChange: boolean;\n setManualTriggerChange: (value: boolean) => void;\n};\n\nexport const One2manyContext = React.createContext<One2manyContextType | null>(\n null,\n);\n\nconst One2manyProvider = ({\n children,\n initialView,\n}: {\n children: React.ReactNode;\n initialView: ViewType;\n}): any => {\n const [currentView, setCurrentView] = useState<ViewType>(initialView);\n const [itemIndex, setItemIndex] = useState<number>(0);\n const [manualTriggerChange, setManualTriggerChange] =\n useState<boolean>(false);\n\n return (\n <One2manyContext.Provider\n value={{\n currentView,\n setCurrentView,\n itemIndex,\n setItemIndex,\n manualTriggerChange,\n setManualTriggerChange,\n }}\n >\n {children}\n </One2manyContext.Provider>\n );\n};\n\nexport default One2manyProvider;\n","import React, { useState } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { Modal } from \"antd\";\nimport { ConfirmConfig } from \"./asyncConfirm\";\n\nexport const AsyncConfirmModal: React.FC<ConfirmConfig> = ({\n title,\n content,\n onOk,\n icon,\n okText,\n cancelText,\n centered,\n}) => {\n const [confirmLoading, setConfirmLoading] = useState(false);\n const [visible, setVisible] = useState(true);\n\n const handleOk = async () => {\n setConfirmLoading(true);\n try {\n await onOk();\n } finally {\n setConfirmLoading(false);\n closeModal();\n }\n };\n\n const handleCancel = () => {\n closeModal();\n };\n\n const closeModal = () => {\n setVisible(false);\n const container = document.querySelector(\"#confirm-modal-container\");\n if (container) {\n const root = createRoot(container); // Create a root.\n root.unmount(); // Unmount the component.\n container.remove(); // Remove the container from the DOM.\n }\n };\n\n const modalTitle = (\n <span>\n {icon && <span style={{ marginRight: 8 }}>{icon}</span>}\n {title}\n </span>\n );\n\n return (\n <Modal\n title={modalTitle}\n zIndex={9999}\n open={visible}\n centered={centered || false}\n onOk={handleOk}\n onCancel={handleCancel}\n confirmLoading={confirmLoading}\n okText={okText}\n cancelText={cancelText}\n >\n {content}\n </Modal>\n );\n};\n","import { createRoot } from \"react-dom/client\";\nimport { AsyncConfirmModal } from \"./AsyncConfirmModal\";\n\nexport interface ConfirmConfig {\n title: string;\n content: React.ReactNode;\n onOk: () => Promise<void>;\n okText?: string;\n cancelText?: string;\n icon?: React.ReactNode;\n centered?: boolean;\n}\n\nexport const asyncConfirm = (config: ConfirmConfig) => {\n const container = document.createElement(\"div\");\n document.body.appendChild(container);\n\n const root = createRoot(container); // This creates the root instance.\n root.render(\n <AsyncConfirmModal\n {...config}\n onOk={async () => {\n try {\n await config.onOk(); // Execute the async confirm function\n } finally {\n root.unmount(); // Properly unmount using the root instance\n container.remove(); // Remove the container element\n }\n }}\n />,\n );\n\n return {\n destroy: () => {\n root.unmount(); // Use the root instance to unmount\n container.remove(); // Make sure to also remove the container\n },\n };\n};\n","import { ExclamationCircleOutlined } from \"@ant-design/icons\";\nimport { asyncConfirm } from \"./asyncConfirm\";\n\nexport const showRemoveItemDialog = ({\n t,\n onOk,\n}: {\n onOk: () => Promise<void>;\n t: (key: string) => string;\n}) => {\n asyncConfirm({\n title: t(\"removeItems\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmRemove\"),\n okText: t(\"yesConfirmRemove\"),\n cancelText: t(\"cancel\"),\n onOk,\n });\n};\n","import { ExclamationCircleOutlined } from \"@ant-design/icons\";\nimport { asyncConfirm } from \"./asyncConfirm\";\n\nexport const showUnlinkItemDialog = ({\n t,\n onOk,\n}: {\n onOk: () => Promise<void>;\n t: (key: string) => string;\n}) => {\n asyncConfirm({\n title: t(\"unlinkItems\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmUnlink\"),\n okText: t(\"yesConfirmUnlink\"),\n onOk,\n cancelText: t(\"cancel\"),\n });\n};\n","import React from \"react\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\n\nimport {\n FileAddOutlined,\n DeleteOutlined,\n LeftOutlined,\n RightOutlined,\n AlignLeftOutlined,\n SearchOutlined,\n ApiOutlined,\n} from \"@ant-design/icons\";\nimport { ViewType } from \"@/types\";\nimport { theme } from \"antd\";\nconst { useToken } = theme;\n\ntype One2manyTopBarProps = {\n title: string;\n mode: ViewType;\n isMany2Many: boolean;\n readOnly: boolean;\n formHasChanges: boolean;\n onToggleViewMode: () => void;\n onCreateItem: () => void;\n onDelete: () => void;\n totalItems: number;\n currentItemIndex: number;\n onPreviousItem: () => void;\n onNextItem: () => void;\n onSearchItem: () => void;\n selectedRowKeys: string[];\n showToggleButton: boolean;\n showCreateButton: boolean;\n};\n\nexport const One2manyTopBar = (props: One2manyTopBarProps) => {\n const {\n title: titleString,\n readOnly,\n onCreateItem,\n onToggleViewMode,\n mode,\n onDelete,\n totalItems,\n currentItemIndex,\n onPreviousItem,\n onNextItem,\n isMany2Many,\n onSearchItem,\n selectedRowKeys,\n showCreateButton,\n showToggleButton,\n } = props;\n const { token } = useToken();\n\n function separator() {\n return <div className=\"inline-block w-3\" />;\n }\n\n function title() {\n return (\n <div\n className=\"flex flex-grow h-8 text-white\"\n style={{\n borderRadius: token.borderRadius,\n backgroundColor: token.colorPrimaryActive,\n }}\n >\n <div className=\"flex flex-col items-center justify-center h-full\">\n <span className=\"pl-2 font-bold\">{titleString}</span>\n </div>\n </div>\n );\n }\n\n function deleteButton() {\n return (\n <ButtonWithTooltip\n tooltip={isMany2Many ? \"Unlink\" : \"Delete\"}\n icon={isMany2Many ? <ApiOutlined /> : <DeleteOutlined />}\n onClick={onDelete}\n disabled={\n totalItems === 0 ||\n readOnly ||\n (mode !== \"form\" && selectedRowKeys.length === 0)\n }\n />\n );\n }\n\n function index() {\n let itemToShow = \"_\";\n if (totalItems === 0) {\n itemToShow = \"_\";\n } else {\n itemToShow = (currentItemIndex + 1).toString();\n }\n return (\n <span className=\"pl-1 pr-1\">\n ({itemToShow}/{totalItems})\n </span>\n );\n }\n\n function itemBrowser() {\n return (\n <>\n {separator()}\n <ButtonWithTooltip\n tooltip={\"Previous item\"}\n icon={<LeftOutlined />}\n onClick={onPreviousItem}\n />\n {index()}\n <ButtonWithTooltip\n tooltip={\"Next item\"}\n icon={<RightOutlined />}\n onClick={onNextItem}\n />\n </>\n );\n }\n\n return (\n <div className=\"flex mb-2\">\n {title()}\n <div className=\"flex-none h-8 pl-2\">\n {mode !== \"graph\" && showCreateButton && (\n <ButtonWithTooltip\n tooltip={\"Create new item\"}\n icon={<FileAddOutlined />}\n disabled={readOnly}\n onClick={onCreateItem}\n />\n )}\n {isMany2Many && showCreateButton && (\n <>\n {separator()}\n <ButtonWithTooltip\n tooltip={\"Search existing item\"}\n icon={<SearchOutlined />}\n disabled={readOnly}\n onClick={onSearchItem}\n />\n </>\n )}\n {mode !== \"graph\" && separator()}\n {mode !== \"graph\" && deleteButton()}\n {mode === \"form\" && itemBrowser()}\n {separator()}\n {showToggleButton && (\n <ButtonWithTooltip\n tooltip={\"Toggle view mode\"}\n icon={<AlignLeftOutlined />}\n onClick={onToggleViewMode}\n />\n )}\n </div>\n </div>\n );\n};\n","import React, {\n useState,\n useRef,\n useContext,\n useEffect,\n useCallback,\n} from \"react\";\nimport {\n One2many as One2manyOoui,\n Form as FormOoui,\n Tree as TreeOoui,\n parseGraph,\n transformDomainForChildWidget,\n} from \"@gisce/ooui\";\nimport { Alert, Spin } from \"antd\";\nimport { Form, Tree } from \"@/index\";\nimport { Graph } from \"@/widgets/views/Graph/Graph\";\nimport { Views, ViewType } from \"@/types\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { FormModal } from \"@/widgets/modals/FormModal\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport { showRemoveItemDialog } from \"@/ui/RemoveItemDialog\";\nimport { showUnlinkItemDialog } from \"@/ui/UnlinkItemDialog\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { One2manyTopBar } from \"@/widgets/base/one2many/One2manyTopBar\";\nimport { readObjectValues, getNextPendingId } from \"@/helpers/one2manyHelper\";\nimport { SearchModal } from \"@/widgets/modals/SearchModal\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { sortResults } from \"@/helpers/treeHelper\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\n\ntype One2manyValue = {\n fields?: any;\n items: One2manyItem[];\n};\n\nconst ViewObjects = {\n form: FormOoui,\n tree: TreeOoui,\n graph: Graph,\n};\n\ntype One2manyItem = {\n operation?:\n | \"original\"\n | \"pendingRemove\"\n | \"pendingUpdate\"\n | \"pendingCreate\"\n | \"pendingLink\";\n id?: number;\n values?: any;\n treeValues?: any;\n defaultValues?: any;\n};\n\ninterface One2manyInputProps {\n ooui: One2manyOoui;\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n views: Views;\n}\n\nfunction filterDuplicateItems(items: any) {\n const ids = items.map((o: any) => o.id);\n const filtered = items.filter((item: any, index: number) => {\n const { id } = item;\n return !ids.includes(id, index + 1);\n });\n return filtered;\n}\n\nconst One2manyInput: React.FC<One2manyInputProps> = (\n props: One2manyInputProps,\n) => {\n const { value, onChange, ooui, views } = props;\n const { items = [] } = value || {};\n\n const { currentView, setCurrentView, itemIndex, setItemIndex } = useContext(\n One2manyContext,\n ) as One2manyContextType;\n\n const formContext = useContext(FormContext) as FormContextType;\n const { activeId, getFields, getValues, getContext, domain } =\n formContext || {};\n const { t } = useLocale();\n\n const [formHasChanges, setFormHasChanges] = useState<boolean>(false);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [showSearchModal, setShowSearchModal] = useState<boolean>(false);\n const [modalItem, setModalItem] = useState<One2manyItem>();\n const [selectedRowKeys, setSelectedRowKeys] = useState<any[]>([]);\n const [continuousEntryMode, setContinuousEntryMode] =\n useState<boolean>(false);\n const transformedDomain = useRef<any[]>([]);\n const [sorter, setSorter] = useState<any>();\n const originalSortItemIds = useRef<number[]>();\n const [colorsForResults, setColorsForResults] = useState<any>(undefined);\n\n const {\n readOnly,\n relation,\n context,\n domain: widgetDomain,\n } = ooui as One2manyOoui;\n const isMany2many = ooui.type === \"many2many\";\n const { id: fieldName } = ooui;\n const itemsToShow = items.filter(\n (item) =>\n (item.values || item.treeValues) && item.operation !== \"pendingRemove\",\n );\n const previousCurrentView = useRef<ViewType>();\n\n useEffect(() => {\n if (previousCurrentView.current !== currentView) {\n previousCurrentView.current = currentView;\n fetchDataIfNeeded();\n return;\n }\n\n fetchDataIfNeeded();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, currentView]);\n\n const fetchDataIfNeeded = useCallback(() => {\n if (currentView === \"form\" && items.some((item) => !item.values)) {\n fetchData();\n } else if (\n currentView === \"tree\" &&\n items.some((item) => !item.treeValues)\n ) {\n fetchData();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, currentView]);\n\n useEffect(() => {\n parseDomain();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [domain]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n fields: views.get(\"form\")?.fields || views.get(\"tree\")?.fields,\n items: filterDuplicateItems(changedValue),\n });\n };\n\n const fetchData = async () => {\n await fetchOriginalItemsFromApi();\n if (itemIndex > itemsToShow.length - 1 && itemIndex !== 0) {\n setItemIndex(0);\n }\n };\n\n const fetchOriginalItemsFromApi = async (mode?: ViewType) => {\n setIsLoading(true);\n setFormHasChanges(false);\n setError(undefined);\n\n try {\n const [itemsWithValues, evaluatedColorsForTree] = await readObjectValues({\n treeView: {\n arch: views.get(\"tree\")?.arch,\n fields: views.get(\"tree\")?.fields,\n },\n formView: {\n fields: views.get(\"form\")?.fields || {},\n },\n model: relation,\n items,\n context: { ...getContext?.(), ...context },\n currentView: mode || currentView,\n });\n\n if (!originalSortItemIds.current) {\n originalSortItemIds.current = itemsWithValues.map((item) => item.id!);\n }\n\n if ((currentView || mode) === \"tree\" && evaluatedColorsForTree) {\n setColorsForResults(evaluatedColorsForTree);\n }\n\n triggerChange(itemsWithValues);\n return itemsWithValues;\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoading(false);\n }\n };\n\n async function parseDomain() {\n if (widgetDomain) {\n transformedDomain.current =\n await ConnectionProvider.getHandler().evalDomain({\n domain: widgetDomain,\n values: transformPlainMany2Ones({\n fields: getFields(),\n values: getValues(),\n }),\n fields: getFields(),\n context: getContext(),\n });\n }\n\n if (domain && domain.length > 0) {\n transformedDomain.current = transformedDomain.current.concat(\n transformDomainForChildWidget({\n domain,\n widgetFieldName: fieldName,\n }),\n );\n }\n }\n\n const toggleViewMode = () => {\n const keys = Array.from(views.keys());\n const nextView = keys[\n (keys.indexOf(currentView) + 1) % keys.length\n ] as ViewType;\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setCurrentView(nextView);\n });\n } else {\n setCurrentView(nextView);\n }\n };\n\n const previousItem = () => {\n if (itemIndex > 0) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex - 1);\n });\n } else {\n setItemIndex(itemIndex - 1);\n }\n }\n };\n\n const nextItem = () => {\n const totalItems = itemsToShow.length;\n if (itemIndex < totalItems - 1) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex + 1);\n });\n } else {\n setItemIndex(itemIndex + 1);\n }\n }\n };\n\n const reloadOriginalValuesForFormItem = async () => {\n const currentId = itemsToShow[itemIndex].id!;\n\n const updatedFormObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [currentId],\n fields: views.get(\"form\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n const updatedTreeObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [currentId],\n fields: views.get(\"tree\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n\n const updatedItems: One2manyItem[] = items.map((item) => {\n if (item.id === currentId) {\n return {\n ...item,\n operation: \"original\",\n values: updatedFormObject,\n treeValues: updatedTreeObject,\n };\n }\n return item;\n });\n\n triggerChange(updatedItems);\n };\n\n const showFormChangesDialogIfNeeded = (callback: () => void) => {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n reloadOriginalValuesForFormItem();\n callback();\n setFormHasChanges(false);\n },\n });\n } else {\n callback();\n }\n };\n\n const showRemoveConfirm = () => {\n if (isMany2many) {\n showUnlinkItemDialog({\n t,\n onOk: async () => {\n if (currentView === \"form\") {\n removeCurrentItem();\n } else {\n removeSelectedItems();\n }\n },\n });\n return;\n }\n\n showRemoveItemDialog({\n t,\n onOk: async () => {\n if (currentView === \"form\") {\n removeCurrentItem();\n } else {\n removeSelectedItems();\n }\n },\n });\n };\n\n const createItem = async () => {\n const { inv_field } = ooui;\n let defaultValues: any;\n\n if (inv_field && activeId) {\n defaultValues = { [inv_field]: activeId };\n }\n\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n });\n } else {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n }\n };\n\n const searchItem = async () => {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setShowSearchModal(true);\n });\n } else {\n setShowSearchModal(true);\n }\n };\n\n const removeCurrentItem = async () => {\n setIsLoading(true);\n setFormHasChanges(false);\n setError(undefined);\n\n try {\n if (itemsToShow[itemIndex].id! > 0) {\n const updatedItems = items.map((item) => {\n if (item.id === itemsToShow[itemIndex].id!) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n } else {\n triggerChange(\n items.filter((item) => item.id !== itemsToShow[itemIndex].id!),\n );\n }\n } catch (err) {\n setError(err as any);\n }\n\n setItemIndex(0);\n setIsLoading(false);\n };\n\n const removeSelectedItems = async () => {\n const itemsToRemove = itemsToShow.filter((item) => {\n return selectedRowKeys.includes(item.id);\n });\n\n setIsLoading(true);\n setFormHasChanges(false);\n setError(undefined);\n\n try {\n const idsToRemove: number[] = itemsToRemove.map((item) => item.id!);\n\n const updatedItems = items\n .filter((item) => {\n if (idsToRemove.includes(item.id!) && item.id! < 0) {\n return false;\n }\n return true;\n })\n .map((item) => {\n if (idsToRemove.includes(item.id!)) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n } catch (err) {\n setError(err as any);\n }\n\n setItemIndex(0);\n setIsLoading(false);\n };\n\n // This is the callback called when a modal is done creating/updating the object\n const onFormModalSubmitSucceed = (\n id: number | undefined,\n _: any,\n values: any,\n x2manyPendingLink: boolean = false,\n ) => {\n let updatedItems: One2manyItem[];\n\n if (x2manyPendingLink) {\n updatedItems = items.concat({\n id,\n operation: \"pendingLink\",\n values: { ...values, id },\n treeValues: { ...values, id },\n });\n } else if (id) {\n updatedItems = items.map((item: One2manyItem) => {\n if (item.id === id) {\n return {\n id,\n operation: id > 0 ? \"pendingUpdate\" : \"pendingCreate\",\n values: { ...values, id },\n treeValues: { ...values, id },\n };\n }\n return item;\n });\n } else {\n const nextId = getNextPendingId(items);\n updatedItems = items.concat({\n id: nextId,\n operation: \"pendingCreate\",\n values: { ...values, id: nextId },\n treeValues: { ...values, id: nextId },\n });\n }\n\n triggerChange(updatedItems);\n\n if (!continuousEntryMode) {\n setShowFormModal(false);\n }\n };\n\n const onTreeRowClicked = async (record: any) => {\n const { id: itemId } = record;\n\n let itemsToLoadFrom: One2manyItem[] | undefined = items;\n\n // We should fetch the form data if needed in order to get the form values\n const modalItem = items.find((item) => item.id === itemId);\n if (modalItem?.values === undefined) {\n itemsToLoadFrom = await fetchOriginalItemsFromApi(\"form\");\n }\n\n // We show the detail for the clicked item in a Form modal\n setModalItem(itemsToLoadFrom!.find((item) => item.id === itemId));\n setContinuousEntryMode(false);\n setShowFormModal(true);\n };\n\n const onSearchModalSelectValue = async (ids: number[]) => {\n setIsLoading(true);\n\n const updatedItems = items;\n const filteredIds = ids.filter((id) => {\n return !items.find((item) => item.id === id);\n });\n\n try {\n for (const id of filteredIds) {\n const updatedFormObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: views.get(\"form\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n const updatedTreeObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: views.get(\"tree\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n updatedItems.push({\n id,\n operation: \"pendingLink\",\n values: updatedFormObject,\n treeValues: updatedTreeObject,\n });\n }\n\n triggerChange(updatedItems);\n } catch (e) {\n setError(e as any);\n } finally {\n setIsLoading(false);\n }\n };\n\n // TODO: improve this. Do we really have to parse the entire object just to get the title?\n function getTitle() {\n const ViewType: any = (ViewObjects as any)[currentView];\n if (currentView === \"graph\") {\n const parsedGraph = parseGraph(views.get(\"graph\").arch);\n return parsedGraph.string!;\n } else {\n const ooui = new ViewType(views.get(currentView).fields);\n ooui.parse(views.get(currentView).arch);\n return ooui.string!;\n }\n }\n\n const content = () => {\n if (currentView === \"form\") {\n if (itemsToShow.length === 0) {\n return t(\"noCurrentEntries\");\n }\n\n if (\n currentView !== previousCurrentView.current &&\n items.some((item) => !item.values)\n ) {\n return <Spin />;\n }\n\n return (\n <Form\n formView={views.get(\"form\")}\n values={itemsToShow[itemIndex]?.values}\n parentContext={{ ...getContext?.(), ...context }}\n model={relation}\n id={itemsToShow[itemIndex]?.id}\n submitMode={\"values\"}\n onFieldsChange={(values: any) => {\n const currentItemId = itemsToShow[itemIndex]?.id;\n\n const updatedItems = items.map((item) => {\n if (item.id === currentItemId) {\n return {\n ...item,\n operation:\n item.operation === \"original\"\n ? \"pendingUpdate\"\n : item.operation,\n values: { ...values, id: currentItemId },\n treeValues: { ...values, id: currentItemId },\n };\n }\n return item;\n });\n\n triggerChange(updatedItems);\n\n setFormHasChanges(true);\n }}\n readOnly={readOnly}\n />\n );\n }\n\n let resultsToShow = [];\n\n if (itemsToShow.some((item) => item.treeValues)) {\n resultsToShow = sorter\n ? sortResults({\n resultsToSort: itemsToShow.map((item) => item.treeValues),\n sorter,\n fields: {\n ...views.get(\"tree\").fields,\n ...(views.get(\"form\")?.fields || {}),\n },\n })\n : itemsToShow.map((item) => item.treeValues);\n }\n\n if (currentView === \"tree\") {\n return (\n <Tree\n total={itemsToShow.length}\n limit={itemsToShow.length}\n treeView={views.get(\"tree\")}\n results={resultsToShow}\n loading={isLoading}\n onRowClicked={\n views.get(\"form\")?.fields !== undefined\n ? onTreeRowClicked\n : undefined\n }\n showPagination={false}\n selectedRowKeys={selectedRowKeys}\n onRowSelectionChange={setSelectedRowKeys}\n sorter={sorter}\n onChangeSort={setSorter}\n context={{ ...getContext?.(), ...context }}\n colorsForResults={colorsForResults}\n readonly={readOnly}\n scrollY={ooui?.height}\n />\n );\n }\n if (currentView === \"graph\") {\n const domain = [[`${ooui.inv_field}`, \"=\", activeId]];\n return (\n <Graph\n view_id={views.get(\"graph\").view_id}\n model={ooui.relation}\n domain={domain}\n context={{ ...getContext?.(), ...context }}\n limit={0}\n />\n );\n }\n };\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n // If we are in create mode we have to show the modal in continuous mode.\n // This means the modal won't close after clicking OK, the modal will add the new item\n // and will reset to defaults to let the user add a new item.\n const mustClearAfterSave = continuousEntryMode;\n\n if (isLoading) {\n return <Spin />;\n }\n\n return (\n <>\n <One2manyTopBar\n mode={currentView}\n title={getTitle()}\n readOnly={readOnly || false}\n isMany2Many={isMany2many}\n formHasChanges={formHasChanges}\n totalItems={itemsToShow.length}\n currentItemIndex={itemIndex}\n onDelete={showRemoveConfirm}\n onCreateItem={createItem}\n onToggleViewMode={toggleViewMode}\n onPreviousItem={previousItem}\n onNextItem={nextItem}\n onSearchItem={searchItem}\n selectedRowKeys={selectedRowKeys}\n showCreateButton={views.get(\"form\")?.fields !== undefined}\n showToggleButton={views.size > 1}\n />\n {content()}\n <FormModal\n formView={views.get(\"form\")}\n model={relation}\n id={modalItem?.id}\n submitMode={\"2many\"}\n values={modalItem?.values}\n defaultValues={modalItem?.defaultValues}\n visible={showFormModal}\n onSubmitSucceed={onFormModalSubmitSucceed}\n parentContext={{ ...getContext?.(), ...context }}\n onCancel={() => {\n setContinuousEntryMode(false);\n setShowFormModal(false);\n }}\n readOnly={readOnly}\n mustClearAfterSave={mustClearAfterSave}\n />\n <SearchModal\n domain={transformedDomain.current}\n model={relation}\n context={{ ...getContext?.(), ...context }}\n visible={showSearchModal}\n onSelectValues={async (ids: number[]) => {\n setShowSearchModal(false);\n onSearchModalSelectValue(ids);\n }}\n onCloseModal={() => {\n setShowSearchModal(false);\n }}\n />\n </>\n );\n};\n\nexport { One2manyInput, One2manyItem, One2manyValue };\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\nimport { transformDomainForChildWidget } from \"@gisce/ooui\";\nimport { useContext, useEffect, useRef } from \"react\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\n\nexport const useOne2ManyDomain = ({\n fieldName,\n widgetDomain,\n}: {\n fieldName: string;\n widgetDomain?: string;\n}) => {\n const transformedDomain = useRef<any[]>([]);\n const {\n getFields,\n getValues,\n getContext,\n domain: formDomain,\n } = (useContext(FormContext) as FormContextType) || {};\n\n useEffect(() => {\n parseDomain();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [formDomain]);\n\n async function parseDomain() {\n if (widgetDomain) {\n transformedDomain.current =\n await ConnectionProvider.getHandler().evalDomain({\n domain: widgetDomain,\n values: transformPlainMany2Ones({\n fields: getFields(),\n values: getValues(),\n }),\n fields: getFields(),\n context: getContext(),\n });\n }\n\n if (formDomain && formDomain.length > 0) {\n transformedDomain.current = transformedDomain.current.concat(\n transformDomainForChildWidget({\n domain: formDomain,\n widgetFieldName: fieldName,\n }),\n );\n }\n }\n\n return transformedDomain.current;\n};\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { getColorMap, getTree } from \"@/helpers/treeHelper\";\nimport { TreeView } from \"@/types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport const useOne2manyTree = ({\n treeView,\n relation,\n context,\n}: {\n treeView: TreeView;\n relation: string;\n context: any;\n}) => {\n const [selectedRowKeys, setSelectedRowKeys] = useState<any>([]);\n const firstVisibleRowIndex = useRef(0);\n const selectedRowKeysRef = useRef(selectedRowKeys);\n const allRowSelectedMode = useRef(false);\n\n const onChangeAllRowSelectedMode = useCallback((value: boolean) => {\n allRowSelectedMode.current = value;\n }, []);\n\n const onChangeFirstVisibleRowIndex = useCallback((index: number) => {\n firstVisibleRowIndex.current = index;\n }, []);\n\n const onGetFirstVisibileRowIndex = useCallback(() => {\n return firstVisibleRowIndex.current;\n }, []);\n\n useEffect(() => {\n selectedRowKeysRef.current = selectedRowKeys;\n }, [selectedRowKeys]);\n\n const onGetSelectedRowKeys = useCallback(() => {\n if (allRowSelectedMode) {\n return [];\n }\n return selectedRowKeysRef.current;\n }, []);\n\n const treeOoui = useMemo(() => {\n return getTree(treeView);\n }, [treeView]);\n\n const onTreeFetchRows = useDeepCompareCallback(\n async (idsToFetch: number[]) => {\n const fetchedData =\n await ConnectionProvider.getHandler().readEvalUiObjects({\n model: relation,\n ids: idsToFetch,\n arch: treeView.arch,\n fields: treeView.fields,\n context,\n attrs: treeOoui.colors && {\n colors: treeOoui.colors,\n },\n });\n const results = fetchedData[0];\n const colors = getColorMap(fetchedData[1]);\n return { results, colors };\n },\n [context, relation, treeOoui.colors, treeView],\n );\n\n return {\n onTreeFetchRows,\n treeOoui,\n setSelectedRowKeys,\n selectedRowKeys,\n onChangeFirstVisibleRowIndex,\n onGetFirstVisibileRowIndex,\n onGetSelectedRowKeys,\n onChangeAllRowSelectedMode,\n allRowSelectedMode: allRowSelectedMode.current,\n };\n};\n","import { useCallback, useContext, useEffect, useState } from \"react\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { TreeView, FormView } from \"@/types\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\n\nexport const useOne2manyForm = ({\n items,\n relation,\n context,\n treeView,\n formView,\n triggerChange,\n}: {\n items: One2manyItem[];\n context: any[];\n relation: string;\n treeView: TreeView;\n formView: FormView;\n triggerChange: (items: One2manyItem[]) => void;\n}) => {\n const [formHasChanges, setFormHasChanges] = useState<boolean>(false);\n const { itemIndex } = useContext(One2manyContext) as One2manyContextType;\n const { t } = useLocale();\n\n // Whenever we save the form, we must reset the formHasChanges state\n useEffect(() => {\n const currentItem = items[itemIndex];\n if (!currentItem || currentItem?.operation === \"original\") {\n setFormHasChanges(false);\n }\n }, [itemIndex, items]);\n\n const getOriginalItemsWithRestoredItemId = useCallback(\n async ({ id }: { id: number }) => {\n const updatedFormObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: formView.fields,\n context,\n })\n )[0];\n\n const updatedTreeObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: treeView.fields,\n context,\n })\n )[0];\n\n const updatedItems: One2manyItem[] = items.map((item) => {\n if (item.id === id) {\n return {\n ...item,\n operation: \"original\",\n values: updatedFormObject,\n treeValues: updatedTreeObject,\n };\n }\n return item;\n });\n\n return updatedItems;\n },\n [context, formView.fields, items, relation, treeView.fields],\n );\n\n const onFormChanges = useCallback(\n (newUpdatedItems: One2manyItem[]) => {\n setFormHasChanges(true);\n triggerChange(newUpdatedItems);\n },\n [setFormHasChanges, triggerChange],\n );\n\n const reloadOriginalValuesForCurrentItem = useCallback(async () => {\n const { id } = items[itemIndex];\n if (!id) return;\n const originalItems = await getOriginalItemsWithRestoredItemId({ id });\n triggerChange(originalItems);\n }, [getOriginalItemsWithRestoredItemId, itemIndex, items, triggerChange]);\n\n const showFormChangesDialogIfNeeded = useCallback(\n (callback: () => void) => {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n reloadOriginalValuesForCurrentItem();\n callback();\n setFormHasChanges(false);\n },\n });\n } else {\n callback();\n }\n },\n [formHasChanges, reloadOriginalValuesForCurrentItem, setFormHasChanges, t],\n );\n\n return {\n showFormChangesDialogIfNeeded,\n formHasChanges,\n setFormHasChanges,\n getOriginalItemsWithRestoredItemId,\n onFormChanges,\n };\n};\n","import { One2manyItem } from \"./One2manyInput\";\nimport { useDeepCompareMemo } from \"use-deep-compare\";\n\nexport const useOne2manyItems = ({\n one2manyItems,\n}: {\n one2manyItems: One2manyItem[];\n}) => {\n return useDeepCompareMemo(() => {\n return one2manyItems.filter((item) => item.operation !== \"pendingRemove\");\n }, [one2manyItems]);\n};\n","import { FormView } from \"@/types\";\nimport Form from \"@/widgets/views/Form\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { useContext } from \"react\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { filterDuplicateItems } from \"@/helpers/one2manyHelper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nexport type One2manyFormProps = {\n formView: FormView;\n items: One2manyItem[];\n context: any;\n relation: string;\n readOnly: boolean;\n onChange: (items: One2manyItem[]) => void;\n};\n\nexport const One2manyForm = ({\n formView,\n items,\n context,\n relation,\n readOnly,\n onChange,\n}: One2manyFormProps) => {\n const { itemIndex } = useContext(One2manyContext) as One2manyContextType;\n\n const { t } = useLocale();\n\n if (items.length === 0) {\n return t(\"noCurrentEntries\");\n }\n\n return (\n <Form\n formView={formView}\n values={items[itemIndex]?.values}\n parentContext={context}\n model={relation}\n id={items[itemIndex]?.id}\n submitMode={\"values\"}\n onFieldsChange={(values: any) => {\n const currentItemId = items[itemIndex]?.id;\n\n const updatedItems = items.map((item) => {\n if (item.id === currentItemId) {\n return {\n ...item,\n operation:\n item.operation === \"original\"\n ? \"pendingUpdate\"\n : item.operation,\n values: { ...values, id: currentItemId },\n treeValues: { ...values, id: currentItemId },\n };\n }\n return item;\n });\n\n onChange(filterDuplicateItems(updatedItems));\n }}\n readOnly={readOnly}\n />\n );\n};\n","import { showRemoveItemDialog } from \"@/ui/RemoveItemDialog\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { useCallback, useContext } from \"react\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { showUnlinkItemDialog } from \"@/ui/UnlinkItemDialog\";\nimport { showErrorExceptionDialog } from \"@/ui/GenericErrorDialog\";\n\nexport const useOne2manyRemove = ({\n isMany2many,\n triggerChange,\n items,\n setFormHasChanges,\n selectedRowKeys,\n setSelectedRowKeys,\n}: {\n isMany2many: boolean;\n triggerChange: (items: One2manyItem[]) => void;\n items: One2manyItem[];\n setFormHasChanges: (hasChanges: boolean) => void;\n selectedRowKeys: number[];\n setSelectedRowKeys: (selectedRowKeys: number[]) => void;\n}) => {\n const { t } = useLocale();\n const { currentView, itemIndex, setItemIndex } = useContext(\n One2manyContext,\n ) as One2manyContextType;\n\n const removeSelectedItems = useCallback(async () => {\n const itemsToRemove: One2manyItem[] = getItemsToRemove({\n selectedRowKeys,\n items,\n });\n\n setFormHasChanges(false);\n\n try {\n const idsToRemove: number[] = itemsToRemove.map((item) => item.id!);\n\n const updatedItems = items\n .filter((item) => {\n if (idsToRemove.includes(item.id!) && item.id! < 0) {\n return false;\n }\n return true;\n })\n .map((item) => {\n if (idsToRemove.includes(item.id!)) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n setSelectedRowKeys([]);\n } catch (err) {\n showErrorExceptionDialog(err);\n }\n\n setItemIndex(0);\n }, [\n items,\n selectedRowKeys,\n setFormHasChanges,\n setItemIndex,\n setSelectedRowKeys,\n triggerChange,\n ]);\n\n const removeCurrentItem = useCallback(async () => {\n setFormHasChanges(false);\n\n try {\n if (items[itemIndex].id! > 0) {\n const updatedItems = items.map((item) => {\n if (item.id === items[itemIndex].id!) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n } else {\n triggerChange(items.filter((item) => item.id !== items[itemIndex].id!));\n }\n } catch (err) {\n showErrorExceptionDialog(err);\n }\n\n setItemIndex(0);\n }, [items, itemIndex, setFormHasChanges, setItemIndex, triggerChange]);\n\n const onOk = useCallback(async () => {\n return currentView === \"form\"\n ? await removeCurrentItem()\n : await removeSelectedItems();\n }, [currentView, removeCurrentItem, removeSelectedItems]);\n\n const showRemoveConfirm = useCallback(() => {\n if (isMany2many) {\n showUnlinkItemDialog({\n t,\n onOk,\n });\n return;\n }\n\n showRemoveItemDialog({\n t,\n onOk,\n });\n }, [isMany2many, onOk, t]);\n\n return { showRemoveConfirm };\n};\n\ninterface IdCount {\n [key: number]: number;\n}\n\nfunction getItemsToRemove({\n selectedRowKeys,\n items,\n}: {\n selectedRowKeys: number[];\n items: One2manyItem[];\n}) {\n const itemsToRemove: One2manyItem[] = [];\n // Count the number of times each id appears in selectedRowKeys\n const idCount = selectedRowKeys.reduce<IdCount>((acc: IdCount, id) => {\n acc[id] = (acc[id] || 0) + 1;\n return acc;\n }, {});\n\n // Loop over items and push items to remove based on the count\n items.forEach((item) => {\n if (item.id && idCount[item.id] > 0) {\n itemsToRemove.push(item);\n idCount[item.id] -= 1; // Decrement the count each time an item is added to itemsToRemove\n }\n });\n return itemsToRemove;\n}\n","import { getNextPendingId } from \"@/helpers/one2manyHelper\";\nimport { ConnectionProvider, One2manyItem } from \"@/index\";\nimport { FormView, ViewType } from \"@/types\";\nimport { useCallback, useState } from \"react\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport const useOne2manyFormModal = ({\n currentView,\n inv_field,\n activeId,\n showFormChangesDialogIfNeeded,\n items,\n triggerChange,\n setCurrentView,\n setItemIndex,\n relation,\n formView,\n context,\n}: {\n currentView: string;\n inv_field?: string;\n activeId?: number;\n showFormChangesDialogIfNeeded: (callback: () => void) => void;\n items: One2manyItem[];\n triggerChange: (items: One2manyItem[]) => void;\n setCurrentView: (view: ViewType) => void;\n setItemIndex: (index: number) => void;\n relation: string;\n formView: FormView;\n context: any;\n}) => {\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [modalItem, setModalItem] = useState<One2manyItem>();\n const [continuousEntryMode, setContinuousEntryMode] =\n useState<boolean>(false);\n\n const createItem = useCallback(async () => {\n let defaultValues: any;\n\n if (inv_field && activeId) {\n defaultValues = { [inv_field]: activeId };\n }\n\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n });\n } else {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n }\n }, [activeId, currentView, inv_field, showFormChangesDialogIfNeeded]);\n\n const onCancelFormModal = useCallback(() => {\n setShowFormModal(false);\n setContinuousEntryMode(false);\n }, []);\n\n const onFormModalSubmitSucceed = useDeepCompareCallback(\n (\n id: number | undefined,\n _: any,\n values: any,\n x2manyPendingLink: boolean = false,\n ) => {\n let updatedItems: One2manyItem[];\n\n if (x2manyPendingLink) {\n updatedItems = items.concat({\n id,\n operation: \"pendingLink\",\n values: { ...values, id },\n treeValues: { ...values, id },\n });\n } else if (id) {\n updatedItems = items.map((item: One2manyItem) => {\n if (item.id === id) {\n return {\n id,\n operation: id > 0 ? \"pendingUpdate\" : \"pendingCreate\",\n values: { ...values, id },\n treeValues: { ...values, id },\n };\n }\n return item;\n });\n } else {\n const nextId = getNextPendingId(items);\n updatedItems = items.concat({\n id: nextId,\n operation: \"pendingCreate\",\n values: { ...values, id: nextId },\n treeValues: { ...values, id: nextId },\n });\n }\n\n triggerChange(updatedItems);\n\n if (!continuousEntryMode) {\n setShowFormModal(false);\n }\n },\n [continuousEntryMode, items, triggerChange],\n );\n\n const openItemInFormModal = useDeepCompareCallback(\n async (item: One2manyItem) => {\n const { id: itemId } = item;\n\n let itemsToLoadFrom: One2manyItem[] | undefined = items;\n\n // We should fetch the form data if needed in order to get the form values\n const modalItem = items.find((item) => item.id === itemId);\n if (modalItem?.values === undefined) {\n itemsToLoadFrom = await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [item.id!],\n fields: formView.fields,\n context,\n });\n }\n\n // We show the detail for the clicked item in a Form modal\n setModalItem(itemsToLoadFrom!.find((item) => item.id === itemId));\n setContinuousEntryMode(false);\n setShowFormModal(true);\n },\n [context, formView.fields, items, relation, setCurrentView, setItemIndex],\n );\n\n return {\n showFormModal,\n modalItem,\n continuousEntryMode,\n createItem,\n onCancelFormModal,\n onFormModalSubmitSucceed,\n openItemInFormModal,\n };\n};\n","import { getValuesForFields } from \"@/helpers/one2manyHelper\";\nimport { ConnectionProvider, One2manyItem, Views } from \"@/index\";\nimport { showErrorExceptionDialog } from \"@/ui/GenericErrorDialog\";\nimport { useCallback, useState } from \"react\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport const useOne2manySearchModal = ({\n currentView,\n showFormChangesDialogIfNeeded,\n items,\n triggerChange,\n context,\n views,\n relation,\n}: {\n currentView: string;\n showFormChangesDialogIfNeeded: (callback: () => void) => void;\n items: One2manyItem[];\n triggerChange: (items: One2manyItem[]) => void;\n context: any[];\n views: Views;\n relation: string;\n}) => {\n const [showSearchModal, setShowSearchModal] = useState<boolean>(false);\n\n const searchItem = async () => {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setShowSearchModal(true);\n });\n } else {\n setShowSearchModal(true);\n }\n };\n\n const onCloseSearchModal = useCallback(() => {\n setShowSearchModal(false);\n }, []);\n\n const onSearchModalSelectValue = useDeepCompareCallback(\n async (ids: number[]) => {\n const updatedItems = [...items];\n const filteredIds = ids.filter((id) => {\n return !items.find((item) => item.id === id);\n });\n\n try {\n const updatedObjects =\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: filteredIds,\n fields: {\n ...views.get(\"form\").fields,\n ...views.get(\"tree\").fields,\n },\n context,\n });\n\n updatedObjects.forEach((item: any) => {\n updatedItems.push({\n id: item.id,\n operation: \"pendingLink\",\n values: getValuesForFields({\n values: item,\n fields: [\"id\", ...Object.keys(views.get(\"form\").fields)],\n }),\n treeValues: getValuesForFields({\n values: item,\n fields: [\"id\", ...Object.keys(views.get(\"tree\").fields)],\n }),\n });\n });\n\n triggerChange(updatedItems);\n } catch (e) {\n showErrorExceptionDialog(e);\n }\n },\n [context, items, relation, triggerChange, views],\n );\n\n const onSelectSearchValues = useCallback(\n async (ids: number[]) => {\n await onSearchModalSelectValue(ids);\n setShowSearchModal(false);\n },\n [onSearchModalSelectValue],\n );\n\n return {\n searchItem,\n showSearchModal,\n onCloseSearchModal,\n onSelectSearchValues,\n };\n};\n","import { ColumnState } from \"@gisce/react-formiga-table\";\nimport { One2manyTreeDataForHash } from \"./One2manyTree\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport type DataForHashWithModel = One2manyTreeDataForHash & { model: string };\n\nexport const useOne2manyColumnStorage = (dataForHash: DataForHashWithModel) => {\n const getColumnState = useDeepCompareCallback(():\n | ColumnState[]\n | undefined => {\n // Get the column state values from the localstorage for the curent model\n const columnState = localStorage.getItem(getKey(dataForHash));\n return columnState ? JSON.parse(columnState) : undefined;\n }, [dataForHash]);\n\n const updateColumnState = useDeepCompareCallback(\n (state: ColumnState[]) => {\n localStorage.setItem(getKey(dataForHash), JSON.stringify(state));\n },\n [dataForHash],\n );\n\n return { getColumnState, updateColumnState };\n};\n\nconst getKey = (dataForHash: DataForHashWithModel) => {\n return `columnState-${dataForHash.parentViewId}-${dataForHash.treeViewId}-${dataForHash.one2ManyFieldName}-${dataForHash.model}`;\n};\n","import { InfiniteTable, InfiniteTableRef } from \"@gisce/react-formiga-table\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { Tree as TreeOoui } from \"@gisce/ooui\";\nimport { RefObject, useCallback, useRef } from \"react\";\nimport { getTableColumns, getTableItems } from \"@/helpers/treeHelper\";\nimport { COLUMN_COMPONENTS } from \"@/widgets/views/Tree/treeComponents\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { useOne2manyColumnStorage } from \"./useOne2manyColumnStorage\";\nimport { useDeepCompareMemo } from \"use-deep-compare\";\n\nexport type One2manyTreeDataForHash = {\n parentViewId?: number;\n treeViewId?: number;\n one2ManyFieldName: string;\n};\n\nexport type One2manyTreeProps = {\n items: One2manyItem[];\n onRowDoubleClick: (record: any) => void;\n readOnly: boolean;\n height?: number;\n ooui: TreeOoui;\n context: any;\n onFetchRecords: (idsToFetch: number[]) => Promise<{\n results: any[];\n colors: { [key: number]: string };\n }>;\n onRowSelectionChange: (selectedIds: number[]) => void;\n gridRef?: React.RefObject<InfiniteTableRef>;\n relation: string;\n onChangeFirstVisibleRowIndex?: (index: number) => void;\n onGetFirstVisibleRowIndex?: () => number | undefined;\n onGetSelectedRowKeys?: () => any[];\n onAllRowSelectedModeChange?: (allRowSelectedMode: boolean) => void;\n allRowSelectedMode?: boolean;\n dataForHash: One2manyTreeDataForHash;\n};\n\nconst DEFAULT_HEIGHT = 400;\n\nexport const One2manyTree = ({\n items,\n height,\n onRowDoubleClick,\n readOnly,\n ooui,\n context,\n onFetchRecords,\n onRowSelectionChange,\n gridRef,\n relation,\n onChangeFirstVisibleRowIndex,\n onGetFirstVisibleRowIndex,\n onGetSelectedRowKeys,\n onAllRowSelectedModeChange,\n allRowSelectedMode,\n dataForHash,\n}: One2manyTreeProps) => {\n const internalGridRef = useRef<InfiniteTableRef>();\n const tableRef: RefObject<InfiniteTableRef> = gridRef! || internalGridRef!;\n\n const colorsForResults = useRef<{ [key: number]: string }>({});\n\n const prevItemsValue = useRef<One2manyItem[]>();\n const itemsRef = useRef<One2manyItem[]>(items);\n\n useDeepCompareEffect(() => {\n itemsRef.current = items;\n if (prevItemsValue.current === undefined) {\n prevItemsValue.current = items;\n return;\n }\n\n prevItemsValue.current = items;\n tableRef?.current?.refresh();\n tableRef?.current?.unselectAll();\n }, [items]);\n\n const totalRows = useDeepCompareMemo(() => items.length, [items]);\n\n const columns = useDeepCompareMemo(() => {\n return getTableColumns(\n ooui,\n {\n ...COLUMN_COMPONENTS,\n },\n context,\n );\n }, [context, ooui]);\n\n const onRequestData = useCallback(\n async (startRow: number, endRow: number) => {\n const itemsToFetch = itemsRef.current;\n const idsToFetch = itemsToFetch.map((item) => item.id) as number[];\n // now slice the records with startRow and endRow\n const idsToFetchSliced = idsToFetch.slice(startRow, endRow);\n\n // in this idsToFetchSliced we have the ids of the records that theoretically we have to fetch\n // however, it's possible that these items have operation different than original,\n // and we have to skip these items to being fetched, and passed later on to the callback as they were originally\n const realIdsToFetch = idsToFetchSliced.filter((id) => {\n const item = itemsToFetch.find((item) => item.id === id);\n return (\n item &&\n (item.operation === \"original\" || item.operation === \"pendingLink\")\n );\n });\n const otherItems = itemsToFetch.filter((item) => {\n return (\n item &&\n item.operation !== \"original\" &&\n item.operation !== \"pendingLink\"\n );\n });\n\n if (realIdsToFetch.length === 0 && otherItems.length === 0) {\n return [];\n }\n\n const { results, colors } = await onFetchRecords(realIdsToFetch);\n\n const preparedResults = getTableItems(ooui, results);\n\n // now we have to map the results to the original ids\n const resultsMapped = idsToFetchSliced.map((id) => {\n const result = preparedResults.find((result) => result.id === id);\n if (result) {\n return result;\n }\n return itemsToFetch.find((item) => item.id === id)?.treeValues;\n });\n\n colorsForResults.current = { ...colorsForResults.current, ...colors };\n return resultsMapped;\n },\n [onFetchRecords, ooui],\n );\n\n const onRowStyle = useCallback((record: any) => {\n if (colorsForResults.current[record.node?.data?.id]) {\n return { color: colorsForResults.current[record.node?.data?.id] };\n }\n return undefined;\n }, []);\n\n const { getColumnState, updateColumnState } = useOne2manyColumnStorage({\n ...dataForHash,\n model: relation,\n });\n\n return (\n <InfiniteTable\n ref={tableRef}\n height={height || DEFAULT_HEIGHT}\n columns={columns}\n onRequestData={onRequestData}\n onRowDoubleClick={onRowDoubleClick}\n readonly={readOnly}\n onRowStyle={onRowStyle}\n onRowSelectionChange={onRowSelectionChange}\n onColumnChanged={updateColumnState}\n onGetColumnsState={getColumnState}\n onChangeFirstVisibleRowIndex={onChangeFirstVisibleRowIndex}\n onGetFirstVisibleRowIndex={onGetFirstVisibleRowIndex}\n onGetSelectedRowKeys={onGetSelectedRowKeys}\n allRowSelectedMode={allRowSelectedMode}\n onAllRowSelectedModeChange={onAllRowSelectedModeChange}\n totalRows={totalRows}\n />\n );\n};\n","import React, { useCallback, useContext, useMemo, useRef } from \"react\";\nimport { One2manyInputProps } from \"./One2many.types\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { One2many as One2manyOoui } from \"@gisce/ooui\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { useOne2ManyDomain } from \"./useOne2manyDomain\";\nimport { useOne2manyTree } from \"./useOne2manyTree\";\nimport { One2manyTopBar } from \"./One2manyTopBar\";\nimport { ViewType } from \"@/types\";\nimport { useOne2manyForm } from \"./useOne2manyForm\";\nimport { useOne2manyItems } from \"./useOne2manyItems\";\nimport { One2manyForm } from \"./One2manyForm\";\nimport { useOne2manyRemove } from \"./useOne2manyRemove\";\nimport { InfiniteTableRef } from \"@gisce/react-formiga-table\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\nimport { FormModal, SearchModal } from \"@/index\";\nimport { useOne2manyFormModal } from \"./useOne2manyFormModal\";\nimport { useOne2manySearchModal } from \"./useOne2manySearchModal\";\nimport { One2manyTree } from \"./One2manyTree\";\nimport \"@gisce/react-formiga-table/style.css\";\nimport { Graph } from \"@/widgets/views/Graph/Graph\";\n\nconst SUPPORTED_VIEWS = [\"form\", \"tree\", \"graph\"];\n\nexport type One2manyValue = {\n fields?: any;\n items: One2manyItem[];\n};\n\nexport type One2manyItem = {\n operation?:\n | \"original\"\n | \"pendingRemove\"\n | \"pendingUpdate\"\n | \"pendingCreate\"\n | \"pendingLink\";\n id?: number;\n values?: any;\n treeValues?: any;\n defaultValues?: any;\n};\n\nexport type One2manyInputInfiniteProps = One2manyInputProps & {\n parentViewId?: number;\n treeViewId?: number;\n};\n\nexport const One2manyInput: React.FC<One2manyInputInfiniteProps> = (\n props: One2manyInputInfiniteProps,\n) => {\n const gridRef = useRef<InfiniteTableRef>(null);\n const { value, onChange, ooui, views } = props;\n const { items: one2manyItems = [] } = value || {};\n const items = useOne2manyItems({ one2manyItems });\n const { currentView, setCurrentView, itemIndex, setItemIndex } = useContext(\n One2manyContext,\n ) as One2manyContextType;\n const {\n readOnly,\n relation,\n context: widgetContext,\n domain: widgetDomain,\n id: fieldName,\n } = ooui as One2manyOoui;\n const formContext = useContext(FormContext) as FormContextType;\n const { activeId, getContext } = formContext || {};\n\n const showToggleButton = views.size > 1;\n const showCreateButton = views.get(\"form\")?.fields !== undefined;\n\n const context = useMemo(() => {\n return { ...getContext?.(), ...widgetContext };\n }, [getContext, widgetContext]);\n\n const domain = useOne2ManyDomain({\n widgetDomain,\n fieldName,\n });\n\n const {\n treeOoui,\n onTreeFetchRows,\n selectedRowKeys,\n setSelectedRowKeys,\n onChangeFirstVisibleRowIndex,\n onGetFirstVisibileRowIndex,\n onGetSelectedRowKeys,\n allRowSelectedMode,\n onChangeAllRowSelectedMode,\n } = useOne2manyTree({\n treeView: views.get(\"tree\"),\n relation,\n context,\n });\n\n const title = useMemo(() => {\n const { title } = views.get(currentView) || {};\n return title || ooui.label;\n }, [currentView, ooui.label, views]);\n\n const isMany2many = ooui.type === \"many2many\";\n\n const triggerChange = useCallback(\n (changedValues: One2manyItem[]) => {\n onChange?.({\n fields: views.get(\"form\")?.fields || views.get(\"tree\")?.fields,\n items: changedValues,\n });\n },\n [onChange, views],\n );\n\n const {\n formHasChanges,\n onFormChanges,\n showFormChangesDialogIfNeeded,\n setFormHasChanges,\n } = useOne2manyForm({\n items,\n formView: views.get(\"form\"),\n treeView: views.get(\"tree\"),\n relation,\n context,\n triggerChange,\n });\n\n const {\n showFormModal,\n modalItem,\n continuousEntryMode,\n onCancelFormModal,\n onFormModalSubmitSucceed,\n createItem,\n openItemInFormModal,\n } = useOne2manyFormModal({\n activeId,\n inv_field: ooui.inv_field,\n showFormChangesDialogIfNeeded,\n currentView,\n triggerChange,\n items,\n setCurrentView,\n setItemIndex,\n context,\n relation,\n formView: views.get(\"form\"),\n });\n\n const {\n showSearchModal,\n onSelectSearchValues,\n onCloseSearchModal,\n searchItem,\n } = useOne2manySearchModal({\n showFormChangesDialogIfNeeded,\n currentView,\n triggerChange,\n items,\n views,\n context,\n relation,\n });\n\n const { showRemoveConfirm } = useOne2manyRemove({\n isMany2many,\n items,\n triggerChange,\n setFormHasChanges,\n selectedRowKeys,\n setSelectedRowKeys,\n });\n\n const toggleViewMode = () => {\n const keys = Array.from(views.keys());\n const nextView = keys[\n (keys.indexOf(currentView) + 1) % keys.length\n ] as ViewType;\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setCurrentView(nextView);\n });\n } else {\n setCurrentView(nextView);\n }\n };\n\n const onRowDoubleClick = useDeepCompareCallback(\n (item: any) => {\n if (!views.get(\"form\")?.fields) return;\n openItemInFormModal(item);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [items],\n );\n\n const onPreviousItem = useCallback(() => {\n if (itemIndex > 0) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex - 1);\n });\n } else {\n setItemIndex(itemIndex - 1);\n }\n }\n }, [currentView, itemIndex, setItemIndex, showFormChangesDialogIfNeeded]);\n\n const onNextItem = useCallback(() => {\n const totalItems = items.length;\n if (itemIndex < totalItems - 1) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex + 1);\n });\n } else {\n setItemIndex(itemIndex + 1);\n }\n }\n }, [\n currentView,\n itemIndex,\n items.length,\n setItemIndex,\n showFormChangesDialogIfNeeded,\n ]);\n\n return (\n <>\n <One2manyTopBar\n mode={currentView}\n title={title}\n readOnly={readOnly || false}\n isMany2Many={isMany2many}\n formHasChanges={formHasChanges}\n totalItems={items.length}\n currentItemIndex={itemIndex}\n onDelete={showRemoveConfirm}\n onCreateItem={createItem}\n onToggleViewMode={toggleViewMode}\n onPreviousItem={onPreviousItem}\n onNextItem={onNextItem}\n onSearchItem={searchItem}\n selectedRowKeys={selectedRowKeys}\n showCreateButton={showCreateButton}\n showToggleButton={showToggleButton}\n />\n {currentView === \"tree\" && (\n <One2manyTree\n gridRef={gridRef}\n items={items}\n readOnly={readOnly || false}\n onFetchRecords={onTreeFetchRows}\n ooui={treeOoui}\n context={context}\n onRowDoubleClick={onRowDoubleClick}\n onRowSelectionChange={setSelectedRowKeys}\n relation={relation}\n onChangeFirstVisibleRowIndex={onChangeFirstVisibleRowIndex}\n onGetFirstVisibleRowIndex={onGetFirstVisibileRowIndex}\n onGetSelectedRowKeys={onGetSelectedRowKeys}\n allRowSelectedMode={allRowSelectedMode}\n onAllRowSelectedModeChange={onChangeAllRowSelectedMode}\n dataForHash={{\n parentViewId: props.parentViewId,\n treeViewId: props.treeViewId,\n one2ManyFieldName: fieldName,\n }}\n />\n )}\n {currentView === \"form\" && (\n <One2manyForm\n items={items}\n formView={views.get(\"form\")}\n context={context}\n relation={relation}\n readOnly={readOnly || false}\n onChange={onFormChanges}\n />\n )}\n <FormModal\n formView={views.get(\"form\")}\n model={relation}\n id={modalItem?.id}\n submitMode={\"2many\"}\n values={modalItem?.values}\n defaultValues={modalItem?.defaultValues}\n visible={showFormModal}\n onSubmitSucceed={onFormModalSubmitSucceed}\n parentContext={context}\n onCancel={onCancelFormModal}\n readOnly={readOnly}\n mustClearAfterSave={continuousEntryMode}\n />\n <SearchModal\n domain={domain}\n model={relation}\n context={context}\n visible={showSearchModal}\n onSelectValues={onSelectSearchValues}\n onCloseModal={onCloseSearchModal}\n />\n {currentView === \"graph\" && (\n <Graph\n view_id={views.get(\"graph\").view_id}\n model={relation}\n domain={[[`${ooui.inv_field}`, \"=\", activeId]]}\n context={context}\n limit={0}\n />\n )}\n {!SUPPORTED_VIEWS.includes(currentView) && (\n <span>Unsupported view {currentView}</span>\n )}\n </>\n );\n};\n","import { useContext, useState } from \"react\";\nimport { One2many as One2manyOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { Spin, Alert } from \"antd\";\nimport { Views, ViewType } from \"@/types\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport One2manyProvider from \"@/context/One2manyContext\";\nimport { One2manyInput } from \"@/widgets/base/one2many/One2manyInput\";\nimport { One2manyInput as One2manyInputInfinite } from \"@/widgets/base/one2many/One2manyInputInfinite\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\n\ntype Props = {\n ooui: One2manyOoui;\n};\n\nexport const One2many = (props: Props) => {\n const { ooui } = props;\n const { mode, relation, views: oouiViews, required, context } = ooui;\n\n let initialView: ViewType;\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<string>();\n const [views, setViews] = useState<Views>(new Map<string, any>());\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext, formView } = formContext || {};\n const { view_id: parentViewId } = formView || {};\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [ooui]);\n\n const getViewData = async (type: ViewType) => {\n if (oouiViews && oouiViews[type]) {\n return oouiViews[type];\n }\n return await ConnectionProvider.getHandler().getView({\n model: relation,\n type,\n context: { ...getContext?.(), ...context },\n });\n };\n\n const fetchData = async () => {\n setIsLoading(true);\n setError(undefined);\n\n try {\n if (mode && mode.length > 0) {\n for (const m of mode as ViewType[]) {\n const v = await getViewData(m);\n views.set(m, v);\n }\n setViews(views);\n } else {\n const formView = await getViewData(\"form\");\n const treeView = await getViewData(\"tree\");\n views.set(\"form\", formView);\n views.set(\"tree\", treeView);\n setViews(views);\n }\n } catch (err) {\n setError(JSON.stringify(err));\n } finally {\n setIsLoading(false);\n }\n };\n\n if (mode && mode.length > 0) {\n initialView = mode[0] as ViewType;\n } else {\n initialView = \"tree\";\n }\n\n if (isLoading) {\n return <Spin />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n const validator = async (_: any, value: any) => {\n if (!value) throw new Error();\n if (!value.items) throw new Error();\n if (!Array.isArray(value.items)) throw new Error();\n if (value.items.length === 0) throw new Error();\n };\n\n return (\n <One2manyProvider initialView={initialView}>\n <Field\n required={required}\n type={\"array\"}\n validator={validator}\n {...props}\n >\n {ooui.infinite ? (\n <One2manyInputInfinite\n ooui={ooui}\n views={views}\n parentViewId={parentViewId}\n treeViewId={views.get(\"tree\")?.view_id}\n />\n ) : (\n <One2manyInput ooui={ooui} views={views} />\n )}\n </Field>\n </One2manyProvider>\n );\n};\n","import React, { useContext, useEffect, useRef, useState } from \"react\";\nimport { Input, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Float as FloatOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport { parseFloatToString, parseStringToFloat } from \"@/helpers/timeHelper\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\nexport const FloatTime = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as FloatOoui;\n\n return (\n <Field required={required} type={\"number\"} {...props}>\n <FloatTimeInput ooui={ooui as FloatOoui} />\n </Field>\n );\n};\n\ninterface FloatTimeInputProps {\n ooui: FloatOoui;\n value?: number;\n onChange?: (value?: number) => void;\n}\n\nexport const FloatTimeInput: React.FC<FloatTimeInputProps> = (\n props: FloatTimeInputProps,\n) => {\n const { ooui, value, onChange } = props;\n const { id, readOnly, required } = ooui as FloatOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const inputTextRef = useRef<string>();\n const [inputText, setInputText] = useState<string>();\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n useEffect(() => {\n setInputText(parseFloatToString(value!));\n }, [value]);\n\n const triggerChange = (changedValue?: number) => {\n onChange?.(changedValue);\n };\n\n function onValueStringChange(e: React.ChangeEvent<HTMLInputElement>) {\n inputTextRef.current = e.target.value;\n setInputText(e.target.value);\n }\n\n async function onElementLostFocus() {\n triggerChange(parseStringToFloat(inputText));\n await new Promise((resolve) => setTimeout(resolve, 300));\n elementHasLostFocus?.();\n }\n\n return (\n <Input\n value={inputText}\n disabled={readOnly}\n className={\"w-full\"}\n style={requiredStyle}\n id={id}\n placeholder={\"00:00\"}\n onChange={onValueStringChange}\n onBlur={onElementLostFocus}\n />\n );\n};\n","import React from \"react\";\nimport { Group as GroupOoui } from \"@gisce/ooui\";\nimport Container from \"./Container\";\nimport { FieldSet } from \"@gisce/react-formiga-components\";\nimport { Space } from \"antd\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\ntype Props = {\n ooui: GroupOoui;\n showLabel?: boolean;\n responsiveBehaviour: boolean;\n};\n\nfunction Group(props: Props): React.ReactElement {\n const { ooui, showLabel = true, responsiveBehaviour } = props;\n const icon: React.ElementType | undefined = iconMapper(ooui.icon || \"\");\n\n return (\n <>\n {(ooui.label || icon) && showLabel ? (\n <FieldSet label={ooui.label} icon={icon}>\n <Container\n container={ooui!.container}\n responsiveBehaviour={responsiveBehaviour}\n />\n </FieldSet>\n ) : (\n <Container\n container={ooui!.container}\n responsiveBehaviour={responsiveBehaviour}\n />\n )}\n </>\n );\n}\n\nexport default Group;\n","import React from \"react\";\nimport { Tabs } from \"antd\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\nimport { Notebook as NotebookOoui, Group as GroupOoui } from \"@gisce/ooui\";\nimport { Group } from \"@/index\";\nconst { TabPane } = Tabs;\n\ntype Props = {\n ooui: NotebookOoui;\n responsiveBehaviour: boolean;\n};\n\nfunction Notebook(props: Props): React.ReactElement {\n const { ooui, responsiveBehaviour } = props;\n const tabs = ooui.pages;\n\n function getPageIcon(icon: string) {\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <Tabs defaultActiveKey=\"1\" tabPosition={ooui.tabPosition}>\n {tabs\n .filter((page: any) => !page.invisible)\n .map((page: any) => {\n return (\n <TabPane\n tab={\n <>\n {getPageIcon(page.icon)} {page.label}\n </>\n }\n key={page.label}\n >\n <Group\n ooui={page as GroupOoui}\n showLabel={false}\n responsiveBehaviour={responsiveBehaviour}\n />\n </TabPane>\n );\n })}\n </Tabs>\n );\n}\n\nexport default Notebook;\n","import React, { CSSProperties, useContext, useState } from \"react\";\nimport { Input, Row, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Text as TextOoui } from \"@gisce/ooui\";\nimport { TranslationModal } from \"../modals/TranslationModal\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { TranslationOutlined } from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport showInfo from \"@/ui/InfoDialog\";\nconst { useToken } = theme;\n\nconst { TextArea } = Input;\n\ntype Props = {\n ooui: TextOoui;\n};\n\nconst Text = (props: Props) => {\n const { ooui } = props;\n const { id, readOnly, required, height, translatable } = ooui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n return (\n <Field required={required} {...props}>\n {translatable ? (\n <TranslatableText\n field={id}\n height={height}\n requiredStyle={requiredStyle}\n />\n ) : (\n <TextArea\n disabled={readOnly || translatable}\n style={{\n minHeight: height ? height + \"px\" : \"100%\",\n ...requiredStyle,\n }}\n rows={4}\n onBlur={elementHasLostFocus}\n />\n )}\n </Field>\n );\n};\n\nconst TranslatableText = ({\n value,\n field,\n requiredStyle,\n onChange,\n height,\n}: {\n value?: string;\n field: string;\n requiredStyle: CSSProperties | undefined;\n height: number | undefined;\n onChange?: (value: string) => void;\n}) => {\n const formContext = useContext(FormContext) as FormContextType;\n const {\n activeId,\n activeModel,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n } = formContext || {};\n const [translationModalVisible, setTranslationModalVisible] = useState(false);\n const { t } = useLocale();\n\n if (!activeId) {\n return (\n <>\n <Row gutter={8} wrap={false}>\n <TextArea\n value={value}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n style={{\n height: height ? height + \"px\" : \"100%\",\n ...requiredStyle,\n }}\n id={field}\n rows={4}\n onBlur={elementHasLostFocus}\n />\n </Row>\n <Row justify=\"end\" style={{ paddingTop: 5 }}>\n <ButtonWithTooltip\n tooltip={t(\"translate\")}\n icon={<TranslationOutlined />}\n onClick={async () => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n } else {\n showInfo(t(\"enterTextBeforeTranslate\"));\n }\n }}\n >\n {t(\"translate\")}\n </ButtonWithTooltip>\n </Row>\n </>\n );\n }\n\n return (\n <>\n <div\n onClick={() => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n return;\n }\n\n if (!translationModalVisible) {\n setTranslationModalVisible(true);\n }\n }}\n >\n <TextArea\n value={value}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n style={{\n height: height ? height + \"px\" : \"100%\",\n cursor: \"pointer\",\n pointerEvents: \"none\",\n ...requiredStyle,\n }}\n id={field}\n disabled={true}\n rows={4}\n onBlur={elementHasLostFocus}\n />\n </div>\n <TranslationModal\n id={activeId!}\n model={activeModel}\n field={field}\n visible={translationModalVisible}\n onCloseModal={() => {\n setTranslationModalVisible(false);\n }}\n onSubmitSucceed={() => {\n setTranslationModalVisible(false);\n fetchValues?.();\n }}\n />\n </>\n );\n};\n\nexport default Text;\n","import React from \"react\";\nimport { Divider, Space } from \"antd\";\nimport { Separator as SeparatorOoui } from \"@gisce/ooui\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\ntype Props = {\n ooui: SeparatorOoui;\n};\n\nexport const Separator = (props: Props) => {\n const { ooui } = props;\n const { label, icon } = ooui;\n const Icon: React.ElementType | undefined = iconMapper(icon || \"\");\n\n return (\n <Divider orientation=\"left\" className=\"text-sm\">\n {(Icon || label) && (\n <Space>\n {Icon ? <Icon /> : null}\n {label}\n </Space>\n )}\n </Divider>\n );\n};\n","import {\n ExportField,\n ExportOptions,\n PredefinedExport,\n PredefinedExportField,\n useLocale,\n} from \"@gisce/react-formiga-components\";\nimport { useCallback, useRef } from \"react\";\nimport { ConnectionProvider } from \"..\";\nimport showInfo from \"@/ui/InfoDialog\";\nimport { getMimeType, openBase64InNewTab } from \"@/helpers/filesHelper\";\n\nexport const useExport = ({\n model,\n context,\n selectedRegistersToExport,\n domain,\n limit,\n onClose,\n}: {\n model: string;\n context: any;\n selectedRegistersToExport?: any[];\n domain: any[];\n limit?: number;\n onClose: () => void;\n}) => {\n const fields = useRef<any>({});\n const exportModelFields = useRef<Map<string, any>>(new Map<string, any>());\n const { t } = useLocale();\n\n const onExport = useCallback(\n async (options: ExportOptions) => {\n if (\n options.selectedKeys === undefined ||\n options.selectedKeys.length === 0\n ) {\n showInfo(t(\"selectAtLeastOneField\"));\n return;\n }\n\n let exportDomain = domain;\n\n if (\n options.registersAmount === \"selected\" &&\n selectedRegistersToExport?.length !== 0\n ) {\n exportDomain = [\n [\"id\", \"in\", selectedRegistersToExport?.map((r) => r.id)],\n ];\n }\n\n const { datas } = await ConnectionProvider.getHandler().exportData({\n model,\n fields: addIdToRelationFields({\n keys: options.selectedKeys,\n fields: fields.current,\n }),\n domain: exportDomain,\n limit: options.registersAmount === \"all\" ? 0 : limit,\n context,\n format: options.exportType,\n });\n\n onClose();\n\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n const fileType: any = await getMimeType(datas);\n openBase64InNewTab(datas, fileType.mime);\n },\n [domain, selectedRegistersToExport, model, limit, context, onClose, t],\n );\n\n const onGetFields = useCallback(async () => {\n const viewData = await ConnectionProvider.getHandler().getFields({\n model,\n context,\n fields: [],\n });\n fields.current[\"/\"] = viewData;\n return convertToExportFields({ fields: viewData });\n }, [model, context, fields]);\n\n const onGetFieldChilds = useCallback(\n async (key: string) => {\n const fieldDefinition = getFieldDefinition(key, fields.current);\n const optsForField = fieldDefinition[getChildKey(key)];\n const relation = optsForField.relation;\n const viewData = await ConnectionProvider.getHandler().getFields({\n model: relation,\n context,\n fields: [],\n });\n\n // We must iterate over each key of viewData in order to replace the string value\n for (const [key, value] of Object.entries(viewData)) {\n viewData[key].string = getTitle({\n parentTitle: optsForField.string,\n title: (value as any).string,\n });\n }\n\n fields.current[key] = viewData;\n\n return convertToExportFields({\n fields: viewData,\n parentKey: key,\n });\n },\n [context],\n );\n\n const onGetPredefinedExports = useCallback(async () => {\n const predefinedExports = await listPredefinedExports({ model, context });\n\n const keysWithChilds = await retrieveKeyFieldsForPredefinedExports({\n predefinedExports,\n fields: fields.current,\n onGetFieldChilds,\n });\n\n // Then we reformat predefined exports to get the title\n const predefinedExportsAdjusted = predefinedExports.map((pExport) => {\n return {\n ...pExport,\n fields: pExport.fields.map((field: PredefinedExportField) => {\n const childKey = getChildKey(field.key);\n const fieldDefinition = getFieldDefinition(field.key, fields.current);\n const optsForField = fieldDefinition[childKey];\n\n if (!optsForField) {\n return {\n key: field.key,\n };\n }\n\n return {\n key: field.key,\n title: optsForField.string,\n };\n }),\n };\n });\n\n return {\n predefinedExports: predefinedExportsAdjusted,\n keysWithChilds,\n };\n }, [context, model, onGetFieldChilds]);\n\n const onRemovePredefinedExport = useCallback(\n async (pExport: PredefinedExport) => {\n await ConnectionProvider.getHandler().deleteObjects({\n model: \"ir.exports\",\n ids: [pExport.id!],\n context,\n });\n },\n [context],\n );\n\n const getModelFields = useCallback(\n async (model: string) => {\n if (exportModelFields.current.has(model)) {\n return exportModelFields.current.get(model);\n }\n\n const fieldsForModel = ConnectionProvider.getHandler().getFields({\n model,\n context,\n fields: [],\n });\n\n exportModelFields.current.set(model, fieldsForModel);\n },\n [exportModelFields, context],\n );\n\n const onSavePredefinedExport = useCallback(\n async (pExport: PredefinedExport) => {\n const fieldsForExport = await getModelFields(\"ir.exports\");\n const fieldsForExportLine = await getModelFields(\"ir.exports.line\");\n\n // First we must create the parent object\n const exportId = await ConnectionProvider.getHandler().create({\n model: \"ir.exports\",\n values: {\n name: pExport.name,\n resource: model,\n },\n fields: fieldsForExport,\n context,\n });\n\n // We create the lines\n await Promise.all(\n pExport.fields.map(async (field: any) => {\n return await ConnectionProvider.getHandler().create({\n model: \"ir.exports.line\",\n values: {\n name: field.key,\n export_id: exportId,\n },\n fields: fieldsForExportLine,\n context,\n });\n }),\n );\n\n return { ...pExport, id: exportId };\n },\n [context, getModelFields, model],\n );\n\n return {\n onGetFields,\n onGetFieldChilds,\n onExport,\n onGetPredefinedExports,\n onSavePredefinedExport,\n onRemovePredefinedExport,\n };\n};\n\nconst convertToExportFields = ({\n fields,\n parentKey,\n}: {\n fields: any;\n parentKey?: string;\n}) => {\n const exportFields = [];\n\n for (const key of Object.keys(fields)) {\n const valuesForField = fields[key];\n\n if (valuesForField.relation && valuesForField.is_function === true) {\n continue;\n }\n\n const relationField = isRelationField(valuesForField);\n\n exportFields.push({\n key: compoundId({ key, parentKey }),\n title: valuesForField.string,\n tooltip: valuesForField.help,\n required: valuesForField.required,\n isLeaf: !relationField,\n });\n }\n return exportFields;\n};\n\nconst isRelationField = (fieldDefinition: any) => {\n return (\n fieldDefinition.type === \"many2one\" ||\n fieldDefinition.type === \"one2many\" ||\n fieldDefinition.type === \"many2many\"\n );\n};\n\nconst compoundId = ({\n parentKey,\n key,\n}: {\n parentKey?: string;\n key: string;\n}) => {\n return `${parentKey ? parentKey + \"/\" : \"\"}${key}`;\n};\n\nconst getParentKey = (key: string) => {\n if (key.indexOf(\"/\") === -1) {\n return key;\n }\n const items = key.split(\"/\");\n return items.slice(0, -1).join(\"/\");\n};\n\nconst getChildKey = (key: string) => {\n if (key.indexOf(\"/\") === -1) {\n return key;\n }\n const items = key.split(\"/\");\n return items[items.length - 1];\n};\n\nconst getFieldDefinition = (key: string, fields: any) => {\n if (key.indexOf(\"/\") === -1) {\n return fields[\"/\"];\n } else {\n return fields[getParentKey(key)];\n }\n};\n\nconst getTitle = ({\n title,\n parentTitle,\n}: {\n title: string;\n parentTitle?: string;\n}) => {\n return `${parentTitle ? parentTitle + \" → \" : \"\"}${title}`;\n};\n\nconst listPredefinedExports = async ({\n model,\n context,\n}: {\n model: string;\n context: any;\n}) => {\n const pExports = await ConnectionProvider.getHandler().search({\n model: \"ir.exports\",\n params: [[\"resource\", \"=\", model]],\n context,\n });\n\n const exportLinesIds = pExports.flatMap((exp: any) => exp.export_fields);\n\n // Now we must read each id of the export lines\n const exportLinesObjects = await ConnectionProvider.getHandler().readObjects({\n model: \"ir.exports.line\",\n ids: exportLinesIds,\n context,\n });\n\n return pExports.map((pExport) => ({\n id: pExport.id,\n name: pExport.name,\n fields: pExport.export_fields.map((id: number) => {\n const exportLine = exportLinesObjects.find((e: any) => e.id === id);\n return {\n key: exportLine.name,\n };\n }),\n }));\n};\n\nconst getKeysWithoutChildsInFields = ({\n fields,\n keys,\n}: {\n fields: any;\n keys: string[];\n}) => {\n return splitAndSortKeys([\n ...new Set(\n keys\n .filter((key) => {\n if (key.indexOf(\"/\") === -1) {\n return !fields[\"/\"]?.[key];\n } else {\n return !fields?.[getParentKey(key)]?.[key];\n }\n })\n .map((key) => getParentKey(key)),\n ),\n ]);\n};\n\nconst retrieveKeyFieldsForPredefinedExports = async ({\n predefinedExports,\n fields,\n onGetFieldChilds,\n}: {\n predefinedExports: PredefinedExport[];\n fields: any;\n onGetFieldChilds: (key: string) => Promise<ExportField[]>;\n}) => {\n const allPredefinedExportKeys = predefinedExports.flatMap(\n (exp: PredefinedExport) => exp.fields.map((field: any) => field.key),\n );\n\n const keysWithoutChildsInFields = getKeysWithoutChildsInFields({\n fields,\n keys: allPredefinedExportKeys,\n });\n\n const keysWithChilds = [];\n\n // We must load the fields info for each key if not loaded yet in fields and store them in an array to pass them to the formiga component\n for (const key of keysWithoutChildsInFields) {\n try {\n const childs = await onGetFieldChilds(key);\n keysWithChilds.push({ key, childs });\n } catch (err) {\n console.warn(\n `Export field ${key} has raised an error - has been migrated? does the field exist?`,\n );\n }\n }\n\n return keysWithChilds;\n};\n\nconst addIdToRelationFields = ({\n keys,\n fields,\n}: {\n keys: string[];\n fields: any;\n}) =>\n keys.map((key) => {\n const childKey = getChildKey(key);\n const fieldDefinition = getFieldDefinition(key, fields);\n const optsForField = fieldDefinition[childKey];\n const relationField = isRelationField(optsForField);\n return relationField ? `${key}/id` : key;\n });\n\nconst splitAndSortKeys = (keys: string[]): string[] => {\n // We must split the keys that have more than one level (character / ocurrences in the string > 1)\n // Into an array of keys with only one level\n // For example: \"partner_id/country_id/name\" => [\"partner_id\", \"partner_id/country_id\", \"partner_id/country_id/name\"]\n // We must do this because we must load the fields info for each key if not loaded yet in fields\n // And we must load the fields info for the parent key first\n //\n // We must also sort the keys by the number of levels they have\n // For example: [\"partner_id\", \"partner_id/country_id\", \"partner_id/country_id/name\"]\n\n const keysMap: Map<string, boolean> = new Map();\n const result: string[] = [];\n\n // Split keys with more than one level\n for (const key of keys) {\n const subKeys = key.split(\"/\");\n let parentKey = \"\";\n for (const subKey of subKeys) {\n const currentKey = parentKey ? `${parentKey}/${subKey}` : subKey;\n if (!keysMap.has(currentKey)) {\n result.push(currentKey);\n keysMap.set(currentKey, true);\n }\n parentKey = currentKey;\n }\n }\n\n // Sort keys by number of levels\n result.sort((a, b) => {\n const aLevels = a.split(\"/\").length;\n const bLevels = b.split(\"/\").length;\n return aLevels - bLevels;\n });\n\n return result;\n};\n","import { ExportModal as ExportModalFmg } from \"@gisce/react-formiga-components\";\nimport { useExport } from \"@/hooks/useExport\";\n\nexport type ExportModalProps = {\n visible: boolean;\n onClose: () => void;\n selectedRegistersToExport?: any[];\n totalRegisters: number;\n model: string;\n domain: any[];\n limit?: number;\n context?: any;\n visibleRegisters: number;\n};\n\nexport const ExportModal = (props: ExportModalProps) => {\n const {\n visible,\n onClose,\n model,\n context,\n selectedRegistersToExport,\n totalRegisters,\n domain,\n limit,\n visibleRegisters,\n } = props;\n\n const {\n onExport,\n onGetFieldChilds,\n onGetFields,\n onGetPredefinedExports,\n onSavePredefinedExport,\n onRemovePredefinedExport,\n } = useExport({\n model,\n context,\n domain,\n limit,\n selectedRegistersToExport,\n onClose,\n });\n\n return (\n <ExportModalFmg\n visible={visible}\n onSucceed={onExport}\n onCancel={onClose}\n selectedRegistersToExport={\n selectedRegistersToExport &&\n selectedRegistersToExport.length &&\n selectedRegistersToExport.length > 0\n ? selectedRegistersToExport.length\n : undefined\n }\n totalRegisters={totalRegisters}\n onGetFieldChilds={onGetFieldChilds}\n onGetFields={onGetFields}\n visibleRegisters={visibleRegisters}\n onGetPredefinedExports={onGetPredefinedExports}\n onSavePredefinedExport={onSavePredefinedExport}\n onRemovePredefinedExport={onRemovePredefinedExport}\n />\n );\n};\n","import DatePicker from \"@/common/DatePicker\";\n\nimport React from \"react\";\nimport { WidgetProps } from \"@/types\";\n\nconst Date = (props: WidgetProps) => {\n const { ooui } = props;\n\n return <DatePicker ooui={ooui} />;\n};\n\nexport default Date;\n","import DatePicker from \"@/common/DatePicker\";\n\nimport React from \"react\";\nimport { WidgetProps } from \"@/types\";\n\nconst DateTime = (props: WidgetProps) => {\n const { ooui } = props;\n\n return <DatePicker ooui={ooui} showTime />;\n};\n\nexport default DateTime;\n","import Field from \"@/common/Field\";\nimport { Time as TimeOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport dayjs from \"@/helpers/dayjs\";\nimport { Dayjs } from \"dayjs\";\nimport { TimePicker } from \"../../common/TimePicker\";\n\nconst Time = (props: WidgetProps) => {\n const { ooui } = props;\n\n return (\n <Field {...props}>\n <TimeInput ooui={ooui as TimeOoui} />\n </Field>\n );\n};\n\ntype TimeInputProps = {\n ooui: TimeOoui;\n value?: string;\n onChange?: (value?: string) => void;\n};\n\nexport const TimeInput = (props: TimeInputProps) => {\n const onChange = (time: Dayjs | null, timestring?: string) => {\n if (props.onChange) {\n props.onChange(timestring);\n }\n };\n\n return (\n <TimePicker\n onChange={onChange}\n numberOfSelectsToHide={3} // Since it has hours, minutes, and seconds\n value={props.value ? dayjs(props.value, \"HH:mm:ss\") : undefined}\n />\n );\n};\n\nexport default Time;\n","import React, { useEffect, useState } from \"react\";\nimport { Row, Col } from \"antd\";\nimport {\n Reference as ReferenceOoui,\n Selection as SelectionOoui,\n Many2one as Many2oneOoui,\n} from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { Many2oneInput } from \"./many2one/Many2one\";\nimport { SelectionInput } from \"./Selection\";\n\ntype Props = {\n ooui: ReferenceOoui;\n onOpenDetailClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n onSearchClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n};\n\nexport const Reference = (props: Props) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} {...props}>\n <ReferenceInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface ReferenceInputProps {\n ooui: ReferenceOoui;\n value?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport const ReferenceInput: React.FC<ReferenceInputProps> = (\n props: ReferenceInputProps,\n) => {\n const { value, onChange, ooui } = props;\n const { required, selectionValues, readOnly, domain } = ooui;\n\n const splittedValue = value?.split(\",\");\n\n const [many2oneValue, setMany2oneValue] = useState<any[]>([]);\n const [selectionValue, setSelectionValue] = useState<string>();\n\n useEffect(() => {\n if (!value) {\n setSelectionValue(undefined);\n setMany2oneValue([]);\n return;\n }\n\n const model = value && splittedValue && splittedValue[0];\n const id =\n value && splittedValue && splittedValue[1] && parseInt(splittedValue[1]);\n setMany2oneValue([id, undefined]);\n setSelectionValue(model!);\n }, [value]);\n\n return (\n <Row gutter={8} wrap={false}>\n <Col flex=\"1\">\n <SelectionInput\n ooui={\n new SelectionOoui({\n name: \"model_selection\",\n selection: selectionValues,\n readonly: readOnly,\n required,\n })\n }\n onChange={(changedValue: string) => {\n setSelectionValue(changedValue);\n let m2oValue = many2oneValue[0] || 0;\n if (changedValue !== selectionValue) {\n setMany2oneValue([]);\n m2oValue = 0;\n }\n const referenceValue = `${changedValue},${m2oValue}`;\n if (referenceValue === value) {\n return;\n }\n onChange?.(referenceValue);\n }}\n value={selectionValue}\n />\n </Col>\n <Col flex=\"3\">\n <Many2oneInput\n ooui={\n new Many2oneOoui({\n name: \"object_value\",\n relation: selectionValue,\n readonly: readOnly,\n required,\n domain,\n })\n }\n value={many2oneValue}\n onChange={(changedValue: any[]) => {\n setMany2oneValue(changedValue);\n const referenceValue = `${selectionValue},${changedValue[0] || 0}`;\n if (referenceValue === value) {\n return;\n }\n onChange?.(referenceValue);\n }}\n />\n </Col>\n </Row>\n );\n};\n","import React, { useRef, useContext } from \"react\";\nimport { Row, Col, Button, Input, Space, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Binary as BinaryOoui } from \"@gisce/ooui\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport {\n FolderOpenOutlined,\n DownloadOutlined,\n ClearOutlined,\n EyeOutlined,\n} from \"@ant-design/icons\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nimport {\n getFilesize,\n getMimeType,\n openBase64InNewTab,\n toBase64,\n} from \"@/helpers/filesHelper\";\nconst { useToken } = theme;\n\ntype Props = {\n ooui: BinaryOoui;\n};\n\nexport const Binary = (props: Props) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} {...props}>\n <BinaryInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface BinaryInputProps {\n ooui: BinaryOoui;\n value?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport const BinaryInput = (props: BinaryInputProps) => {\n const { ooui, value, onChange } = props;\n const { readOnly, required, filenameField } = ooui as BinaryOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const inputFile = useRef(null);\n const { setFieldValue, getFieldValue } =\n (useContext(FormContext) as FormContextType) || {};\n const { t } = useLocale();\n\n const filesize = value ? getFilesize(value) : \"\";\n\n const triggerChange = (changedValue?: string) => {\n onChange?.(changedValue);\n };\n\n async function downloadFile() {\n const fileType = await getMimeType(value!);\n const linkSource = `data:${fileType?.mime};base64,${value}`;\n const downloadLink = document.createElement(\"a\");\n const fileName = getFieldValue(filenameField);\n const name = getFieldValue(\"name\");\n\n downloadLink.href = linkSource;\n downloadLink.download = fileName || name;\n downloadLink.click();\n }\n\n async function openFile() {\n const fileType: any = await getMimeType(value!);\n openBase64InNewTab(value!, fileType.mime);\n }\n\n async function onChangeFile(event: any) {\n event.stopPropagation();\n event.preventDefault();\n const file = event.target.files[0];\n const b64: string = await toBase64(file);\n triggerChange(b64);\n\n if (filenameField) {\n setFieldValue(filenameField, file.name);\n }\n }\n\n function clearFile() {\n setFieldValue(filenameField, undefined);\n triggerChange(undefined);\n }\n\n return (\n <Row gutter={8}>\n <Col style={{ paddingBottom: 5 }}>\n <input\n type=\"file\"\n id=\"file\"\n ref={inputFile}\n style={{ display: \"none\" }}\n onChange={onChangeFile}\n />\n <Input\n type=\"text\"\n disabled={true}\n style={requiredStyle}\n value={filesize}\n />\n </Col>\n <Col>\n <Space>\n <Button\n icon={<FolderOpenOutlined />}\n disabled={readOnly}\n onClick={() => {\n const fileUploadField = inputFile.current as any;\n fileUploadField.click();\n }}\n >\n Select\n </Button>\n <Button icon={<EyeOutlined />} disabled={!value} onClick={openFile}>\n {t(\"open\")}\n </Button>\n <ButtonWithTooltip\n tooltip={t(\"download\")}\n disabled={!value}\n onClick={downloadFile}\n icon={<DownloadOutlined />}\n />\n <ButtonWithTooltip\n tooltip={t(\"clear\")}\n disabled={readOnly || !value}\n onClick={clearFile}\n icon={<ClearOutlined />}\n />\n </Space>\n </Col>\n </Row>\n );\n};\n","import { useMemo } from \"react\";\nimport { Button } from \"antd\";\nimport {\n DownOutlined,\n TableOutlined,\n FormOutlined,\n AreaChartOutlined,\n CalendarOutlined,\n} from \"@ant-design/icons\";\nimport {\n useLocale,\n Dropdown,\n DropdownMenuItem,\n} from \"@gisce/react-formiga-components\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { View } from \"@/types\";\n\ntype Props = {\n onChangeView: (view: View) => void;\n currentView: View;\n availableViews: View[];\n disabled?: boolean;\n formHasChanges?: boolean;\n previousView?: View;\n};\n\nconst iconsForViewTypes = {\n tree: <TableOutlined />,\n form: <FormOutlined />,\n graph: <AreaChartOutlined />,\n calendar: <CalendarOutlined />,\n};\n\nfunction getIconForView(view?: View) {\n if (!view) {\n return <FormOutlined />;\n }\n\n return (iconsForViewTypes as any)?.[view.type] || <FormOutlined />;\n}\n\nfunction ChangeViewButton(props: Props) {\n const {\n currentView,\n availableViews,\n onChangeView,\n disabled = false,\n formHasChanges = false,\n previousView,\n } = props;\n const { t } = useLocale();\n\n const dropdownData = useMemo(() => {\n return [\n {\n label: t(\"viewAs\"),\n items: availableViews.map((view, idx) => {\n const fallbackTitle =\n view.type.charAt(0).toUpperCase() + view.type.slice(1);\n return {\n id: view.view_id || idx,\n name: view.title || fallbackTitle,\n icon: getIconForView(view),\n selected: currentView.view_id === view.view_id,\n };\n }),\n },\n ];\n }, [availableViews, currentView.view_id, t]);\n\n function tryNavigate(callback: any) {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n callback();\n },\n });\n return;\n }\n\n callback();\n }\n\n function handleMenuClick(item: DropdownMenuItem) {\n tryNavigate(() => {\n const selectedView = availableViews.find(\n (view) => view.view_id === parseInt(item.id as string),\n );\n onChangeView(selectedView!);\n });\n }\n\n return (\n <div style={{ display: \"flex\" }}>\n <ButtonWithTooltip\n tooltip={previousView ? t(\"viewAs\") + \" \" + t(previousView.type) : \"\"}\n icon={getIconForView(previousView)}\n style={{\n width: 50,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n }}\n onClick={() => {\n handleMenuClick({ id: previousView?.view_id as number });\n }}\n disabled={disabled || availableViews.length === 1}\n />\n <Dropdown\n onRetrieveData={async () => dropdownData}\n onItemClick={handleMenuClick}\n placement=\"bottomRight\"\n disabled={disabled || availableViews.length === 1}\n >\n <Button\n style={{\n width: 25,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n }}\n icon={<DownOutlined style={{ fontSize: \"0.5em\" }} />}\n onClick={(e) => e.preventDefault()}\n ></Button>\n </Dropdown>\n </div>\n );\n}\n\nexport default ChangeViewButton;\n","import React from \"react\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\n\ntype Props = {\n tooltip: string;\n onClick: any;\n icon: any;\n disabled?: boolean;\n label?: string;\n loading?: boolean;\n type?: string;\n};\n\nfunction ActionButton(props: Props) {\n const {\n onClick,\n disabled = false,\n loading = false,\n tooltip,\n icon,\n label,\n type = \"default\",\n } = props;\n const finalIcon = loading ? <LoadingOutlined /> : icon;\n\n return (\n <ButtonWithTooltip\n type={type as any}\n tooltip={tooltip}\n onClick={onClick}\n disabled={disabled}\n >\n {finalIcon}\n {label}\n </ButtonWithTooltip>\n );\n}\n\nexport default ActionButton;\n","import React, { useContext } from \"react\";\nimport { FileAddOutlined } from \"@ant-design/icons\";\nimport ActionButton from \"./ActionButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n disabled?: boolean;\n};\n\nfunction NewButton(props: Props) {\n const { disabled = false } = props;\n\n const { formHasChanges, onNewClicked: onNewClickedProps } = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { t } = useLocale();\n\n const onNewClicked = () => {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n onNewClickedProps();\n },\n });\n return;\n }\n\n onNewClickedProps();\n };\n\n return (\n <ActionButton\n icon={<FileAddOutlined />}\n tooltip={t(\"new\")}\n onClick={onNewClicked}\n disabled={disabled}\n />\n );\n}\nexport default NewButton;\n","import { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { confirm } = Modal;\n\nconst showDialog = ({\n onOk,\n onCancel,\n t,\n}: {\n onOk: () => void;\n onCancel?: () => void;\n t: (key: string) => string;\n}) => {\n confirm({\n title: t(\"unsavedChanges\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmRefreshWithoutSave\"),\n okText: t(\"discardAndRefresh\"),\n cancelText: t(\"cancel\"),\n onOk,\n onCancel,\n });\n};\n\nexport default showDialog;\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport React from \"react\";\nimport showInfo from \"@/ui/InfoDialog\";\n\nasync function showLogInfo(\n model: string,\n currentId: number,\n translateFn: Function,\n) {\n const logInfo = (\n (await ConnectionProvider.getHandler().getLogInfo({\n model,\n ids: [currentId],\n })) as any\n )[0];\n\n const { create_date, create_uid, id, write_date, write_uid } = logInfo;\n\n showInfo(\n <div>\n {\"ID: \" + id} <br />\n {translateFn(\"createdBy\") + \": \" + create_uid[1]} <br />\n {translateFn(\"creationDate\") + \": \" + create_date} <br />\n {translateFn(\"lastUpdatedBy\") + \": \" + write_uid[1]} <br />\n {translateFn(\"lastUpdatedDate\") + \": \" + write_date}\n </div>,\n );\n}\n\nexport { showLogInfo };\n","import { useRef } from \"react\";\nimport {\n DownOutlined,\n FormOutlined,\n DownloadOutlined,\n LinkOutlined,\n FileAddOutlined,\n TableOutlined,\n} from \"@ant-design/icons\";\nimport { Button, Row, Col, Tooltip } from \"antd\";\nimport {\n Dropdown,\n DropdownRef,\n useLocale,\n} from \"@gisce/react-formiga-components\";\n\nexport type Attachment = {\n id: number;\n name: string;\n datas: string;\n link: string;\n};\n\nexport type AttachmentsButtonWrapperProps = {\n attachments: Attachment[] | undefined;\n numberOfAttachments: number;\n disabled: boolean;\n loading: boolean;\n onAddNewAttachment: () => void;\n onListAllAttachments: () => void;\n onOpenAttachmentLink: (attachment: Attachment) => void;\n onOpenAttachmentDetail: (attachment: Attachment) => void;\n};\n\nexport const AttachmentsButtonWrapper = (\n props: AttachmentsButtonWrapperProps,\n) => {\n const {\n numberOfAttachments,\n attachments = [],\n disabled,\n onAddNewAttachment,\n onOpenAttachmentLink,\n onOpenAttachmentDetail,\n onListAllAttachments,\n } = props;\n const { t } = useLocale();\n const dropdownRef = useRef<DropdownRef>(null);\n\n const button = (\n <Button>\n <LinkOutlined />\n {`(${numberOfAttachments})`}\n <DownOutlined style={{ fontSize: 12 }} />\n </Button>\n );\n\n return (\n <Dropdown\n ref={dropdownRef}\n onRetrieveData={async () => [\n {\n items: attachments.map((attachment) => {\n const Icon = attachment.link ? LinkOutlined : DownloadOutlined;\n const right = (\n <Row wrap={false} align=\"middle\" key={attachment.id} gutter={8}>\n <Col style={{ textAlign: \"center\" }}>\n {((attachment as any).datas_fname || attachment.link) && (\n <Tooltip\n title={\n attachment.link\n ? t(\"openAttachmentLink\")\n : t(\"download\")\n }\n >\n <Icon\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n dropdownRef.current?.close();\n onOpenAttachmentLink(attachment);\n }}\n />\n </Tooltip>\n )}\n </Col>\n <Col style={{ textAlign: \"center\" }}>\n <Tooltip title={t(\"openAttachment\")}>\n <FormOutlined\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n dropdownRef.current?.close();\n onOpenAttachmentDetail(attachment);\n }}\n />\n </Tooltip>\n </Col>\n </Row>\n );\n\n return {\n id: attachment.id as number,\n name: attachment.name,\n disableClick: true,\n right,\n };\n }),\n },\n ]}\n placement=\"bottomRight\"\n disabled={disabled}\n header={\n <div style={{ padding: 5 }}>\n <a\n style={{ display: \"block\", paddingBottom: 5 }}\n href=\"#\"\n onClick={() => {\n dropdownRef.current?.close();\n onListAllAttachments();\n }}\n >\n <TableOutlined /> {t(\"listAllAttachments\")}\n </a>\n <a\n style={{ display: \"block\" }}\n href=\"#\"\n onClick={() => {\n dropdownRef.current?.close();\n onAddNewAttachment();\n }}\n >\n <FileAddOutlined /> {t(\"addNewAttachment\")}\n </a>\n </div>\n }\n >\n {button}\n </Dropdown>\n );\n};\n","import { useCallback, useContext, useEffect, useState } from \"react\";\nimport { getMimeType, openBase64InNewTab } from \"@/helpers/filesHelper\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport {\n Attachment,\n AttachmentsButtonWrapper,\n} from \"./AttachmentsButtonWrapper\";\nimport { Modal, Spin } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nexport type AttachmentsButtonProps = {\n attachments?: any;\n disabled?: boolean;\n onAddNewAttachment: () => void;\n onListAllAttachments: () => void;\n onViewAttachmentDetails: (attachment: Attachment) => void;\n};\n\nfunction AttachmentsButton(props: AttachmentsButtonProps) {\n const {\n attachments,\n disabled = false,\n onAddNewAttachment,\n onListAllAttachments,\n onViewAttachmentDetails,\n } = props;\n const { formRef } = useContext(ActionViewContext) as ActionViewContextType;\n const [preloading, setPreloading] = useState(false);\n const [preloadedAttachments, setPreloadedAttachments] = useState<\n Attachment[]\n >([]);\n const [downloading, setDownloading] = useState(false);\n const { t } = useLocale();\n\n const preloadAttachments = useCallback(async () => {\n if (!attachments || attachments.length === 0) {\n return;\n }\n setPreloading(true);\n try {\n const results = await ConnectionProvider.getHandler().readObjects({\n model: \"ir.attachment\",\n ids: attachments.map((a: any) => a.id),\n fieldsToRetrieve: [\"name\", \"datas_fname\", \"link\"],\n context: (formRef.current as any).getContext(),\n });\n setPreloadedAttachments(\n results.map((r: any) => ({\n id: r.id,\n name: r.name,\n datas_fname: r.datas_fname,\n link: r.link,\n })),\n );\n } catch (error) {\n showErrorDialog(error as any);\n }\n setPreloading(false);\n }, [attachments, formRef]);\n\n const openAttachmentLink = useCallback(\n async (attachment: any) => {\n if (attachment.link) {\n window.open(attachment.link);\n return;\n }\n\n setDownloading(true);\n\n let retrievedAttachment;\n\n try {\n const results = await ConnectionProvider.getHandler().readObjects({\n model: \"ir.attachment\",\n ids: [attachment.id],\n context: (formRef.current as any).getContext(),\n });\n retrievedAttachment = results[0];\n } catch (error) {\n showErrorDialog(error as any);\n }\n\n setDownloading(false);\n\n if (!retrievedAttachment) {\n return;\n }\n\n if (retrievedAttachment.datas) {\n const fileType: any = await getMimeType(retrievedAttachment.datas);\n openBase64InNewTab(retrievedAttachment.datas, fileType.mime);\n } else {\n onViewAttachmentDetails(retrievedAttachment);\n }\n },\n [formRef, onViewAttachmentDetails],\n );\n\n const openAttachmentDetail = useCallback(\n async (attachment: any) => {\n onViewAttachmentDetails(attachment);\n },\n [onViewAttachmentDetails],\n );\n\n useEffect(() => {\n preloadAttachments();\n }, [preloadAttachments]);\n\n return (\n <>\n <AttachmentsButtonWrapper\n numberOfAttachments={attachments.length}\n attachments={preloadedAttachments}\n disabled={disabled}\n loading={preloading}\n onAddNewAttachment={onAddNewAttachment}\n onListAllAttachments={onListAllAttachments}\n onOpenAttachmentLink={openAttachmentLink}\n onOpenAttachmentDetail={openAttachmentDetail}\n />\n <Modal\n title={t(\"downloadingAttachment\")}\n open={downloading}\n footer={null}\n closable={false}\n centered\n maskClosable={false}\n >\n <Spin />\n </Modal>\n </>\n );\n}\n\nexport default AttachmentsButton;\n","import { useContext } from \"react\";\nimport { Space, Spin } from \"antd\";\nimport {\n SaveOutlined,\n RightOutlined,\n LeftOutlined,\n DeleteOutlined,\n ThunderboltOutlined,\n PrinterOutlined,\n EnterOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n} from \"@ant-design/icons\";\nimport ChangeViewButton from \"./ChangeViewButton\";\nimport ActionButton from \"./ActionButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport NewButton from \"./NewButton\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport { showErrorDialog } from \"@/ui/GenericErrorDialog\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport refreshChangesDialog from \"@/ui/RefreshItemDialog\";\nimport { showLogInfo } from \"@/helpers/logInfoHelper\";\nimport { DropdownButton, useLocale } from \"@gisce/react-formiga-components\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\n\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport AttachmentsButton from \"./AttachmentsButton\";\nimport { Attachment } from \"./AttachmentsButtonWrapper\";\n\nfunction FormActionBar({ toolbar }: { toolbar: any }) {\n const {\n availableViews,\n currentView,\n setCurrentView,\n onFormSave,\n formHasChanges,\n formIsSaving,\n currentId,\n results,\n setCurrentItemIndex,\n currentItemIndex,\n setCurrentId,\n currentModel,\n setRemovingItem,\n removingItem,\n duplicatingItem,\n setDuplicatingItem,\n setResults,\n formIsLoading,\n attachments,\n formRef,\n setFormHasChanges,\n previousView,\n setPreviousView,\n goToResourceId,\n } = useContext(ActionViewContext) as ActionViewContextType;\n const { t } = useLocale();\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openRelate, openDefaultActionForModel } = tabManagerContext || {};\n\n function tryRefresh(callback: any) {\n if (formHasChanges) {\n refreshChangesDialog({\n t,\n onOk: () => {\n callback();\n },\n });\n return;\n }\n\n callback();\n }\n\n function tryNavigate(callback: any) {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n callback();\n },\n });\n return;\n }\n\n callback();\n }\n\n function onNextClick() {\n if (results && results.length > currentItemIndex! + 1) {\n setCurrentItemIndex?.(currentItemIndex! + 1);\n setCurrentId?.(results[currentItemIndex! + 1].id);\n } else if (results && currentItemIndex! + 1 === results.length) {\n setCurrentItemIndex?.(0);\n setCurrentId?.(results[0].id);\n }\n }\n\n function onPreviousClick() {\n if (results && currentItemIndex! > 0) {\n setCurrentItemIndex?.(currentItemIndex! - 1);\n setCurrentId?.(results[currentItemIndex! - 1].id);\n } else if (results && currentItemIndex === 0) {\n setCurrentItemIndex?.(results.length - 1);\n setCurrentId?.(results[results.length - 1].id);\n }\n }\n\n function tryDelete() {\n showConfirmDialog({\n confirmMessage: t(\"confirmRemoveItem\"),\n t,\n onOk: () => {\n remove();\n },\n });\n }\n\n async function remove() {\n try {\n setRemovingItem?.(true);\n\n await ConnectionProvider.getHandler().deleteObjects({\n model: currentModel!,\n ids: [currentId!],\n context: (formRef.current as any).getContext(),\n });\n\n const filteredResults = results?.filter((item: any) => {\n return item.id !== currentId;\n });\n setResults?.(filteredResults!);\n\n let newIndex = 0;\n\n if (currentItemIndex! > 0 && currentItemIndex! <= results!.length - 1) {\n newIndex = currentItemIndex! - 1;\n }\n\n if (!filteredResults?.[newIndex]) {\n setCurrentId?.(undefined);\n setCurrentItemIndex?.(undefined);\n } else {\n setCurrentId?.(filteredResults?.[newIndex].id);\n setCurrentItemIndex?.(newIndex);\n }\n } catch (e) {\n showErrorDialog(JSON.stringify(e));\n } finally {\n setRemovingItem?.(false);\n }\n }\n\n async function duplicate() {\n try {\n setDuplicatingItem?.(true);\n\n const newId = await ConnectionProvider.getHandler().duplicate({\n id: currentId!,\n model: currentModel!,\n context: (formRef.current as any).getContext(),\n });\n\n if (newId) {\n await goToResourceId?.([newId]);\n }\n } catch (e) {\n showErrorDialog(JSON.stringify(e));\n } finally {\n setDuplicatingItem?.(false);\n }\n }\n\n const mustDisableButtons =\n formIsSaving || removingItem || formIsLoading || duplicatingItem;\n\n function runAction(actionData: any) {\n processAction?.({\n actionData,\n values: (formRef.current as any).getValues(),\n fields: (formRef.current as any).getFields(),\n context: (formRef.current as any).getContext(),\n onRefreshParentValues: () => {\n (formRef.current as any).fetchValues();\n },\n });\n }\n\n if (!currentView) {\n return null;\n }\n\n return (\n <Space wrap={true}>\n {formIsLoading && (\n <>\n <Spin />\n {separator()}\n {separator()}\n </>\n )}\n <NewButton\n disabled={\n formIsSaving || formIsLoading || removingItem || duplicatingItem\n }\n />\n <ActionButton\n icon={<SaveOutlined />}\n tooltip={t(\"save\")}\n disabled={!formHasChanges || mustDisableButtons}\n loading={formIsSaving}\n onClick={onFormSave}\n />\n <ActionButton\n icon={<CopyOutlined />}\n tooltip={t(\"duplicate\")}\n disabled={\n formHasChanges ||\n formIsSaving ||\n currentId === undefined ||\n duplicatingItem ||\n formIsLoading\n }\n loading={duplicatingItem}\n onClick={duplicate}\n />\n <ActionButton\n icon={<DeleteOutlined />}\n tooltip={t(\"delete\")}\n disabled={\n formIsSaving ||\n currentId === undefined ||\n removingItem ||\n duplicatingItem ||\n formIsLoading\n }\n loading={removingItem}\n onClick={tryDelete}\n />\n {separator()}\n <ActionButton\n icon={<InfoCircleOutlined />}\n tooltip={t(\"showLogs\")}\n disabled={\n formIsSaving ||\n currentId === undefined ||\n removingItem ||\n duplicatingItem ||\n formIsLoading\n }\n loading={false}\n onClick={() => {\n showLogInfo(currentModel!, currentId!, t);\n }}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={\n formIsSaving ||\n currentId === undefined ||\n removingItem ||\n duplicatingItem ||\n formIsLoading\n }\n loading={false}\n onClick={() => {\n tryRefresh(() => {\n (formRef.current as any).fetchValues();\n });\n }}\n />\n {separator()}\n <ChangeViewButton\n currentView={currentView}\n previousView={previousView}\n availableViews={availableViews}\n onChangeView={(view: any) => {\n setPreviousView?.(currentView);\n setFormHasChanges?.(false);\n setCurrentView?.(view);\n }}\n disabled={mustDisableButtons}\n formHasChanges={formHasChanges}\n />\n {separator()}\n <Space>\n <ActionButton\n icon={<LeftOutlined />}\n tooltip={t(\"previous\")}\n disabled={mustDisableButtons}\n loading={false}\n onClick={() => {\n tryNavigate(onPreviousClick);\n }}\n />\n <ActionButton\n icon={<RightOutlined />}\n tooltip={t(\"next\")}\n disabled={mustDisableButtons}\n loading={false}\n onClick={() => {\n tryNavigate(onNextClick);\n }}\n />\n </Space>\n {separator()}\n <DropdownButton\n icon={<ThunderboltOutlined />}\n placement=\"bottomRight\"\n disabled={mustDisableButtons}\n onRetrieveData={async () => [\n { label: t(\"actions\"), items: toolbar?.action },\n ]}\n onItemClick={async (action: any) => {\n if (!action) {\n return;\n }\n\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n runAction(action);\n }}\n />\n <DropdownButton\n icon={<PrinterOutlined />}\n disabled={mustDisableButtons}\n placement=\"bottomRight\"\n onRetrieveData={async () => [\n { label: t(\"reports\"), items: toolbar?.print },\n ]}\n onItemClick={async (report: any) => {\n if (!report) {\n return;\n }\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n runAction({\n ...report,\n datas: {\n ...(report.datas || {}),\n ids: [result.currentId as number],\n },\n });\n }}\n />\n <DropdownButton\n icon={<EnterOutlined />}\n disabled={mustDisableButtons}\n placement=\"bottomRight\"\n onRetrieveData={async () => [\n { label: t(\"related\"), items: toolbar?.relate },\n ]}\n onItemClick={async (relate: any) => {\n if (!relate) {\n return;\n }\n\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n openRelate({\n relateData: relate,\n values: (formRef.current as any).getValues(),\n fields: (formRef.current as any).getFields(),\n action_id: relate.id,\n action_type: relate.type,\n });\n }}\n />\n <AttachmentsButton\n disabled={mustDisableButtons}\n attachments={attachments}\n onAddNewAttachment={async () => {\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n const res_id = result.currentId as number;\n const res_model = currentModel as string;\n openDefaultActionForModel({\n ...getAttachmentActionPayload(res_model, res_id),\n initialViewType: \"form\",\n });\n }}\n onListAllAttachments={async () => {\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n const res_id = result.currentId as number;\n const res_model = currentModel as string;\n openDefaultActionForModel({\n ...getAttachmentActionPayload(res_model, res_id),\n initialViewType: \"tree\",\n });\n }}\n onViewAttachmentDetails={async (attachment: Attachment) => {\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n openDefaultActionForModel({\n model: \"ir.attachment\",\n res_id: attachment.id,\n initialViewType: \"form\",\n });\n }}\n />\n </Space>\n );\n}\n\nfunction separator() {\n return <div className=\"inline-block w-2\" />;\n}\n\nasync function saveDocument({\n onFormSave,\n}: {\n onFormSave?: () => Promise<{ succeed: boolean; id: number }>;\n}): Promise<{ succeed: boolean; currentId?: number }> {\n const result = await onFormSave?.();\n if (result?.succeed) {\n return { succeed: true, currentId: result.id };\n } else {\n return { succeed: false, currentId: undefined };\n }\n}\n\nfunction getAttachmentActionPayload(res_model: string, res_id: number) {\n return {\n model: \"ir.attachment\",\n domain: [\n [\"res_model\", \"=\", `${res_model}`],\n [\"res_id\", \"=\", `${res_id}`],\n ],\n values: {\n selection_associated_object: `${res_model},${res_id}`,\n },\n forced_values: {\n res_model,\n res_id,\n },\n };\n}\nexport default FormActionBar;\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { Input, Button, Row, Col, theme } from \"antd\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\nimport { EditOutlined, CheckOutlined } from \"@ant-design/icons\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\ninterface LinkInputProps {\n ooui: CharOoui;\n value?: string;\n onChange?: (value: string) => void;\n valueValidator: (value?: string) => boolean;\n linkPrefix?: string;\n}\n\nexport const LinkInput = (props: LinkInputProps) => {\n const { ooui, value, onChange, valueValidator, linkPrefix = \"\" } = props;\n const { id, readOnly, required } = ooui as CharOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n const [editMode, setEditMode] = useState(false);\n const [showInput, setShowInput] = useState(false);\n\n useEffect(() => {\n if (readOnly && !editMode) {\n setShowInput(false);\n }\n\n if (!value && !readOnly) {\n setEditMode(true);\n setShowInput(true);\n }\n }, [editMode, readOnly]);\n\n const onValueStringChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n };\n\n return (\n <Row gutter={8} wrap={false} align=\"middle\">\n {!readOnly ? (\n <Col flex=\"none\">\n {editMode ? (\n <Button\n icon={<CheckOutlined />}\n onClick={() => {\n if (valueValidator(value)) {\n setEditMode(false);\n setShowInput(false);\n }\n }}\n style={{ borderTopRightRadius: 0, borderBottomRightRadius: 0 }}\n tabIndex={-1}\n />\n ) : (\n <Button\n icon={<EditOutlined />}\n onClick={() => {\n setEditMode(true);\n setShowInput(true);\n }}\n style={{ borderTopRightRadius: 0, borderBottomRightRadius: 0 }}\n tabIndex={-1}\n />\n )}\n </Col>\n ) : null}\n <Col flex=\"auto\">\n {showInput ? (\n <Input\n style={{\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n ...requiredStyle,\n }}\n id={id}\n onChange={onValueStringChange}\n value={value}\n onBlur={() => {\n if (valueValidator(value)) {\n setEditMode(false);\n setShowInput(false);\n elementHasLostFocus?.();\n }\n }}\n />\n ) : (\n <a\n href={`${linkPrefix}${value}`}\n style={{ color: token.colorPrimary, paddingRight: 15 }}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {value}\n </a>\n )}\n </Col>\n </Row>\n );\n};\n","import React from \"react\";\nimport isURL from \"validator/lib/isURL\";\nimport Field from \"@/common/Field\";\n\nimport { WidgetProps } from \"@/types\";\nimport { LinkInput } from \"./LinkInput\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\n\nexport const Url = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as CharOoui;\n\n return (\n <Field required={required} {...props}>\n <LinkInput\n ooui={ooui as CharOoui}\n valueValidator={(value) => {\n if (!value) {\n return false;\n }\n return isURL(value);\n }}\n />\n </Field>\n );\n};\n","import React from \"react\";\nimport isEmail from \"validator/lib/isEmail\";\nimport Field from \"@/common/Field\";\n\nimport { WidgetProps } from \"@/types\";\nimport { LinkInput } from \"./LinkInput\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\n\nexport const Email = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as CharOoui;\n\n return (\n <Field required={required} {...props}>\n <LinkInput\n ooui={ooui as CharOoui}\n linkPrefix={\"mailto:\"}\n valueValidator={(value) => {\n if (!value) {\n return false;\n }\n return isEmail(value);\n }}\n />\n </Field>\n );\n};\n","import { useRef } from \"react\";\nimport { Button, Col, Form, Input, Modal, Row, Space } from \"antd\";\nimport { PlusOutlined, EnterOutlined, CloseOutlined } from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n visible: boolean;\n onIdSubmitted: (ids: number[], openInSameTab?: boolean) => void;\n onCancel: () => void;\n isSearching: boolean;\n};\n\nexport const GoToResourceModal = (props: Props) => {\n const { visible, onIdSubmitted, onCancel, isSearching } = props;\n\n const { t } = useLocale();\n const inputRef = useRef<null | HTMLElement>(null);\n const openInSameTab = useRef(false);\n\n function handleSubmit(values: any) {\n const ids = values.id.split(\",\").map((id: string) => parseInt(id.trim()));\n onIdSubmitted(ids, openInSameTab.current);\n openInSameTab.current = false;\n }\n\n return (\n <Modal\n title={t(\"goToResourceId\")}\n centered\n open={visible}\n width={600}\n footer={null}\n destroyOnClose\n onCancel={onCancel}\n maskClosable={false}\n afterOpenChange={(open) => open && inputRef.current?.focus()}\n >\n <Form layout=\"vertical\" onFinish={handleSubmit} autoComplete=\"off\">\n <Form.Item\n name={\"id\"}\n label={t(\"searchId\")}\n rules={[\n {\n required: true,\n },\n ]}\n help={t(\"searchIdHelp\")}\n >\n <Input style={{ width: \"100%\" }} autoFocus ref={inputRef as any} />\n </Form.Item>\n <Row align=\"middle\" justify=\"end\">\n <Col>\n <Space>\n <Button\n icon={<CloseOutlined />}\n htmlType=\"button\"\n onClick={onCancel}\n disabled={isSearching}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n tabIndex={1}\n loading={isSearching}\n style={{ marginLeft: 15 }}\n icon={<PlusOutlined />}\n htmlType=\"submit\"\n disabled={isSearching}\n onClick={() => {\n openInSameTab.current = true;\n }}\n >\n {t(\"openInSameWindow\")}\n </Button>\n <Button\n tabIndex={0}\n loading={isSearching}\n style={{ marginLeft: 15 }}\n icon={<EnterOutlined />}\n htmlType=\"submit\"\n type=\"primary\"\n disabled={isSearching}\n onClick={() => {\n openInSameTab.current = false;\n }}\n >\n {t(\"openInNewTab\")}\n </Button>\n </Space>\n </Col>\n </Row>\n </Form>\n </Modal>\n );\n};\n","import React from \"react\";\nimport ButtonWithTooltip, {\n Props as ButtonWithTooltipProps,\n} from \"@/common/ButtonWithTooltip\";\nimport { theme } from \"antd\";\nconst { useToken } = theme;\n\ntype Props = ButtonWithTooltipProps & {\n badgeNumber?: number;\n};\n\nfunction ButtonWithBadge(props: Props) {\n const { badgeNumber = 0, ...restProps } = props;\n const { token } = useToken();\n\n return (\n <div style={{ position: \"relative\" }}>\n {badgeNumber > 0 && (\n <div style={{ position: \"absolute\", left: -10, top: -10, zIndex: 2 }}>\n <span\n style={{\n display: \"inline-block\",\n minWidth: \"22px\",\n padding: \"2px\",\n borderRadius: \"50%\",\n fontSize: \"12px\",\n textAlign: \"center\",\n background: token.colorPrimaryHover,\n color: token.colorPrimaryBg,\n }}\n >\n {badgeNumber}\n </span>\n </div>\n )}\n <ButtonWithTooltip\n {...restProps}\n style={{ width: 46, zIndex: 0 }}\n ></ButtonWithTooltip>\n </div>\n );\n}\n\nexport default ButtonWithBadge;\n","import React, { useContext } from \"react\";\nimport { Space } from \"antd\";\nimport ChangeViewButton from \"./ChangeViewButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport ActionButton from \"./ActionButton\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport ButtonWithBadge from \"./ButtonWithBadge\";\nimport { ReloadOutlined, FilterOutlined } from \"@ant-design/icons\";\nimport { View } from \"@/types\";\n\nfunction GraphActionBar({ refreshGraph }: { refreshGraph: () => void }) {\n const { t } = useLocale();\n const {\n availableViews,\n currentView,\n setCurrentView,\n searchParams,\n searchVisible,\n setSearchVisible,\n graphIsLoading,\n previousView,\n setPreviousView,\n } = useContext(ActionViewContext) as ActionViewContextType;\n\n return (\n <Space wrap={true}>\n <ButtonWithBadge\n icon={\n <FilterOutlined\n style={{ color: searchVisible ? \"white\" : undefined }}\n />\n }\n tooltip={t(\"advanced_search\")}\n type={searchVisible ? \"primary\" : \"default\"}\n onClick={() => {\n setSearchVisible?.(!searchVisible);\n }}\n disabled={graphIsLoading}\n badgeNumber={searchParams?.length}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={graphIsLoading}\n loading={false}\n onClick={() => {\n refreshGraph();\n }}\n />\n <ChangeViewButton\n currentView={currentView}\n availableViews={availableViews}\n onChangeView={(newView: View) => {\n setPreviousView?.(currentView);\n setCurrentView?.(newView);\n }}\n disabled={false}\n previousView={previousView}\n />\n </Space>\n );\n}\n\nexport default GraphActionBar;\n","import React, { useContext } from \"react\";\nimport { Row, Col, Typography, theme } from \"antd\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { CopyOutlined } from \"@ant-design/icons\";\n\nconst { useToken } = theme;\n\nconst { Title, Text } = Typography;\n\ntype Props = {\n title?: string;\n children?: any;\n};\n\nfunction TitleHeader(props: Props) {\n const { title: titleProps, children } = props;\n const {\n title,\n currentView,\n currentId,\n currentItemIndex,\n results,\n totalItems,\n selectedRowItems,\n } = useContext(ActionViewContext) as ActionViewContextType;\n const { t } = useLocale();\n const { token } = useToken();\n\n function getSummary() {\n if (currentView?.type === \"form\") {\n if (!currentId) {\n return \"\";\n }\n\n if (totalItems === 0) {\n return (\n <>\n {t(\"editingDocument\")} (id:{\" \"}\n <Text\n copyable={{ icon: <CopyOutlined style={{ color: \"red\" }} /> }}\n >\n {currentId}\n </Text>\n )\n </>\n );\n }\n\n return (\n <>\n {t(\"register\")}{\" \"}\n {currentItemIndex === undefined ? 1 : currentItemIndex + 1} /{\" \"}\n {results!.length} {t(\"of\")} {totalItems} - {t(\"editingDocument\")} (id:{\" \"}\n <Text copyable>{currentId}</Text>)\n </>\n );\n } else if (currentView?.type === \"tree\" && selectedRowItems) {\n if (selectedRowItems.length === 1) {\n return (\n <>\n 1 {t(\"selectedRegisters\")} - (id:{\" \"}\n <Text copyable>{selectedRowItems[0].id}</Text>)\n </>\n );\n } else if (selectedRowItems.length > 1) {\n return (\n <>\n {selectedRowItems.length} {t(\"selectedRegisters\")}\n <Text\n copyable={{\n text: selectedRowItems.map((reg) => reg.id).join(\", \"),\n }}\n ></Text>\n </>\n );\n }\n }\n return null;\n }\n return (\n <div\n style={{\n position: \"sticky\",\n top: 80,\n zIndex: 3,\n }}\n >\n <Row\n className=\"shadow-md\"\n style={{\n padding: \"1em\",\n borderRadius: token.borderRadius,\n backgroundColor: token.colorPrimaryBg,\n minHeight: \"82px\",\n }}\n align=\"middle\"\n >\n <Col flex={2}>\n <Title level={3} style={{ marginBottom: 0 }}>\n {titleProps || title}\n </Title>\n {getSummary()}\n </Col>\n <Col flex={3}>\n <Row justify=\"end\">{children}</Row>\n </Col>\n </Row>\n <div className=\"pb-5\" />\n </div>\n );\n}\n\nexport default TitleHeader;\n","import GraphActionBar from \"@/actionbar/GraphActionBar\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport { Graph } from \"@/widgets/views/Graph/Graph\";\nimport React, { useContext, useEffect, useRef, useState } from \"react\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { FormView, TreeView } from \"@/types\";\nimport { mergeSearchFields } from \"@/helpers/formHelper\";\nimport { useSearch } from \"@/hooks/useSearch\";\nimport SearchFilter from \"@/widgets/views/searchFilter/SearchFilter\";\nimport { Spin } from \"antd\";\nimport { mergeParams } from \"@/helpers/searchHelper\";\n\nexport type GraphActionViewProps = {\n viewData: any;\n visible: boolean;\n model: string;\n context: any;\n domain: any;\n formView: FormView;\n treeView: TreeView;\n};\n\nexport const GraphActionView = (props: GraphActionViewProps) => {\n const { viewData, visible, model, context, domain, formView, treeView } =\n props;\n const graphRef = useRef();\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const {\n setResults: setResultsActionView = undefined,\n setCurrentItemIndex = undefined,\n currentId = undefined,\n results: resultsActionView = undefined,\n setSelectedRowItems = undefined,\n setSearchParams = undefined,\n searchVisible = true,\n setSearchVisible = undefined,\n sorter = undefined,\n setSorter = undefined,\n setTotalItems: setActionViewTotalItems = undefined,\n setSearchTreeNameSearch = undefined,\n setTreeIsLoading = undefined,\n limit,\n setLimit,\n searchParams,\n searchValues,\n setSearchValues,\n currentView,\n } = actionViewContext || {};\n\n const [applyLimit, setApplyLimit] = useState(true);\n\n useEffect(() => {\n (graphRef.current as any)?.refresh();\n }, [searchParams]);\n\n useEffect(() => {\n if (viewData.view_id !== currentView.view_id) {\n setApplyLimit(true);\n }\n }, [currentView]);\n\n const { clear, searchFilterLoading, searchError, offset, tableRefreshing } =\n useSearch({\n model,\n setSearchTreeNameSearch,\n setSelectedRowItems,\n searchParams,\n setSearchValues,\n setSearchParams,\n setSearchVisible,\n setTreeIsLoading,\n context,\n formView: formView!,\n treeView: treeView!,\n sorter,\n setSorter,\n setCurrentItemIndex,\n setResultsActionView,\n resultsActionView,\n domain,\n currentId,\n setActionViewTotalItems,\n limit,\n setLimit,\n });\n\n if (!visible) {\n return null;\n }\n\n if (!viewData) {\n return null;\n }\n\n return (\n <>\n <TitleHeader title={viewData.title || viewData.name}>\n <GraphActionBar\n refreshGraph={() => {\n (graphRef.current as any).refresh();\n }}\n />\n </TitleHeader>\n <SearchFilter\n fields={{ ...treeView.fields, ...formView.fields }}\n searchFields={mergeSearchFields([\n formView.search_fields,\n treeView.search_fields,\n ])}\n limit={limit!}\n onClear={clear}\n offset={offset}\n isSearching={searchFilterLoading}\n onSubmit={(opts: {\n params: any;\n limit: number;\n offset: number;\n searchValues: any;\n }) => {\n setApplyLimit(false);\n setSearchParams?.(opts.params);\n setSearchVisible?.(false);\n }}\n searchError={searchError}\n searchVisible={searchVisible}\n searchValues={searchValues}\n showLimitOptions={false}\n />\n {tableRefreshing ? (\n <Spin />\n ) : (\n <Graph\n ref={graphRef}\n view_id={viewData.view_id}\n model={model}\n context={context}\n domain={mergeParams(searchParams || [], domain)}\n limit={applyLimit ? limit : undefined}\n manualIds={\n applyLimit ? resultsActionView?.map((r) => r.id) : undefined\n }\n />\n )}\n </>\n );\n};\n","import FormActionBar from \"@/actionbar/FormActionBar\";\nimport { FormView } from \"@/types\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport Form from \"@/widgets/views/Form\";\nimport React from \"react\";\n\nexport type FormActionViewProps = {\n formView?: FormView;\n visible: boolean;\n formRef: any;\n model: string;\n currentId?: number;\n domain: any;\n context: any;\n defaultValues?: any;\n forcedValues?: any;\n results: any[];\n setResults: (value: any[]) => void;\n setCurrentItemIndex: (value?: number) => void;\n};\n\nexport const FormActionView = (props: FormActionViewProps) => {\n const {\n visible,\n formRef,\n model,\n currentId,\n domain,\n formView,\n context,\n defaultValues,\n forcedValues,\n results,\n setResults,\n setCurrentItemIndex,\n } = props;\n\n if (!visible) {\n return null;\n }\n\n return (\n <>\n <TitleHeader>\n <FormActionBar toolbar={formView?.toolbar} />\n </TitleHeader>\n <Form\n rootForm={true}\n ref={formRef}\n model={model}\n defaultValues={defaultValues}\n forcedValues={forcedValues}\n formView={formView}\n actionDomain={domain}\n id={currentId}\n parentContext={context}\n onSubmitSucceed={(id, values) => {\n const itemIndex = results!.findIndex((item: any) => {\n return item.id === id;\n });\n if (itemIndex === -1) {\n results!.push(values);\n setResults(results);\n setCurrentItemIndex(results!.length - 1);\n }\n }}\n />\n </>\n );\n};\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { Button, Col, Form, Input, Row, Tooltip } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { CloseCircleFilled } from \"@ant-design/icons\";\n\ntype Props = {\n onSearch: (searchValue?: string) => void;\n searchText?: string;\n disabled?: boolean;\n};\n\nfunction SearchBar(props: Props) {\n const { onSearch, disabled = false, searchText } = props;\n const { t } = useLocale();\n const [form] = Form.useForm();\n const [mustShowClearSuffix, setMustShowClearSuffix] =\n useState<boolean>(false);\n\n function handleSubmit(values: any) {\n onSearch(values.search);\n }\n\n useEffect(() => {\n form.setFieldsValue({ search: searchText });\n }, [searchText]);\n\n function clear() {\n setMustShowClearSuffix(false);\n form.setFieldsValue({ search: undefined });\n onSearch(undefined);\n }\n\n return (\n <Form form={form} onFinish={handleSubmit} autoComplete=\"off\">\n <Row align=\"middle\" justify=\"end\">\n <Col>\n <Form.Item name={\"search\"} noStyle>\n <Input\n autoFocus\n disabled={disabled}\n onChange={(e) => {\n setMustShowClearSuffix(e.target.value.length > 0);\n }}\n style={{ borderTopRightRadius: 0, borderBottomRightRadius: 0 }}\n suffix={\n (mustShowClearSuffix ||\n (searchText && searchText.length > 0)) && (\n <Tooltip title={t(\"clear\")}>\n <CloseCircleFilled\n style={{ color: \"rgba(0,0,0,.45)\" }}\n onClick={clear}\n />\n </Tooltip>\n )\n }\n />\n </Form.Item>\n </Col>\n <Col>\n <Button\n htmlType=\"submit\"\n disabled={disabled}\n style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0 }}\n >\n {t(\"search\")}\n </Button>\n </Col>\n </Row>\n </Form>\n );\n}\n\nexport default SearchBar;\n","import { useContext, useState } from \"react\";\nimport { Space, Spin } from \"antd\";\nimport ChangeViewButton from \"./ChangeViewButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport NewButton from \"./NewButton\";\nimport ActionButton from \"./ActionButton\";\nimport Icon, {\n DeleteOutlined,\n PrinterOutlined,\n ThunderboltOutlined,\n CopyOutlined,\n ReloadOutlined,\n InfoCircleOutlined,\n FilterOutlined,\n} from \"@ant-design/icons\";\nimport { useLocale, DropdownButton } from \"@gisce/react-formiga-components\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport ButtonWithBadge from \"./ButtonWithBadge\";\nimport { showLogInfo } from \"@/helpers/logInfoHelper\";\nimport SearchBar from \"./SearchBar\";\nimport { ExportModal } from \"..\";\nimport { mergeParams } from \"@/helpers/searchHelper\";\nimport { useFeatureIsEnabled } from \"@/context/ConfigContext\";\nimport { ErpFeatureKeys } from \"@/models/erpFeature\";\n\ntype Props = {\n parentContext?: any;\n treeExpandable: boolean;\n toolbar: any;\n};\n\nfunction TreeActionBar(props: Props) {\n const {\n availableViews,\n currentView,\n setCurrentView,\n selectedRowItems,\n setRemovingItem,\n removingItem,\n duplicatingItem,\n setDuplicatingItem,\n currentModel,\n searchTreeRef,\n setCurrentId,\n setCurrentItemIndex,\n searchParams,\n searchVisible,\n setSearchVisible,\n setSearchTreeNameSearch,\n searchTreeNameSearch,\n treeIsLoading,\n setPreviousView,\n previousView,\n results,\n limit,\n totalItems,\n } = useContext(ActionViewContext) as ActionViewContextType;\n\n const { parentContext = {}, treeExpandable, toolbar } = props;\n const advancedExportEnabled = useFeatureIsEnabled(\n ErpFeatureKeys.FEATURE_ADVANCED_EXPORT,\n );\n const { t } = useLocale();\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n const [exportModalVisible, setExportModalVisible] = useState(false);\n\n const hasNameSearch: boolean =\n searchTreeNameSearch !== undefined &&\n searchTreeNameSearch.trim().length > 0;\n\n function tryDelete() {\n showConfirmDialog({\n confirmMessage: t(\"confirmRemove\"),\n t,\n onOk: () => {\n remove();\n },\n });\n }\n\n async function remove() {\n try {\n setRemovingItem?.(true);\n\n await ConnectionProvider.getHandler().deleteObjects({\n model: currentModel!,\n ids: selectedRowItems!.map((item) => item.id),\n context: { ...parentContext },\n });\n\n setCurrentId?.(undefined);\n setCurrentItemIndex?.(undefined);\n\n searchTreeRef?.current?.refreshResults();\n } catch (e) {\n showErrorDialog(e);\n } finally {\n setRemovingItem?.(false);\n }\n }\n\n async function duplicate() {\n try {\n setDuplicatingItem?.(true);\n\n const currentId = selectedRowItems![0].id;\n\n const newId = await ConnectionProvider.getHandler().duplicate({\n id: currentId,\n model: currentModel!,\n context: { ...parentContext },\n });\n\n if (newId) {\n searchTreeRef?.current?.refreshResults();\n }\n } catch (e) {\n showErrorDialog(e);\n } finally {\n setDuplicatingItem?.(false);\n }\n }\n\n function runAction(actionData: any) {\n processAction?.({\n actionData,\n values: {\n active_id: selectedRowItems?.map((item) => item.id)[0],\n active_ids: selectedRowItems?.map((item) => item.id),\n },\n fields: {},\n context: {\n ...parentContext,\n active_id: selectedRowItems?.map((item) => item.id)[0],\n active_ids: selectedRowItems?.map((item) => item.id),\n },\n onRefreshParentValues: () => {\n searchTreeRef?.current?.refreshResults();\n },\n });\n }\n\n return (\n <Space wrap={true}>\n {treeIsLoading && (\n <>\n <Spin />\n {separator()}\n {separator()}\n </>\n )}\n {treeExpandable ? null : (\n <>\n <SearchBar\n disabled={duplicatingItem || removingItem || treeIsLoading}\n searchText={searchTreeNameSearch}\n onSearch={(searchString?: string) => {\n if (searchString && searchString.trim().length > 0) {\n setSearchTreeNameSearch?.(searchString);\n } else {\n setSearchTreeNameSearch?.(undefined);\n }\n }}\n />\n {!treeExpandable && (\n <ButtonWithBadge\n icon={\n <FilterOutlined\n style={{ color: searchVisible ? \"white\" : undefined }}\n />\n }\n tooltip={t(\"advanced_search\")}\n type={searchVisible ? \"primary\" : \"default\"}\n onClick={() => {\n setSearchVisible?.(!searchVisible);\n }}\n disabled={duplicatingItem || removingItem || treeIsLoading}\n badgeNumber={searchParams?.length}\n />\n )}\n {separator()}\n <NewButton disabled={treeIsLoading} />\n <ActionButton\n icon={<CopyOutlined />}\n tooltip={t(\"duplicate\")}\n disabled={\n !selectedRowItems ||\n selectedRowItems?.length !== 1 ||\n duplicatingItem ||\n treeIsLoading\n }\n loading={duplicatingItem}\n onClick={duplicate}\n />\n <ActionButton\n icon={<DeleteOutlined />}\n tooltip={t(\"delete\")}\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) ||\n treeIsLoading\n }\n loading={removingItem}\n onClick={tryDelete}\n />\n {separator()}\n </>\n )}\n <ActionButton\n icon={<InfoCircleOutlined />}\n tooltip={t(\"showLogs\")}\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) || treeIsLoading\n }\n loading={false}\n onClick={() => {\n showLogInfo(currentModel!, selectedRowItems![0].id, t);\n }}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={duplicatingItem || removingItem || treeIsLoading}\n loading={false}\n onClick={() => {\n searchTreeRef?.current?.refreshResults();\n }}\n />\n {!treeExpandable && (\n <>\n {separator()}\n <ChangeViewButton\n currentView={currentView}\n availableViews={availableViews}\n onChangeView={(newView) => {\n setPreviousView?.(currentView);\n setCurrentView?.(newView);\n }}\n previousView={previousView}\n disabled={treeIsLoading}\n />\n </>\n )}\n {separator()}\n <DropdownButton\n icon={<ThunderboltOutlined />}\n placement=\"bottomRight\"\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) || treeIsLoading\n }\n onRetrieveData={async () => [\n { label: t(\"actions\"), items: toolbar?.action },\n ]}\n onItemClick={(action: any) => {\n if (!action) {\n return;\n }\n\n runAction(action);\n }}\n />\n <DropdownButton\n icon={<PrinterOutlined />}\n placement=\"bottomRight\"\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) || treeIsLoading\n }\n onRetrieveData={async () => [\n { label: t(\"reports\"), items: toolbar?.print },\n ]}\n onItemClick={(report: any) => {\n if (!report) {\n return;\n }\n\n runAction({\n ...report,\n datas: {\n ...(report.datas || {}),\n ids: selectedRowItems!.map((item) => item.id),\n },\n });\n }}\n />\n {advancedExportEnabled && (\n <>\n {separator()}\n <DropdownButton\n placement=\"bottomRight\"\n icon={\n <Icon\n component={() => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"icon icon-tabler icon-tabler-database-export\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <ellipse cx=\"12\" cy=\"6\" rx=\"8\" ry=\"3\" />\n <path d=\"M4 6v6c0 1.657 3.582 3 8 3a19.84 19.84 0 0 0 3.302 -.267m4.698 -2.733v-6\" />\n <path d=\"M4 12v6c0 1.599 3.335 2.905 7.538 2.995m8.462 -6.995v-2m-6 7h7m-3 -3l3 3l-3 3\" />\n </svg>\n )}\n />\n }\n onRetrieveData={async () => [\n {\n label: t(\"export\"),\n items: [\n {\n id: \"print_screen\",\n name: t(\"printScreen\"),\n },\n {\n id: \"export\",\n name: t(\"advancedExport\"),\n },\n ],\n },\n ]}\n onItemClick={(itemClicked: any) => {\n if (itemClicked.id === \"print_screen\") {\n let idsToExport =\n selectedRowItems?.map((item) => item.id) || [];\n\n if (idsToExport.length === 0) {\n idsToExport = results?.map((item) => item.id) || [];\n }\n\n runAction({\n id: -1,\n model: currentModel,\n report_name: \"printscreen.list\",\n type: \"ir.actions.report.xml\",\n datas: {\n model: currentModel,\n ids: idsToExport,\n },\n });\n return;\n }\n\n setExportModalVisible(true);\n }}\n disabled={\n duplicatingItem || removingItem || treeIsLoading || hasNameSearch\n }\n />\n <ExportModal\n visible={exportModalVisible}\n onClose={() => setExportModalVisible(false)}\n model={currentModel!}\n domain={mergeParams(\n searchTreeRef?.current?.getDomain() || [],\n searchParams || [],\n )}\n limit={limit}\n totalRegisters={totalItems || 0}\n selectedRegistersToExport={selectedRowItems}\n visibleRegisters={results?.length || 0}\n context={parentContext}\n />\n </>\n )}\n </Space>\n );\n}\n\nfunction separator() {\n return <div className=\"inline-block w-2\" />;\n}\n\nexport default TreeActionBar;\n","import TreeActionBar from \"@/actionbar/TreeActionBar\";\nimport { FormView, TreeView, View } from \"@/types\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport SearchTree from \"@/widgets/views/SearchTree\";\nimport React, { useContext } from \"react\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\n\nexport type TreeActionViewProps = {\n formView?: FormView;\n treeView?: TreeView;\n visible: boolean;\n searchTreeRef: any;\n model: string;\n domain: any;\n context: any;\n results: any[];\n setCurrentItemIndex: (value?: number) => void;\n setCurrentId: (id?: number) => void;\n setCurrentView: (view: View) => void;\n availableViews: View[];\n searchTreeNameSearch?: string;\n limit?: number;\n};\n\nexport const TreeActionView = (props: TreeActionViewProps) => {\n const {\n visible,\n searchTreeRef,\n model,\n context,\n formView,\n treeView,\n domain,\n setCurrentItemIndex,\n results,\n setCurrentId,\n setCurrentView,\n availableViews,\n searchTreeNameSearch,\n } = props;\n\n const { currentView, setPreviousView } = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n\n if (!visible) {\n return null;\n }\n\n return (\n <>\n <TitleHeader>\n <TreeActionBar\n toolbar={treeView?.toolbar}\n parentContext={context}\n treeExpandable={treeView?.isExpandable || false}\n />\n </TitleHeader>\n <SearchTree\n ref={searchTreeRef}\n rootTree={true}\n model={model}\n parentContext={context}\n nameSearch={searchTreeNameSearch}\n formView={formView}\n treeView={treeView}\n domain={domain}\n onRowClicked={(event: any) => {\n const { id } = event;\n setCurrentId(id);\n const itemIndex = results.findIndex((item: any) => {\n return item.id === id;\n });\n setPreviousView?.(currentView);\n setCurrentItemIndex(itemIndex);\n const formView = availableViews.find(\n (v) => v.type === \"form\",\n ) as FormView;\n setCurrentView(formView);\n }}\n />\n </>\n );\n};\n","import { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport React, { useState } from \"react\";\n\nexport type DashboardActionContextType = {\n isLoading: boolean;\n setIsLoading: (value: boolean) => void;\n dashboardRef: any;\n openAction: (action?: ShortcutApi) => void;\n moveItemsEnabled: boolean;\n setMoveItemsEnabled: (value: boolean) => void;\n};\n\nexport const DashboardActionContext =\n React.createContext<DashboardActionContextType | null>(null);\n\ntype DashboardActionProviderProps = {\n children: React.ReactNode;\n dashboardRef: any;\n openAction: (action?: ShortcutApi) => void;\n};\n\nconst DashboardActionProvider = (props: DashboardActionProviderProps): any => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [moveItemsEnabled, setMoveItemsEnabled] = useState<boolean>(false);\n\n const { children, dashboardRef, openAction } = props;\n\n return (\n <DashboardActionContext.Provider\n value={{\n isLoading,\n setIsLoading,\n dashboardRef,\n openAction,\n moveItemsEnabled,\n setMoveItemsEnabled,\n }}\n >\n {children}\n </DashboardActionContext.Provider>\n );\n};\n\nexport default DashboardActionProvider;\n","import React, { useContext } from \"react\";\nimport {\n DashboardActionContext,\n DashboardActionContextType,\n} from \"@/context/DashboardActionContext\";\nimport { Space } from \"antd\";\nimport ActionButton from \"./ActionButton\";\nimport {\n ReloadOutlined,\n SettingOutlined,\n BorderOuterOutlined,\n} from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nfunction DashboardActionBar() {\n const { isLoading, dashboardRef, moveItemsEnabled, setMoveItemsEnabled } =\n useContext(DashboardActionContext) as DashboardActionContextType;\n const { t } = useLocale();\n\n return (\n <Space wrap={true}>\n <ActionButton\n icon={\n <BorderOuterOutlined\n style={{ color: moveItemsEnabled ? \"white\" : undefined }}\n />\n }\n type={moveItemsEnabled ? \"primary\" : \"default\"}\n tooltip={t(\"moveDashboard\")}\n disabled={isLoading}\n loading={false}\n onClick={() => {\n setMoveItemsEnabled(!moveItemsEnabled);\n }}\n />\n {separator()}\n <ActionButton\n icon={<SettingOutlined />}\n tooltip={t(\"configDashboard\")}\n disabled={isLoading}\n loading={false}\n onClick={() => {\n dashboardRef?.current.configDashboard();\n }}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={isLoading}\n loading={false}\n onClick={() => {\n dashboardRef?.current.refresh();\n }}\n />\n </Space>\n );\n}\n\nfunction separator() {\n return <div className=\"inline-block w-2\" />;\n}\n\nexport default DashboardActionBar;\n","import DashboardActionBar from \"@/actionbar/DashboardActionBar\";\nimport DashboardActionProvider from \"@/context/DashboardActionContext\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport Dashboard from \"@/widgets/views/Dashboard/Dashboard\";\nimport React, { useContext, useRef } from \"react\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { DashboardProps } from \"@/types\";\n\nexport type DashboardActionViewProps = {\n dashboardData: DashboardProps;\n visible: boolean;\n};\n\nexport const DashboardActionView = (props: DashboardActionViewProps) => {\n const { dashboardData, visible } = props;\n const dashboardRef = useRef();\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openShortcut } = tabManagerContext || {};\n\n if (!dashboardData) {\n return null;\n }\n\n if (!visible) {\n return null;\n }\n\n return (\n <DashboardActionProvider\n dashboardRef={dashboardRef}\n openAction={(action) => {\n openShortcut(action!);\n }}\n >\n <TitleHeader>\n <DashboardActionBar />\n </TitleHeader>\n <Dashboard\n ref={dashboardRef}\n model={dashboardData!.model}\n id={dashboardData!.id}\n context={dashboardData?.context}\n configAction={dashboardData?.configAction}\n />\n </DashboardActionProvider>\n );\n};\n","import { ViewTuple } from \"@/types\";\n\nexport async function resolveViewInfoPromises(\n viewsToRetrieve: Array<{ viewTuple: ViewTuple; promise?: Promise<any> }>,\n) {\n const results = await Promise.all(\n viewsToRetrieve.map(async (item) => {\n try {\n return await item.promise;\n } catch (error) {\n return null;\n }\n }),\n );\n\n const updatedViews = viewsToRetrieve.map((item, index) => ({\n ...item,\n info: results[index],\n }));\n\n return updatedViews.filter((item) => item.info !== null);\n}\n","import React, {\n useEffect,\n useState,\n useRef,\n forwardRef,\n useImperativeHandle,\n useContext,\n} from \"react\";\n\nimport { Spin } from \"antd\";\n\nimport {\n DashboardView,\n FormView,\n GraphView,\n InitialViewData,\n TreeView,\n View,\n ViewType,\n} from \"@/types/index\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\nimport ActionViewProvider from \"@/context/ActionViewContext\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { useHotkeys } from \"react-hotkeys-hook\";\nimport { GoToResourceModal } from \"@/ui/GoToResourceModal\";\nimport showInfo from \"@/ui/InfoDialog\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { GraphActionView } from \"@/views/actionViews/GraphActionView\";\nimport { FormActionView } from \"./actionViews/FormActionView\";\nimport { TreeActionView } from \"./actionViews/TreeActionView\";\nimport { DashboardActionView } from \"./actionViews/DashboardActionView\";\nimport { resolveViewInfoPromises } from \"@/helpers/viewHelper\";\n\ntype Props = {\n domain: any;\n context: any;\n model: string;\n views: Array<[number, ViewType]>;\n title: string;\n tabKey: string;\n setCanWeClose: (f: any) => void;\n initialView: InitialViewData;\n formDefaultValues?: any;\n formForcedValues?: any;\n res_id?: number | boolean;\n action_id: number;\n action_type: string;\n treeExpandable?: boolean;\n limit?: number;\n};\n\nfunction ActionView(props: Props, ref: any) {\n const {\n domain,\n model,\n context,\n views,\n title,\n setCanWeClose,\n tabKey,\n initialView,\n formDefaultValues,\n formForcedValues = {},\n res_id = false,\n action_id,\n action_type,\n treeExpandable = false,\n limit,\n } = props;\n const [currentView, setCurrentViewInternal] = useState<View>();\n\n const [availableViews, setAvailableViews] = useState<View[]>([]);\n\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const res_id_parsed: number | undefined = res_id\n ? (res_id as number)\n : undefined;\n\n const [currentId, setCurrentIdInternal] = useState<number | undefined>(\n res_id_parsed,\n );\n const [selectedRowItems, setSelectedRowItems] = useState<any[]>([]);\n const [currentItemIndex, setCurrentItemIndex] = useState<number>();\n const [results, setResults] = useState<any>([]);\n const [sorter, setSorter] = useState<any>();\n const [totalItems, setTotalItems] = useState<number>(0);\n const [gtResourceModalVisible, setGtResourceModalVisible] =\n useState<boolean>(false);\n const [searchingForResourceId, setSearchingForResourceId] =\n useState<boolean>(false);\n const [searchTreeNameSearch, setSearchTreeNameSearch] = useState<string>();\n\n const { t } = useLocale();\n\n const formRef = useRef();\n const searchTreeRef = useRef();\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const {\n setCurrentView: setCurrentViewTabContext,\n setCurrentId: setCurrentIdTabContext,\n tabs,\n activeKey,\n openAction,\n onRemoveTab,\n } = tabManagerContext || {};\n\n useHotkeys(\n \"ctrl+g,command+g\",\n (event) => {\n event.preventDefault();\n handleGoToRecordShortcut();\n },\n [activeKey, tabs, currentView, currentItemIndex, results],\n );\n\n function setCurrentId(id?: number) {\n setCurrentIdInternal(id);\n setCurrentIdTabContext?.(id);\n }\n\n function setCurrentView(view?: View) {\n setCurrentViewInternal(view);\n const extra = { action_id, action_type };\n setCurrentViewTabContext?.({ ...view, extra } as any);\n }\n\n useImperativeHandle(ref, () => ({\n canWeClose,\n }));\n\n const fetchData = async () => {\n setIsLoading(true);\n\n const viewDataRetrieved: View[] = [];\n\n const getViewsPromises = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n if (viewType !== \"dashboard\") {\n getViewsPromises.push({\n viewTuple: viewArray,\n promise: ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context,\n }),\n });\n } else {\n getViewsPromises.push({\n viewTuple: viewArray,\n });\n }\n }\n\n const viewsRetrieved = await resolveViewInfoPromises(getViewsPromises);\n\n for (const view of viewsRetrieved) {\n if (!view) {\n continue;\n }\n\n const [, viewType] = view.viewTuple;\n\n const viewInfo = view.info;\n\n switch (viewType) {\n case \"dashboard\": {\n const formView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"form\";\n });\n\n let configAction;\n\n if (formView) {\n configAction = {\n action_id,\n action_type,\n name: title,\n res_id: context[\"active_id\"],\n res_model: model,\n view_id: formView[0],\n view_type: formView[1],\n };\n }\n\n viewDataRetrieved.push({\n type: \"dashboard\",\n id: context[\"active_id\"],\n model,\n context,\n configAction,\n });\n break;\n }\n case \"form\": {\n viewDataRetrieved.push({\n ...(viewInfo as FormView),\n type: viewType,\n });\n break;\n }\n case \"tree\": {\n viewDataRetrieved.push({\n ...(viewInfo as TreeView),\n isExpandable: treeExpandable,\n type: viewType,\n });\n break;\n }\n case \"graph\": {\n viewDataRetrieved.push({\n ...(viewInfo as GraphView),\n type: viewType,\n });\n break;\n }\n default:\n break;\n }\n }\n let currentViewToAssign;\n\n if (!initialView && viewDataRetrieved.find((v) => v.type === \"tree\")) {\n const treeView: TreeView = viewDataRetrieved.find(\n (v) => v.type === \"tree\",\n ) as TreeView;\n currentViewToAssign = treeView;\n } else if (!initialView) {\n const formView: TreeView = viewDataRetrieved.find(\n (v) => v.type === \"form\",\n ) as TreeView;\n currentViewToAssign = formView;\n } else {\n const view = viewDataRetrieved.find((v) => {\n if (!initialView.id) {\n return v.type === initialView.type;\n } else {\n return v.type === initialView.type && v.view_id === initialView.id;\n }\n });\n currentViewToAssign = view;\n }\n\n if (!currentViewToAssign) {\n showErrorDialog(\n `Error determining the first view to show for model ${model}.\\nPlease, make sure the view ids on the fields_view_get responses are the same as the ones defined in the action`,\n );\n onRemoveTab?.(tabKey);\n }\n\n setCurrentView(currentViewToAssign);\n setAvailableViews(viewDataRetrieved);\n setIsLoading(false);\n };\n\n setCanWeClose({ tabKey, canWeClose });\n\n useEffect(() => {\n const treeView = availableViews.find((v) => v.type === \"tree\") as TreeView;\n const initialViewWithData: View = availableViews.find((v) => {\n if (!initialView.id) {\n return v.type === initialView.type;\n } else {\n return v.type === initialView.type && v.view_id === initialView.id;\n }\n }) as View;\n\n setCurrentView(initialViewWithData || treeView);\n if (!res_id) {\n setCurrentId(undefined);\n setCurrentItemIndex(undefined);\n } else {\n setCurrentIdTabContext?.(res_id_parsed);\n }\n fetchData();\n }, [model, views, res_id]);\n\n useEffect(() => {\n if (activeKey === tabKey) {\n setCurrentIdTabContext?.(currentId);\n const extra = { action_id, action_type };\n setCurrentViewTabContext?.({ ...currentView, extra } as any);\n }\n }, [tabs, activeKey]);\n\n async function canWeClose() {\n if (!currentView) {\n return true;\n } else if (currentView!.type === \"form\") {\n return await (formRef.current as any).cancelUnsavedChanges();\n } else {\n return true;\n }\n }\n\n async function handleGoToRecordShortcut() {\n if (activeKey !== tabKey) {\n return;\n }\n\n if (currentView!.type === \"form\") {\n const canWeClose = await (formRef.current as any).cancelUnsavedChanges();\n\n if (!canWeClose) {\n return;\n }\n }\n\n setGtResourceModalVisible(true);\n }\n\n async function goToResourceId(ids: number[], openInSameTab?: boolean) {\n setSearchingForResourceId(true);\n\n let mode: ViewType;\n let domain: any[];\n if (ids.length === 1) {\n mode = \"form\";\n domain = [];\n const id = ids[0];\n const itemIndex = results!.findIndex((item: any) => {\n return item.id === id;\n });\n let resource;\n\n if (itemIndex === -1) {\n try {\n resource = (\n await ConnectionProvider.getHandler().readObjects({\n model,\n ids: [id],\n context,\n })\n )?.[0];\n } catch (err) {}\n\n if (!resource) {\n setSearchingForResourceId(false);\n setGtResourceModalVisible(false);\n showInfo(t(\"idNotFound\"));\n return;\n }\n } else {\n resource = results[itemIndex];\n }\n } else {\n mode = \"tree\";\n domain = [[\"id\", \"in\", ids]];\n }\n\n setSearchingForResourceId(false);\n setGtResourceModalVisible(false);\n\n if (openInSameTab && mode === \"form\") {\n setCurrentId(ids[0]);\n const formView: FormView = availableViews.find(\n (v) => v.type === \"form\",\n ) as FormView;\n setCurrentView(formView);\n } else {\n const viewForm = views.find((v) => v[1] === mode);\n openAction({\n domain,\n context,\n model,\n views,\n title,\n target: \"current\",\n initialView: { id: viewForm?.[0]!, type: mode },\n action_id,\n action_type,\n res_id: ids[0],\n });\n }\n }\n\n function content() {\n return availableViews.map((view) => {\n switch (view.type) {\n case \"form\": {\n return (\n <FormActionView\n key={`${view.type}-${view.view_id}`}\n formRef={formRef}\n currentId={currentId}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n formView={view as FormView}\n model={model}\n context={context}\n domain={domain}\n defaultValues={formDefaultValues}\n forcedValues={formForcedValues}\n results={results}\n setResults={setResults}\n setCurrentItemIndex={setCurrentItemIndex}\n />\n );\n }\n case \"tree\": {\n return (\n <TreeActionView\n key={`${view.type}-${view.view_id}`}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n limit={limit}\n model={model}\n context={context}\n domain={domain}\n formView={\n availableViews.find((v) => v.type === \"form\") as FormView\n }\n treeView={view as TreeView}\n searchTreeRef={searchTreeRef}\n searchTreeNameSearch={searchTreeNameSearch}\n availableViews={availableViews}\n results={results}\n setCurrentItemIndex={setCurrentItemIndex}\n setCurrentId={setCurrentId}\n setCurrentView={setCurrentView}\n />\n );\n }\n case \"graph\": {\n return (\n <GraphActionView\n key={`${view.type}-${view.view_id}`}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n viewData={view as GraphView}\n model={model}\n context={context}\n domain={domain}\n treeView={\n availableViews.find((v) => v.type === \"tree\") as TreeView\n }\n formView={\n availableViews.find((v) => v.type === \"form\") as FormView\n }\n />\n );\n }\n case \"dashboard\": {\n return (\n <DashboardActionView\n key={`${view.type}-${view.view_id}`}\n dashboardData={view as DashboardView}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n />\n );\n }\n }\n });\n }\n\n function onNewClicked() {\n if (currentId === undefined && currentView!.type === \"form\") {\n (formRef.current as any).clearAndReload();\n } else {\n setCurrentId(undefined);\n const formView: FormView = availableViews.find(\n (v) => v.type === \"form\",\n ) as FormView;\n setCurrentView(formView);\n }\n }\n\n if (isLoading) {\n return <Spin />;\n }\n\n if (!currentView) {\n return null;\n }\n\n return (\n <ActionViewProvider\n title={title}\n currentView={currentView}\n setCurrentView={setCurrentView}\n availableViews={availableViews}\n formRef={formRef}\n searchTreeRef={searchTreeRef}\n onNewClicked={onNewClicked}\n currentId={currentId}\n setCurrentId={setCurrentId}\n setCurrentItemIndex={setCurrentItemIndex}\n currentItemIndex={currentItemIndex}\n results={results}\n setResults={setResults}\n currentModel={model}\n sorter={sorter}\n setSorter={setSorter}\n totalItems={totalItems}\n setTotalItems={setTotalItems}\n selectedRowItems={selectedRowItems}\n setSelectedRowItems={setSelectedRowItems}\n setSearchTreeNameSearch={setSearchTreeNameSearch}\n searchTreeNameSearch={searchTreeNameSearch}\n goToResourceId={goToResourceId}\n limit={limit}\n >\n {content()}\n <GoToResourceModal\n visible={gtResourceModalVisible}\n onIdSubmitted={goToResourceId}\n isSearching={searchingForResourceId}\n onCancel={() => {\n setGtResourceModalVisible(false);\n }}\n />\n </ActionViewProvider>\n );\n}\n\nexport default forwardRef(ActionView);\n","import React from \"react\";\nimport { DashboardGridProps } from \"./DashboardGrid.types\";\nimport { WidthProvider, Responsive } from \"react-grid-layout\";\nimport \"react-resizable/css/styles.css\";\nimport \"react-grid-layout/css/styles.css\";\n\nconst ResponsiveReactGridLayout = WidthProvider(Responsive);\n\nexport const DashboardGrid = (props: DashboardGridProps) => {\n const { children = [], onPositionItemsChanged } = props;\n\n const items = React.Children.map(\n children,\n (\n child:\n | boolean\n | React.ReactChild\n | React.ReactFragment\n | React.ReactPortal,\n ) => {\n const { parms, id } = (child as any).props;\n return (\n <div key={id} data-grid={parms}>\n {child}\n </div>\n );\n },\n );\n\n return (\n <ResponsiveReactGridLayout\n className=\"layout\"\n cols={{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }}\n draggableHandle={\".draggable-head\"}\n rowHeight={30}\n onLayoutChange={(layout) => {\n onPositionItemsChanged?.(\n layout.map((item) => {\n return {\n id: parseInt(item.i.replace(\".$\", \"\"), 10),\n x: item.x,\n y: item.y,\n w: item.w,\n h: item.h,\n };\n }),\n );\n }}\n >\n {items}\n </ResponsiveReactGridLayout>\n );\n};\n","import { useEffect, useState, useRef, memo } from \"react\";\nimport { Alert, Spin } from \"antd\";\n\nimport { Tree } from \"@/widgets/views/Tree\";\nimport { FormView, TreeView } from \"@/types/index\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\nimport { getColorMap, getTree, sortResults } from \"@/helpers/treeHelper\";\nimport { mergeParams } from \"@/helpers/searchHelper\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype OnRowClickedData = {\n id: number;\n model: string;\n treeView: TreeView;\n};\n\ntype Props = {\n action?: string;\n model?: string;\n view_id?: number;\n onRowClicked: (data: OnRowClickedData) => void;\n domain?: any;\n visible?: boolean;\n parentContext?: any;\n};\n\nfunction DashboardTree(props: Props) {\n const {\n action,\n model,\n view_id,\n onRowClicked,\n domain = [],\n visible = true,\n parentContext = {},\n } = props;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [initialFetchDone, setInitialFetchDone] = useState<boolean>(false);\n\n const [currentModel, setCurrentModel] = useState<string>();\n const [treeView, setTreeView] = useState<TreeView>();\n const [formView, setFormView] = useState<FormView>();\n\n const [page, setPage] = useState<number>(1);\n const [offset, setOffset] = useState<number>(0);\n const limitRef = useRef<number>(DEFAULT_SEARCH_LIMIT);\n\n const paramsRef = useRef<any[]>([]);\n\n const [totalItems, setTotalItems] = useState<number>(0);\n const [results, setResults] = useState<any>([]);\n const [colorsForResults, setColorsForResults] = useState<any>(undefined);\n const [sorter, setSorter] = useState<any>();\n\n const [searchError, setSearchError] = useState<string>();\n const [initialError, setInitialError] = useState<string>();\n\n const [tableRefreshing, setTableRefreshing] = useState<boolean>(false);\n\n const actionDomain = useRef<any>([]);\n\n const onRequestPageChange = (page: number) => {\n setTableRefreshing(true);\n setPage(page);\n setOffset((page - 1) * limitRef.current!);\n };\n\n const searchResults = async () => {\n const domainParams =\n actionDomain.current.length > 0 ? actionDomain.current : domain;\n\n const searchParams = mergeParams(paramsRef.current, domainParams);\n const { colors } = getTree(treeView!);\n\n const { totalItems, results, attrsEvaluated } =\n await ConnectionProvider.getHandler().searchForTree({\n params: searchParams,\n limit: limitRef.current,\n offset,\n model: currentModel!,\n fields: treeView!.fields,\n context: parentContext,\n attrs: colors && { colors },\n });\n setColorsForResults(getColorMap(attrsEvaluated));\n\n const resultsSorted = sortResults({\n resultsToSort: results,\n sorter,\n fields: { ...treeView!.fields, ...formView!.fields },\n });\n setTableRefreshing(false);\n\n setResults(resultsSorted);\n const totalItemsResult = await totalItems;\n setTotalItems(totalItemsResult);\n };\n\n const fetchResults = async () => {\n try {\n setTableRefreshing(true);\n await searchResults();\n } catch (error) {\n setSearchError(JSON.stringify(error));\n }\n };\n\n useEffect(() => {\n if (!initialFetchDone) {\n return;\n }\n\n if (visible) {\n fetchResults();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [page, offset, initialFetchDone, visible]);\n\n const fetchData = async (type: \"action\" | \"model\") => {\n setInitialFetchDone(false);\n setIsLoading(true);\n setInitialError(undefined);\n\n try {\n if (type === \"action\") {\n await fetchActionData();\n } else {\n await fetchModelData();\n }\n setInitialFetchDone(true);\n } catch (error) {\n setInitialError(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const fetchActionData = async () => {\n const dataForAction =\n await ConnectionProvider.getHandler().getViewsForAction({\n action: action!,\n context: parentContext,\n });\n actionDomain.current = dataForAction.domain;\n setFormView(dataForAction.views.get(\"form\"));\n setTreeView(dataForAction.views.get(\"tree\"));\n setCurrentModel(dataForAction.model);\n limitRef.current = dataForAction.limit;\n };\n\n const fetchModelData = async () => {\n setCurrentModel(model);\n\n const _formView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"form\",\n context: parentContext,\n })) as FormView;\n setFormView(_formView as FormView);\n\n const _treeView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"tree\",\n id: view_id,\n context: parentContext,\n })) as TreeView;\n\n setTreeView(_treeView as TreeView);\n };\n\n useEffect(() => {\n if (action) {\n fetchData(\"action\");\n } else if (model) {\n fetchData(\"model\");\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [action, model]);\n\n const onRowClickedHandler = (record: any) => {\n const { id } = record;\n onRowClicked({\n id,\n model: currentModel!,\n treeView: treeView!,\n });\n };\n\n const content = () => {\n if (!treeView || !formView) {\n return null;\n }\n\n return (\n <div style={{ overflowY: \"scroll\" }}>\n {searchError && (\n <Alert className=\"mt-10\" message={searchError} type=\"error\" banner />\n )}\n <Tree\n showPagination={false}\n total={totalItems}\n limit={limitRef.current}\n page={page}\n treeView={treeView}\n results={results}\n onRequestPageChange={onRequestPageChange}\n loading={tableRefreshing}\n onRowClicked={onRowClickedHandler}\n colorsForResults={colorsForResults}\n sorter={sorter}\n onChangeSort={(newSorter) => {\n setSorter?.(newSorter);\n const sortedResults = sortResults({\n resultsToSort: results,\n sorter: newSorter,\n fields: { ...treeView.fields, ...formView.fields },\n });\n setResults(sortedResults);\n }}\n context={parentContext}\n />\n </div>\n );\n };\n\n if (initialError) {\n return (\n <Alert className=\"mt-10\" message={initialError} type=\"error\" banner />\n );\n }\n\n return isLoading ? <Spin style={{ padding: \"2rem\" }} /> : content();\n}\nexport default memo(DashboardTree);\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport React, { useEffect, useState } from \"react\";\nimport Form, { FormProps } from \"../Form\";\n\nexport const DashboardForm = (props: FormProps) => {\n const { model } = props;\n const [firstId, setFirstId] = useState<number>();\n\n useEffect(() => {\n fetchData();\n }, [model]);\n\n async function fetchData() {\n const results: any[] = (await ConnectionProvider.getHandler().search({\n params: [],\n model,\n limit: 1,\n })) as any;\n\n if (results.length > 0) {\n setFirstId(results[0].id);\n }\n }\n\n return (\n <div style={{ padding: \"0.5rem\", overflowY: \"scroll\" }}>\n <Form {...props} model={model} id={firstId} readOnly />\n </div>\n );\n};\n","import React, {\n forwardRef,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport ActionView from \"@/views/ActionView\";\nimport { fetchAction } from \"./dashboardHelper\";\nimport \"react-resizable/css/styles.css\";\nimport \"react-grid-layout/css/styles.css\";\nimport { Graph } from \"../Graph/Graph\";\nimport { DashboardGrid } from \"../DashboardGrid\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { DashboardProps, FormView } from \"@/types\";\nimport { ErpFeatureKeys, GraphCard, One2manyItem } from \"@/index\";\nimport { readObjectValues } from \"@/helpers/one2manyHelper\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\nimport { Alert } from \"antd\";\nimport {\n DashboardActionContext,\n DashboardActionContextType,\n} from \"@/context/DashboardActionContext\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport DashboardTree from \"./DashboardTree\";\nimport { DashboardForm } from \"./DashboardForm\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { GraphServer } from \"../Graph/GraphServer\";\nimport { useFeatureIsEnabled } from \"@/context/ConfigContext\";\n\nconst itemsField = \"line_ids\";\n\nfunction Dashboard(props: DashboardProps, ref: any) {\n const { model, context = {}, id, configAction } = props;\n const [dashboardItems, setDashboardItems] = useState<any[]>([]);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const {\n setIsLoading: setActionBarLoading,\n openAction,\n moveItemsEnabled,\n } = useContext(DashboardActionContext) as DashboardActionContextType;\n\n const itemsFields = useRef<any>();\n const boardFields = useRef<any>();\n const [getView] = useNetworkRequest(ConnectionProvider.getHandler().getView);\n const [readObjects] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n const [update] = useNetworkRequest(ConnectionProvider.getHandler().update);\n const readForViewEnabled = useFeatureIsEnabled(\n ErpFeatureKeys.FEATURE_READFORVIEW,\n );\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model, id, context]);\n\n useImperativeHandle(ref, () => ({\n refresh: () => {\n fetchData();\n },\n configDashboard: openConfigDashboard,\n }));\n\n async function fetchData() {\n setIsLoading(true);\n setActionBarLoading(true);\n setError(undefined);\n\n try {\n const view: FormView = (await fetchView()) as FormView;\n const values = await fetchValues(view);\n const model = view.fields[itemsField].relation;\n const items: One2manyItem[] = values[itemsField].items;\n boardFields.current = view.fields;\n\n const originalItems: One2manyItem[] = await fetchDashboardItems({\n items,\n model,\n context,\n });\n\n const itemsWithActions = await getItemsWithActions(originalItems);\n setError(undefined);\n setDashboardItems(itemsWithActions);\n setIsLoading(false);\n setActionBarLoading(false);\n } catch (err) {\n setError(JSON.stringify(err));\n }\n }\n\n async function fetchView() {\n return await getView({\n model,\n type: \"form\",\n context,\n });\n }\n\n async function fetchDashboardItems({\n items,\n model,\n context,\n }: {\n items: One2manyItem[];\n model: string;\n context: any;\n }) {\n itemsFields.current = (\n (await getView({\n model,\n type: \"form\",\n context,\n })) as FormView\n ).fields;\n\n const [results] = await readObjectValues({\n treeView: {\n fields: itemsFields.current,\n },\n formView: {\n fields: itemsFields.current,\n },\n model,\n items,\n context,\n currentView: \"form\",\n });\n return results;\n }\n\n async function fetchValues(view: FormView) {\n return (\n await readObjects({\n model,\n ids: [id],\n fields: view.fields,\n context,\n })\n )[0];\n }\n\n async function getItemsWithActions(items: One2manyItem[]) {\n const fetchPromises: Array<Promise<any>> = [];\n\n for (const dashboardItem of items) {\n const { values } = dashboardItem;\n if (values.action_id && values.action_id.length > 0) {\n const actionId = parseInt(values.action_id[0], 10);\n const promise = fetchAction({\n actionId,\n rootContext: context,\n }).then((actionData) => {\n return { ...dashboardItem, actionData };\n });\n fetchPromises.push(promise);\n }\n }\n\n const itemsWithActions = await Promise.all(fetchPromises);\n return itemsWithActions;\n }\n\n async function onPositionItemsChanged(itemPositions: any[]) {\n if (!moveItemsEnabled) {\n return;\n }\n\n const differences = itemPositions.filter((itemPosition) => {\n const dashboardItem = dashboardItems.find(\n (dashboardItem) => dashboardItem.id === itemPosition.id,\n );\n if (!dashboardItem) {\n return false;\n }\n\n if (!dashboardItem.position) {\n return true;\n }\n\n const remotePosition = {\n ...JSON.parse(dashboardItem.position.replace(/'/g, '\"')),\n id: dashboardItem.id,\n };\n\n return JSON.stringify(itemPosition) !== JSON.stringify(remotePosition);\n });\n\n if (differences.length === 0) {\n return;\n }\n\n const itemsToUpdate = dashboardItems.filter((dashboardItem) => {\n return differences.map((diff) => diff.id).includes(dashboardItem.id);\n });\n\n const itemsToUpdateWithUpdatedPos = itemsToUpdate.map((dashboardItem) => {\n const diffItem = {\n ...differences.find((diffItem) => diffItem.id === dashboardItem.id),\n };\n delete diffItem.id;\n\n const item = { ...dashboardItem };\n delete item.actionData;\n\n return {\n ...dashboardItem,\n operation: \"pendingUpdate\",\n values: {\n ...dashboardItem.values,\n position: JSON.stringify(diffItem).replace(/\"/g, \"'\"),\n },\n };\n });\n\n const valueToUpdate = {\n fields: itemsFields.current,\n items: itemsToUpdateWithUpdatedPos,\n };\n\n await update({\n model,\n id,\n values: { [itemsField]: valueToUpdate },\n fields: boardFields.current,\n context,\n });\n }\n\n async function openConfigDashboard() {\n openAction(configAction);\n }\n\n if (isLoading) {\n return <LoadingOutlined />;\n }\n\n if (error) {\n return (\n <Alert className=\"mt-10 mb-20\" message={error} type=\"error\" banner />\n );\n }\n\n return (\n <DashboardGrid onPositionItemsChanged={onPositionItemsChanged}>\n {dashboardItems.map((item, idx) => {\n const { actionData, values } = item;\n const { position, id } = values;\n\n const {\n actionId,\n actionType,\n key,\n title,\n views,\n model,\n context,\n domain,\n initialView,\n limit,\n } = actionData as any;\n\n let parmsParsed = {};\n\n try {\n parmsParsed = JSON.parse(position.replace(/'/g, '\"'));\n } catch (err) {\n // console.error(`Error parsing parms: ${action.position}`);\n parmsParsed = { x: idx * 2, y: 0, w: 2, h: 3 };\n }\n\n let childContent = null;\n\n if (initialView?.type === \"graph\") {\n const mustUseServerGraphs =\n values.server_action === true && readForViewEnabled;\n const GraphComponent = mustUseServerGraphs ? GraphServer : Graph;\n\n childContent = (\n <GraphComponent\n key={id}\n view_id={\n views.filter(\n (view: [number, string]) => view[1] === \"graph\",\n )[0][0]\n }\n model={model}\n context={context}\n domain={domain}\n limit={limit}\n />\n );\n } else if (initialView?.type === \"form\") {\n childContent = (\n <DashboardForm key={id} model={model} actionDomain={domain} />\n );\n } else if (initialView?.type === \"tree\") {\n childContent = (\n <DashboardTree\n key={id}\n model={model}\n domain={domain}\n view_id={\n views.filter(\n (view: [number, string]) => view[1] === \"tree\",\n )[0][0]\n }\n onRowClicked={(record) => {\n const formView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"form\";\n });\n if (formView) {\n const [id, type] = formView;\n const {\n actionId: action_id,\n actionType: action_type,\n title: name,\n model: res_model,\n } = actionData;\n\n const action: ShortcutApi = {\n action_id,\n action_type,\n name,\n res_id: record.id,\n res_model,\n view_id: id,\n view_type: type,\n };\n openAction(action);\n }\n }}\n />\n );\n } else if (initialView !== undefined) {\n const formattedInitialView =\n initialView && Array.isArray(initialView.id)\n ? { ...initialView, id: initialView.id[0] }\n : initialView;\n childContent = (\n <ActionView\n key={id}\n action_id={actionId}\n action_type={actionType}\n tabKey={key}\n title={title}\n views={views}\n model={model}\n context={context}\n domain={domain}\n setCanWeClose={() => {}}\n initialView={formattedInitialView}\n limit={limit}\n />\n );\n }\n\n let action: ShortcutApi;\n const treeView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"tree\";\n });\n if (treeView) {\n const [id, type] = treeView;\n const {\n actionId: action_id,\n actionType: action_type,\n title: name,\n model: res_model,\n } = actionData;\n\n action = {\n action_id,\n action_type,\n name,\n res_id: false,\n res_model,\n view_id: id,\n view_type: type,\n overrideUnsettedLimit: true,\n };\n }\n\n return (\n <GraphCard\n key={`griditem-${id}`}\n id={id}\n title={title}\n parms={parmsParsed}\n action={action!}\n openAction={openAction}\n >\n {childContent}\n </GraphCard>\n );\n })}\n </DashboardGrid>\n );\n}\n\nexport default forwardRef(Dashboard);\n","import React, { useContext, useState } from \"react\";\nimport { MultiCheckbox as MultiCheckboxOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { One2manyItem, One2manyValue } from \"../base/one2many/One2manyInput\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { Alert, Checkbox, Spin, Col, Row, Button, Space } from \"antd\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\n\ntype MultiCheckboxProps = {\n ooui: MultiCheckboxOoui;\n};\n\ntype MultiCheckboxInputProps = MultiCheckboxProps & {\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n};\n\nexport const MultiCheckbox = (props: MultiCheckboxProps) => {\n const { ooui } = props;\n\n return (\n <Field type={\"array\"} {...props}>\n <MultiCheckboxInput ooui={ooui} />\n </Field>\n );\n};\n\nexport const MultiCheckboxInput = (props: MultiCheckboxInputProps) => {\n const { value, ooui, onChange } = props;\n const { items = [] } = value || {};\n const itemsToShow = items\n .filter((item) => item.operation !== \"pendingRemove\")\n .map((item) => item.id) as number[];\n\n const [options, setOptions] = useState<any[]>([]);\n const [error, setError] = useState<string>();\n const [isLoadingOptions, setIsLoadingOptions] = useState<boolean>(false);\n const { relation, context, readOnly, field, columns } = ooui;\n\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchOptions();\n }, [items]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n items: changedValue,\n });\n };\n\n async function fetchOptions() {\n setIsLoadingOptions(true);\n let params: any = [];\n if (ooui.domain) {\n const evaluatedDomain = await ConnectionProvider.getHandler().evalDomain({\n domain: ooui.domain,\n values: transformPlainMany2Ones({\n fields: formContext?.getFields(),\n values: formContext.getPlainValues(),\n }),\n fields: formContext?.getFields(),\n context: formContext.getContext(),\n });\n params = [...params, ...evaluatedDomain];\n }\n try {\n const optionsRead = await ConnectionProvider.getHandler().search({\n model: relation,\n params,\n fieldsToRetrieve: [field],\n context: { ...getContext?.(), ...context },\n });\n const options = optionsRead.map((item: any) => {\n const value = item[field];\n let formattedValue = value;\n if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n return { label: formattedValue, value: item.id };\n });\n setOptions(options);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoadingOptions(false);\n }\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n }\n\n const checkAll = () => {\n onChangeSelected(options.map((option) => option.value));\n };\n\n const uncheckAll = () => {\n onChangeSelected([]);\n };\n\n const onChangeSelected = (ids: any[]) => {\n const newItems: One2manyItem[] = items.map((item) => {\n if (ids.includes(item.id as number)) {\n if (item.operation == \"pendingRemove\") {\n return {\n ...item,\n operation: \"original\",\n };\n } else {\n return item;\n }\n } else {\n return { id: item.id, operation: \"pendingRemove\" };\n }\n });\n const currentIds = newItems.map((item) => item.id);\n ids\n .filter((id) => !currentIds.includes(id))\n .map((id) => {\n newItems.push({ id, operation: \"pendingLink\" });\n });\n triggerChange(newItems);\n };\n\n if (isLoadingOptions && options.length === 0) {\n return <Spin />;\n }\n\n return (\n <>\n <div className=\"flex flex-row\">\n <Checkbox.Group\n value={options.length ? itemsToShow : []}\n disabled={readOnly}\n onChange={onChangeSelected}\n style={{ width: \"100%\" }}\n >\n <Row>\n {options.map((option) => (\n <Col span={Math.floor(24 / columns)}>\n <Checkbox value={option.value}>{option.label}</Checkbox>\n </Col>\n ))}\n </Row>\n </Checkbox.Group>\n {!readOnly && (\n <Space>\n <Button\n onClick={checkAll}\n disabled={itemsToShow.length == options.length}\n >\n Check all\n </Button>\n <Button onClick={uncheckAll} disabled={itemsToShow.length === 0}>\n Uncheck all\n </Button>\n </Space>\n )}\n </div>\n </>\n );\n};\n","import Field from \"@/common/Field\";\nimport ReactMarkdown from \"react-markdown\";\nimport React from \"react\";\nimport { WidgetProps } from \"@/types\";\nimport remarkGfm from \"remark-gfm\";\n\nexport const Markdown = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <MarkdownInput {...props} />\n </Field>\n );\n};\n\nexport const MarkdownInput = (props: any) => {\n const { value, ooui } = props;\n return (\n <div\n style={{\n height: ooui?.height ? ooui.height + \"px\" : \"100%\",\n overflow: \"auto\",\n }}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n className=\"markdown-typography\"\n >\n {value}\n </ReactMarkdown>\n </div>\n );\n};\n","import React from \"react\";\nimport { Radio as RadioAnt, Space } from \"antd\";\n\nimport Field from \"@/common/Field\";\nimport { Radio as RadioOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nexport const Radio = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <SelectionInput {...props} />\n </Field>\n );\n};\n\ntype RadioInputProps = WidgetProps & {\n onChange?: (value: any) => void;\n value?: string;\n};\n\nexport const SelectionInput = (props: RadioInputProps) => {\n const { ooui, onChange, value } = props;\n const { selectionValues, readOnly, direction } = ooui as RadioOoui;\n\n const values = Array.from(selectionValues.entries());\n\n const options =\n values &&\n values.length &&\n values.map((entry: string[]) => {\n const [key, value] = entry;\n return (\n <RadioAnt key={key} value={key}>\n {value}\n </RadioAnt>\n );\n });\n\n return (\n <RadioAnt.Group disabled={readOnly} onChange={onChange} value={value}>\n <Space direction={direction}>{options}</Space>\n </RadioAnt.Group>\n );\n};\n","import React from \"react\";\nimport { Switch as AntdSwitch } from \"antd\";\n\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\nexport const Switch = (props: WidgetProps) => {\n const { ooui } = props;\n const { id, readOnly, required } = ooui;\n\n return (\n <Field {...props} valuePropName=\"checked\">\n <SwitchInput id={id} readOnly={readOnly} required={required} />\n </Field>\n );\n};\n\nconst SwitchInput = (props: any) => {\n const { required, readOnly, ...restProps } = props;\n\n return (\n <div className=\"flex flex-row\">\n <AntdSwitch disabled={readOnly} {...restProps} />\n </div>\n );\n};\n","import React, { useContext } from \"react\";\nimport { Steps as AntdSteps } from \"antd\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport Field from \"@/common/Field\";\nimport { Steps as StepsOoui } from \"@gisce/ooui\";\n\ntype StepsProps = {\n ooui: StepsOoui;\n value: any;\n};\n\ntype StatusType = \"wait\" | \"process\" | \"finish\" | \"error\";\n\nexport const Steps = (props: StepsProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <StepsInput {...props} />\n </Field>\n );\n};\n\ntype StepsInputProps = StepsProps & {\n value?: any;\n};\n\nexport const StepsInput = (props: StepsInputProps) => {\n const { ooui, value } = props;\n const { selectionValues, errorField } = ooui as StepsOoui;\n const formContext = useContext(FormContext) as FormContextType;\n\n const values = Array.from(selectionValues.entries());\n const current = values.map((val) => val[0]).indexOf(value);\n let status: StatusType = \"process\";\n let error = \"\";\n\n if (errorField) {\n error = formContext.getFieldValue(errorField);\n if (error) {\n status = \"error\";\n }\n }\n\n return (\n <AntdSteps current={current} status={status}>\n {values.map((val, idx) => (\n <AntdSteps.Step\n title={val[1]}\n description={idx === current && status === \"error\" ? error : null}\n />\n ))}\n </AntdSteps>\n );\n};\n","import { useContext } from \"react\";\nimport Editor from \"@monaco-editor/react\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { CodeEditor as CodeEditorOoui } from \"@gisce/ooui\";\n\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\ntype CodeEditorProps = WidgetProps & {\n ooui: CodeEditorOoui;\n};\n\nexport const CodeEditor = (props: CodeEditorProps) => {\n const { ooui } = props;\n const { lang, height, readOnly } = ooui;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n const onMount = (editor: any) => {\n editor.onDidBlurEditorWidget(elementHasLostFocus);\n };\n\n return (\n <Field {...props}>\n <Editor\n options={{\n readOnly,\n }}\n defaultLanguage={lang || \"\"}\n height={height || 300}\n onMount={onMount}\n />\n </Field>\n );\n};\n","import { Fragment, useContext } from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport {\n Card,\n Space,\n Typography,\n Avatar,\n Tag,\n Timeline,\n TimelineItemProps,\n} from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nimport dayjs from \"@/helpers/dayjs\";\nimport md5 from \"md5\";\n\nconst { Meta } = Card;\nconst { Text } = Typography;\n\ntype GravatarProps = {\n email: string;\n size?: number;\n theme: string;\n};\n\ntype CommentDataType = {\n id: number;\n isSender: boolean;\n isAuthor: boolean;\n text: string;\n email: string;\n date: string;\n author: string;\n};\n\ntype CommentProps = {\n data: CommentDataType;\n style?: any;\n};\n\ntype CommentsTypeProps = {\n data: CommentDataType[];\n};\n\ntype CommentsTimelineProps = {\n value?: EventsType[];\n};\n\ntype EventActionType = {\n date: string;\n action: string;\n};\n\nexport type EventsType = {\n type: \"action\" | \"comment\";\n event: EventActionType | CommentDataType;\n};\n\nconst Gravatar = ({ email, size = 40, theme = \"\" }: GravatarProps) => {\n // Genera el enlace de Gravatar utilizando el email\n const gravatarUrl = `https://www.gravatar.com/avatar/${md5(\n email,\n )}?s=${size}&d=${theme}`;\n\n return <Avatar src={gravatarUrl} size={size} />;\n};\n\nfunction TextWithNewlines({ text }: { text: string }) {\n const textParts = text.split(\"\\n\");\n\n return (\n <div>\n {textParts.map((part, index) => (\n <Fragment key={index}>\n {part}\n {index !== textParts.length - 1 && <br />}\n </Fragment>\n ))}\n </div>\n );\n}\n\nexport const Comment = (props: CommentProps) => {\n const { data, style } = props;\n const { t } = useLocale();\n return (\n <Card key={data.id} style={{ ...style, ...{ textAlign: \"start\" } }}>\n <Meta\n avatar={<Gravatar email={data.email} theme=\"mp\" />}\n title={data.author}\n description={\n <Space direction=\"horizontal\">\n <span title={data.date}>{dayjs(data.date).fromNow()}</span>\n {data.isAuthor && <Tag color=\"blue\">{t(\"author\")}</Tag>}\n </Space>\n }\n style={{ marginBottom: \"5px\" }}\n />\n <Text>\n <TextWithNewlines text={data.text} />\n </Text>\n </Card>\n );\n};\n\nexport const Comments = (props: CommentsTypeProps) => {\n const { data = [] } = props;\n const comments = data.map((c) => {\n const style = { float: c.isSender ? \"right\" : \"left\", width: \"60%\" };\n return <Comment data={c} style={style} />;\n });\n return (\n <div>\n <Space direction=\"vertical\" size=\"middle\" style={{ display: \"flex\" }}>\n {comments}\n </Space>\n </div>\n );\n};\n\nexport const CommentsTimeline = (props: CommentsTimelineProps) => {\n const { value } = props;\n const items = (value || []).map((i) => {\n if (i.type === \"action\") {\n return {\n children: `${i.event.date} - ${(i.event as EventActionType).action}`,\n };\n } else if (i.type === \"comment\") {\n return {\n color: \"gray\",\n position: (i.event as CommentDataType).isSender ? \"left\" : \"right\",\n label: i.event.date,\n children: <Comment data={i.event as CommentDataType} />,\n };\n }\n });\n return <Timeline mode=\"alternate\" items={items as TimelineItemProps[]} />;\n};\n\nexport const CommentsTimelineField = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <CommentsTimeline />\n </Field>\n );\n};\n","import React from \"react\";\nimport Field from \"@/common/Field\";\nimport { HTMLPreview as HTMLPreviewInput } from \"@gisce/react-formiga-components\";\nimport { WidgetProps } from \"@/types\";\n\nexport const HTMLPreview = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <HTMLPreviewInput />\n </Field>\n );\n};\n","import React from \"react\";\nimport { Alert as AntdAlert } from \"antd\";\nimport { WidgetProps } from \"@/types\";\nimport { Alert as AlertOoui } from \"@gisce/ooui\";\nimport { Interweave } from \"interweave\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\nexport const Alert = (props: WidgetProps) => {\n const { ooui } = props;\n const { title, text, alertType, icon } = ooui as AlertOoui;\n\n function getIcon(icon: string | null): React.JSX.Element | undefined {\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <AntdAlert\n message={<Interweave content={title} />}\n description={<Interweave content={text} />}\n type={alertType}\n showIcon\n icon={getIcon(icon)}\n />\n );\n};\n","import React, { useContext } from \"react\";\nimport { Layout, Typography } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nconst { Content } = Layout;\nconst { Title } = Typography;\n\nfunction Welcome(): React.ReactElement {\n const { t } = useLocale();\n\n return (\n <Content className=\"m-5 select-none\">\n <Title level={5}>{t(\"welcome\")}</Title>\n </Content>\n );\n}\n\nexport default Welcome;\n","import {\n useState,\n forwardRef,\n useImperativeHandle,\n useRef,\n ReactNode,\n} from \"react\";\nimport { ConnectionProvider, ContentRootProvider, FormView } from \"..\";\nimport Welcome from \"./Welcome\";\nimport TabManagerProvider from \"@/context/TabManagerContext\";\nimport ActionView from \"./ActionView\";\nimport { parseContext } from \"@gisce/ooui\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { InitialViewData, ViewType } from \"@/types\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\nimport { nanoid } from \"nanoid\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { useConfigContext } from \"@/context/ConfigContext\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype RootViewProps = {\n children: ReactNode;\n};\n\nexport type ActionInfo = {\n id: number;\n type: string;\n};\n\nfunction RootView(props: RootViewProps, ref: any) {\n const { children } = props;\n const [activeKey, setActiveKey] = useState<string>(\"welcome\");\n const { t } = useLocale();\n const { globalValues, rootContext } = useConfigContext();\n\n const [tabs, setTabs] = useState<any>([\n {\n title: t(\"welcome\"),\n key: \"welcome\",\n closable: true,\n content: <Welcome />,\n },\n ]);\n const tabViewsCloseFunctions = useRef(new Map<string, any>());\n const contentRootProvider = useRef();\n\n useImperativeHandle(ref, () => ({\n retrieveAndOpenAction,\n openShortcut,\n }));\n\n function remove(key: string) {\n if (key === activeKey) {\n const currentIndex = tabs.findIndex((tab: any) => tab.key === key);\n\n if (tabs[currentIndex - 1]) {\n setActiveKey(tabs[currentIndex - 1].key);\n }\n if (tabs[currentIndex + 1]) {\n setActiveKey(tabs[currentIndex + 1].key);\n }\n }\n\n setTabs(tabs.filter((tab: any) => tab.key !== key));\n tabViewsCloseFunctions.current.delete(key);\n }\n\n function registerViewCloseFn({\n tabKey,\n canWeClose,\n }: {\n tabKey: string;\n canWeClose: any;\n }) {\n tabViewsCloseFunctions.current.set(tabKey, canWeClose);\n }\n\n async function retrieveAndOpenAction({\n action,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain = [],\n }: {\n action: string;\n values?: any;\n forced_values?: any;\n initialViewType?: ViewType;\n res_id?: number;\n domain?: any;\n }) {\n const dataForAction = await ConnectionProvider.getHandler().getActionData({\n action,\n context: rootContext,\n });\n\n if (dataForAction.type === \"ir.actions.wizard\") {\n showErrorDialog(\"Action type not supported\");\n return;\n }\n\n const [action_type, action_id_string] = action.split(\",\");\n const action_id = parseInt(action_id_string);\n\n const parsedContext = parseContext({\n context: dataForAction.context,\n values: globalValues,\n fields: {},\n });\n\n const parsedDomain = dataForAction.domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain: dataForAction.domain,\n values: globalValues,\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n const {\n res_model: model,\n views,\n name: title,\n target,\n view_type,\n limit,\n } = dataForAction;\n\n const treeExpandable = view_type === \"tree\";\n\n const finalViews = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n\n if (!id) {\n if (viewType === \"dashboard\") {\n finalViews.push([undefined, \"dashboard\"]);\n } else {\n const { view_id } = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context: { ...rootContext, ...parsedContext },\n });\n finalViews.push([view_id, viewType]);\n }\n } else {\n finalViews.push(viewArray);\n }\n }\n\n let initialView;\n\n if (initialViewType) {\n const [id, type] = finalViews.find(\n ([_, type]) => type === initialViewType,\n );\n initialView = { id, type };\n } else {\n const [id, type] = finalViews[0];\n initialView = { id, type };\n }\n\n openAction({\n domain: [...parsedDomain, ...domain],\n context: { ...rootContext, ...parsedContext },\n model,\n views: finalViews,\n title,\n target,\n initialView,\n action_type,\n action_id,\n values,\n forced_values,\n res_id,\n treeExpandable,\n limit,\n });\n }\n\n function addNewTab({\n title,\n content,\n key,\n action,\n }: {\n title: string;\n content: any;\n key: string;\n action?: ActionInfo;\n }) {\n let newTabs = [...tabs];\n\n if (tabs.length === 1 && tabs[0].key === \"welcome\") {\n newTabs = [...tabs.filter((tab: any) => tab.key !== \"welcome\")];\n }\n\n setTabs([\n ...newTabs,\n {\n title,\n key,\n closable: true,\n content,\n action,\n },\n ]);\n\n setActiveKey(key);\n }\n\n async function openRelate({\n relateData,\n fields,\n values,\n action_id,\n action_type,\n }: {\n relateData: any;\n fields: any;\n values: any;\n action_id: number;\n action_type: string;\n }) {\n const {\n res_model: model,\n context,\n domain,\n views,\n target,\n string: title,\n limit,\n } = relateData;\n\n const [id, type] = views[0];\n const initialView = { id, type };\n\n const parsedContext = parseContext({\n context,\n values: { ...values, ...globalValues },\n fields,\n });\n\n const parsedDomain = domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain,\n values: transformPlainMany2Ones({\n fields,\n values: { ...values, ...globalValues },\n }),\n fields,\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n openAction({\n model,\n target,\n views,\n context: { ...rootContext, ...parsedContext },\n domain: parsedDomain,\n title,\n initialView,\n action_id,\n action_type,\n limit,\n });\n }\n\n async function openShortcut(shortcut: ShortcutApi) {\n const {\n action_id,\n action_type,\n res_id,\n view_id,\n overrideUnsettedLimit = false,\n values = {},\n } = shortcut;\n const action = `${action_type},${action_id}`;\n\n const dataForAction = await ConnectionProvider.getHandler().getActionData({\n action,\n context: rootContext,\n });\n const parsedContext = parseContext({\n context: dataForAction.context,\n values: { ...globalValues, ...values },\n fields: {},\n });\n\n const parsedDomain = dataForAction.domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain: dataForAction.domain,\n values: { ...globalValues, ...values },\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n const {\n res_model: model,\n views,\n name: title,\n target,\n view_type,\n limit,\n } = dataForAction;\n const treeExpandable = view_type === \"tree\";\n\n const finalViews = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n\n if (!id) {\n if (viewType === \"dashboard\") {\n finalViews.push([undefined, \"dashboard\"]);\n } else {\n const { view_id } = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context: { ...rootContext, ...parsedContext },\n });\n finalViews.push([view_id, viewType]);\n }\n } else {\n finalViews.push(viewArray);\n }\n }\n\n let id, type;\n if (view_id === undefined || view_id === null) {\n const view = finalViews.find((view: any[]) => {\n return view[0] === undefined;\n });\n id = undefined;\n type = view[1];\n } else {\n [id, type] = finalViews.find((view: any[]) => {\n if (view[0] === undefined) {\n return false;\n }\n return view[0] === view_id;\n });\n }\n\n const initialView = { id, type };\n\n openAction({\n domain: parsedDomain,\n context: { ...rootContext, ...parsedContext },\n model,\n views: finalViews,\n title,\n target,\n initialView,\n action_id,\n action_type,\n res_id,\n treeExpandable,\n limit:\n overrideUnsettedLimit && (limit === 0 || limit === false)\n ? DEFAULT_SEARCH_LIMIT\n : limit,\n });\n }\n\n async function openDefaultActionForModel({\n model,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain,\n }: {\n model: string;\n values?: any;\n forced_values?: any;\n initialViewType?: ViewType;\n res_id?: number;\n domain?: any;\n }) {\n const actionString =\n await ConnectionProvider.getHandler().getActionStringForModel(model);\n await retrieveAndOpenAction({\n action: actionString,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain,\n });\n }\n\n async function openAction({\n domain,\n context,\n model,\n views,\n title,\n target,\n initialView,\n action_id,\n action_type,\n res_id,\n values,\n forced_values,\n treeExpandable = false,\n limit,\n }: {\n domain: any;\n context: any;\n model: string;\n views: any[];\n title: string;\n target: string;\n initialView: InitialViewData;\n action_id: number;\n action_type: string;\n res_id?: number | boolean;\n values?: any;\n forced_values?: any;\n treeExpandable?: boolean;\n limit?: number;\n }) {\n const key = nanoid();\n\n if (target !== \"current\") {\n const formView = (await ConnectionProvider.getHandler().getView({\n model,\n type: \"form\",\n id: initialView.type === \"form\" ? initialView.id : undefined,\n context: { ...rootContext, ...context },\n })) as FormView;\n\n (contentRootProvider.current as any).openActionModal({\n domain,\n model,\n formView,\n context: { ...rootContext, ...context },\n actionData: {\n action_id,\n action_type,\n res_id,\n view_id: formView.view_id,\n },\n });\n } else {\n const formattedInitialView =\n initialView && Array.isArray(initialView.id)\n ? { ...initialView, id: initialView.id[0] }\n : initialView;\n\n addNewTab({\n title,\n action: {\n id: action_id,\n type: action_type,\n },\n content: (\n <ActionView\n action_id={action_id}\n action_type={action_type}\n tabKey={key}\n title={title}\n views={views}\n model={model}\n context={{ ...rootContext, ...context }}\n domain={domain}\n setCanWeClose={registerViewCloseFn}\n initialView={formattedInitialView}\n res_id={res_id}\n formDefaultValues={values}\n formForcedValues={forced_values}\n treeExpandable={treeExpandable}\n limit={limit}\n />\n ),\n key,\n });\n }\n }\n\n return (\n <TabManagerProvider\n openShortcut={openShortcut}\n openAction={openAction}\n openRelate={openRelate}\n openDefaultActionForModel={openDefaultActionForModel}\n tabs={tabs}\n activeKey={activeKey}\n onRemoveTab={async (key: string) => {\n const canWeCloseFn = tabViewsCloseFunctions.current.get(key as string);\n const canWeClose = await canWeCloseFn?.();\n\n if (canWeClose || activeKey === \"welcome\") {\n remove(key as string);\n }\n }}\n onChangeTab={(key: string) => {\n setActiveKey(key);\n }}\n >\n <ContentRootProvider\n ref={contentRootProvider}\n globalValues={globalValues}\n >\n {children}\n </ContentRootProvider>\n </TabManagerProvider>\n );\n}\n\nexport default forwardRef(RootView);\n","import React from \"react\";\nimport { CloseOutlined } from \"@ant-design/icons\";\nimport { theme } from \"antd\";\nconst { useToken } = theme;\n\ntype TabProps = {\n tabKey: string;\n label: string;\n onClose: (key: string) => void;\n isActive: boolean;\n onSelected: (key: string) => void;\n};\n\nfunction Tab(props: TabProps) {\n const { label, onClose, tabKey, isActive, onSelected } = props;\n const { token } = useToken();\n const bgColor = isActive ? token.colorBgContainer : token.colorPrimaryBg;\n\n return (\n <div\n onClick={() => {\n !isActive && onSelected(tabKey);\n }}\n style={{\n cursor: \"pointer\",\n height: 40,\n paddingTop: 7,\n paddingBottom: 5,\n paddingLeft: 10,\n paddingRight: 10,\n backgroundColor: bgColor,\n display: \"inline-flex\",\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderTopLeftRadius: token.borderRadius,\n borderTopRightRadius: token.borderRadius,\n marginLeft: 2,\n }}\n >\n <div\n style={{\n color: token.colorPrimaryActive,\n userSelect: \"none\",\n height: 40,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n paddingLeft: 5,\n paddingRight: 5,\n marginBottom: 2,\n fontWeight: isActive ? 500 : \"normal\",\n }}\n >\n {label}\n </div>\n <div\n style={{\n paddingLeft: 5,\n height: 40,\n\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <CloseOutlined\n style={{\n color: token.colorPrimaryActive,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onClose(tabKey);\n }}\n />\n </div>\n </div>\n );\n}\n\nexport default Tab;\n","import React, { useContext, useState } from \"react\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport Tab from \"./tabs/Tab\";\n\nfunction TabSelector() {\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { activeKey, tabs, onRemoveTab, onChangeTab } = tabManagerContext || {};\n\n return (\n <>\n {tabs.map((tab: any) => (\n <Tab\n key={tab.key}\n tabKey={tab.key}\n label={tab.title}\n onClose={onRemoveTab}\n isActive={activeKey === tab.key}\n onSelected={onChangeTab}\n />\n ))}\n </>\n );\n}\n\nexport default TabSelector;\n","import React, { useContext } from \"react\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\n\ntype Props = {\n tab: any;\n};\n\nfunction TabContent(props: Props) {\n const { tab } = props;\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { activeKey } = tabManagerContext || {};\n\n const hiddenStyle: any = {\n display: \"none\",\n };\n\n return (\n <div style={tab.key !== activeKey ? hiddenStyle : undefined}>\n {tab.content}\n </div>\n );\n}\n\nexport default React.memo(TabContent, () => true);\n","import React, { useContext } from \"react\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport TabContent from \"./TabContent\";\n\nfunction CurrentTabContent() {\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { tabs } = tabManagerContext || {};\n\n const tabsToRender =\n tabs?.map((tab) => <TabContent key={tab.key} tab={tab} />) || null;\n\n return <>{tabsToRender}</>;\n}\n\nexport default CurrentTabContent;\n","import {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { TableOutlined, FormOutlined, EditOutlined } from \"@ant-design/icons\";\nimport { Tooltip, theme } from \"antd\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport {\n useLocale,\n FavouriteButton as FavouriteButtonUi,\n FavouriteButtonRef,\n DropdownMenuGroup,\n DropdownMenuItem,\n} from \"@gisce/react-formiga-components\";\nconst { useToken } = theme;\n\nexport type ShortcutApi = {\n action_id: number;\n action_type: string;\n id?: number;\n name: string;\n res_id: number | boolean;\n res_model: string;\n view_id: number;\n view_type: string;\n overrideUnsettedLimit?: boolean;\n values?: any;\n};\n\nexport type FavouriteOptions = {\n action_id: number;\n action_type: string;\n res_id: number | boolean;\n view_id: number;\n};\n\ntype Props = {\n onRetrieveShortcuts: () => Promise<ShortcutApi[]>;\n onCheckIsFavourite: (options: FavouriteOptions) => Promise<number | boolean>;\n onAddFavourite: (options: FavouriteOptions) => Promise<number>;\n onRemoveFavourite: (shortcut_id: number) => Promise<void>;\n onDropdownClosed?: () => void;\n};\n\nconst FavouriteButton = (props: Props) => {\n const {\n onRetrieveShortcuts,\n onCheckIsFavourite,\n onAddFavourite,\n onRemoveFavourite,\n onDropdownClosed,\n } = props;\n\n const [isFavourite, setIsFavourite] = useState(false);\n const [currentShortcutId, setCurrentShortcutId] = useState<number>();\n const { t } = useLocale();\n\n const { token } = useToken();\n const favouriteButtonRef = useRef<FavouriteButtonRef>(null);\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const {\n openShortcut,\n tabs,\n activeKey,\n currentView,\n currentId,\n openDefaultActionForModel,\n } = tabManagerContext || {};\n\n const favouriteQuery = useMemo(() => {\n if (!currentView || !currentView.view_id || !(currentView as any).extra) {\n return;\n }\n\n const { action_id, action_type } = (currentView as any).extra || {};\n\n if (!action_id || !action_type) {\n setIsFavourite(false);\n return;\n }\n\n const view_id = currentView.view_id!;\n let res_id: boolean | number = false;\n\n if (currentView.type === \"form\") {\n res_id = currentId ? (currentId as number) : false;\n }\n\n return {\n action_id,\n action_type,\n view_id,\n res_id,\n };\n }, [currentId, currentView]);\n\n const favouriteQueryString = useMemo(() => {\n if (!favouriteQuery) {\n return;\n }\n return JSON.stringify(favouriteQuery);\n }, [favouriteQuery]);\n\n useEffect(() => {\n checkFavourite();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [favouriteQueryString]);\n\n function handleMenuClick(item: DropdownMenuItem) {\n const shortcut = item as ShortcutApi;\n if (shortcut?.action_type === \"ir.actions.wizard\") {\n return;\n }\n openShortcut(shortcut);\n }\n\n const checkFavourite = useCallback(async () => {\n if (!favouriteQuery) {\n return;\n }\n\n const result = await onCheckIsFavourite(favouriteQuery);\n\n if (result !== false) {\n setCurrentShortcutId(result as number);\n }\n\n setIsFavourite(result !== false);\n }, [favouriteQuery, onCheckIsFavourite]);\n\n async function editFavourites() {\n favouriteButtonRef?.current?.close();\n openDefaultActionForModel?.({ model: \"ir.ui.view_sc\" });\n }\n\n const getShortcuts = useCallback(async (): Promise<DropdownMenuGroup[]> => {\n const shortcuts = await onRetrieveShortcuts();\n\n if (shortcuts.length === 0) {\n return [\n {\n label: t?.(\"no_favorites\"),\n items: [],\n },\n ];\n }\n\n const items: DropdownMenuItem[] = shortcuts.map((shortcut) => {\n return {\n ...shortcut,\n id: shortcut.id,\n name: shortcut.name,\n icon:\n shortcut.view_type === \"tree\" ? <TableOutlined /> : <FormOutlined />,\n } as DropdownMenuItem;\n });\n\n return [\n {\n items,\n },\n ];\n }, [onRetrieveShortcuts, t]);\n\n const toggleFavourite = useCallback(async () => {\n if (isFavourite && currentShortcutId) {\n await onRemoveFavourite(currentShortcutId);\n } else {\n if (!currentView) {\n return;\n }\n\n const currentTab = tabs.find((t) => t.key === activeKey);\n const { id: action_id, type: action_type } = currentTab?.action || {};\n const view_id = currentView.view_id!;\n let res_id: boolean | number = false;\n\n if (!action_id || !action_type) {\n setIsFavourite(false);\n return;\n }\n\n if (currentView.type === \"form\") {\n res_id = currentId ? (currentId as number) : false;\n }\n\n await onAddFavourite({\n action_id,\n action_type,\n view_id,\n res_id,\n });\n }\n\n await getShortcuts();\n setIsFavourite(!isFavourite);\n }, [\n activeKey,\n currentId,\n currentShortcutId,\n currentView,\n getShortcuts,\n isFavourite,\n onAddFavourite,\n onRemoveFavourite,\n tabs,\n ]);\n\n return (\n <FavouriteButtonUi\n ref={favouriteButtonRef}\n isFavourite={isFavourite}\n onToggleFavourite={toggleFavourite}\n onItemClick={handleMenuClick}\n placement={\"bottomRight\"}\n header={\n <div style={{ width: 300, padding: 5, display: \"flex\" }}>\n <div style={{ paddingLeft: 15, color: \"#ccc\" }}>\n {t?.(\"favorites\").toUpperCase()}\n </div>\n <div style={{ flexGrow: 1, paddingLeft: 10 }}>\n <Tooltip title={t?.(\"edit_favorites\")}>\n <EditOutlined\n style={{ color: token.colorPrimary, cursor: \"pointer\" }}\n onClick={editFavourites}\n />\n </Tooltip>\n </div>\n </div>\n }\n onOpenChange={(open: boolean) => {\n if (!open) {\n onDropdownClosed?.();\n }\n }}\n onRetrieveData={getShortcuts}\n />\n );\n};\n\nexport default FavouriteButton;\n"],"names":["Text","Title","Typography","useToken","theme","alignClass","Label","props","ooui","align","responsiveBehaviour","label","tooltip","fieldForLabel","labelSize","labelType","labelText","labelAlgin","token","TextType","jsxs","jsx","Tooltip","QuestionCircleOutlined","Interweave","Field","children","layout","valuePropName","showLabel","alignLabel","required","type","validator","id","t","useLocale","rules","formItem","Form","labelWidget","LabelOoui","Row","Col","Fragment","confirm","Modal","showDialog","onOk","confirmMessage","okText","cancelText","ExclamationCircleOutlined","FormContext","React","FormProvider","activeId","activeModel","setFieldValue","getFieldValue","executeButtonAction","getContext","getValues","getPlainValues","domain","submitForm","fetchValues","formHasChanges","elementHasLostFocus","getFields","formView","iconMapping","iconMapper","key","getIconForKey","toCamelCase","word","w","IconCamelCase","antKey","AntIcons","tablerKey","TablerIcons","TablerIcon","_a","Icon","Button","activated","buttonType","icon","context","readOnly","formContext","useContext","isRunning","setIsRunning","useState","onClick_confirm","onClick","showConfirmDialog","getButtonIcon","LoadingOutlined","AntButton","ButtonGroup","defaultButton","secondaryButtons","caption","primary","FieldOoui","Dropdown","DownOutlined","Items","items","button","danger","Menu","MODAL_WIDTH_CONSTANT","getWindowDimensions","width","height","useWindowDimensions","windowDimensions","setWindowDimensions","useEffect","handleResize","_ConnectionProvider","handler","__publicField","ConnectionProvider","parseError","errorResponse","message","title","splitted","args","error","warning","err","WarningOutlined","TranslationModal","visible","onCloseModal","model","field","onSubmitSucceed","modalWidth","langs","setLangs","isLoading","setIsLoading","submitLoading","setSubmitLoading","valuesForLangs","setValuesForLangs","originalValuesForLangs","useRef","fetchData","getLangs","getValuesForLangs","showErrorDialog","item","retrievedValuesForLang","lang","retrievedValue","getInputsForLangs","i","TextArea","event","onSubmit","langCode","content","Spin","Divider","Space","CloseOutlined","CheckOutlined","ButtonWithTooltip","restProps","info","Char","isSearchField","isPassword","translatable","requiredStyle","input","Input","TranslatableChar","value","onChange","translationModalVisible","setTranslationModalVisible","showInfo","TranslationOutlined","defaultAlgorithm","defaultSeed","mapToken","Option","Select","Selection","SelectionInput","selectionValues","values","options","entry","RequiredSelect","option","styled","Boolean","BooleanInput","RequiredCheckbox","AntCheckbox","getFilesize","base64string","inKbs","getMimeType","mimeInfo","fileTypeFromBuffer","toBase64","file","resolve","reject","reader","e","openBase64InNewTab","data","mimeType","byteCharacters","byteNumbers","byteArray","fileURL","Image","ImageInput","inputFile","triggerChange","changedValue","downloadFile","fileType","linkSource","downloadLink","onChangeFile","b64","clearFile","FolderOpenOutlined","DownloadOutlined","ClearOutlined","FiberGrid","FiberGridInput","GridUi","newValue","getTree","treeView","xml","fields","tree","TreeOoui","canRenderValue","getTableColumns","components","column","component","render","a","b","aItem","bItem","_b","getTableItems","treeOoui","results","parsedItem","widget","Reference","Many2one","getColorMap","colorsValue","getItemsAttributes","getStatusMap","attributes","attribute","map","sortResults","resultsToSort","sorter","desc","order","sortFn","hasActualValues","obj","readObjectValues","currentView","operationsToRead","temporalItems","idsToFetch","fieldsToRetrieve","evaluatedColorsForTree","colors","filteredValues","result","resultFormValues","fetchedItemValues","itemValues","itemWithFetchedValues","getNextPendingId","negativeIds","convertToPlain2ManyValues","convertFrom2ManyRawValues","formattedValues","itemsId","itemId","filterDuplicateItems","ids","index","getValuesForFields","Timeline","relation","oouiViews","setError","views","setViews","useDeepCompareEffect","getViewData","Alert","TimelineInput","showFormModal","setShowFormModal","modalItem","setModalItem","summaryField","titleField","itemsToShow","itemsWithValues","AntTimeline","searchItem","FormModal","ca_ES","en_US","es_ES","strings","defaultConfigContext","ConfigContext","useConfigContext","useFeatureIsEnabled","featureKey","erpFeatures","ConfigContextProvider","memo","locale","localizedStrings","globalValues","rootContext","devMode","providerValue","useMemo","FormigaConfigProvider","mergeStrings","fetchAction","actionId","actionType","action","dataForAction","parsedContext","parseContext","parsedDomain","limit","view_type","treeExpandable","finalViews","viewArray","viewType","view_id","initialView","nanoid","useFormGraphData","loading","setLoading","actionData","setActionData","treeShortcut","setTreeShortcut","view","action_id","action_type","name","res_model","CenteredSpinner","ErrorAlert","className","messageContent","messageType","useNetworkRequest","fn","abortControllersRef","cancelRequest","useCallback","payload","manualRequestId","requestId","abortController","controller","fontGrowFactor","minFontSize","GraphIndicatorComp","setHeight","setWidth","totalValue","percent","color","suffix","showPercent","Measure","contentRect","measureRef","PercentageIndicator","CommonIndicator","getTextWidth","text","font","total","fontSize","localeValue","finalValue","tw","IconElement","twoLinesHeight","percentValue","getValueForOperator","graphProcessor","GraphIndicator","colorCondition","totalDomain","iconProps","operator","manualIds","setValue","setPercent","setTotalValue","setColor","setIcon","searchAllIds","readObjects","searchCount","evalDomain","parseCondition","fetchValue","isTotal","fetchTotalValue","resultIds","r","totalRetrievedValue","conditionEval","iconEval","processGraphData","getFieldsToRetrieve","graphFieldUtils","useGraphData","opts","uninformedString","processedValues","setProcessedValues","evaluatedEntries","setEvaluatedEntries","setType","search","parseGraph","retrieveData","_processedValues","getFieldsForModel","methods","fieldsDefinition","dayjs","advancedFormat","customParseFormat","isoWeek","timezone","duration","relativeTime","weekday","localeData","formatter","graphType","object","formattedValue","axisFormatter","stringIsValidNumeric","isNumber","isValidDateString","dateType","getDateType","dateFormats","DefaultGraphOptions","variable","dateString","format","PieLabelOptions","calculateAdjustedPiePercentages","acc","roundedPercentages","p","num","types","Line","Column","Pie","GraphChartComp","isGroup","isStack","numItems","pieTotal","piePercents","getPercentValueForX","x","matchedDataEntry","d","pieItemValueFormatter","_","pieLabelFormatter","Chart","getGraphProps","graphProps","GraphDefaults","GraphChart","DEFAULT_SEARCH_LIMIT","ActionViewContext","createContext","ActionViewProvider","titleProps","setCurrentView","availableViews","formRef","searchTreeRef","onNewClicked","currentId","setCurrentId","setResults","currentItemIndex","setCurrentItemIndex","currentModel","setSorter","totalItems","setTotalItems","setSelectedRowItems","selectedRowItems","searchTreeNameSearch","setSearchTreeNameSearch","goToResourceId","limitProps","formIsSaving","setFormIsSaving","setFormHasChanges","removingItem","setRemovingItem","formIsLoading","setFormIsLoading","treeIsLoading","setTreeIsLoading","attachments","setAttachments","duplicatingItem","setDuplicatingItem","searchParams","setSearchParams","searchVisible","setSearchVisible","graphIsLoading","setGraphIsLoading","previousView","setPreviousView","searchValues","setSearchValues","setLimit","setTitle","callOnFormSave","GraphComp","ref","graphOoui","setGraphOoui","graphXml","setGraphXml","actionViewContext","getView","useImperativeHandle","viewData","graph","indicator","indicatorFieldopts","Graph","forwardRef","ErpFeatureKeys","ErpAllFeatureKeys","useServerGraphData","graphData","setGraphData","readForView","chart","GraphServer","TabManagerContext","TabManagerProvider","openAction","openRelate","openDefaultActionForModel","openShortcut","activeKey","onChangeTab","onRemoveTab","tabs","GraphCard","parms","hasDragAndDrop","ExportOutlined","ErrorBoundary","Indicator","hasActionId","GraphIndicatorInput","IndicatorInput","Statistic","Card","readForViewEnabled","tabManagerContext","GraphComponent","boolValue","processValues","getTouchedValues","source","target","differences","sourceValue","targetValue","isValidMany2OneValue","numericId","targetNumericId","checkFieldsType","changedFields","formOoui","fieldType","mergeFieldsDomain","fieldsDomain","output","getValuesForDomain","getOnChangePayload","onChangeFieldActionArgs","parentValues","arg","splittedArg","parentKey","mergeSearchFields","searchFields","mergedSearchFields","sf","onlyUnique","self","transformPlainMany2Ones","reformattedValues","colorFromString","hash","hexColour","stringFormat","match","Tag","TagInput","colorValue","CustomTag","style","isPresetStatusColor","isPresetColor","AntdTag","Tags","TagsInput","setOptions","isLoadingOptions","setIsLoadingOptions","fetchOptions","params","evaluatedDomain","onChangeSelected","newItems","currentIds","tagRender","closable","onClose","onPreventMouseDown","element","getWidgetType","Tree","Notebook","Group","Integer","Float","ProgressBar","Date","DateTime","Time","One2many","Separator","Binary","Url","Email","FloatTime","MultiCheckbox","Markdown","Radio","Switch","Steps","CodeEditor","CommentsTimelineField","HTMLPreview","createReactWidget","widgetClass","createElement","getSpanStyleForItem","fillRowWithEmptiesToFit","row","mustFillWithEmpties","numberOfColumns","rowWithEmptiesToFit","totalColSpan","isLastItemAndMustFit","columnIndex","gapsToAdjust","gapsToFill","expandWidgetsIfNeeded","getSingleRowTemplateColumns","gridOptions","Container","columnsToAdd","getTemplateColumns","columns","fieldInRows","odd","even","templateColumns","getMaxColspanForRows","rows","prev","current","container","maxColspanForRows","firstRow","rowWithoutInvisibleFields","rowWithExpandedItems","onCancel","FormModalContext","FormModalProvider","ContentRootContext","callRefreshValues","fns","ContentRootProvider","reportInProgressInterval","waitingForReport","reportGenerating","setReportGenerating","onRefreshParentValues","openActionModal","actionModalVisible","setActionModalVisible","actionModalOptions","setActionModalOptions","generateReport","reportData","reportContext","datas","report_name","idsToExecute","reportContextParsed","newReportId","evaluateReportStatus","reportState","processAction","onRefreshParentValuesFn","runAction","_actionData","responseContext","mergedContext","getViewsAndInitialView","openNewActionModal","onFormModalSucceed","view_mode","retriedViewData","viewTypes","retrievedViewId","ContentRootProvider$1","mergeFieldsContext","contextFields","WIDTH_BREAKPOINT","propsOnCancel","propsOnSubmitSucceed","showFooter","getDataFromAction","onFieldsChange","propsOnSubmitError","mustClearAfterSave","submitMode","valuesProps","formViewProps","postSaveAction","insideButtonModal","parentContext","actionDomain","rootForm","defaultValues","forcedValues","parentWidth","isSubmitting","setIsSubmitting","setFormOoui","antForm","AntForm","arch","setArch","setFields","formModalContext","containerWidth","setContainerWidth","defaultGetCalled","setDefaultGetCalled","createdId","originalFormValues","lastAssignedValues","warningIsShown","formSubmitting","x2manyPendingLink","parentId","getParentPlainValues","contentRootContext","cancelUnsavedChanges","checkFieldsChanges","formValues","onSubmitError","getCurrentId","getCurrentValues","getAdditionalValues","val","getFormValues","getActiveIdsContext","getDefaultValues","currentValues","assignNewValuesToForm","checkIfFormHasErrors","getFormView","_fields","_arch","hasDefaultGetCalled","fetchValuesFromApi","parseForm","showUnsavedChangesDialog","newValues","reset","isDefaultGet","mergedValues","valuesProcessed","fieldsToUpdate","fieldName","fieldValue","getFormOoui","submitApi","callOnSubmitSucceed","touchedValues","newId","submitValues","submitSucceed","formErrorsDialog","operationInProgress","FormOoui","evaluateChanges","debouncedCheckFieldsChanges","debounce","changedField","processFieldOnChange","onChangeFieldAction","response","valuesWith2ManyValuesConverted","proccessedFields","runObjectButton","runWorkflowButton","runActionButton","closeParent","updateOperationInProgress","mustBlockButtons","additionalContext","updatedContext","footer","Form$1","buttonModal","isMenuAction","rest","formTitle","setFormTitle","isFavourite","setIsFavourite","currentShortcutId","setCurrentShortcutId","res_id","checkFavourite","toggleFavourite","header","StarFilled","StarOutlined","contentWidth","DateRangePicker","DatePicker","TimePicker","numberOfSelectsToHide","picker","pickerSelectedTimes","AntTimePicker","DateTimeRangePicker","TimeRangePicker","decimalDigits","InputNumber","newNumber","PairFields","Widget","IntegerOoui","getWidget","MultiSelection","MultiSelectionInput","optionValueKeyPair","optionKey","CustomSelect","handleChange","changedValues","keysForChangedValues","SearchField","SearchFieldTypes","SelectionOoui","SearchBottomBar","onAdvancedFilterToggle","advancedFilter","onClear","isSearching","UpOutlined","SearchOutlined","SearchParams","onLimitChange","limitOoui","offsetOoui","convertBooleanParamIfNeeded","getParamsForFields","widgetContainer","removeUndefinedFields","groupedDateTime","groupDateTimeValuesIfNeeded","groupedValues","ungroupDateValuesIfNeeded","getParamForField","curVal","filteredKey","valueEntry","getDatetimeDateFields","removeDateTimeSingleFields","datePair","baseKey","timeKey","timePair","from","to","timeValueFrom","timeValueTo","dateFields","getUniqueFieldsForParams","uniqueFields","param","mergeParams","domainParams","finalParams","uniqueParams","SearchFilter","offset","setSearchFilterHeight","searchError","showLimitOptions","simpleSearchFields","setSimpleSearchFields","advancedSearchFields","setAdvancedSearchFields","setAdvancedFilter","sfo","form","getRowsAndCols","j","SearchFilterOoui","onFinish","newParams","metrics","calculateColumnsWidth","maxWidthPerCell","columnsWithWidth","indexColumn","columnWidth","cellValue","cellWidth","tableWidth","SelectAllRecordsRow","numberOfVisibleSelectedRows","totalRecords","numberOfTotalRows","onSelectAllRecords","numberOfRealSelectedRows","translations","handleClick","selectRowsComponent","Link","allRowsAreSelected","parseStringToFloat","parseFloatToString","finalString","hours","mins","hoursString","minsStrings","ProgressBarInput","textValue","StyledProgress","Progress","Many2oneSuffixOoui","onRetrieveData","onItemClick","onOpenChange","printModalVisible","setPrintModalVisible","setData","fetchMenuItems","actionItems","relateItems","printItems","ThunderboltOutlined","PrinterOutlined","EnterOutlined","Many2OneSuffixUi","open","Many2OneSuffixModal","Many2oneSuffix","setFormView","targetValues","setTargetValues","cancelGetViewRequest","cancelReadObjectsRequest","cancelRequests","handleMenuClick","commonParams","toolbar","extractedFields","toolbarField","parseContextFields","parseDomainFields","Many2oneTree","m2oField","ReferenceTree","setName","intId","fetchName","nameResponse","selectionDescription","Avatar","backgroundColor","AntdAvatar","DatePickerConfig","showTime","DatePickerInput","mode","onValueStringChange","momentDate","dateValue","AntDatePicker","BooleanComponent","Checkbox","Many2OneComponent","TextComponent","DateComponent","DateTimeComponent","One2ManyComponent","length","ProgressBarComponent","FloatTimeComponent","NumberComponent","ImageComponent","TagComponent","SelectionComponent","selectionKey","ReferenceComponent","AvatarComponent","TagsComponent","setValues","loadValues","optionsRead","v","tags","COLUMN_COMPONENTS","UnmemoizedTree","page","onRequestPageChange","onRowClicked","showPagination","selectedRowKeys","onRowSelectionChange","scrollY","colorsForResults","statusForResults","onChangeSort","onFetchChildrenForRecord","childField","rootTree","readonly","tableRef","setItems","errorInParseColors","setTreeOoui","internalLimit","summary","pagination","AntPagination","sums","sumFields","it","sumItems","sumField","dataTable","adjustedHeight","GisceTable","record","Badge","PlusSquareOutlined","MinusSquareOutlined","useSearch","nameSearch","searchNameGetDoneRef","setActionViewTotalItems","setResultsActionView","resultsActionView","clearSelection","tableRefreshing","setTableRefreshing","searchFilterLoading","setSearchFilterLoading","setSearchError","setPage","setOffset","resultsInternal","setResultsInternal","setColorsForResults","setStatusForResults","originalResults","getResults","searchByNameSearch","searchResults","resultsIds","status","attrs","resultsWithData","resultsData","newResultIds","resultsSorted","newOffset","mergedParams","attrsEvaluated","newCurrentItemIndex","totalItemsValue","fetchResults","changeSort","newSorter","sortedResults","submit","newLimit","requestPageChange","clear","fetchChildrenForRecord","child_id","getAllIds","SearchTree","treeViewProps","treeScrollY","onChangeSelectedRowKeys","initialFetchDone","setInitialFetchDone","setCurrentModel","setTreeView","initialError","setInitialError","searchFilterHeight","expandableClickActionData","changeSelectedRowKeys","newSelectedRowKeys","limitUsedInSearch","fetchModelData","_formView","_treeView","onSearchTreeLimitChange","treeButOpen","onRowClickedHandler","selectAllRecords","allIds","calculatedTableHeight","SearchTree$1","showErrorExceptionDialog","SearchModal","onCloseModalProps","onSelectValuesProps","showCreateModal","setShowCreateModal","modalHeight","setSelectedRowKeys","setOperationInProgress","onSelectValues","keys","FileAddOutlined","Many2oneInput","widgetDomain","showSearchModal","setShowSearchModal","searching","setSearching","searchText","setSearchText","searchButtonTappedRef","inputText","setInputText","inputTextRef","transformedDomain","searchDomain","setSearchDomain","fetchNameAndUpdate","onElementLostFocus","tryFetchFirstResultOrShowSearch","parseDomain","transformDomainForChildWidget","onKeyDown","RequiredInput","One2manyContext","One2manyProvider","itemIndex","setItemIndex","manualTriggerChange","setManualTriggerChange","AsyncConfirmModal","centered","confirmLoading","setConfirmLoading","setVisible","handleOk","closeModal","handleCancel","createRoot","asyncConfirm","config","root","showRemoveItemDialog","showUnlinkItemDialog","One2manyTopBar","titleString","onCreateItem","onToggleViewMode","onDelete","onPreviousItem","onNextItem","isMany2Many","onSearchItem","showCreateButton","showToggleButton","separator","deleteButton","ApiOutlined","DeleteOutlined","itemToShow","itemBrowser","LeftOutlined","RightOutlined","AlignLeftOutlined","ViewObjects","One2manyInput","continuousEntryMode","setContinuousEntryMode","originalSortItemIds","isMany2many","previousCurrentView","fetchDataIfNeeded","fetchOriginalItemsFromApi","_c","toggleViewMode","nextView","showFormChangesDialogIfNeeded","previousItem","nextItem","reloadOriginalValuesForFormItem","updatedFormObject","updatedTreeObject","updatedItems","callback","showRemoveConfirm","removeCurrentItem","removeSelectedItems","createItem","inv_field","itemsToRemove","idsToRemove","onFormModalSubmitSucceed","nextId","onTreeRowClicked","itemsToLoadFrom","onSearchModalSelectValue","filteredIds","getTitle","ViewType","currentItemId","resultsToShow","_d","useOne2ManyDomain","formDomain","useOne2manyTree","firstVisibleRowIndex","selectedRowKeysRef","allRowSelectedMode","onChangeAllRowSelectedMode","onChangeFirstVisibleRowIndex","onGetFirstVisibileRowIndex","onGetSelectedRowKeys","useDeepCompareCallback","fetchedData","useOne2manyForm","currentItem","getOriginalItemsWithRestoredItemId","onFormChanges","newUpdatedItems","reloadOriginalValuesForCurrentItem","originalItems","useOne2manyItems","one2manyItems","useDeepCompareMemo","One2manyForm","useOne2manyRemove","getItemsToRemove","idCount","useOne2manyFormModal","onCancelFormModal","openItemInFormModal","useOne2manySearchModal","onCloseSearchModal","onSelectSearchValues","useOne2manyColumnStorage","dataForHash","getColumnState","columnState","getKey","updateColumnState","state","DEFAULT_HEIGHT","One2manyTree","onRowDoubleClick","onFetchRecords","gridRef","onGetFirstVisibleRowIndex","onAllRowSelectedModeChange","internalGridRef","prevItemsValue","itemsRef","totalRows","onRequestData","startRow","endRow","itemsToFetch","idsToFetchSliced","realIdsToFetch","otherItems","preparedResults","resultsMapped","onRowStyle","InfiniteTable","SUPPORTED_VIEWS","widgetContext","onTreeFetchRows","parentViewId","m","One2manyInputInfinite","FloatTimeInput","FieldSet","TabPane","Tabs","getPageIcon","TranslatableText","useExport","selectedRegistersToExport","exportModelFields","onExport","exportDomain","addIdToRelationFields","onGetFields","convertToExportFields","onGetFieldChilds","optsForField","getFieldDefinition","getChildKey","onGetPredefinedExports","predefinedExports","listPredefinedExports","keysWithChilds","retrieveKeyFieldsForPredefinedExports","pExport","childKey","onRemovePredefinedExport","getModelFields","fieldsForModel","onSavePredefinedExport","fieldsForExport","fieldsForExportLine","exportId","exportFields","valuesForField","relationField","isRelationField","compoundId","fieldDefinition","getParentKey","parentTitle","pExports","exportLinesIds","exp","exportLinesObjects","getKeysWithoutChildsInFields","splitAndSortKeys","allPredefinedExportKeys","keysWithoutChildsInFields","childs","keysMap","subKeys","subKey","currentKey","aLevels","bLevels","ExportModal","totalRegisters","visibleRegisters","ExportModalFmg","TimeInput","time","timestring","ReferenceInput","splittedValue","many2oneValue","setMany2oneValue","selectionValue","setSelectionValue","m2oValue","referenceValue","Many2oneOoui","BinaryInput","filenameField","filesize","fileName","openFile","EyeOutlined","iconsForViewTypes","TableOutlined","FormOutlined","AreaChartOutlined","CalendarOutlined","getIconForView","ChangeViewButton","onChangeView","disabled","dropdownData","idx","fallbackTitle","tryNavigate","selectedView","ActionButton","NewButton","onNewClickedProps","showLogInfo","translateFn","logInfo","create_date","create_uid","write_date","write_uid","AttachmentsButtonWrapper","numberOfAttachments","onAddNewAttachment","onOpenAttachmentLink","onOpenAttachmentDetail","onListAllAttachments","dropdownRef","LinkOutlined","attachment","right","AttachmentsButton","onViewAttachmentDetails","preloading","setPreloading","preloadedAttachments","setPreloadedAttachments","downloading","setDownloading","preloadAttachments","openAttachmentLink","retrievedAttachment","openAttachmentDetail","FormActionBar","onFormSave","tryRefresh","refreshChangesDialog","onNextClick","onPreviousClick","tryDelete","remove","filteredResults","newIndex","duplicate","mustDisableButtons","SaveOutlined","CopyOutlined","InfoCircleOutlined","ReloadOutlined","DropdownButton","saveDocument","report","relate","getAttachmentActionPayload","LinkInput","valueValidator","linkPrefix","editMode","setEditMode","showInput","setShowInput","EditOutlined","isURL","isEmail","GoToResourceModal","onIdSubmitted","inputRef","openInSameTab","handleSubmit","PlusOutlined","ButtonWithBadge","badgeNumber","GraphActionBar","refreshGraph","FilterOutlined","newView","TitleHeader","getSummary","reg","GraphActionView","graphRef","applyLimit","setApplyLimit","FormActionView","SearchBar","onSearch","mustShowClearSuffix","setMustShowClearSuffix","CloseCircleFilled","TreeActionBar","advancedExportEnabled","exportModalVisible","setExportModalVisible","hasNameSearch","searchString","itemClicked","idsToExport","TreeActionView","DashboardActionContext","DashboardActionProvider","moveItemsEnabled","setMoveItemsEnabled","dashboardRef","DashboardActionBar","BorderOuterOutlined","SettingOutlined","DashboardActionView","dashboardData","Dashboard","resolveViewInfoPromises","viewsToRetrieve","ActionView","setCanWeClose","tabKey","formDefaultValues","formForcedValues","setCurrentViewInternal","setAvailableViews","res_id_parsed","setCurrentIdInternal","gtResourceModalVisible","setGtResourceModalVisible","searchingForResourceId","setSearchingForResourceId","setCurrentViewTabContext","setCurrentIdTabContext","useHotkeys","handleGoToRecordShortcut","extra","canWeClose","viewDataRetrieved","getViewsPromises","viewsRetrieved","viewInfo","configAction","currentViewToAssign","initialViewWithData","resource","viewForm","ActionView$1","ResponsiveReactGridLayout","WidthProvider","Responsive","DashboardGrid","onPositionItemsChanged","child","DashboardTree","limitRef","paramsRef","totalItemsResult","fetchActionData","DashboardTree$1","DashboardForm","firstId","setFirstId","itemsField","dashboardItems","setDashboardItems","setActionBarLoading","itemsFields","boardFields","update","openConfigDashboard","fetchView","fetchDashboardItems","itemsWithActions","getItemsWithActions","fetchPromises","dashboardItem","promise","itemPositions","itemPosition","remotePosition","itemsToUpdateWithUpdatedPos","diff","diffItem","valueToUpdate","position","parmsParsed","childContent","formattedInitialView","Dashboard$1","MultiCheckboxInput","checkAll","uncheckAll","MarkdownInput","ReactMarkdown","remarkGfm","direction","RadioAnt","SwitchInput","AntdSwitch","StepsInput","errorField","AntdSteps","Editor","editor","Meta","Gravatar","email","size","gravatarUrl","md5","TextWithNewlines","textParts","part","Comment","CommentsTimeline","HTMLPreviewInput","alertType","getIcon","AntdAlert","Content","Layout","Welcome","RootView","setActiveKey","setTabs","tabViewsCloseFunctions","contentRootProvider","retrieveAndOpenAction","currentIndex","tab","registerViewCloseFn","forced_values","initialViewType","action_id_string","addNewTab","newTabs","relateData","shortcut","overrideUnsettedLimit","actionString","canWeCloseFn","RootView$1","Tab","isActive","onSelected","bgColor","TabSelector","TabContent","hiddenStyle","TabContent$1","CurrentTabContent","tabsToRender","FavouriteButton","onRetrieveShortcuts","onCheckIsFavourite","onAddFavourite","onRemoveFavourite","onDropdownClosed","favouriteButtonRef","favouriteQuery","favouriteQueryString","editFavourites","getShortcuts","shortcuts","currentTab","FavouriteButtonUi"],"mappings":"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"}
1
+ {"version":3,"file":"react-ooui.es.js","sources":["../src/widgets/base/Label.tsx","../src/common/Field.tsx","../src/ui/ConfirmDialog.tsx","../src/context/FormContext.tsx","../src/helpers/iconMapper.ts","../src/widgets/base/Button.tsx","../src/widgets/custom/ButtonGroup.tsx","../src/hooks/useWindowDimensions.ts","../src/ConnectionProvider.ts","../src/helpers/errorHelper.ts","../src/ui/ActionErrorDialog.tsx","../src/widgets/modals/TranslationModal.tsx","../src/common/ButtonWithTooltip.tsx","../src/ui/InfoDialog.tsx","../src/widgets/base/Char.tsx","../src/widgets/base/Selection.tsx","../src/widgets/base/Boolean.tsx","../src/helpers/filesHelper.ts","../src/widgets/base/Image.tsx","../src/widgets/custom/FiberGrid.tsx","../src/helpers/treeHelper.tsx","../src/helpers/one2manyHelper.ts","../src/widgets/custom/Timeline.tsx","../src/locales/ca_ES.ts","../src/locales/en_US.ts","../src/locales/es_ES.ts","../src/locales/index.ts","../src/context/ConfigContext.tsx","../src/widgets/views/Dashboard/dashboardHelper.ts","../src/hooks/useFormGraphData.ts","../src/ui/CenteredSpinner.tsx","../src/ui/ErrorAlert.tsx","../src/hooks/useNetworkRequest.ts","../src/widgets/views/Graph/GraphIndicatorComp.tsx","../src/widgets/views/Graph/GraphIndicator.tsx","../src/widgets/views/Graph/useGraphData.tsx","../src/helpers/dayjs.ts","../src/widgets/views/Graph/GraphDefaults.ts","../src/widgets/views/Graph/GraphChartComp.tsx","../src/widgets/views/Graph/GraphChart.tsx","../src/models/constants.ts","../src/context/ActionViewContext.tsx","../src/widgets/views/Graph/Graph.tsx","../src/models/erpFeature.ts","../src/widgets/views/Graph/useServerGraphData.tsx","../src/widgets/views/Graph/GraphServer.tsx","../src/context/TabManagerContext.tsx","../src/widgets/views/Graph/GraphCard.tsx","../src/widgets/custom/Indicator.tsx","../src/helpers/formHelper.ts","../src/widgets/custom/Tag.tsx","../src/widgets/custom/Tags.tsx","../src/widgets/WidgetFactory.tsx","../src/helpers/containerHelper.ts","../src/widgets/containers/Container.tsx","../src/ui/UnsavedChangesDialog.tsx","../src/ui/FormErrorsDialog.tsx","../src/ui/WarningDialog.tsx","../src/context/FormModalContext.tsx","../src/context/ContentRootContext.tsx","../src/helpers/fieldsHelper.ts","../src/widgets/views/Form.tsx","../src/widgets/modals/FormModal.tsx","../src/widgets/views/searchFilter/DateRangePicker.tsx","../src/common/TimePicker.tsx","../src/widgets/views/searchFilter/DateTimeRangePicker.tsx","../src/widgets/base/Float.tsx","../src/widgets/base/Integer.tsx","../src/widgets/views/searchFilter/PairFields.tsx","../src/widgets/base/MultiSelection.tsx","../src/widgets/views/searchFilter/SearchField.tsx","../src/widgets/views/searchFilter/SearchBottomBar.tsx","../src/widgets/views/searchFilter/SearchParams.tsx","../src/helpers/searchHelper.ts","../src/widgets/views/searchFilter/SearchFilter.tsx","../src/helpers/dynamicColumnsHelper.ts","../src/common/SelectAllRecordsRow.tsx","../src/helpers/timeHelper.ts","../src/widgets/base/ProgressBar.tsx","../src/widgets/base/many2one/Many2oneSuffixOoui.tsx","../src/widgets/base/many2one/Many2oneSuffix.tsx","../src/widgets/base/many2one/Many2oneTree.tsx","../src/widgets/base/ReferenceTree.tsx","../src/widgets/custom/Avatar.tsx","../src/common/DatePicker.tsx","../src/widgets/views/Tree/treeComponents.tsx","../src/widgets/views/Tree/Tree.tsx","../src/hooks/useSearch.ts","../src/widgets/views/SearchTree.tsx","../src/ui/GenericErrorDialog.tsx","../src/widgets/modals/SearchModal.tsx","../src/widgets/base/many2one/Many2one.tsx","../src/context/One2manyContext.tsx","../src/ui/AsyncConfirmModal.tsx","../src/ui/asyncConfirm.tsx","../src/ui/RemoveItemDialog.tsx","../src/ui/UnlinkItemDialog.tsx","../src/widgets/base/one2many/One2manyTopBar.tsx","../src/widgets/base/one2many/One2manyInput.tsx","../src/widgets/base/one2many/useOne2manyDomain.ts","../src/widgets/base/one2many/useOne2manyTree.ts","../src/widgets/base/one2many/useOne2manyForm.ts","../src/widgets/base/one2many/useOne2manyItems.ts","../src/widgets/base/one2many/One2manyForm.tsx","../src/widgets/base/one2many/useOne2manyRemove.ts","../src/widgets/base/one2many/useOne2manyFormModal.ts","../src/widgets/base/one2many/useOne2manySearchModal.ts","../src/widgets/base/one2many/useOne2manyColumnStorage.ts","../src/widgets/base/one2many/One2manyTree.tsx","../src/widgets/base/one2many/One2manyInputInfinite.tsx","../src/widgets/base/one2many/One2many.tsx","../src/widgets/base/FloatTime.tsx","../src/widgets/containers/Group.tsx","../src/widgets/containers/Notebook.tsx","../src/widgets/base/Text.tsx","../src/widgets/base/Separator.tsx","../src/hooks/useExport.ts","../src/widgets/modals/ExportModal.tsx","../src/widgets/base/Date.tsx","../src/widgets/base/DateTime.tsx","../src/widgets/base/Time.tsx","../src/widgets/base/Reference.tsx","../src/widgets/base/Binary.tsx","../src/actionbar/ChangeViewButton.tsx","../src/actionbar/ActionButton.tsx","../src/actionbar/NewButton.tsx","../src/ui/RefreshItemDialog.tsx","../src/helpers/logInfoHelper.tsx","../src/actionbar/AttachmentsButtonWrapper.tsx","../src/actionbar/AttachmentsButton.tsx","../src/actionbar/FormActionBar.tsx","../src/widgets/base/LinkInput.tsx","../src/widgets/base/Url.tsx","../src/widgets/base/Email.tsx","../src/ui/GoToResourceModal.tsx","../src/actionbar/ButtonWithBadge.tsx","../src/actionbar/GraphActionBar.tsx","../src/ui/TitleHeader.tsx","../src/views/actionViews/GraphActionView.tsx","../src/views/actionViews/FormActionView.tsx","../src/actionbar/SearchBar.tsx","../src/actionbar/TreeActionBar.tsx","../src/views/actionViews/TreeActionView.tsx","../src/context/DashboardActionContext.tsx","../src/actionbar/DashboardActionBar.tsx","../src/views/actionViews/DashboardActionView.tsx","../src/helpers/viewHelper.ts","../src/views/ActionView.tsx","../src/widgets/views/DashboardGrid/DashboardGrid.tsx","../src/widgets/views/Dashboard/DashboardTree.tsx","../src/widgets/views/Dashboard/DashboardForm.tsx","../src/widgets/views/Dashboard/Dashboard.tsx","../src/widgets/custom/MultiCheckbox.tsx","../src/widgets/custom/Markdown.tsx","../src/widgets/custom/Radio.tsx","../src/widgets/custom/Switch.tsx","../src/widgets/custom/Steps.tsx","../src/widgets/custom/CodeEditor.tsx","../src/widgets/custom/Comments.tsx","../src/widgets/custom/HTMLPreview.tsx","../src/widgets/custom/Alert.tsx","../src/views/Welcome.tsx","../src/views/RootView.tsx","../src/views/tabs/Tab.tsx","../src/views/TabSelector.tsx","../src/views/TabContent.tsx","../src/views/CurrentTabContent.tsx","../src/ui/FavouriteButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { Tooltip, Typography, theme } from \"antd\";\nimport { WidgetProps } from \"@/types\";\nimport { QuestionCircleOutlined } from \"@ant-design/icons\";\nimport { Label as LabelOoui } from \"@gisce/ooui\";\nimport { Interweave } from \"interweave\";\nconst { Text, Title } = Typography;\nconst { useToken } = theme;\n\ntype Props = WidgetProps & {\n align?: \"left\" | \"center\" | \"right\";\n responsiveBehaviour?: boolean;\n};\n\nconst alignClass = {\n left: \"justify-start\",\n center: \"justify-center\",\n right: \"justify-end\",\n};\n\nconst Label = (props: Props) => {\n const { ooui, align, responsiveBehaviour } = props;\n const { label, tooltip, fieldForLabel, labelSize, labelType } =\n ooui as LabelOoui;\n const addColon = fieldForLabel !== null;\n const labelText = addColon && label.length > 1 ? label + \" :\" : label;\n const responsiveAlign = responsiveBehaviour ? \"left\" : \"right\";\n const labelAlgin = align || (fieldForLabel ? responsiveAlign : \"left\");\n const { token } = useToken();\n\n const TextType = labelSize === undefined ? Text : Title;\n\n return (\n <div\n className={`flex flex-row items-center pb-1 pt-1 ${alignClass[labelAlgin]}`}\n >\n {tooltip && (\n <Tooltip title={tooltip}>\n <QuestionCircleOutlined\n className=\"pr-1 text-xs\"\n style={{\n color: token.colorPrimary,\n }}\n />\n </Tooltip>\n )}\n <span className=\"pr-2\">\n <TextType level={labelSize} type={labelType as any}>\n <Interweave content={labelText} />\n </TextType>\n </span>\n </div>\n );\n};\n\nexport default Label;\n","import React, { useContext } from \"react\";\nimport { Form, Row, Col } from \"antd\";\nimport { Field as FieldOoui, Label as LabelOoui } from \"@gisce/ooui\";\nimport Label from \"@/widgets/base/Label\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nexport default function Field({\n ooui,\n children,\n layout = \"horizontal\",\n valuePropName,\n showLabel = false,\n alignLabel = \"left\",\n required = false,\n type,\n validator,\n}: {\n ooui: FieldOoui;\n children?: React.ReactNode;\n layout?: \"horizontal\" | \"vertical\";\n valuePropName?: string;\n showLabel?: boolean;\n alignLabel?: \"left\" | \"center\" | \"right\";\n required?: boolean;\n type?: any;\n validator?: any;\n}) {\n const { id, label, tooltip } = ooui;\n const { t } = useLocale();\n\n const rules = required\n ? [\n {\n required: true,\n message: t(\"fillRequiredField\"),\n type,\n validator,\n },\n ]\n : undefined;\n\n const formItem = () => (\n <Form.Item\n className=\"mb-0\"\n name={id}\n valuePropName={valuePropName}\n rules={rules}\n help={ooui.tooltipInline ? ooui.tooltip : null}\n >\n {children}\n </Form.Item>\n );\n\n if (!showLabel) {\n return formItem();\n }\n\n const labelWidget = (\n <Label\n ooui={\n new LabelOoui({\n name: id + \"_label\",\n string: label,\n help: ooui.tooltipInline ? false : tooltip,\n fieldForLabel: id,\n })\n }\n align={alignLabel}\n />\n );\n\n const horizontalMode = () => {\n return (\n <Row align=\"middle\" className=\"pb-1 pt-1\">\n <Col className=\"ml-2\" flex=\"7rem\">\n <div className=\"flex flex-col items-end\">{labelWidget}</div>\n </Col>\n <Col flex=\"auto\">{formItem()}</Col>\n </Row>\n );\n };\n\n const verticalMode = () => {\n return (\n <>\n {labelWidget}\n {formItem()}\n </>\n );\n };\n\n return layout === \"horizontal\" ? horizontalMode() : verticalMode();\n}\n","import { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { confirm } = Modal;\n\nconst showDialog = ({\n onOk,\n confirmMessage,\n okText,\n cancelText,\n t,\n}: {\n onOk: () => void;\n confirmMessage: string;\n okText?: string;\n cancelText?: string;\n t: (key: string) => string;\n}) => {\n confirm({\n title: t(\"confirmation\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: confirmMessage,\n okText: okText || t(\"ok\"),\n cancelText: cancelText || t(\"cancel\"),\n onOk,\n });\n};\n\nexport default showDialog;\n","import React, { useRef, useState } from \"react\";\nimport { FormView } from \"..\";\n\nexport type FormContextType = {\n activeId?: number;\n activeModel: string;\n setFieldValue: (field: string, value?: string) => void;\n getFieldValue: (field: string) => string;\n executeButtonAction: ({\n type,\n action,\n context,\n }: {\n type: string;\n action: string;\n context?: any;\n }) => Promise<void>;\n getContext: () => Promise<any>;\n getValues: () => Promise<any>;\n getPlainValues: () => { [key: string]: any };\n getFields: () => Promise<any>;\n domain: any[];\n submitForm?: (options?: {\n callOnSubmitSucceed?: boolean;\n }) => Promise<{ succeed: boolean; id: number }>;\n fetchValues?: (options?: any) => void;\n formHasChanges?: () => boolean;\n elementHasLostFocus?: () => void;\n formView?: FormView;\n};\n\nexport const FormContext = React.createContext<FormContextType | null>(null);\n\ntype FormProviderProps = FormContextType & {\n children: React.ReactNode;\n};\n\nconst FormProvider = (props: FormProviderProps): any => {\n const {\n children,\n activeId,\n activeModel,\n setFieldValue,\n getFieldValue,\n executeButtonAction,\n getContext,\n getValues,\n getPlainValues,\n domain,\n submitForm,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n getFields,\n formView,\n } = props;\n\n return (\n <FormContext.Provider\n value={{\n domain,\n getValues,\n getPlainValues,\n getFields,\n activeId,\n activeModel,\n setFieldValue,\n getFieldValue,\n executeButtonAction,\n getContext,\n submitForm,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n formView,\n }}\n >\n {children}\n </FormContext.Provider>\n );\n};\n\nexport default FormProvider;\n","import React, { CSSProperties } from \"react\";\nimport * as AntIcons from \"@ant-design/icons\";\nimport * as TablerIcons from \"@tabler/icons-react\";\nimport Icon from \"@ant-design/icons\";\n\ntype TablerKey = keyof typeof TablerIcons;\ntype AntKey = keyof typeof AntIcons;\n\nconst iconMapping: { [key: string]: string } = {\n \"terp-purchase\": \"ShoppingCart\",\n \"terp-graph\": \"PieChart\",\n \"terp-crm\": \"Contacts\",\n \"terp-hr\": \"Friends\",\n \"terp-account\": \"BuildingBank\",\n \"terp-project\": \"Checklist\",\n \"terp-administration\": \"Adjustments\",\n \"terp-partner\": \"Team\",\n \"terp-mrp\": \"Build\",\n \"terp-product\": \"Shopping\",\n STOCK_JUSTIFY_FILL: \"UnorderedList\",\n STOCK_INDENT: \"IndentIncrease\",\n STOCK_HELP: \"Question\",\n STOCK_GO_UP: \"ArrowUp\",\n STOCK_SORT_DESCENDING: \"SortDescending\",\n STOCK_ADD: \"Plus\",\n STOCK_GOTO_LAST: \"FastForward\",\n STOCK_FIND: \"Search\",\n STOCK_PROPERTIES: \"Control\",\n STOCK_DIALOG_INFO: \"Info\",\n STOCK_FLOPPY: \"Usb\",\n STOCK_JUSTIFY_CENTER: \"AlignCenter\",\n STOCK_GO_BACK: \"ArrowLeft\",\n STOCK_UNDERLINE: \"Underline\",\n STOCK_BOLD: \"Bold\",\n STOCK_APPLY: \"Check\",\n STOCK_ZOOM_OUT: \"ZoomOut\",\n STOCK_STRIKETHROUGH: \"Strikethrough\",\n STOCK_MEDIA_REWIND: \"Backward\",\n STOCK_PRINT: \"Printer\",\n STOCK_NO: \"Close\",\n STOCK_GOTO_FIRST: \"FastBackward\",\n STOCK_CLOSE: \"Close\",\n STOCK_REMOVE: \"Minus\",\n STOCK_CUT: \"Scissor\",\n STOCK_DIALOG_AUTHENTICATION: \"Safety\",\n STOCK_ZOOM_FIT: \"Expand\",\n STOCK_JUMP_TO: \"Select\",\n STOCK_HARDDISK: \"Hdd\",\n STOCK_SAVE_AS: \"Save\",\n STOCK_UNDO: \"Undo\",\n STOCK_JUSTIFY_RIGHT: \"AlignRight\",\n STOCK_DIALOG_ERROR: \"CloseCircle\",\n STOCK_INDEX: \"Profile\",\n STOCK_GOTO_BOTTOM: \"VerticalAlignBottom\",\n STOCK_MEDIA_NEXT: \"StepForward\",\n STOCK_REDO: \"Redo\",\n STOCK_COPY: \"Copy\",\n STOCK_MEDIA_PAUSE: \"Pause\",\n STOCK_GO_FORWARD: \"ArrowRight\",\n STOCK_UNDELETE: \"Undo\",\n STOCK_EXECUTE: \"Setting\",\n STOCK_SAVE: \"Save\",\n STOCK_DIALOG_QUESTION: \"QuestionCircle\",\n STOCK_SORT_ASCENDING: \"SortAscending\",\n STOCK_REFRESH: \"Reload\",\n STOCK_MEDIA_FORWARD: \"Forward\",\n STOCK_STOP: \"Border\",\n STOCK_PRINT_PREVIEW: \"Printer\",\n STOCK_HOME: \"Home\",\n STOCK_PASTE: \"CarryOut\",\n STOCK_ZOOM_100: \"ZoomIn\",\n STOCK_FIND_AND_REPLACE: \"FileSearch\",\n STOCK_DIALOG_WARNING: \"Warning\",\n STOCK_ZOOM_IN: \"ZoomIn\",\n STOCK_CONVERT: \"Export\",\n STOCK_ITALIC: \"Italic\",\n STOCK_YES: \"Check\",\n STOCK_MEDIA_PLAY: \"PlayCircle\",\n STOCK_MEDIA_RECORD: \"VideoCamera\",\n STOCK_MEDIA_PREVIOUS: \"StepBackward\",\n STOCK_NEW: \"FileAdd\",\n STOCK_CANCEL: \"Close\",\n STOCK_DISCONNECT: \"Api\",\n STOCK_JUSTIFY_LEFT: \"AlignLeft\",\n STOCK_FILE: \"File\",\n STOCK_QUIT: \"Logout\",\n STOCK_EDIT: \"Edit\",\n STOCK_CONNECT: \"Api\",\n STOCK_GO_DOWN: \"CaretDown\",\n STOCK_NETWORK: \"Apartment\",\n STOCK_OK: \"Check\",\n STOCK_GOTO_TOP: \"VerticalAlignTop\",\n STOCK_ABOUT: \"Star\",\n STOCK_COLOR_PICKER: \"Aim\",\n STOCK_SELECT_FONT: \"FontSize\",\n STOCK_DELETE: \"Delete\",\n STOCK_DND: \"FileText\",\n STOCK_CLEAR: \"CloseSquare\",\n STOCK_UNINDENT: \"AlignLeft\",\n STOCK_PREFERENCES: \"Setting\",\n};\n\nexport default (\n key: string,\n props?: { className?: any; style: CSSProperties },\n) => {\n if (key.indexOf(\"gtk-\") !== -1) {\n const rootIcon = key.replace(\"gtk-\", \"\").replace(/\\-/g, \"_\");\n key = `STOCK_${rootIcon.toUpperCase()}`;\n }\n\n if (iconMapping.hasOwnProperty(key)) {\n return getIconForKey(iconMapping[key], props);\n }\n\n return getIconForKey(key, props);\n};\n\nfunction toCamelCase(key: string): string {\n return `${key\n .split(\"-\")\n .map((word) =>\n word.replace(\n /\\w\\S*/g,\n (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase(),\n ),\n )\n .join(\"\")}`;\n}\n\nfunction getIconForKey(\n key: string,\n props?: { className?: any; style: CSSProperties },\n) {\n let IconCamelCase = key.charAt(0).toUpperCase() + key.slice(1); // Capitalize first letter\n if (IconCamelCase.indexOf(\"-\") !== -1) {\n IconCamelCase = toCamelCase(IconCamelCase);\n }\n\n const antKey: AntKey = `${IconCamelCase}Outlined` as any;\n if (AntIcons[antKey]) {\n return () =>\n React.createElement(AntIcons[antKey] as any, {\n ...props,\n });\n }\n\n const tablerKey: TablerKey = `Icon${IconCamelCase}` as any;\n if (TablerIcons[tablerKey]) {\n const TablerIcon = () =>\n React.createElement(TablerIcons[tablerKey] as any, {\n fill: \"transparent\",\n size: props?.style?.fontSize || 17,\n });\n const CustomIcon = () =>\n React.createElement(Icon, {\n component: TablerIcon,\n ...props,\n });\n return CustomIcon;\n }\n\n return undefined;\n}\n","import React, { useContext, useState } from \"react\";\nimport Field from \"@/common/Field\";\nimport { Button as AntButton } from \"antd\";\nimport { Button as ButtonOoui } from \"@gisce/ooui\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n ooui: ButtonOoui;\n};\n\nexport const Button = (props: Props) => {\n const { ooui } = props;\n const {\n id,\n label,\n activated,\n buttonType,\n confirmMessage,\n icon,\n context,\n readOnly,\n } = ooui;\n const formContext = useContext(FormContext) as FormContextType;\n const { executeButtonAction } = formContext || {};\n const [isRunning, setIsRunning] = useState<boolean>(false);\n const { t } = useLocale();\n\n async function onClick_confirm() {\n setIsRunning(true);\n await executeButtonAction({ type: buttonType, action: id, context });\n setIsRunning(false);\n }\n\n function onClick() {\n if (confirmMessage) {\n showConfirmDialog({\n confirmMessage,\n t,\n onOk: () => {\n onClick_confirm();\n },\n });\n return;\n }\n\n onClick_confirm();\n }\n\n function getButtonIcon() {\n if (isRunning) return <LoadingOutlined />;\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <Field ooui={ooui}>\n <AntButton\n block\n disabled={!activated || readOnly || isRunning}\n onClick={onClick}\n icon={getButtonIcon()}\n type={ooui.primary ? \"primary\" : \"default\"}\n danger={ooui.danger}\n style={{ whiteSpace: \"normal\", height: \"auto\" }}\n >\n {label}\n </AntButton>\n </Field>\n );\n};\n","import React, { useContext, useState } from \"react\";\nimport Field from \"@/common/Field\";\nimport { DownOutlined, LoadingOutlined } from \"@ant-design/icons\";\nimport { Dropdown, Menu } from \"antd\";\nimport { Button } from \"@/widgets/base/Button\";\nimport {\n ButtonGroup as ButtonGroupOoui,\n Button as ButtonOoui,\n Field as FieldOoui,\n} from \"@gisce/ooui\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype ButtonGroupProps = {\n ooui: ButtonGroupOoui;\n};\n\ntype ItemsProps = {\n ooui: ButtonOoui[];\n executeButtonAction: any;\n};\n\nexport const ButtonGroup = (props: ButtonGroupProps) => {\n const { ooui } = props;\n const { defaultButton, secondaryButtons } = ooui;\n const {\n id,\n caption,\n activated,\n buttonType,\n confirmMessage,\n icon,\n primary,\n context,\n readOnly,\n } = defaultButton || {};\n const formContext = useContext(FormContext) as FormContextType;\n const { executeButtonAction } = formContext || {};\n const [isRunning, setIsRunning] = useState<boolean>(false);\n const { t } = useLocale();\n\n function getButtonIcon() {\n if (isRunning) return <LoadingOutlined />;\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n async function onClick_confirm() {\n if (buttonType && id) {\n setIsRunning(true);\n await executeButtonAction({ type: buttonType, action: id, context });\n setIsRunning(false);\n }\n }\n\n function onClick() {\n if (confirmMessage) {\n showConfirmDialog({\n confirmMessage,\n t,\n onOk: () => {\n onClick_confirm();\n },\n });\n return;\n }\n\n onClick_confirm();\n }\n if (ooui.buttons.length === 0) {\n return null;\n } else if (ooui.buttons.length > 1) {\n return (\n <Field ooui={new FieldOoui({ ...{ ooui } })}>\n <Dropdown.Button\n disabled={!activated || readOnly}\n onClick={onClick}\n icon={<DownOutlined />}\n type={primary ? \"primary\" : undefined}\n // danger={danger ? true : undefined} This works but typescript\n // doesn't accept\n overlay={\n <Items\n ooui={secondaryButtons}\n executeButtonAction={executeButtonAction}\n />\n }\n >\n {getButtonIcon()}\n {caption}\n </Dropdown.Button>\n </Field>\n );\n } else if (defaultButton) {\n return <Button ooui={defaultButton} />;\n }\n};\n\nconst Items = (props: ItemsProps) => {\n const { t } = useLocale();\n const { ooui, executeButtonAction } = props;\n if (!ooui) {\n return null;\n }\n const items = ooui.map((button) => {\n const {\n id,\n caption,\n activated,\n buttonType,\n confirmMessage,\n icon,\n context,\n readOnly,\n danger,\n } = button;\n const [isRunning, setIsRunning] = useState<boolean>(false);\n\n async function onClick_confirm() {\n setIsRunning(true);\n await executeButtonAction({ type: buttonType, action: id, context });\n setIsRunning(false);\n }\n\n function onClick() {\n if (confirmMessage) {\n showConfirmDialog({\n confirmMessage,\n t,\n onOk: () => {\n onClick_confirm();\n },\n });\n return;\n }\n\n onClick_confirm();\n }\n\n function getButtonIcon() {\n if (isRunning) return <LoadingOutlined />;\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <Menu.Item\n key={`menuitem-${caption}`}\n disabled={!activated || readOnly}\n onClick={onClick}\n icon={getButtonIcon()}\n danger={danger}\n >\n {caption}\n </Menu.Item>\n );\n });\n return <Menu>{items}</Menu>;\n};\n","import { useState, useEffect } from \"react\";\n\nconst MODAL_WIDTH_CONSTANT = 0.7;\n\nfunction getWindowDimensions() {\n const { innerWidth: width, innerHeight: height } = window;\n return {\n width,\n height,\n };\n}\n\nexport default function useWindowDimensions() {\n const [windowDimensions, setWindowDimensions] = useState(\n getWindowDimensions(),\n );\n\n useEffect(() => {\n function handleResize() {\n setWindowDimensions(getWindowDimensions());\n }\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n return {\n modalWidth: windowDimensions.width * MODAL_WIDTH_CONSTANT,\n modalHeight: windowDimensions.height,\n width: windowDimensions.width,\n height: windowDimensions.height,\n };\n}\n","import { ConnectionProviderType } from \"@/types\";\n\nexport default class ConnectionProvider {\n private static handler: ConnectionProviderType;\n\n public static init(handler: ConnectionProviderType): void {\n ConnectionProvider.handler = handler;\n }\n\n public static getHandler(): ConnectionProviderType {\n if (!ConnectionProvider.handler) {\n throw \"Must call init() first with a valid ConnectionProvider instance\";\n }\n return ConnectionProvider.handler;\n }\n}\n","export const parseError = (errorResponse: string) => {\n let message;\n let type;\n let title;\n\n if (\n typeof errorResponse === \"string\" &&\n errorResponse.indexOf(\" -- \") !== -1 &&\n errorResponse.indexOf(\"\\n\\n\") !== -1\n ) {\n const splitted = errorResponse.split(\"\\n\\n\");\n message = splitted[1].replace(/\\n/g, \"<br />\");\n const args = splitted[0].split(\" -- \");\n type = args[0];\n title = args[1];\n } else {\n message = errorResponse;\n type = \"error\";\n title = \"Error\";\n }\n\n return {\n type,\n message,\n title,\n };\n};\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { ExclamationCircleOutlined, WarningOutlined } from \"@ant-design/icons\";\nimport { parseError } from \"@/helpers/errorHelper\";\n\nconst { error, warning } = Modal;\n\nconst showDialog = (err: string) => {\n const { message, type, title } = parseError(err);\n\n const iconComponent =\n type === \"error\" ? <ExclamationCircleOutlined /> : <WarningOutlined />;\n\n const modalType = type === \"error\" ? error : warning;\n\n modalType({\n title,\n icon: iconComponent,\n centered: true,\n content: message,\n });\n};\n\nexport default showDialog;\n","import React, { useContext, useEffect, useRef, useState } from \"react\";\nimport { Modal, Button, Divider, Row, Space, Spin, Col } from \"antd\";\nimport {\n CheckOutlined,\n CloseOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport TextArea from \"antd/lib/input/TextArea\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\n\ntype TranslationModalProps = {\n visible: boolean;\n model: string;\n id: number;\n field: string;\n onCloseModal: () => void;\n onSubmitSucceed: () => void;\n};\n\ntype Lang = {\n code: string;\n name: string;\n};\n\ntype ValuesForLangs = {\n [key: string]: string;\n};\n\nexport const TranslationModal = (props: TranslationModalProps) => {\n const { visible, onCloseModal, model, id, field, onSubmitSucceed } = props;\n\n const { modalWidth } = useWindowDimensions();\n const { t } = useLocale();\n const [langs, setLangs] = useState<Lang[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [submitLoading, setSubmitLoading] = useState(false);\n const [valuesForLangs, setValuesForLangs] = useState<ValuesForLangs>({});\n\n const originalValuesForLangs = useRef<ValuesForLangs>();\n\n useEffect(() => {\n if (visible) {\n fetchData();\n } else {\n setValuesForLangs({});\n }\n }, [visible]);\n\n async function fetchData() {\n setIsLoading(true);\n\n try {\n const langs = await getLangs();\n await getValuesForLangs(langs);\n } catch (err) {\n showErrorDialog(err as any);\n }\n\n setIsLoading(false);\n }\n\n async function getLangs() {\n const results: any[] = (await ConnectionProvider.getHandler().search({\n params: [[\"translatable\", \"=\", \"1\"]],\n fieldsToRetrieve: [\"code\", \"name\"],\n model: \"res.lang\",\n })) as any;\n\n const langs = results.map((item: any) => {\n return {\n code: item.code,\n name: item.name,\n };\n });\n\n setLangs?.(langs);\n return langs;\n }\n\n async function getValuesForLangs(langs: Lang[]) {\n const retrievedValuesForLang: ValuesForLangs = {};\n\n for (const lang of langs) {\n const retrievedValue = (\n await ConnectionProvider.getHandler().readObjects({\n model,\n ids: [id],\n fieldsToRetrieve: [field],\n context: { lang: lang.code },\n })\n )[0];\n retrievedValuesForLang[lang.code] = retrievedValue[field] || \"\";\n }\n\n originalValuesForLangs.current = retrievedValuesForLang;\n setValuesForLangs(retrievedValuesForLang);\n }\n\n function getInputsForLangs() {\n return langs.map((lang: Lang, i: number) => {\n return (\n <Row key={i} style={{ paddingBottom: 20 }}>\n <Col flex=\"8rem\" style={{ paddingRight: 10 }}>\n {lang.name}\n </Col>\n <Col flex=\"auto\">\n <TextArea\n rows={4}\n value={valuesForLangs[lang.code] || \"\"}\n onChange={(event: any) => {\n setValuesForLangs({\n ...valuesForLangs,\n [lang.code]: event.target.value,\n });\n }}\n disabled={submitLoading}\n />\n </Col>\n </Row>\n );\n });\n }\n\n async function onSubmit() {\n setSubmitLoading(true);\n\n try {\n for (const langCode of Object.keys(valuesForLangs)) {\n if (\n valuesForLangs[langCode] !== originalValuesForLangs.current![langCode]\n ) {\n await ConnectionProvider.getHandler().update({\n model,\n id,\n values: { [field]: valuesForLangs[langCode] },\n context: {\n lang: langCode,\n },\n fields: {},\n });\n }\n }\n } catch (err) {\n showErrorDialog(err as any);\n }\n\n setSubmitLoading(false);\n onSubmitSucceed();\n }\n\n function content() {\n if (isLoading) {\n return <Spin />;\n }\n\n return (\n <>\n {getInputsForLangs()}\n <Divider />\n <Row justify=\"end\">\n <Space>\n <Button\n icon={<CloseOutlined />}\n onClick={onCloseModal}\n disabled={submitLoading}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n icon={submitLoading ? <LoadingOutlined /> : <CheckOutlined />}\n disabled={submitLoading}\n onClick={onSubmit}\n style={{ marginLeft: 15 }}\n type=\"primary\"\n >\n {t(\"ok\")}\n </Button>\n </Space>\n </Row>\n </>\n );\n }\n\n return (\n <Modal\n title={t(\"translate\")}\n centered\n width={modalWidth}\n open={visible}\n closable={true}\n onCancel={onCloseModal}\n footer={null}\n destroyOnClose\n maskClosable={false}\n >\n {content()}\n </Modal>\n );\n};\n","import React from \"react\";\nimport { Button, Tooltip, ButtonProps } from \"antd\";\n\nexport type Props = ButtonProps & {\n tooltip: string;\n};\n\nfunction ButtonWithTooltip(props: Props) {\n const { tooltip, ...restProps } = props;\n\n return (\n <Tooltip title={tooltip}>\n <Button {...restProps} />\n </Tooltip>\n );\n}\n\nexport default ButtonWithTooltip;\n","import { Modal } from \"antd\";\n\nconst { info } = Modal;\n\nconst showDialog = (content: any) => {\n info({\n title: \"\",\n centered: true,\n content,\n });\n};\n\nexport default showDialog;\n","import React, { CSSProperties, useContext, useState } from \"react\";\nimport { Col, Input, Row, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport { TranslationModal } from \"../modals/TranslationModal\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { TranslationOutlined } from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport showInfo from \"@/ui/InfoDialog\";\nconst { useToken } = theme;\n\ntype CharProps = WidgetProps & {\n isSearchField?: boolean;\n};\n\nexport const Char = (props: CharProps) => {\n const { ooui, isSearchField = false } = props;\n const { id, readOnly, isPassword, required, translatable } = ooui as CharOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n let input = (\n <Input\n disabled={readOnly || (translatable && !isSearchField)}\n id={id}\n style={requiredStyle}\n maxLength={(ooui as CharOoui).size}\n onBlur={elementHasLostFocus}\n />\n );\n\n if (isPassword) {\n input = (\n <Input.Password\n disabled={readOnly}\n id={id}\n onBlur={elementHasLostFocus}\n />\n );\n }\n\n if (translatable && !readOnly && !isSearchField) {\n input = <TranslatableChar field={id} requiredStyle={requiredStyle} />;\n }\n\n return (\n <Field required={required} {...props}>\n {input}\n </Field>\n );\n};\n\nconst TranslatableChar = ({\n value,\n field,\n requiredStyle,\n onChange,\n}: {\n value?: string;\n field: string;\n requiredStyle: CSSProperties | undefined;\n onChange?: (value: string) => void;\n}) => {\n const formContext = useContext(FormContext) as FormContextType;\n const {\n activeId,\n activeModel,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n } = formContext || {};\n const [translationModalVisible, setTranslationModalVisible] = useState(false);\n const { t } = useLocale();\n\n if (!activeId) {\n return (\n <>\n <Row gutter={8} wrap={false}>\n <Col flex=\"auto\">\n <Input\n value={value}\n id={field}\n style={requiredStyle}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n onBlur={elementHasLostFocus}\n />\n </Col>\n <Col flex=\"none\">\n <ButtonWithTooltip\n tooltip={t(\"translate\")}\n icon={<TranslationOutlined />}\n onClick={async () => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n } else {\n showInfo(t(\"enterTextBeforeTranslate\"));\n }\n }}\n >\n {t(\"translate\")}\n </ButtonWithTooltip>\n </Col>\n </Row>\n </>\n );\n }\n\n return (\n <>\n <div\n onClick={() => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n return;\n }\n\n if (!translationModalVisible) {\n setTranslationModalVisible(true);\n }\n }}\n >\n <Input\n value={value}\n disabled={true}\n id={field}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n onBlur={elementHasLostFocus}\n style={{ cursor: \"pointer\", pointerEvents: \"none\", ...requiredStyle }}\n />\n </div>\n <TranslationModal\n id={activeId!}\n model={activeModel}\n field={field}\n visible={translationModalVisible}\n onCloseModal={() => {\n setTranslationModalVisible(false);\n }}\n onSubmitSucceed={() => {\n setTranslationModalVisible(false);\n fetchValues?.();\n }}\n />\n </>\n );\n};\n","import React from \"react\";\nimport { Select, theme } from \"antd\";\nimport styled from \"styled-components\";\n\nimport Field from \"@/common/Field\";\nimport { Selection as SelectionOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\nconst { Option } = Select;\n\nexport const Selection = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <SelectionInput {...props} />\n </Field>\n );\n};\n\ntype SelectionInputProps = WidgetProps & {\n onChange?: (value: any) => void;\n value?: string;\n};\n\nexport const SelectionInput = (props: SelectionInputProps) => {\n const { ooui, onChange, value } = props;\n const { selectionValues, readOnly, required } = ooui as SelectionOoui;\n\n const values = Array.from(selectionValues.entries());\n\n const options =\n values &&\n values.length &&\n values.map((entry: string[]) => {\n const [key, value] = entry;\n return (\n <Option key={key} value={key}>\n {value}\n </Option>\n );\n });\n\n const CustomSelect: any = required && !readOnly ? RequiredSelect : Select;\n\n return (\n <CustomSelect\n disabled={readOnly}\n onChange={onChange}\n value={value}\n optionFilterProp=\"children\"\n filterOption={(input: string, option: any) =>\n option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0\n }\n showSearch\n >\n {options}\n </CustomSelect>\n );\n};\n\nconst RequiredSelect = styled(Select)`\n &.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n background-color: ${mapToken.colorPrimaryBg};\n }\n`;\n","import React from \"react\";\nimport { Checkbox as AntCheckbox, theme } from \"antd\";\nimport styled from \"styled-components\";\n\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\nexport const Boolean = (props: WidgetProps) => {\n const { ooui } = props;\n const { id, readOnly, required } = ooui;\n\n return (\n <Field {...props} valuePropName=\"checked\">\n <BooleanInput id={id} readOnly={readOnly} required={required} />\n </Field>\n );\n};\n\nconst BooleanInput = (props: any) => {\n const { required, readOnly, ...restProps } = props;\n\n const CustomCheckbox: any =\n required && !readOnly ? RequiredCheckbox : AntCheckbox;\n\n return (\n <div className=\"flex flex-row\">\n <CustomCheckbox disabled={readOnly} {...restProps} />\n </div>\n );\n};\n\nconst RequiredCheckbox = styled(AntCheckbox)`\n .ant-checkbox-inner {\n background-color: ${mapToken.colorPrimaryBg};\n }\n\n .ant-checkbox-checked .ant-checkbox-inner {\n background-color: ${mapToken.colorPrimary};\n }\n`;\n","import { fileTypeFromBuffer } from \"file-type-buffer-browser\";\n\nexport function getFilesize(base64string: string) {\n const buffer = Buffer.from(base64string, \"base64\");\n const inKbs = buffer.length / 1e3;\n return `${Math.round((inKbs + Number.EPSILON) * 100) / 100} KB`;\n}\n\nexport async function getMimeType(base64string: string) {\n const mimeInfo = await fileTypeFromBuffer(\n Buffer.from(base64string, \"base64\"),\n );\n if (!mimeInfo) {\n return {\n mime: \"text/plain\",\n ext: \"txt\",\n };\n }\n\n return mimeInfo;\n}\n\nexport const toBase64 = (file: File): Promise<string> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = (e: any) => resolve(e.target.result.split(\",\")[1]);\n reader.onerror = (error) => reject(error);\n });\n\nexport function openBase64InNewTab(data: string, mimeType: string) {\n const byteCharacters = atob(data);\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n const byteArray = new Uint8Array(byteNumbers);\n const file = new Blob([byteArray], { type: mimeType + \";base64\" });\n const fileURL = URL.createObjectURL(file);\n window.open(fileURL);\n}\n","import React, { useContext, useRef } from \"react\";\nimport { Row, Space } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Image as ImageOoui } from \"@gisce/ooui\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport {\n FolderOpenOutlined,\n DownloadOutlined,\n ClearOutlined,\n} from \"@ant-design/icons\";\n\nimport { toBase64, getMimeType } from \"@/helpers/filesHelper\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n ooui: ImageOoui;\n};\n\nexport const Image = (props: Props) => {\n const { ooui } = props;\n const { required, id } = ooui;\n\n const Icon: React.ElementType = iconMapper(id) as any;\n\n if (Icon) {\n return <Icon />;\n }\n\n return (\n <Field required={required} {...props}>\n <ImageInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface ImageInputProps {\n ooui: ImageOoui;\n value?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport const ImageInput = (props: ImageInputProps) => {\n const { ooui, value, onChange } = props;\n const { readOnly } = ooui as ImageOoui;\n const inputFile = useRef(null);\n const { t } = useLocale();\n\n const triggerChange = (changedValue?: string) => {\n onChange?.(changedValue);\n };\n\n async function downloadFile() {\n const fileType = await getMimeType(value!);\n const linkSource = `data:${fileType?.mime};base64,${value}`;\n const downloadLink = document.createElement(\"a\");\n\n downloadLink.href = linkSource;\n downloadLink.download = `image.${fileType?.ext}`;\n downloadLink.click();\n }\n\n async function onChangeFile(event: any) {\n event.stopPropagation();\n event.preventDefault();\n const file = event.target.files[0];\n const b64: string = await toBase64(file);\n triggerChange(b64);\n }\n\n function clearFile() {\n triggerChange(undefined);\n }\n\n return (\n <>\n <Row gutter={8} wrap={false} justify=\"center\">\n {value && (\n <img\n src={`data:image/*;base64,${value}`}\n style={{ maxWidth: \"100px\" }}\n />\n )}\n <input\n type=\"file\"\n id=\"file\"\n ref={inputFile}\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={onChangeFile}\n />\n </Row>\n <Row gutter={8} wrap={false} justify=\"center\" className=\"pt-5\">\n <Space>\n <ButtonWithTooltip\n tooltip={t(\"uploadNewImage\")}\n icon={<FolderOpenOutlined />}\n disabled={readOnly}\n onClick={() => {\n const fileUploadField = inputFile.current as any;\n fileUploadField.click();\n }}\n />\n <ButtonWithTooltip\n tooltip={t(\"download\")}\n disabled={!value}\n onClick={downloadFile}\n icon={<DownloadOutlined />}\n />\n <ButtonWithTooltip\n tooltip={t(\"clear\")}\n disabled={readOnly || !value}\n onClick={clearFile}\n icon={<ClearOutlined />}\n />\n </Space>\n </Row>\n </>\n );\n};\n","import React from \"react\";\nimport Field from \"@/common/Field\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport { GridUi } from \"@gisce/fiber-diagram\";\n\nexport const FiberGrid = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as CharOoui;\n\n return (\n <Field required={required} {...props}>\n <FiberGridInput />\n </Field>\n );\n};\n\ninterface FiberGridInputProps {\n value?: string;\n onChange?: (value: string) => void;\n}\n\nexport const FiberGridInput = (props: FiberGridInputProps) => {\n const { value, onChange } = props;\n\n if (!value) {\n return null;\n }\n\n // Validate string json\n try {\n JSON.parse(value);\n } catch (e) {\n console.error(e);\n return null;\n }\n\n return (\n <GridUi\n inputJson={value}\n onChange={(newValue) => {\n if (onChange) {\n onChange(newValue);\n }\n }}\n />\n );\n};\n","import {\n Tree as TreeOoui,\n Selection,\n Many2one,\n Boolean,\n Reference,\n} from \"@gisce/ooui\";\nimport { TreeView, Column } from \"@/types\";\n\nconst getTree = (treeView: TreeView): TreeOoui => {\n const xml = treeView.arch;\n const fields = treeView.fields;\n const tree = new TreeOoui(fields);\n tree.parse(xml);\n return tree;\n};\n\nfunction canRenderValue(value: any): boolean {\n return (\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n value === null ||\n value === undefined ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\nconst getTableColumns = (\n tree: TreeOoui,\n components: any,\n context: any,\n): Column[] => {\n const tableColumns = tree.columns.map((column) => {\n const type = column.type;\n const key = column.id;\n const component = components?.[type];\n let render;\n\n if (component) {\n render = (value: any) => {\n return component({ value, key, ooui: column, context });\n };\n } else {\n render = (value: any) => {\n return canRenderValue(value) ? (\n value\n ) : (\n <p style={{ color: \"red\" }}>\n Unsupported widget value for a Tree cell:\n <pre>\n <strong>\n Type: {type} - Value: {JSON.stringify(value)}\n </strong>\n </pre>\n </p>\n );\n };\n }\n\n return {\n key,\n dataIndex: key,\n title: column.label,\n render,\n sorter: (a: any, b: any) => {\n let aItem = a[key] || \"\";\n let bItem = b[key] || \"\";\n\n if (type === \"many2one\") {\n aItem = a[key]?.value || \"\";\n bItem = b[key]?.value || \"\";\n }\n\n if (aItem < bItem) return -1;\n if (aItem > bItem) return 1;\n return 0;\n },\n };\n });\n return tableColumns;\n};\n\nconst getTableItems = (treeOoui: TreeOoui, results: any[]): any[] => {\n const tableItems = results.map((item: any) => {\n const parsedItem: any = {};\n Object.keys(item).forEach((key) => {\n if (key === \"id\") {\n parsedItem[key] = item[key];\n } else {\n const widget = treeOoui.findById(key);\n\n if (widget instanceof Reference) {\n parsedItem[key] = item[key];\n } else if (widget instanceof Selection) {\n parsedItem[key] = item[key];\n } else if (widget instanceof Many2one) {\n parsedItem[key] = item[key] &&\n Array.isArray(item[key]) &&\n item[key].length === 2 && {\n model: widget.relation,\n id: item[key][0],\n value: item[key][1],\n };\n } else if (widget instanceof Boolean) {\n parsedItem[key] = item[key];\n } else if (widget) {\n parsedItem[key] = item[key] === false ? \"\" : item[key];\n } else {\n parsedItem[key] = item[key];\n }\n }\n });\n return parsedItem;\n });\n\n return tableItems;\n};\n\nfunction itemHasBooleans({ values, fields }: { values: any; fields: any }) {\n if (!fields) {\n return false;\n }\n return Object.keys(values).some((key) => {\n return fields[key] !== undefined && fields[key].type === \"boolean\";\n });\n}\n\nfunction convertBooleansToNumeric({\n values,\n fields,\n}: {\n values: any;\n fields: any;\n}) {\n if (!fields) {\n return values;\n }\n const filteredValues: any = {};\n Object.keys(values).forEach((key) => {\n if (fields[key] !== undefined && fields[key].type === \"boolean\") {\n filteredValues[key] = values[key] === true ? 1 : 0;\n }\n });\n return { ...values, ...filteredValues };\n}\n\nfunction getColorMap(colorsValue: any) {\n return getItemsAttributes(colorsValue, \"colors\");\n}\n\nfunction getStatusMap(values: any) {\n return getItemsAttributes(values, \"status\");\n}\n\nfunction getItemsAttributes(attributes: object[], attribute: string) {\n if (!attributes) {\n return undefined;\n }\n const map: any = {};\n attributes.forEach((entry: any) => {\n map[entry.id] = entry[attribute];\n });\n return map;\n}\n\nfunction sortResults({\n resultsToSort,\n sorter,\n fields,\n}: {\n resultsToSort: any[];\n sorter: any;\n fields: any;\n}) {\n if (!sorter) {\n return resultsToSort;\n }\n\n const { id: field, desc } = sorter;\n const order = desc === false ? \"ascend\" : \"descend\";\n\n const type = fields[field].type;\n\n const sortFn = (a: any, b: any) => {\n let aItem = a[field] || \"\";\n let bItem = b[field] || \"\";\n\n if (type === \"many2one\") {\n aItem = a[field]?.[1] || \"\";\n bItem = b[field]?.[1] || \"\";\n }\n\n if (aItem === bItem) {\n return 0;\n }\n\n if (order === \"ascend\") {\n return aItem > bItem ? 1 : -1;\n }\n\n return aItem < bItem ? 1 : -1;\n };\n\n return resultsToSort.sort(sortFn);\n}\n\nfunction hasActualValues(obj: Record<string, any>): boolean {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n if (obj[key] !== undefined) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport {\n getTableColumns,\n getTableItems,\n getTree,\n convertBooleansToNumeric,\n itemHasBooleans,\n getColorMap,\n getStatusMap,\n sortResults,\n hasActualValues,\n};\n","import { One2manyItem } from \"@/widgets/base/one2many/One2manyInput\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { TreeView, View, ViewType } from \"@/types\";\nimport { getColorMap, getTree } from \"./treeHelper\";\n\ntype ReadObjectValuesOptions = {\n items: One2manyItem[];\n model: string;\n context?: any;\n currentView: ViewType;\n formView: {\n fields: any;\n };\n treeView: {\n arch?: string;\n fields: any;\n };\n};\n\nconst readObjectValues = async (\n options: ReadObjectValuesOptions,\n): Promise<[One2manyItem[], any]> => {\n const {\n items,\n model,\n formView,\n treeView,\n context,\n currentView = {},\n } = options;\n\n const operationsToRead = [\"original\", \"pendingLink\"];\n\n const temporalItems: One2manyItem = items.filter(\n (item) => !operationsToRead.includes(item.operation!),\n );\n\n // We get a number array of id's\n const idsToFetch = items\n .filter((item) => operationsToRead.includes(item.operation!))\n .map((item) => item.id) as number[];\n\n const fieldsToRetrieve: { [key: string]: any } = {\n form: formView.fields,\n tree: treeView.fields,\n };\n\n let values = [];\n let evaluatedColorsForTree;\n\n if (currentView === \"tree\" && treeView?.arch) {\n const colors = getTree(treeView as TreeView)?.colors;\n const results = await ConnectionProvider.getHandler().readEvalUiObjects({\n model,\n ids: idsToFetch,\n arch: treeView?.arch!,\n fields: treeView!.fields,\n context,\n attrs: colors && {\n colors,\n },\n });\n values = results[0];\n evaluatedColorsForTree = getColorMap(results[1]);\n } else {\n values = await ConnectionProvider.getHandler().readObjects({\n model,\n ids: idsToFetch,\n fields: fieldsToRetrieve[currentView as string],\n context,\n });\n }\n\n const filteredValues = values.map((result: any) => {\n const resultFormValues: any = {};\n Object.keys(result).forEach((key) => {\n if (\n fieldsToRetrieve[currentView as string].hasOwnProperty(key) ||\n key === \"id\"\n ) {\n resultFormValues[key] = result[key];\n }\n });\n return resultFormValues;\n });\n\n // We fill the values property of the One2manyItem with the retrieved values from the API\n const originalItemsWithFetchedValues: One2manyItem[] = items.map((item) => {\n const fetchedItemValues = filteredValues.find(\n (itemValues: any) => itemValues.id === item.id,\n );\n\n const itemWithFetchedValues = {\n ...item,\n };\n\n if (currentView === \"form\") {\n itemWithFetchedValues[\"values\"] = fetchedItemValues;\n } else if (currentView === \"tree\") {\n itemWithFetchedValues[\"treeValues\"] = fetchedItemValues;\n }\n return itemWithFetchedValues;\n });\n\n return [\n originalItemsWithFetchedValues.concat(temporalItems),\n evaluatedColorsForTree,\n ];\n};\n\ntype RemoveItemOptions = {\n model: string;\n activeId: number;\n fieldName: string;\n idsToRemove: number[];\n fields: any;\n isMany2many: boolean;\n};\n\nconst removeItems = async (options: RemoveItemOptions) => {\n const { model, activeId, fieldName, idsToRemove, fields, isMany2many } =\n options;\n\n const values: any = {};\n values[fieldName] = [];\n\n for (const idToRemove of idsToRemove) {\n values[fieldName].push([isMany2many ? 3 : 2, idToRemove]);\n }\n\n await ConnectionProvider.getHandler().update({\n model,\n id: activeId,\n values,\n fields,\n });\n};\n\ntype LinkItemOptions = {\n model: string;\n activeId: number;\n fieldName: string;\n id: number;\n fields: any;\n};\n\nconst linkItem = async (options: LinkItemOptions) => {\n const { model, activeId, fieldName, id, fields } = options;\n\n const values: any = {};\n values[fieldName] = [[4, id]];\n\n await ConnectionProvider.getHandler().update({\n model,\n id: activeId,\n values,\n fields,\n });\n};\n\nconst getNextPendingId = (items: One2manyItem[]) => {\n const negativeIds: number[] = items\n .filter((item) => item.id && item.id < 0)\n .map((item) => item.id!);\n if (negativeIds.length === 0) {\n return -1;\n } else {\n return Math.min(...negativeIds) - 1;\n }\n};\n\nconst convertToPlain2ManyValues = (values: any, fields: any) => {\n const result: any = {};\n Object.keys(values).forEach((key) => {\n if (\n fields.hasOwnProperty(key) &&\n (fields[key].type === \"one2many\" || fields[key].type === \"many2many\") &&\n values[key] &&\n values[key]?.items\n ) {\n result[key] = values[key].items.filter(\n (item: One2manyItem) => item.operation !== \"pendingRemove\",\n );\n } else {\n result[key] = values[key];\n }\n });\n return result;\n};\n\nexport const convertFrom2ManyRawValues = ({\n values,\n fields,\n}: {\n values: any;\n fields: any;\n}) => {\n const formattedValues: any = {};\n\n Object.keys(values).forEach((key) => {\n if (\n Object.prototype.hasOwnProperty.call(fields, key) &&\n (fields[key].type === \"one2many\" || fields[key].type === \"many2many\") &&\n values[key] &&\n !values[key]?.items &&\n Array.isArray(values[key])\n ) {\n const itemsId = values[key];\n formattedValues[key] = {\n items: itemsId.map((itemId: number) => ({\n operation: \"pendingLink\",\n id: itemId,\n })),\n };\n } else {\n formattedValues[key] = values[key];\n }\n });\n return formattedValues;\n};\n\nfunction filterDuplicateItems(items: any) {\n const ids = items.map((o: any) => o.id);\n const filtered = items.filter((item: any, index: number) => {\n const { id } = item;\n return !ids.includes(id, index + 1);\n });\n return filtered;\n}\n\nfunction getValuesForFields({\n values,\n fields,\n}: {\n values: any;\n fields: string[];\n}) {\n const result: any = {};\n fields.forEach((field) => {\n if (values[field]) {\n result[field] = values[field];\n }\n });\n return result;\n}\n\nexport {\n readObjectValues,\n removeItems,\n linkItem,\n getNextPendingId,\n convertToPlain2ManyValues,\n filterDuplicateItems,\n getValuesForFields,\n};\n","import React, { useContext, useState } from \"react\";\nimport { Timeline as TimelineOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { One2manyItem, One2manyValue } from \"../base/one2many/One2manyInput\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { Views, ViewType } from \"@/types\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Spin, Alert, Timeline as AntTimeline } from \"antd\";\nimport { readObjectValues } from \"@/helpers/one2manyHelper\";\nimport { FormModal } from \"../modals/FormModal\";\n\ntype TimelineProps = {\n ooui: TimelineOoui;\n};\n\ntype TimelineInputProps = TimelineProps & {\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n views: Views;\n};\n\nexport const Timeline = (props: TimelineProps) => {\n const { ooui } = props;\n const { relation, context, views: oouiViews } = ooui;\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<string>();\n const [views, setViews] = useState<Views>(new Map<string, any>());\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [ooui]);\n\n const getViewData = async (type: ViewType) => {\n if (oouiViews && oouiViews[type]) {\n return oouiViews[type];\n }\n return await ConnectionProvider.getHandler().getView({\n model: relation,\n type,\n context: { ...getContext?.(), ...context },\n });\n };\n\n const fetchData = async () => {\n setIsLoading(true);\n setError(undefined);\n\n try {\n const formView = await getViewData(\"form\");\n const treeView = await getViewData(\"tree\");\n views.set(\"form\", formView);\n views.set(\"tree\", treeView);\n setViews(views);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (isLoading) {\n return <Spin />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <Field type={\"array\"} {...props}>\n <TimelineInput ooui={ooui} views={views} />\n </Field>\n );\n};\n\nexport const TimelineInput = (props: TimelineInputProps) => {\n const { value, views, ooui, onChange } = props;\n const { items = [] } = value || {};\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [modalItem, setModalItem] = useState<One2manyItem>();\n const { relation, context, readOnly, summaryField, titleField } = ooui;\n const itemsToShow = items.filter((item) => item.values);\n\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [items]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n items: changedValue,\n });\n };\n\n async function fetchData() {\n setIsLoading(true);\n setError(undefined);\n\n try {\n const [itemsWithValues] = await readObjectValues({\n treeView: {\n fields: views.get(\"tree\").fields,\n arch: views.get(\"tree\").arch,\n },\n formView: {\n fields: views.get(\"form\").fields,\n },\n model: relation,\n items,\n context: { ...getContext?.(), ...context },\n currentView: \"form\",\n });\n\n triggerChange(itemsWithValues);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoading(false);\n }\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n if (isLoading) {\n return <Spin />;\n }\n\n return (\n <>\n <AntTimeline style={{ padding: \"1rem\" }}>\n {itemsToShow.map((item, index) => {\n return (\n <div key={index}>\n <AntTimeline.Item key={index}>\n <div\n style={{ display: \"inline-block\", cursor: \"pointer\" }}\n onClick={() => {\n setModalItem(\n itemsToShow.find(\n (searchItem) => item.id === searchItem.id,\n ),\n );\n setShowFormModal(true);\n }}\n >\n <strong>{item.values?.[titleField]}</strong>\n </div>\n <br />\n <div\n style={{ display: \"inline-block\", cursor: \"pointer\" }}\n onClick={() => {\n setModalItem(\n itemsToShow.find(\n (searchItem) => item.id === searchItem.id,\n ),\n );\n setShowFormModal(true);\n }}\n >\n {item.values?.[summaryField]}\n </div>\n </AntTimeline.Item>\n </div>\n );\n })}\n </AntTimeline>\n <FormModal\n formView={views.get(\"form\")}\n model={relation}\n id={modalItem?.id}\n values={modalItem?.values}\n defaultValues={modalItem?.defaultValues}\n visible={showFormModal}\n onSubmitSucceed={() => {\n setShowFormModal(false);\n }}\n parentContext={{ ...getContext?.(), ...context }}\n onCancel={() => {\n setShowFormModal(false);\n }}\n readOnly={readOnly}\n postSaveAction={fetchData}\n />\n </>\n );\n};\n","export default {\n true: \"Sí\",\n false: \"No\",\n simple_search: \"Búsqueda simple\",\n advanced_search: \"Búsqueda avançada\",\n search: \"Buscar\",\n parameters: \"Paràmetres\",\n limit: \"Limit\",\n first: \"Primer\",\n no_results: \"No hi ha resultats\",\n summary:\n \"Mostrant resultats des de {from} fins {to} d'un total de {total} registres\",\n welcome: \"Benvingut\",\n attachments: \"Adjunts\",\n addNewAttachment: \"Afegir nou adjunt\",\n listAllAttachments: \"Veure tots els adjunts\",\n viewAs: \"Veure com\",\n confirmRemoveItem: \"Estàs segur de volguer eliminar aquest item?\",\n save: \"Desar\",\n delete: \"Eliminar\",\n refresh: \"Refrescar\",\n previous: \"Anterior\",\n next: \"Següent\",\n actions: \"Accions\",\n reports: \"Informes\",\n related: \"Relacionat\",\n new: \"Nou\",\n fillRequiredField: \"Siusplau, omple aquest camp obligatori\",\n fillRequiredFields: \"Siusplau, omple tots els camps obligatoris\",\n generatingReport: \"Generant informe...\",\n confirmation: \"Confirmació\",\n ok: \"D'acord\",\n cancel: \"Cancel·lar\",\n formHasErrors: \"El formulari té errors\",\n unsavedChanges: \"Hi ha canvis sense guardar\",\n confirmRefreshWithoutSave:\n \"Estàs segur de volguer refrescar la pàgina sense guardar els canvis?\",\n discardAndRefresh: \"Descarta els canvis i refresca\",\n removeItems: \"Elimina el registre/s\",\n confirmRemove: \"Estàs segur de volguer eliminar els registre/s seleccionats?\",\n yesConfirmRemove: \"Sí, elimina\",\n unlinkItems: \"Desenllaça registre/s\",\n confirmUnlink:\n \"Estàs segur de volguer desenllaçar els registre/s seleccionats?\",\n yesConfirmUnlink: \"Sí, desenllaça\",\n confirmCloseWithoutSave:\n \"Estàs segur de volguer tancar aquesta finestra sense guardar?\",\n closeWithoutSaving: \"Tancar sense guardar\",\n action: \"Acció\",\n report: \"Informe\",\n selectAction: \"Selecciona una acció\",\n download: \"Descarrega\",\n clear: \"Neteja\",\n open: \"Obre\",\n uploadNewImage: \"Puja una nova imatge\",\n noCurrentEntries: \"No hi ha registres\",\n duplicate: \"Duplicar\",\n downloadingAttachment: \"Descarregant adjunt...\",\n tree: \"llista\",\n form: \"formulari\",\n favorites: \"Els meus favorits\",\n edit_favorites: \"Edita els favorits\",\n no_favorites: \"No tens favorits guardats\",\n register: \"Registre\",\n of: \"de\",\n editingDocument: \"Editant document\",\n showLogs: \"Veure logs\",\n createdBy: \"Creat per l'usuari\",\n creationDate: \"Data creació\",\n lastUpdatedBy: \"Última modificació per\",\n lastUpdatedDate: \"Data última modificació\",\n goToResourceId: \"Vés al recurs amb ID\",\n searchId: \"ID de cerca:\",\n searchIdHelp: \"Es pot utiltizar un ID o una llista d'IDs separats per comes\",\n idNotFound: \"No es troba aquesta id de recurs per l'objecte\",\n selectedRegisters: \"registres seleccionats\",\n translate: \"Traduïr\",\n enterTextBeforeTranslate:\n \"Introdueix algun text al camp abans d'afegir traduccions\",\n saveBeforeTranslate:\n \"Heu de desar el registre abans d'afegir les traduccions\",\n configDashboard: \"Configurar panell\",\n moveDashboard: \"Moure items del panell\",\n openAttachment: \"Veure detall de l'adjunt\",\n openAttachmentLink: \"Obrir enllaç de l'adjunt\",\n uninformed: \"Sense informar\",\n totalRegisters: \"Registres totals:\",\n total: \"Total:\",\n export: \"Exportar\",\n selectAtLeastOneField: \"Selecciona almenys un camp per a l'exportació\",\n printScreen: \"Imprimir pantalla\",\n advancedExport: \"Exportació avançada\",\n savedRegisters: \"Registre guardat correctament\",\n errorWhileSavingForm: \"Error en guardar el formulari\",\n autor: \"Autor\",\n recordsSelected:\n \"Hi ha {numberOfSelectedRows} registres seleccionats en aquesta pàgina.\",\n selectAllRecords: \"Seleccionar tots els {totalRecords} registres.\",\n allRecordsSelected: \"Hi ha {totalRecords} registres seleccionats.\",\n openInSameWindow: \"Obrir en la pestanya actual\",\n openInNewTab: \"Obrir en una nova pestanya\",\n};\n","export default {\n true: \"Yes\",\n false: \"No\",\n simple_search: \"Simple search\",\n advanced_search: \"Advanced search\",\n search: \"Search\",\n parameters: \"Parameters\",\n limit: \"Limit\",\n first: \"First\",\n no_results: \"No results\",\n summary: \"Showing registers from {from} to {to} of {total} registers\",\n welcome: \"Welcome\",\n attachments: \"Attachments\",\n addNewAttachment: \"Add new attachment\",\n listAllAttachments: \"View all the attachments\",\n viewAs: \"View as\",\n confirmRemoveItem: \"Are you sure to remove this item?\",\n save: \"Save\",\n delete: \"Delete\",\n refresh: \"Refresh\",\n previous: \"Previous\",\n next: \"Next\",\n actions: \"Actions\",\n reports: \"Reports\",\n related: \"Related\",\n new: \"New\",\n fillRequiredField: \"Please fill this required field\",\n fillRequiredFields: \"Please fill all the required fields\",\n generatingReport: \"Generating report...\",\n confirmation: \"Confirmation\",\n ok: \"OK\",\n cancel: \"Cancel\",\n formHasErrors: \"Form has errors\",\n unsavedChanges: \"There are unsaved changes\",\n confirmRefreshWithoutSave:\n \"Do you really want to refresh this window without saving?\",\n discardAndRefresh: \"Discard changes and refresh\",\n removeItems: \"Remove item/s\",\n confirmRemove: \"Are you sure you want to remove the selected item/s?\",\n yesConfirmRemove: \"Yes, remove\",\n unlinkItems: \"Unlink item/s\",\n confirmUnlink: \"Are you sure you want to unlink the selected item/s?\",\n yesConfirmUnlink: \"Yes, unlink\",\n confirmCloseWithoutSave:\n \"Do you really want to close this window without saving?\",\n closeWithoutSaving: \"Close without saving\",\n action: \"Action\",\n report: \"Report\",\n selectAction: \"Select an action\",\n download: \"Download\",\n clear: \"Clear\",\n open: \"Open\",\n uploadNewImage: \"Upload new image\",\n noCurrentEntries: \"No current entries\",\n duplicate: \"Duplicate\",\n downloadingAttachment: \"Downloading attachment...\",\n tree: \"list\",\n form: \"form\",\n favorites: \"My shortcuts\",\n edit_favorites: \"Edit shortcuts\",\n no_favorites: \"You don't have any shortcuts saved yet\",\n register: \"Register\",\n of: \"of\",\n editingDocument: \"Editing document\",\n showLogs: \"Show logs\",\n createdBy: \"Created by user\",\n creationDate: \"Creation date\",\n lastUpdatedBy: \"Last modified by\",\n lastUpdatedDate: \"Date of last modification\",\n goToResourceId: \"Go to resource ID\",\n searchId: \"Search ID:\",\n searchIdHelp: \"You can use an ID or a list of IDs separated by commas.\",\n idNotFound: \"Resource ID does not exist for this object!\",\n selectedRegisters: \"selected registers\",\n translate: \"Translate\",\n enterTextBeforeTranslate:\n \"Enter some text to the related field before adding translations\",\n saveBeforeTranslate: \"You must save the record before adding translations\",\n configDashboard: \"Setup dashboard\",\n moveDashboard: \"Move dashboard items\",\n openAttachment: \"Open attachment detail\",\n openAttachmentLink: \"Open attachment link\",\n uninformed: \"Uninformed\",\n totalRegisters: \"Total registers:\",\n total: \"Total:\",\n export: \"Export\",\n selectAtLeastOneField: \"Select at least one field for the export\",\n printScreen: \"Print screen\",\n advancedExport: \"Advanced export\",\n savedRegisters: \"Record successfully saved\",\n errorWhileSavingForm: \"Error while saving form\",\n author: \"Author\",\n recordsSelected:\n \"Hi ha {numberOfSelectedRows} registres seleccionats en aquesta pàgina.\",\n selectAllRecords: \"Seleccionar tots els {totalRecords} registres.\",\n allRecordsSelected: \"Hi ha {totalRecords} registres seleccionats.\",\n openInSameWindow: \"Open in the current tab\",\n openInNewTab: \"Open in a new tab\",\n};\n","export default {\n true: \"Sí\",\n false: \"No\",\n simple_search: \"Búsqueda simple\",\n advanced_search: \"Búsqueda avanzada\",\n search: \"Buscar\",\n parameters: \"Parametros\",\n limit: \"Límite\",\n first: \"Primero\",\n no_results: \"No hay resultados\",\n summary:\n \"Mostrando resultado desde {from} hasta {to} de un total de {total} registros\",\n welcome: \"Bienvenido\",\n attachments: \"Adjuntos\",\n addNewAttachment: \"Añadir nuevo adjunto\",\n listAllAttachments: \"Ver todos los adjuntos\",\n viewAs: \"Ver cómo\",\n confirmRemoveItem: \"Estás seguro de querer eliminar éste registro?\",\n save: \"Guardar\",\n delete: \"Eliminar\",\n refresh: \"Refrescar\",\n previous: \"Anterior\",\n next: \"Siguiente\",\n actions: \"Acciones\",\n reports: \"Informes\",\n related: \"Relacionado\",\n new: \"Nuevo\",\n fillRequiredField: \"Por favor, rellena éste campo obligatorio\",\n fillRequiredFields: \"Por favor, rellena todos los campos obligatorios\",\n generatingReport: \"Generando informe...\",\n confirmation: \"Confirmación\",\n ok: \"De acuerdo\",\n cancel: \"Cancelar\",\n formHasErrors: \"El formulario tiene errores\",\n unsavedChanges: \"Hay cambios sin guardar\",\n confirmRefreshWithoutSave:\n \"Estás seguro de querer refrescar la página sin guardar los cambios?\",\n discardAndRefresh: \"Descarta los cambios y refresca\",\n removeItems: \"Eliminar el registro/s\",\n confirmRemove:\n \"Estás seguro de querer eliminar los registro/s seleccionados?\",\n yesConfirmRemove: \"Sí, elimina\",\n unlinkItems: \"Desenlaza registro/s\",\n confirmUnlink:\n \"Estás seguro de querer desenlazar los registro/s seleccionados?\",\n yesConfirmUnlink: \"Sí, desenlaza\",\n confirmCloseWithoutSave:\n \"Estás seguro de querer cerrar ésta ventana sin cerrar?\",\n closeWithoutSaving: \"Cerrar sin guardar\",\n action: \"Acción\",\n report: \"Informe\",\n selectAction: \"Selecciona una acción\",\n download: \"Descarga\",\n clear: \"Limpiar\",\n open: \"Abrir\",\n uploadNewImage: \"Subir una nueva imágen\",\n noCurrentEntries: \"No hay registros\",\n duplicate: \"Duplicar\",\n downloadingAttachment: \"Descargando adjunto...\",\n tree: \"lista\",\n form: \"formulario\",\n favorites: \"Mis favoritos\",\n edit_favorites: \"Edita los favoritos\",\n no_favorites: \"No tienes favoritos guardados\",\n register: \"Registro\",\n of: \"de\",\n editingDocument: \"Editando documento\",\n showLogs: \"Ver logs\",\n createdBy: \"Creado por el usuario\",\n creationDate: \"Fecha creación\",\n lastUpdatedBy: \"Última modificación por\",\n lastUpdatedDate: \"Fecha última modificación\",\n goToResourceId: \"Ir al recurso con ID\",\n searchId: \"ID de búsqueda:\",\n searchIdHelp:\n \"Se puede utilizar un ID o una lista de IDs separados por comas\",\n idNotFound: \"No se encuentra ésta ID de recursos para el objeto\",\n selectedRegisters: \"registros seleccionados\",\n translate: \"Traducir\",\n enterTextBeforeTranslate:\n \"Introduce algun texto en el campo antes de añadir traducciones\",\n saveBeforeTranslate:\n \"Tienes que guardar el registro antes de añadir las traducciones\",\n configDashboard: \"Configurar panel\",\n moveDashboard: \"Mover items del panel\",\n openAttachment: \"Ver detalle del adjunto\",\n openAttachmentLink: \"Abrir enlace del adjunto\",\n uninformed: \"Sin informar\",\n totalRegisters: \"Registros totales:\",\n total: \"Total:\",\n export: \"Exportar\",\n selectAtLeastOneField: \"Selecciona al menos un campo para la exportación\",\n printScreen: \"Imprimir pantalla\",\n advancedExport: \"Exportación avanzada\",\n savedRegisters: \"Registro guardado correctamente\",\n errorWhileSavingForm: \"Error al guardar el formulario\",\n author: \"Autor\",\n recordsSelected:\n \"Hay {numberOfSelectedRows} registros seleccionados en ésta página.\",\n selectAllRecords: \"Seleccionar todos los {totalRecords} registros.\",\n allRecordsSelected: \"Hay {totalRecords} registros seleccionados.\",\n openInSameWindow: \"Abrir en la pestaña actual\",\n openInNewTab: \"Abrir en una nueva pestaña\",\n};\n","import ca_ES from \"@/locales/ca_ES\";\nimport en_US from \"@/locales/en_US\";\nimport es_ES from \"@/locales/es_ES\";\nimport { Strings } from \"@gisce/react-formiga-components\";\n\nexport const strings: Strings = {\n ca_ES,\n en_US,\n es_ES,\n};\n","import React, { memo, useContext, useMemo } from \"react\";\nimport { ErpFeatureKeys, ErpFeaturesMap } from \"@/models/erpFeature\";\nimport {\n FormigaConfigProvider,\n Locale,\n Strings,\n mergeStrings,\n} from \"@gisce/react-formiga-components\";\nimport { strings } from \"@/locales\";\n\ntype ConfigContextProps = ConfigContextValues & {\n locale: Locale;\n localizedStrings?: Strings;\n};\n\ntype ConfigContextValues = {\n erpFeatures: ErpFeaturesMap;\n globalValues?: Record<string, any>;\n rootContext?: Record<string, any>;\n devMode?: boolean;\n};\n\nconst defaultConfigContext: ConfigContextValues = {\n erpFeatures: {},\n globalValues: {},\n rootContext: {},\n devMode: false,\n};\n\nexport const ConfigContext =\n React.createContext<ConfigContextValues>(defaultConfigContext);\n\nexport const useConfigContext = () => {\n const context = useContext(ConfigContext);\n\n if (!context) {\n throw new Error(\n \"useConfigContext must be used within a ConfigContextProvider\",\n );\n }\n\n return context;\n};\n\nexport const useFeatureIsEnabled = (featureKey: ErpFeatureKeys): boolean => {\n const { erpFeatures } = useConfigContext();\n return !!erpFeatures[featureKey];\n};\n\nexport const ConfigContextProvider = memo(\n ({\n erpFeatures,\n locale,\n localizedStrings = {},\n globalValues,\n rootContext,\n devMode,\n children,\n }: ConfigContextProps & { children?: React.ReactNode }) => {\n const providerValue = useMemo(\n () => ({\n erpFeatures,\n globalValues,\n rootContext,\n devMode,\n }),\n [erpFeatures, globalValues, rootContext, devMode],\n );\n\n return (\n <ConfigContext.Provider value={providerValue}>\n <FormigaConfigProvider\n locale={locale}\n localizedStrings={mergeStrings(strings, localizedStrings)}\n >\n {children}\n </FormigaConfigProvider>\n </ConfigContext.Provider>\n );\n },\n);\nConfigContextProvider.displayName = \"ConfigContextProvider\";\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { parseContext } from \"@gisce/ooui\";\nimport { nanoid } from \"nanoid\";\n\nexport async function fetchAction({\n actionId,\n rootContext = {},\n globalValues = {},\n}: {\n actionId: number;\n rootContext?: any;\n globalValues?: any;\n}): Promise<any> {\n const actionType = \"ir.actions.act_window\";\n const action = `${actionType},${actionId}`;\n\n const dataForAction = await ConnectionProvider.getHandler().getActionData({\n action,\n context: rootContext,\n });\n\n const parsedContext = parseContext({\n context: dataForAction.context,\n values: globalValues,\n fields: {},\n });\n\n const parsedDomain = dataForAction.domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain: dataForAction.domain,\n values: globalValues,\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n const {\n res_model: model,\n views,\n name: title,\n limit,\n view_type,\n } = dataForAction;\n const treeExpandable = view_type === \"tree\";\n\n const finalViews = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n\n if (!id) {\n const { view_id } = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context: { ...rootContext, ...parsedContext },\n });\n finalViews.push([view_id, viewType]);\n } else {\n finalViews.push(viewArray);\n }\n }\n\n const [id, type] = finalViews[0];\n const initialView = { id, type };\n\n return {\n title,\n actionId,\n actionType,\n key: nanoid(),\n views,\n model,\n context: { ...rootContext, ...parsedContext },\n domain: parsedDomain,\n initialView,\n limit,\n treeExpandable,\n };\n}\n","import { useContext, useEffect, useMemo, useState } from \"react\";\nimport { useConfigContext } from \"@/context/ConfigContext\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { fetchAction } from \"@/widgets/views/Dashboard/dashboardHelper\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\n\nexport const useFormGraphData = (actionId: number) => {\n const [error, setError] = useState<any>();\n const [loading, setLoading] = useState<boolean>(true);\n const [actionData, setActionData] = useState<any>();\n const [treeShortcut, setTreeShortcut] = useState<ShortcutApi>();\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext, getValues, activeId } = formContext || {};\n const { globalValues, rootContext } = useConfigContext();\n const context = useMemo(() => {\n return { ...getContext?.(), ...rootContext };\n }, [getContext, rootContext]);\n\n const fetchData = async () => {\n setError(undefined);\n setLoading(true);\n try {\n const result = await fetchAction({\n actionId,\n rootContext: context,\n globalValues: {\n ...globalValues,\n ...getValues(),\n },\n });\n const { views } = result as any;\n\n const treeView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"tree\";\n });\n if (treeView) {\n const [id, type] = treeView;\n const {\n actionId: action_id,\n actionType: action_type,\n title: name,\n model: res_model,\n } = result;\n\n setTreeShortcut({\n action_id,\n action_type,\n name,\n res_id: false,\n res_model,\n view_id: id,\n view_type: type,\n overrideUnsettedLimit: true,\n values: {\n active_id: activeId,\n active_ids: [activeId],\n },\n });\n }\n setActionData(result);\n } catch (err) {\n setError(err);\n }\n setLoading(false);\n };\n\n return { actionData, treeShortcut, loading, error, fetchData };\n};\n","import { Spin } from \"antd\";\n\nexport const CenteredSpinner = () => {\n return (\n <div\n style={{\n width: \"100%\",\n display: \"flex\",\n height: \"100%\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <Spin />\n </div>\n );\n};\n","import { parseError } from \"@/helpers/errorHelper\";\nimport { Alert } from \"antd\";\nimport React from \"react\";\nimport { Interweave } from \"interweave\";\n\nexport const ErrorAlert = ({\n error,\n className,\n}: {\n error: any;\n className?: string;\n}) => {\n let messageContent;\n let messageType = \"error\";\n\n if (\n typeof error === \"string\" &&\n error.indexOf(\" -- \") !== -1 &&\n error.indexOf(\"\\n\\n\") !== -1\n ) {\n const { message, type, title } = parseError(error);\n messageContent = <Interweave content={`${title}<br />${message}`} />;\n messageType = type;\n } else {\n messageContent = error.message\n ? JSON.stringify(error.message)\n : JSON.stringify(error);\n }\n return (\n <Alert\n className={className}\n message={messageContent}\n type={messageType as any}\n banner\n />\n );\n};\n","import { nanoid } from \"nanoid\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nexport const useNetworkRequest = (\n fn: (payload: any, requestConfig: any) => Promise<any>,\n): [(payload: any) => Promise<any>, (requestId?: string) => void] => {\n const abortControllersRef = useRef<Map<string, AbortController>>(new Map());\n\n useEffect(() => {\n return () => {\n cancelRequest();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const fetchData = useCallback(\n async (payload: any, manualRequestId?: string) => {\n const requestId = manualRequestId || nanoid();\n if (abortControllersRef.current.has(requestId)) {\n abortControllersRef.current.get(requestId)?.abort();\n }\n\n const abortController = new AbortController();\n abortControllersRef.current.set(requestId, abortController);\n\n try {\n return await fn(payload, {\n signal: abortController.signal,\n });\n } finally {\n abortControllersRef.current.delete(requestId);\n }\n },\n [fn],\n );\n\n const cancelRequest = useCallback((requestId?: string) => {\n if (requestId) {\n abortControllersRef.current.get(requestId)?.abort();\n abortControllersRef.current.delete(requestId);\n } else {\n abortControllersRef.current.forEach((controller) => controller.abort());\n abortControllersRef.current.clear();\n }\n }, []);\n\n return [fetchData, cancelRequest];\n};\n","import { useState } from \"react\";\nimport Measure from \"react-measure\";\nimport Title from \"antd/lib/typography/Title\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { Col, Row } from \"antd\";\n\nconst fontGrowFactor = 0.7;\nconst minFontSize = 30;\n\nexport type GraphIndicatorCompProps = {\n value: number;\n totalValue?: number;\n percent?: number;\n color?: string;\n icon?: string;\n suffix?: string;\n showPercent?: boolean;\n};\n\nexport const GraphIndicatorComp = (props: GraphIndicatorCompProps) => {\n const [height, setHeight] = useState<number>(0);\n const [width, setWidth] = useState<number>(0);\n\n const { value, totalValue, percent, color, icon, suffix, showPercent } =\n props;\n\n return (\n <Measure\n bounds\n onResize={(contentRect) => {\n setHeight(contentRect.bounds?.height!);\n setWidth(contentRect.bounds?.width!);\n }}\n >\n {({ measureRef }) => {\n if (showPercent) {\n return (\n <PercentageIndicator\n value={value!}\n total={totalValue!}\n percent={percent!}\n measureRef={measureRef}\n height={height}\n width={width}\n color={color}\n icon={icon}\n suffix={suffix}\n />\n );\n } else {\n return (\n <CommonIndicator\n value={value!}\n total={totalValue}\n measureRef={measureRef}\n height={height}\n width={width}\n color={color}\n icon={icon}\n suffix={suffix}\n />\n );\n }\n }}\n </Measure>\n );\n};\n\nfunction getTextWidth(text: string, font: string) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n\n context!.font = font || getComputedStyle(document.body).font;\n return context!.measureText(text).width;\n}\n\nfunction CommonIndicator({\n measureRef,\n width,\n height,\n total,\n value,\n color,\n icon,\n suffix,\n}: {\n measureRef: any;\n width: number;\n height: number;\n total: number | undefined;\n value: number;\n color: string | undefined;\n icon?: string;\n suffix?: string;\n}) {\n let fontSize =\n height * fontGrowFactor < minFontSize\n ? minFontSize\n : height * fontGrowFactor;\n\n const localeValue = value?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n\n const totalValue = total?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n\n let finalValue = total ? `${localeValue}/${totalValue}` : `${localeValue}`;\n\n if (suffix) {\n finalValue += \" \" + suffix;\n }\n\n let tw = getTextWidth(\n finalValue,\n `bold ${Math.floor(fontSize * 1.03)}px sans-serif`,\n );\n\n if (icon) {\n tw = tw * 2;\n }\n\n if (tw >= width * 0.85) {\n const maxFontSize = ((width * 0.85) / tw) * fontSize;\n fontSize = maxFontSize;\n }\n\n const IconElement: any =\n icon && iconMapper(icon, { style: { fontSize: fontSize * 0.7 } });\n\n return (\n <div\n ref={measureRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n }}\n >\n <Title style={{ fontSize, margin: 0, color }}>\n {IconElement && <IconElement style={{ fontSize: fontSize * 0.7 }} />}\n {IconElement ? ` ${finalValue}` : finalValue}\n </Title>\n </div>\n );\n}\n\nfunction PercentageIndicator({\n measureRef,\n height,\n width,\n percent,\n total,\n value,\n color,\n icon,\n suffix,\n}: {\n measureRef: any;\n height: number;\n width: number;\n percent: number;\n total: number;\n value: number;\n color: string | undefined;\n icon?: string;\n suffix?: string;\n}) {\n const twoLinesHeight = height * 0.65;\n let fontSize =\n twoLinesHeight * fontGrowFactor < minFontSize\n ? minFontSize\n : twoLinesHeight * fontGrowFactor;\n\n const localeValue = value?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n\n let finalValue = total\n ? `${localeValue}/${total?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}`\n : `${localeValue}`;\n\n if (suffix) {\n finalValue += \" \" + suffix;\n }\n\n const percentValue = `${percent?.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}%`;\n\n let tw = getTextWidth(\n percentValue,\n `bold ${Math.floor(fontSize * 1.03)}px sans-serif`,\n );\n\n if (icon) {\n tw = tw * 1.5;\n }\n\n if (tw >= width * 0.85 || fontSize * 2 < twoLinesHeight) {\n const maxFontSize = ((width * 0.85) / tw) * fontSize;\n fontSize = maxFontSize;\n }\n\n const IconElement: any = icon && iconMapper(icon, { style: { fontSize } });\n\n return (\n <div\n ref={measureRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n flexDirection: \"column\",\n padding: \"0.2rem\",\n }}\n >\n <Row align={\"middle\"}>\n {IconElement && (\n <Col style={{ fontSize: fontSize * 1, color, paddingRight: \"10px\" }}>\n <IconElement />\n </Col>\n )}\n <Col>\n <Title style={{ fontSize: fontSize * 0.8, margin: 0, color }}>\n {IconElement ? ` ${percent}%` : `${percent}%`}\n </Title>\n <Title\n style={{\n fontSize: fontSize * 0.4,\n margin: 0,\n color,\n textAlign: \"center\",\n }}\n >\n {finalValue}\n </Title>\n </Col>\n </Row>\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Alert } from \"antd\";\nimport { Operator, graphProcessor } from \"@gisce/ooui\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { GraphIndicatorComp } from \"./GraphIndicatorComp\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nconst { getValueForOperator } = graphProcessor;\n\nexport type GraphInidicatorProps = {\n model: string;\n domain: any;\n context: any;\n colorCondition?: string | null;\n totalDomain?: string;\n showPercent?: boolean;\n icon?: string;\n suffix?: string;\n field?: string;\n operator?: Operator;\n manualIds?: number[];\n};\n\nexport const GraphIndicator = (props: GraphInidicatorProps) => {\n const {\n model,\n domain,\n context,\n colorCondition,\n totalDomain,\n showPercent = false,\n icon: iconProps,\n suffix,\n field,\n operator,\n manualIds,\n } = props;\n const [loading, setLoading] = useState(false);\n const [value, setValue] = useState<number>();\n const [percent, setPercent] = useState<number>();\n const [totalValue, setTotalValue] = useState<number>();\n const [color, setColor] = useState<string>();\n const [icon, setIcon] = useState<string>();\n const [error, setError] = useState<string>();\n\n const [searchAllIds] = useNetworkRequest(\n ConnectionProvider.getHandler().searchAllIds,\n );\n const [readObjects] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n const [searchCount] = useNetworkRequest(\n ConnectionProvider.getHandler().searchCount,\n );\n const [evalDomain] = useNetworkRequest(\n ConnectionProvider.getHandler().evalDomain,\n );\n const [parseCondition] = useNetworkRequest(\n ConnectionProvider.getHandler().parseCondition,\n );\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model, colorCondition]);\n\n async function fetchValue({\n domain,\n isTotal,\n }: {\n domain: any;\n isTotal: boolean;\n }) {\n if (isTotal) {\n return await fetchTotalValue({ domain });\n }\n\n if (field && operator) {\n const resultIds =\n manualIds ||\n (await searchAllIds({\n params: domain,\n model,\n context,\n }));\n\n const results = await readObjects({\n model,\n ids: resultIds,\n fieldsToRetrieve: [field],\n context,\n });\n\n return getValueForOperator({\n values: results.map((r: any) => r[field]),\n operator,\n });\n } else {\n return manualIds\n ? manualIds.length\n : await searchCount({\n model,\n params: domain,\n context,\n });\n }\n }\n\n async function fetchTotalValue({ domain }: { domain: any }) {\n if (field && operator) {\n const resultIds = await searchAllIds({\n params: domain,\n model,\n context,\n });\n\n const results = await readObjects({\n model,\n ids: resultIds,\n fieldsToRetrieve: [field],\n context,\n });\n\n return getValueForOperator({\n values: results.map((r: any) => r[field]),\n operator,\n });\n } else {\n return await searchCount({\n model,\n params: domain,\n context,\n });\n }\n }\n async function fetchData() {\n setLoading(true);\n setError(undefined);\n let totalRetrievedValue;\n let percent;\n\n try {\n const retrievedValue = await fetchValue({ domain, isTotal: false });\n\n setValue(retrievedValue);\n\n if (totalDomain) {\n const parsedDomain = await evalDomain({\n domain: totalDomain,\n values: {},\n context,\n });\n totalRetrievedValue = await fetchValue({\n domain: parsedDomain,\n isTotal: true,\n });\n\n setTotalValue(totalRetrievedValue);\n }\n\n if (totalRetrievedValue) {\n percent =\n Math.round((retrievedValue / totalRetrievedValue) * 100 * 100) / 100;\n setPercent(percent);\n } else {\n setPercent(0);\n }\n\n if (colorCondition) {\n const conditionEval = await parseCondition({\n condition: colorCondition,\n values: { value: retrievedValue, percent },\n context,\n });\n setColor(conditionEval);\n }\n\n if (iconProps) {\n if (iconProps.indexOf(\":\") !== -1) {\n const iconEval = await parseCondition({\n condition: iconProps,\n values: { value: retrievedValue, percent },\n context,\n });\n setIcon(iconEval);\n } else {\n setIcon(iconProps);\n }\n }\n setError(undefined);\n } catch (err) {\n setError(JSON.stringify(err));\n }\n\n setLoading(false);\n }\n\n if (loading) {\n return <CenteredSpinner />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <GraphIndicatorComp\n value={value!}\n totalValue={totalValue!}\n percent={percent!}\n color={color}\n icon={icon}\n suffix={suffix}\n showPercent={showPercent}\n />\n );\n};\n","import { useCallback, useState } from \"react\";\nimport {\n parseGraph,\n GraphChart as GraphChartOoui,\n graphProcessor,\n graphFieldUtils,\n GraphType,\n} from \"@gisce/ooui\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\n\nconst { processGraphData } = graphProcessor;\nconst { getFieldsToRetrieve } = graphFieldUtils;\n\nexport type GraphDataQueryOpts = {\n model: string;\n domain?: any;\n context?: any;\n limit?: number;\n manualIds?: number[];\n};\n\nexport type GraphDataOpts = GraphDataQueryOpts & {\n xml: string;\n uninformedString: string;\n};\n\nexport const useGraphData = (opts: GraphDataOpts) => {\n const {\n model,\n domain = [],\n context = {},\n xml,\n limit,\n uninformedString,\n manualIds,\n } = opts;\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<any>();\n const [processedValues, setProcessedValues] = useState<any>();\n const [evaluatedEntries, setEvaluatedEntries] = useState<any[]>();\n const [type, setType] = useState<GraphType>(\"line\");\n const [getFields] = useNetworkRequest(\n ConnectionProvider.getHandler().getFields,\n );\n const [readObjects] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n const [search] = useNetworkRequest(ConnectionProvider.getHandler().search);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n\n // // First we parse the xml with ooui library\n const ooui = parseGraph(xml) as GraphChartOoui;\n setType(ooui.type || \"line\");\n\n // // Then we fetch the data\n const fieldsToRetrieve = getFieldsToRetrieve({ ooui });\n let values, fields;\n\n try {\n // Use connection provider or whatever service you need to use\n ({ values, fields } = await retrieveData({\n model,\n domain,\n context,\n limit,\n order: ooui.timerange ? ooui.x.name : null,\n fields: fieldsToRetrieve,\n manualIds,\n methods: {\n getFields,\n readObjects,\n search,\n },\n }));\n } catch (e) {\n setError(\"Error fetching graph data values: \" + JSON.stringify(e));\n setLoading(false);\n return;\n }\n\n try {\n if (!values || !fields) {\n setError(\"No values or fields returned\");\n setLoading(false);\n return {\n loading,\n error,\n type,\n values: processedValues,\n evaluatedEntries,\n fetchData,\n };\n }\n\n setEvaluatedEntries(values);\n const _processedValues = processGraphData({\n ooui,\n values,\n fields,\n options: {\n uninformedString,\n },\n });\n setError(undefined);\n setProcessedValues(_processedValues);\n } catch (e) {\n setError(\"Error processing graph data: \" + e);\n setLoading(false);\n return;\n }\n\n setLoading(false);\n }, [\n context,\n domain,\n error,\n evaluatedEntries,\n getFields,\n limit,\n loading,\n manualIds,\n model,\n processedValues,\n readObjects,\n search,\n type,\n uninformedString,\n xml,\n ]);\n\n return {\n loading,\n error,\n type,\n values: processedValues,\n evaluatedEntries,\n fetchData,\n };\n};\n\nasync function getFieldsForModel({\n model,\n context,\n fields,\n getFields,\n}: {\n model: string;\n context: any;\n fields: string[];\n getFields: (payload: any) => Promise<any>;\n}) {\n const viewData = await getFields({\n model,\n context,\n fields,\n });\n return viewData;\n}\n\nasync function retrieveData({\n fields,\n model,\n domain,\n context,\n order,\n limit,\n manualIds,\n methods,\n}: {\n fields: string[];\n model: string;\n domain: any;\n context: any;\n order: string | null;\n limit?: number;\n manualIds?: number[];\n methods: {\n getFields: (payload: any) => Promise<any>;\n readObjects: (payload: any) => Promise<any>;\n search: (payload: any) => Promise<any>;\n };\n}) {\n const { getFields, readObjects, search } = methods;\n\n const fieldsDefinition = await getFieldsForModel({\n model,\n context,\n fields,\n getFields,\n });\n\n if (manualIds) {\n let values: any[] = (await readObjects({\n model,\n ids: manualIds,\n fieldsToRetrieve: fields,\n context,\n })) as any;\n\n if (order) {\n values = [...values].sort((a, b) => a[order] - b[order]);\n }\n\n return {\n values,\n fields: fieldsDefinition,\n };\n }\n\n const values: any[] = (await search({\n model,\n params: domain,\n fieldsToRetrieve: fields,\n context,\n limit,\n order,\n })) as any;\n return {\n values,\n fields: fieldsDefinition,\n };\n}\n","import dayjs from \"dayjs\";\n\nimport advancedFormat from \"dayjs/plugin/advancedFormat\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport isoWeek from \"dayjs/plugin/isoWeek\";\nimport timezone from \"dayjs/plugin/timezone\";\nimport duration from \"dayjs/plugin/duration\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport weekday from \"dayjs/plugin/weekday\";\nimport localeData from \"dayjs/plugin/localeData\";\n\ndayjs.extend(advancedFormat);\ndayjs.extend(customParseFormat);\ndayjs.extend(isoWeek);\ndayjs.extend(timezone);\ndayjs.extend(duration);\ndayjs.extend(relativeTime);\ndayjs.extend(weekday);\ndayjs.extend(localeData);\n\nexport default dayjs;\n","import dayjs from \"@/helpers/dayjs\";\n\nconst formatter = (graphType: \"pie\" | \"default\" | \"barGrouped\") => {\n return (object: any) => {\n const formattedValue = object.value.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n const name = graphType === \"pie\" ? object.x : object.type;\n return { name, value: formattedValue };\n };\n};\n\nconst axisFormatter = (value: any) => {\n if (typeof value === \"string\" && stringIsValidNumeric(value)) {\n return parseFloat(value).toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n } else if (isNumber(value)) {\n return value.toLocaleString(\"es-ES\", {\n useGrouping: true,\n });\n } else if (isValidDateString(value)) {\n const dateType = getDateType(value);\n if (dateType === null) {\n return value;\n }\n return dayjs(value, (dateFormats.input as any)[dateType]).format(\n (dateFormats.output as any)[dateType],\n );\n } else {\n return value;\n }\n};\n\nconst stringIsValidNumeric = (value: string) => {\n const regex = /^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$/;\n return regex.test(value);\n};\n\nexport const isNumber = (value: any) => {\n return typeof value === \"number\" && !isNaN(value);\n};\n\nconst DefaultGraphOptions = {\n default: {\n padding: \"auto\",\n xAxis: {\n tickCount: 5,\n label: {\n formatter: axisFormatter,\n },\n },\n yAxis: {\n label: {\n formatter: axisFormatter,\n },\n },\n legend: {\n maxWidthRatio: 0.5,\n maxItemWidth: 1000,\n },\n tooltip: {\n formatter: formatter(\"default\"),\n },\n },\n pie: {\n autoFit: true,\n appendPadding: 10,\n radius: 0.9,\n label: null,\n legend: {\n maxWidthRatio: 0.5,\n maxItemWidth: 1000,\n },\n tooltip: {\n formatter: formatter(\"pie\"),\n },\n interactions: [\n {\n type: \"element-active\",\n },\n ],\n },\n barGrouped: {\n isGroup: true,\n legend: {\n maxWidthRatio: 0.5,\n maxItemWidth: 1000,\n },\n tooltip: {\n formatter: formatter(\"barGrouped\"),\n },\n xAxis: {\n label: {\n formatter: axisFormatter,\n },\n },\n yAxis: {\n label: {\n formatter: axisFormatter,\n },\n },\n label: {\n position: \"middle\",\n layout: [\n {\n type: \"interval-adjust-position\",\n },\n {\n type: \"interval-hide-overlap\",\n },\n {\n type: \"adjust-color\",\n },\n ],\n },\n },\n};\n\nfunction isValidDateString(variable: any): boolean {\n // Check if the variable is defined and is a string\n if (typeof variable !== \"string\" || variable === undefined) {\n return false;\n }\n\n // Check if the string is a valid date\n const date = new Date(variable);\n return date.toString() !== \"Invalid Date\";\n}\n\nconst dateFormats = {\n input: {\n hours: \"YYYY-MM-DD HH:mm\",\n days: \"YYYY-MM-DD\",\n weeks: \"YYYY-[W]WW\",\n months: \"YYYY-MM\",\n years: \"YYYY\",\n },\n output: {\n hours: \"DD/MM/YYYY HH:mm\",\n days: \"DD/MM/YYYY\",\n weeks: \"[W]WW/YYYY\",\n months: \"MM/YYYY\",\n years: \"YYYY\",\n },\n};\n\nfunction getDateType(dateString: string): string | null {\n for (const format in dateFormats.input) {\n const isValidFormat = dayjs(\n dateString,\n (dateFormats.input as any)[format],\n true,\n ).isValid();\n if (isValidFormat) {\n return format;\n }\n }\n\n return null;\n}\n\nexport const PieLabelOptions = {\n inner: {\n label: {\n type: \"inner\",\n offset: \"-30%\",\n style: {\n fontSize: 12,\n textAlign: \"center\",\n },\n },\n },\n spider: {\n label: {\n type: \"spider\",\n labelHeight: 28,\n },\n },\n};\n\nexport const calculateAdjustedPiePercentages = (items: any[]) => {\n const total = items.reduce((acc, item) => acc + item.value, 0);\n const rawPercentages = items.map((item) => (item.value / total) * 100);\n const roundedPercentages = rawPercentages.map((p) => Math.round(p));\n const sumOfRounded = roundedPercentages.reduce((acc, num) => acc + num, 0);\n const error = 100 - sumOfRounded;\n\n for (let i = 0; i < Math.abs(error); i++) {\n if (error > 0) {\n roundedPercentages[i % roundedPercentages.length]++;\n } else {\n roundedPercentages[i % roundedPercentages.length]--;\n }\n }\n\n return items.map((item, index) => ({\n x: item.x,\n percent: roundedPercentages[index],\n }));\n};\n\nexport default DefaultGraphOptions;\n","import { Line, Column, Pie } from \"@ant-design/plots\";\nimport GraphDefaults, {\n PieLabelOptions,\n calculateAdjustedPiePercentages,\n} from \"./GraphDefaults\";\nimport { Typography } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { GraphType } from \"@gisce/ooui\";\n\nconst { Text } = Typography;\n\nconst types = {\n line: Line,\n bar: Column,\n pie: Pie,\n};\n\nexport type GraphCompProps = {\n type: GraphType;\n data: any[];\n isGroup: boolean;\n isStack: boolean;\n numItems: number;\n};\n\nexport const GraphChartComp = ({\n type,\n data,\n isGroup,\n isStack,\n numItems,\n}: GraphCompProps) => {\n const { t } = useLocale();\n\n const pieTotal = useMemo(() => {\n if (type !== \"pie\") {\n return undefined;\n }\n const mustShowPieTotal = data.reduce(\n (acc: number, obj: any) => (obj.operator === \"+\" ? acc + obj.value : 0),\n 0,\n );\n if (mustShowPieTotal === 0) {\n return undefined;\n }\n return data.reduce((acc: number, obj: any) => acc + obj.value, 0);\n }, [data, type]);\n\n const piePercents = useMemo(() => {\n if (type !== \"pie\") {\n return undefined;\n }\n return calculateAdjustedPiePercentages(data);\n }, [data, type]);\n\n const getPercentValueForX = useCallback(\n (x: string) => {\n if (!piePercents) {\n return;\n }\n const matchedDataEntry = piePercents.find((d) => d.x === x);\n const value = matchedDataEntry?.percent || 0;\n const percent = `${value.toFixed(0)}%`;\n return `${percent}`;\n },\n [piePercents],\n );\n\n const pieItemValueFormatter = useMemo(() => {\n if (piePercents === undefined) {\n return undefined;\n }\n return {\n formatter: (_: unknown, item: any) => {\n return getPercentValueForX(item.id);\n },\n };\n }, [piePercents]);\n\n const pieLabelFormatter = useCallback(\n ({ percent, x }: { percent: number; x: string }) => {\n // Hide labels for percents lower than 0.07\n if (percent < 0.07) {\n return \"\";\n }\n return getPercentValueForX(x);\n },\n [piePercents],\n );\n\n const Chart = (types as any)[type!];\n\n if (!Chart) {\n return <>{`Unknown graph type: ${type}`}</>;\n }\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"1rem\",\n gap: \"10px\",\n }}\n >\n <div style={{ textAlign: \"right\" }}>\n <Text type=\"secondary\">\n {`${t(\"totalRegisters\")} ${numItems.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}`}\n </Text>\n </div>\n {pieTotal && (\n <div style={{ textAlign: \"right\" }}>\n <Text type=\"secondary\">\n {`${t(\"total\")} ${pieTotal.toLocaleString(\"es-ES\", {\n useGrouping: true,\n })}`}\n </Text>\n </div>\n )}\n <div style={{ width: \"100%\", height: \"100%\", overflow: \"hidden\" }}>\n <Chart\n {...getGraphProps({\n type,\n data,\n isGroup,\n isStack,\n pieItemValueFormatter,\n pieLabelFormatter,\n })}\n />\n </div>\n </div>\n );\n};\n\ntype GetGraphPropsType = {\n type: string;\n isStack: boolean;\n isGroup: boolean;\n data: any[];\n width?: number;\n height?: number;\n pieItemValueFormatter?: any;\n pieLabelFormatter?: any;\n};\n\nfunction getGraphProps(props: GetGraphPropsType) {\n const {\n type,\n data,\n isGroup,\n isStack,\n pieItemValueFormatter,\n pieLabelFormatter,\n } = props;\n let graphProps = { ...(GraphDefaults as any)[type] };\n\n if (!graphProps) {\n graphProps = { ...(GraphDefaults as any)[\"default\"] };\n }\n\n graphProps.data = data;\n\n if (type === \"pie\") {\n graphProps.colorField = \"x\";\n graphProps.angleField = \"value\";\n\n graphProps = { ...graphProps, ...PieLabelOptions.inner };\n\n graphProps.legend.itemValue = pieItemValueFormatter;\n graphProps.label.content = pieLabelFormatter;\n } else {\n graphProps.xField = \"x\";\n graphProps.yField = \"value\";\n graphProps.seriesField = \"type\";\n\n graphProps.isGroup = isGroup;\n\n if (isStack) {\n graphProps.isStack = true;\n graphProps.groupField = \"stacked\";\n }\n }\n return graphProps;\n}\n","import { useGraphData } from \"./useGraphData\";\nimport { Alert } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { GraphChartComp } from \"./GraphChartComp\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nexport type GraphChartProps = {\n model: string;\n domain: any;\n context: any;\n xml: string;\n limit?: number;\n manualIds?: number[];\n};\n\nexport const GraphChart = (props: GraphChartProps) => {\n const { model, domain, context, xml, limit, manualIds } = props;\n const { t } = useLocale();\n\n const { error, loading, values, type, evaluatedEntries, fetchData } =\n useGraphData({\n model,\n xml,\n limit,\n domain,\n context,\n uninformedString: t(\"uninformed\"),\n manualIds,\n });\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [xml, model, limit, context, domain]);\n\n if (loading || !values) {\n return <CenteredSpinner />;\n }\n\n const { data, isGroup, isStack } = values;\n\n if (error) {\n return <Alert message={error} type=\"error\" banner />;\n }\n\n return (\n <GraphChartComp\n type={type}\n data={data}\n isGroup={isGroup}\n isStack={isStack}\n numItems={evaluatedEntries!.length}\n />\n );\n};\n","export const DEFAULT_SEARCH_LIMIT = 80;\n","import { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\nimport { View } from \"@/types\";\nimport { createContext, useEffect, useState } from \"react\";\n\nexport type ActionViewContextType = {\n title: string;\n availableViews: View[];\n currentView: View;\n setCurrentView: (view: View) => void;\n formIsSaving?: boolean;\n setFormIsSaving?: (value: boolean) => void;\n formHasChanges?: boolean;\n setFormHasChanges?: (value: boolean) => void;\n onFormSave?: () => Promise<{ succeed: boolean; id: number }>;\n formRef?: any;\n searchTreeRef?: any;\n onNewClicked: () => void;\n currentId?: number;\n setCurrentId?: (id?: number) => void;\n currentItemIndex?: number;\n setCurrentItemIndex?: (value?: number) => void;\n results?: any[];\n setResults?: (value: any[]) => void;\n currentModel?: string;\n removingItem?: boolean;\n setRemovingItem?: (value: boolean) => void;\n formIsLoading?: boolean;\n setFormIsLoading?: (value: boolean) => void;\n treeIsLoading?: boolean;\n setTreeIsLoading?: (value: boolean) => void;\n graphIsLoading?: boolean;\n setGraphIsLoading?: (value: boolean) => void;\n attachments?: any;\n setAttachments?: (value: any) => void;\n selectedRowItems?: any[];\n setSelectedRowItems?: (value: any[]) => void;\n duplicatingItem?: boolean;\n setDuplicatingItem?: (value: boolean) => void;\n searchParams?: any[];\n setSearchParams?: (value: any[]) => void;\n searchVisible?: boolean;\n setSearchVisible?: (value: boolean) => void;\n sorter: any;\n setSorter: (sorter: any) => void;\n totalItems: number;\n setTotalItems: (totalItems: number) => void;\n searchTreeNameSearch?: string;\n setSearchTreeNameSearch?: (searchString?: string) => void;\n previousView?: View;\n setPreviousView?: (view: View) => void;\n goToResourceId?: (ids: number[], openInSameTab?: boolean) => Promise<void>;\n searchValues?: any;\n setSearchValues?: (value: any) => void;\n limit?: number;\n setLimit?: (value: number) => void;\n setTitle?: (value: string) => void;\n};\n\nexport const ActionViewContext = createContext<ActionViewContextType | null>(\n null,\n);\n\ntype ActionViewProviderProps = ActionViewContextType & {\n children: React.ReactNode;\n};\n\nconst ActionViewProvider = (props: ActionViewProviderProps): any => {\n const {\n children,\n currentView,\n title: titleProps,\n setCurrentView,\n availableViews,\n formRef,\n searchTreeRef,\n onNewClicked,\n currentId,\n setCurrentId,\n setResults,\n results,\n currentItemIndex,\n setCurrentItemIndex,\n currentModel,\n sorter,\n setSorter,\n totalItems,\n setTotalItems,\n setSelectedRowItems,\n selectedRowItems,\n searchTreeNameSearch,\n setSearchTreeNameSearch,\n goToResourceId,\n limit: limitProps,\n } = props;\n\n const [formIsSaving, setFormIsSaving] = useState<boolean>(false);\n const [formHasChanges, setFormHasChanges] = useState<boolean>(false);\n const [removingItem, setRemovingItem] = useState<boolean>(false);\n const [formIsLoading, setFormIsLoading] = useState<boolean>(true);\n const [treeIsLoading, setTreeIsLoading] = useState<boolean>(true);\n const [attachments, setAttachments] = useState<any>([]);\n const [duplicatingItem, setDuplicatingItem] = useState<boolean>(false);\n const [searchParams, setSearchParams] = useState<any[]>([]);\n const [searchVisible, setSearchVisible] = useState<boolean>(false);\n const [graphIsLoading, setGraphIsLoading] = useState<boolean>(true);\n const [previousView, setPreviousView] = useState<View>();\n const [searchValues, setSearchValues] = useState<any>({});\n const [limit, setLimit] = useState<number>(\n limitProps !== undefined ? limitProps : DEFAULT_SEARCH_LIMIT,\n );\n const [title, setTitle] = useState<string>(titleProps);\n\n useEffect(() => {\n if (results && results.length > 0 && !currentItemIndex) {\n setCurrentItemIndex?.(0);\n setCurrentId?.(results[0].id);\n }\n }, [results]);\n\n useEffect(() => {\n setLimit(limitProps !== undefined ? limitProps : DEFAULT_SEARCH_LIMIT);\n }, [limitProps]);\n\n useEffect(() => {\n if (availableViews.length === 1) {\n setPreviousView(availableViews[0]);\n } else if (availableViews.length > 1) {\n setPreviousView(\n availableViews.filter(\n (view) => view.view_id !== currentView.view_id,\n )[0],\n );\n }\n }, [availableViews]);\n\n useEffect(() => {\n if (\n previousView?.view_id === currentView.view_id &&\n availableViews.length > 1\n ) {\n setPreviousView(\n availableViews.filter(\n (view) => view.view_id !== currentView.view_id,\n )[0],\n );\n }\n }, [currentView]);\n\n const callOnFormSave = async () => {\n return await (formRef.current as any)?.submitForm();\n };\n\n return (\n <ActionViewContext.Provider\n value={{\n title,\n currentView,\n setCurrentView,\n availableViews,\n formIsSaving,\n setFormIsSaving,\n formHasChanges,\n setFormHasChanges,\n formRef,\n searchTreeRef,\n onFormSave: callOnFormSave,\n onNewClicked,\n currentId,\n setCurrentId,\n currentItemIndex,\n setCurrentItemIndex,\n results,\n setResults,\n currentModel,\n removingItem,\n setRemovingItem,\n formIsLoading,\n setFormIsLoading,\n treeIsLoading,\n setTreeIsLoading,\n attachments,\n setAttachments,\n selectedRowItems,\n setSelectedRowItems,\n duplicatingItem,\n setDuplicatingItem,\n setSearchParams,\n searchParams,\n searchVisible,\n setSearchVisible,\n sorter,\n setSorter,\n totalItems,\n setTotalItems,\n searchTreeNameSearch,\n setSearchTreeNameSearch,\n setGraphIsLoading,\n graphIsLoading,\n previousView,\n setPreviousView,\n goToResourceId,\n searchValues,\n setSearchValues,\n limit,\n setLimit,\n setTitle,\n }}\n >\n {children}\n </ActionViewContext.Provider>\n );\n};\n\nexport default ActionViewProvider;\n","import {\n useState,\n useEffect,\n useContext,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport {\n Graph as GraphOoui,\n parseGraph,\n GraphIndicator as GraphIndicatorOoui,\n GraphIndicatorField,\n} from \"@gisce/ooui\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { GraphIndicator } from \"./GraphIndicator\";\nimport { GraphChart } from \"./GraphChart\";\nimport { GraphView } from \"@/types\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nexport type GraphProps = {\n view_id: number;\n model: string;\n domain: any;\n context: any;\n limit?: number;\n manualIds?: number[];\n};\n\nconst GraphComp = (props: GraphProps, ref: any) => {\n const { view_id, model, context, domain, limit, manualIds } = props;\n const [loading, setLoading] = useState(false);\n const [graphOoui, setGraphOoui] = useState<GraphOoui>();\n const [graphXml, setGraphXml] = useState<string>();\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { setGraphIsLoading = undefined } = actionViewContext || {};\n\n const [getView] = useNetworkRequest(ConnectionProvider.getHandler().getView);\n\n useImperativeHandle(ref, () => ({\n refresh: () => {\n fetchData();\n },\n }));\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [view_id]);\n\n async function fetchData() {\n setLoading(true);\n setGraphIsLoading?.(true);\n\n try {\n const viewData = (await getView({\n model,\n id: view_id,\n type: \"graph\",\n context,\n })) as GraphView;\n\n setGraphXml(viewData.arch);\n const graph = parseGraph(viewData.arch);\n setGraphOoui(graph);\n setLoading(false);\n setGraphIsLoading?.(false);\n } catch (err) {\n console.error(err);\n setLoading(false);\n setGraphIsLoading?.(false);\n return <>{JSON.stringify(err)}</>;\n }\n }\n\n if (loading || !graphOoui) {\n return <CenteredSpinner />;\n }\n\n switch (graphOoui.type) {\n case \"indicatorField\":\n case \"indicator\": {\n const indicator = graphOoui as GraphIndicatorOoui;\n const indicatorFieldopts =\n indicator.type === \"indicatorField\"\n ? {\n field: (indicator as GraphIndicatorField).field,\n operator: (indicator as GraphIndicatorField).operator,\n }\n : {};\n\n return (\n <GraphIndicator\n showPercent={indicator.showPercent}\n totalDomain={indicator.totalDomain!}\n colorCondition={indicator.color}\n model={model}\n context={context}\n domain={domain}\n icon={indicator.icon!}\n suffix={indicator.suffix!}\n manualIds={manualIds}\n {...indicatorFieldopts}\n />\n );\n }\n case \"line\":\n case \"bar\":\n case \"pie\": {\n return (\n <GraphChart\n model={model}\n context={context}\n domain={domain}\n xml={graphXml!}\n limit={limit}\n manualIds={manualIds}\n />\n );\n }\n default: {\n return <>{`Graph ${graphOoui.type} not implemented`}</>;\n }\n }\n};\n\nexport const Graph = forwardRef(GraphComp);\n","export enum ErpFeatureKeys {\n FEATURE_VIEW_JSON_ATTRS = \"view_json_attrs\",\n FEATURE_ADVANCED_EXPORT = \"export_data2\",\n FEATURE_OMNISEARCH = \"omnisearch\",\n FEATURE_READFORVIEW = \"read_for_view\",\n // ... add more features here\n}\n\nexport const ErpAllFeatureKeys: string[] = Object.values(ErpFeatureKeys);\n\nexport type ErpFeaturesMap = {\n [key in ErpFeatureKeys]?: boolean;\n};\n","import { useCallback, useState } from \"react\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { GraphType } from \"@gisce/ooui\";\n\nexport type GraphDataQueryOpts = {\n model: string;\n domain?: any;\n context?: any;\n view_id: number;\n manualIds?: number[];\n};\n\nexport type GraphResponse = {\n num_items: number;\n type: GraphType;\n};\n\nexport type GraphResponseChart = GraphResponse & {\n data: any;\n isGroup: boolean;\n isStack: boolean;\n};\n\nexport type GraphResponseIndicator = GraphResponse & {\n total: number;\n value: number;\n color?: string;\n icon?: string;\n percent?: number;\n suffix?: string;\n};\n\nexport const useServerGraphData = (opts: GraphDataQueryOpts) => {\n const { model, domain = [], context = {}, view_id, manualIds } = opts;\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<any>();\n const [graphData, setGraphData] = useState<\n GraphResponseChart | GraphResponseIndicator\n >();\n const [readForView] = useNetworkRequest(\n ConnectionProvider.getHandler().readForView,\n );\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(undefined);\n\n // We must check if we have manualIds in order to populate domain with them\n if (manualIds) {\n domain.push([\"id\", \"in\", manualIds]);\n }\n\n try {\n const graphData = await readForView({\n model,\n domain,\n context,\n view_id,\n });\n setGraphData(graphData);\n } catch (e) {\n setError(\"Error reading graph data from server: \" + e);\n }\n setLoading(false);\n }, [context, domain, manualIds, model, readForView, view_id]);\n\n return {\n loading,\n error,\n fetchData,\n graphData,\n };\n};\n","import { useEffect, useContext, forwardRef, useImperativeHandle } from \"react\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { Alert } from \"antd\";\nimport {\n GraphResponseChart,\n GraphResponseIndicator,\n useServerGraphData,\n} from \"./useServerGraphData\";\nimport { GraphIndicatorComp } from \"./GraphIndicatorComp\";\nimport { isNumber } from \"./GraphDefaults\";\nimport { GraphChartComp } from \"./GraphChartComp\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\n\nexport type GraphProps = {\n view_id: number;\n model: string;\n domain: any;\n context: any;\n manualIds?: number[];\n};\n\nconst GraphComp = (props: GraphProps, ref: any) => {\n const { view_id, model, context, domain, manualIds } = props;\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { setGraphIsLoading = undefined } = actionViewContext || {};\n\n const { error, loading, graphData, fetchData } = useServerGraphData({\n view_id,\n model,\n domain,\n context,\n manualIds,\n });\n\n useEffect(() => {\n setGraphIsLoading?.(loading);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loading]);\n\n useImperativeHandle(ref, () => ({\n refresh: () => {\n fetchData();\n },\n }));\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [view_id]);\n\n if (loading || !graphData) {\n return <CenteredSpinner />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n switch (graphData.type) {\n case \"indicatorField\":\n case \"indicator\": {\n const { value, total, percent, icon, color, suffix } =\n graphData as GraphResponseIndicator;\n\n return (\n <GraphIndicatorComp\n value={value}\n totalValue={total}\n percent={percent}\n color={color}\n icon={icon}\n suffix={suffix}\n showPercent={isNumber(percent)}\n />\n );\n }\n case \"line\":\n case \"bar\":\n case \"pie\": {\n const chart = graphData as GraphResponseChart;\n return (\n <GraphChartComp\n type={chart.type}\n data={chart.data}\n isGroup={chart.isGroup}\n isStack={chart.isStack}\n numItems={chart.num_items}\n />\n );\n }\n default: {\n return <>{`Graph ${graphData.type} not implemented`}</>;\n }\n }\n};\n\nexport const GraphServer = forwardRef(GraphComp);\n","import { InitialViewData, View, ViewType } from \"@/types\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport React, { useState } from \"react\";\n\nexport type TabManagerContextType = {\n openAction: ({\n domain,\n context,\n model,\n views,\n title,\n target,\n initialView,\n action_id,\n action_type,\n res_id,\n values,\n forced_values,\n }: {\n domain: any;\n context: any;\n model: string;\n views: any[];\n title: string;\n target: string;\n initialView: InitialViewData;\n action_id: number;\n action_type: string;\n res_id?: number | boolean;\n values?: any;\n forced_values?: any;\n }) => void;\n openRelate: ({\n relateData,\n fields,\n values,\n action_id,\n action_type,\n }: {\n relateData: any;\n fields: any;\n values: any;\n action_id: number;\n action_type: string;\n }) => void;\n openDefaultActionForModel: ({\n model,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain,\n }: {\n model: string;\n values?: any;\n forced_values?: any;\n initialViewType?: ViewType;\n res_id?: number;\n domain?: any;\n }) => void;\n activeKey: string;\n onChangeTab: (key: string) => void;\n onRemoveTab: (key: string) => void;\n openShortcut: (shortcut: ShortcutApi) => void;\n tabs: any[];\n currentView?: View;\n setCurrentView?: (view?: View) => void;\n currentId?: number;\n setCurrentId?: (id?: number) => void;\n};\n\nexport const TabManagerContext =\n React.createContext<TabManagerContextType | null>(null);\n\ntype TabManagerProviderProps = TabManagerContextType & {\n children: React.ReactNode;\n};\n\nconst TabManagerProvider = (props: TabManagerProviderProps): any => {\n const {\n children,\n openAction,\n openRelate,\n openDefaultActionForModel,\n openShortcut,\n activeKey,\n onChangeTab,\n onRemoveTab,\n tabs,\n } = props;\n\n const [currentView, setCurrentView] = useState<View>();\n const [currentId, setCurrentId] = useState<number>();\n\n return (\n <TabManagerContext.Provider\n value={{\n openAction,\n openRelate,\n openDefaultActionForModel,\n activeKey,\n openShortcut,\n onChangeTab,\n onRemoveTab,\n tabs,\n currentId,\n currentView,\n setCurrentId,\n setCurrentView,\n }}\n >\n {children}\n </TabManagerContext.Provider>\n );\n};\n\nexport default TabManagerProvider;\n","import { ExportOutlined } from \"@ant-design/icons\";\nimport { Row, Col, Typography, theme } from \"antd\";\nimport ErrorBoundary from \"antd/es/alert/ErrorBoundary\";\nimport { GraphCardProps } from \"./GraphCard.types\";\nconst { useToken } = theme;\n\nconst { Text } = Typography;\n\nexport const GraphCard = (props: GraphCardProps) => {\n const { title, children, action, openAction, parms } = props;\n const { token } = useToken();\n\n const hasDragAndDrop = Object.keys(parms).length > 0;\n\n return (\n <div\n className={hasDragAndDrop ? \"shadow-md\" : undefined}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n border: \"1px solid #eee\",\n backgroundColor: \"white\",\n borderRadius: token.borderRadius,\n }}\n >\n <Row\n align=\"middle\"\n style={{\n borderBottom: \"1px solid #ddd\",\n backgroundColor: token.colorPrimaryBg,\n }}\n wrap={false}\n >\n <Col\n flex=\"auto\"\n className=\"draggable-head\"\n style={{\n fontWeight: \"bold\",\n padding: \"0.5rem\",\n cursor: hasDragAndDrop ? \"grab\" : undefined,\n overflow: \"hidden\",\n }}\n >\n <Text ellipsis={true}>{title}</Text>\n </Col>\n {action && (\n <Col flex=\"25px\" style={{ padding: \"0.5rem\" }}>\n <Row justify=\"end\" align=\"middle\">\n <ExportOutlined\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n openAction?.(action);\n }}\n />\n </Row>\n </Col>\n )}\n </Row>\n {!hasDragAndDrop && (\n <div style={{ padding: 10 }}>\n <ErrorBoundary>{children}</ErrorBoundary>\n </div>\n )}\n {hasDragAndDrop && <ErrorBoundary>{children}</ErrorBoundary>}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { Tooltip, theme, Statistic, Card } from \"antd\";\nimport { Indicator as IndicatorOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport Field from \"@/common/Field\";\nimport { QuestionCircleOutlined } from \"@ant-design/icons\";\nimport iconMapper from \"@/helpers/iconMapper\";\nimport { useFormGraphData } from \"@/hooks/useFormGraphData\";\nimport { CenteredSpinner } from \"@/ui/CenteredSpinner\";\nimport { ErrorAlert } from \"@/ui/ErrorAlert\";\nimport { Graph } from \"../views/Graph/Graph\";\nimport ErrorBoundary from \"antd/es/alert/ErrorBoundary\";\nimport { useFeatureIsEnabled } from \"@/context/ConfigContext\";\nimport { ErpFeatureKeys } from \"@/models/erpFeature\";\nimport { GraphServer } from \"../views/Graph/GraphServer\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { GraphCard } from \"../views/Graph\";\nconst { useToken } = theme;\n\ntype IndicatorProps = WidgetProps & {\n ooui: IndicatorOoui;\n value?: number;\n};\n\nexport const Indicator = (props: IndicatorProps) => {\n const { ooui } = props;\n\n const hasActionId = ooui.actionId !== undefined;\n\n return (\n <Field ooui={ooui}>\n {hasActionId ? (\n <ErrorBoundary>\n <GraphIndicatorInput ooui={ooui} />\n </ErrorBoundary>\n ) : (\n <IndicatorInput ooui={ooui} />\n )}\n </Field>\n );\n};\n\ntype IndicatorInputProps = {\n ooui: IndicatorOoui;\n value?: any;\n};\n\nconst IndicatorInput = (props: IndicatorInputProps) => {\n const { token } = useToken();\n const { ooui, value } = props;\n const title = (\n <>\n <span>{ooui.label} </span>\n {ooui.tooltip && (\n <Tooltip title={ooui.tooltip}>\n <QuestionCircleOutlined\n className=\"pr-1 text-xs\"\n style={{ color: token.colorPrimaryBg }}\n />\n </Tooltip>\n )}\n </>\n );\n const Icon: React.ElementType = iconMapper(ooui.icon) as any;\n let formattedValue = value;\n if (ooui.selectionValues.size) {\n formattedValue = ooui.selectionValues.get(value);\n } else if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n const field = (\n <Statistic\n title={title}\n prefix={Icon && <Icon />}\n suffix={ooui.suffix}\n value={formattedValue}\n />\n );\n if (ooui.card) {\n return <Card>{field}</Card>;\n } else {\n return field;\n }\n};\n\nconst GraphIndicatorInput = (props: IndicatorInputProps) => {\n const { ooui } = props;\n const { actionId } = ooui;\n\n const { actionData, treeShortcut, loading, error, fetchData } =\n useFormGraphData(actionId!);\n\n const readForViewEnabled = useFeatureIsEnabled(\n ErpFeatureKeys.FEATURE_READFORVIEW,\n );\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openShortcut } = tabManagerContext || {};\n\n useEffect(() => {\n if (!ooui) {\n return;\n }\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ooui]);\n\n if (error) {\n return <ErrorAlert error={error} />;\n }\n\n const { id, model, limit, domain, context, initialView } = actionData || {};\n\n const GraphComponent = readForViewEnabled ? GraphServer : Graph;\n\n return (\n <GraphCard\n id={id}\n parms={{}}\n title={actionData?.title || \"\"}\n action={treeShortcut}\n openAction={openShortcut as any}\n >\n {loading && <CenteredSpinner />}\n {!loading && (\n <GraphComponent\n view_id={initialView.id}\n model={model}\n context={context}\n domain={domain}\n limit={limit}\n />\n )}\n </GraphCard>\n );\n};\n","import { One2manyItem } from \"@/widgets/base/one2many/One2manyInput\";\nimport { Form as FormOoui } from \"@gisce/ooui\";\n\nconst filteredValues = (values: any, fields: any) => {\n if (!fields) {\n return values;\n }\n const filteredValues: any = {};\n Object.keys(values).forEach((key) => {\n if (fields[key] === undefined) {\n // console.log(`${key} is not in fields`);\n filteredValues[key] = values[key];\n } else if (values[key] === false && fields[key].type !== \"boolean\") {\n // Do nothing - filter the field.\n } else if (fields[key].type === \"boolean\") {\n const boolValue = values[key];\n if (boolValue === 0) {\n filteredValues[key] = false;\n } else if (boolValue === 1) {\n filteredValues[key] = true;\n } else {\n filteredValues[key] = values[key];\n }\n } else {\n filteredValues[key] = values[key];\n }\n });\n return filteredValues;\n};\n\nexport const processValues = (values: any, fields: any) => {\n const filterBooleans = filteredValues(values, fields);\n return filterBooleans;\n};\n\nexport const getTouchedValues = ({\n source,\n target,\n fields,\n}: {\n source: any;\n target: any;\n fields: any;\n}) => {\n const differences: any = {};\n Object.keys(target).forEach((key) => {\n const is2Many = fields[key]\n ? fields[key].type === \"one2many\" || fields[key].type === \"many2many\"\n : false;\n\n if (is2Many) {\n const sourceValue = JSON.stringify(source[key]);\n const targetValue = JSON.stringify(target[key]);\n if (sourceValue === targetValue) {\n return;\n }\n\n const nonOriginalItems =\n target[key]?.items?.filter(\n (item: One2manyItem) => item.operation !== \"original\",\n ) || [];\n\n if (nonOriginalItems.length > 0) {\n differences[key] = target[key];\n }\n } else if (Array.isArray(target[key])) {\n if (fields[key].type === \"many2one\") {\n if (\n !isValidMany2OneValue(source[key]) &&\n !isValidMany2OneValue(target[key])\n ) {\n // eslint-disable-next-line no-useless-return\n return;\n } else if (!Array.isArray(source[key])) {\n // This will mean the source many2one value is a numeric id\n const numericId = source[key];\n const [targetNumericId] = target[key];\n if (numericId !== targetNumericId) {\n differences[key] = target[key];\n }\n } else {\n const sourceValue = JSON.stringify(source[key]);\n const targetValue = JSON.stringify(target[key]);\n if (sourceValue !== targetValue) {\n differences[key] = target[key];\n }\n }\n } else {\n const sourceValue = JSON.stringify(source[key]);\n const targetValue = JSON.stringify(target[key]);\n if (sourceValue !== targetValue) {\n differences[key] = target[key];\n }\n }\n } else if (source[key] === undefined && target[key] !== undefined) {\n differences[key] = target[key];\n } else if (source[key] !== target[key]) {\n if (target[key] === undefined) {\n differences[key] = null;\n } else {\n differences[key] = target[key];\n }\n }\n });\n return differences;\n};\n\nexport const checkFieldsType = ({\n changedFields,\n formOoui,\n types,\n}: {\n changedFields: string[];\n formOoui: FormOoui;\n types: string[];\n}) => {\n const valuesChecked = changedFields.map((key) => {\n const fieldType = formOoui?.findById(key)?.type!;\n return types.includes(fieldType);\n });\n return valuesChecked.some((i) => i === true);\n};\n\nexport const mergeFieldsDomain = ({\n fieldsDomain,\n fields,\n}: {\n fieldsDomain: any;\n fields: any;\n}) => {\n const output: any = {};\n\n Object.keys(fields).forEach((key) => {\n output[key] = fields[key];\n\n if (fieldsDomain[key]) {\n output[key].domain = fieldsDomain[key];\n }\n });\n\n return output;\n};\n\nexport const getValuesForDomain = (domain: any[]) => {\n const values: any = {};\n\n if (!domain || !Array.isArray(domain) || domain?.length === 0) {\n return {};\n }\n\n domain.forEach((entry) => {\n if (entry?.[1] === \"=\") {\n values[entry[0]] = entry[2];\n }\n });\n\n return values;\n};\n\nexport const getOnChangePayload = ({\n onChangeFieldActionArgs,\n values,\n parentValues = {},\n}: {\n onChangeFieldActionArgs: any[];\n values: any;\n parentValues?: any;\n}) => {\n const payload: any = {};\n onChangeFieldActionArgs.forEach((arg: string) => {\n const splittedArg = arg.split(\"\");\n\n if (arg === \"True\") {\n payload[arg] = true;\n } else if (arg === \"False\") {\n payload[arg] = false;\n } else if (values[arg]) {\n payload[arg] = values[arg];\n } else if (\n splittedArg[0] === \"'\" &&\n splittedArg[splittedArg.length - 1] === \"'\" &&\n splittedArg.filter((i: string) => i === \"'\").length === 2\n ) {\n payload[arg] = arg.replace(/'/g, \"\");\n } else if (splittedArg.includes(\"'\")) {\n // This is a string with a variable in it.\n // TODO: pending implement.\n payload[arg] = arg;\n } else if (arg.indexOf(\"parent.\") !== -1) {\n const parentKey = arg.replace(\"parent.\", \"\");\n payload[arg] = parentValues[parentKey] || false;\n } else {\n payload[arg] = false;\n }\n });\n return payload;\n};\n\nexport const mergeSearchFields = (searchFields: any[]) => {\n const mergedSearchFields = {\n primary: [],\n secondary: [],\n };\n\n searchFields.forEach((sf) => {\n if (!sf) {\n return;\n }\n\n mergedSearchFields.primary = mergedSearchFields.primary.concat(sf.primary);\n mergedSearchFields.secondary = mergedSearchFields.secondary.concat(\n sf.secondary,\n );\n });\n\n return {\n primary: mergedSearchFields.primary.filter(onlyUnique),\n secondary: mergedSearchFields.secondary.filter(onlyUnique),\n };\n};\n\nfunction onlyUnique(value: any, index: number, self: any) {\n return self.indexOf(value) === index;\n}\n\nexport const transformPlainMany2Ones = ({\n values,\n fields,\n}: {\n values: any;\n fields: any;\n}) => {\n const reformattedValues: { [key: string]: any } = {};\n\n Object.keys(values).forEach((key) => {\n const value = values[key];\n\n if (\n fields[key] &&\n fields[key].type === \"many2one\" &&\n value &&\n Array.isArray(value) &&\n value.length === 2\n ) {\n reformattedValues[key] = value[0];\n } else {\n reformattedValues[key] = value;\n }\n });\n\n return reformattedValues;\n};\n\nexport const colorFromString = (text: string) => {\n let hash = 0;\n text = text.toString().padEnd(10, \"0\");\n for (let i = 0; i < text.length; i++) {\n hash = text.charCodeAt(i) + ((hash << 5) - hash);\n }\n let hexColour = \"#\";\n for (let i = 0; i < 3; i++) {\n const value = (hash >> (i * 8)) & 0xff;\n hexColour += (\"00\" + value.toString(16)).slice(-2);\n }\n return hexColour;\n};\n\nexport const colorTextFromBackground = (color: string) => {\n function getRGB(c: string): number {\n return parseInt(c, 16) || parseInt(c);\n }\n\n function getsRGB(c: string) {\n return getRGB(c) / 255 <= 0.03928\n ? getRGB(c) / 255 / 12.92\n : Math.pow((getRGB(c) / 255 + 0.055) / 1.055, 2.4);\n }\n\n function getLuminance(hexColor: string) {\n return (\n 0.2126 * getsRGB(hexColor.substr(1, 2)) +\n 0.7152 * getsRGB(hexColor.substr(3, 2)) +\n 0.0722 * getsRGB(hexColor.substr(-2))\n );\n }\n\n function getContrast(f: string, b: string) {\n const L1 = getLuminance(f);\n const L2 = getLuminance(b);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n }\n\n function getTextColor(bgColor: string) {\n const whiteContrast = getContrast(bgColor, \"#ffffff\");\n const blackContrast = getContrast(bgColor, \"#000000\");\n\n return whiteContrast > blackContrast ? \"#ffffff\" : \"#000000\";\n }\n\n return getTextColor(color);\n};\n\nexport const stringFormat = (text: string, values: any): string => {\n return text.replace(/\\{([^}]+)\\}/g, (match, key) =>\n values[key] !== undefined ? values[key] : match,\n );\n};\n\nconst isValidMany2OneValue = (value: any) => {\n if (!Array.isArray(value)) {\n return false;\n }\n\n if (value.length !== 2) {\n return false;\n }\n\n if (value[0] === undefined && value[1] === \"\") {\n return false;\n }\n\n return true;\n};\n","import React from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { Tag as AntdTag, TagProps } from \"antd\";\nimport { isPresetStatusColor, isPresetColor } from \"antd/lib/_util/colors\";\nimport { colorFromString } from \"@/helpers/formHelper\";\n\nexport const Tag = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <TagInput {...props} />\n </Field>\n );\n};\n\nexport const TagInput = (props: any) => {\n const { ooui, value } = props;\n let formattedValue = value;\n let colorValue = value;\n if (ooui.selectionValues.size) {\n formattedValue = ooui.selectionValues.get(value);\n } else if (Array.isArray(value)) {\n colorValue = value[0];\n formattedValue = value[1];\n }\n if (!value) {\n return null;\n }\n const color =\n ooui.colors === \"auto\"\n ? colorFromString(colorValue)\n : ooui.colors[colorValue] || colorFromString(colorValue);\n return <CustomTag color={color}>{formattedValue}</CustomTag>;\n};\n\nexport const CustomTag = (props: TagProps) => {\n let { color } = props;\n let style = {};\n if (!isPresetStatusColor(props.color) && !isPresetColor(props.color)) {\n style = {\n color,\n borderColor: color,\n borderStyle: \"solid\",\n borderWidth: \"1px\",\n };\n color = `${color}20`;\n }\n return (\n <AntdTag {...props} style={style} color={color}>\n {props.children}\n </AntdTag>\n );\n};\n","import React, { useContext, useState } from \"react\";\nimport { Tags as TagsOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { One2manyItem, One2manyValue } from \"../base/one2many/One2manyInput\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { Alert, Select } from \"antd\";\nimport { colorFromString, transformPlainMany2Ones } from \"@/helpers/formHelper\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { CustomTag } from \"@/widgets/custom/Tag\";\n\ntype TagsProps = WidgetProps & {\n ooui: TagsOoui;\n};\n\ntype TagsInputProps = TagsProps & {\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n};\n\nexport const Tags = (props: TagsProps) => {\n const { ooui } = props;\n\n return (\n <Field type={\"array\"} {...props}>\n <TagsInput ooui={ooui} />\n </Field>\n );\n};\n\nexport const TagsInput = (props: TagsInputProps) => {\n const { value, ooui, onChange } = props;\n const { items = [] } = value || {};\n const itemsToShow = items\n .filter((item) => item.operation !== \"pendingRemove\")\n .map((item) => item.id) as number[];\n\n const [options, setOptions] = useState<any[]>([]);\n const [error, setError] = useState<string>();\n const [isLoadingOptions, setIsLoadingOptions] = useState<boolean>(false);\n const { relation, context, readOnly, field } = ooui;\n\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchOptions();\n }, [items]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n items: changedValue,\n });\n };\n\n async function fetchOptions() {\n setIsLoadingOptions(true);\n let params: any[] = [];\n try {\n if (readOnly) {\n params = [[\"id\", \"in\", itemsToShow]];\n }\n if (ooui.domain) {\n const evaluatedDomain =\n await ConnectionProvider.getHandler().evalDomain({\n domain: ooui.domain,\n values: transformPlainMany2Ones({\n fields: formContext?.getFields(),\n values: formContext.getPlainValues(),\n }),\n fields: formContext?.getFields(),\n context: formContext.getContext(),\n });\n params = [...params, ...evaluatedDomain];\n }\n\n const optionsRead = await ConnectionProvider.getHandler().search({\n model: relation,\n params,\n fieldsToRetrieve: [field],\n context: { ...getContext?.(), ...context },\n });\n const options = optionsRead.map((item: any) => {\n const value = item[field];\n let formattedValue = value;\n if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n return { label: formattedValue, value: item.id };\n });\n setOptions(options);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoadingOptions(false);\n }\n }\n\n const onChangeSelected = (ids: number[]) => {\n const newItems: One2manyItem[] = items.map((item) => {\n if (ids.includes(item.id as number)) {\n if (item.operation === \"pendingRemove\") {\n return {\n ...item,\n operation: \"pendingLink\",\n };\n } else {\n return item;\n }\n } else {\n return { id: item.id, operation: \"pendingRemove\" };\n }\n });\n const currentIds = newItems.map((item) => item.id);\n ids\n .filter((id) => !currentIds.includes(id))\n .forEach((id) => {\n newItems.push({ id, operation: \"pendingLink\" });\n });\n triggerChange(newItems);\n };\n\n const tagRender = (props: any) => {\n const { label, closable, onClose } = props;\n const onPreventMouseDown = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.preventDefault();\n event.stopPropagation();\n };\n const color = colorFromString(label);\n return (\n <CustomTag\n color={color}\n onMouseDown={onPreventMouseDown}\n closable={closable}\n onClose={onClose}\n closeIcon={<span style={{ color }}>X</span>}\n >\n {label}\n </CustomTag>\n );\n };\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <>\n <div className=\"flex flex-row\">\n <Select\n mode=\"multiple\"\n value={options.length ? itemsToShow : []}\n tagRender={tagRender}\n bordered={!readOnly}\n disabled={readOnly}\n options={options}\n onChange={onChangeSelected}\n loading={isLoadingOptions}\n filterOption={(value, element) =>\n element.label.toLowerCase().includes(value.toString())\n }\n ></Select>\n </div>\n </>\n );\n};\n","import {\n Notebook,\n Group,\n Label,\n Char,\n Text,\n Button,\n ButtonGroup,\n Selection,\n Many2one,\n Boolean,\n Integer,\n Float,\n Date,\n DateTime,\n Time,\n One2many,\n Separator,\n Form,\n Tree,\n Reference,\n Binary,\n Url,\n Email,\n FloatTime,\n ProgressBar,\n MultiCheckbox,\n Markdown,\n Radio,\n Switch,\n Steps,\n Tag,\n CodeEditor,\n CommentsTimelineField,\n HTMLPreview,\n Alert,\n} from \"@/index\";\nimport { Image } from \"./base/Image\";\nimport { FiberGrid } from \"./custom/FiberGrid\";\nimport { Timeline } from \"./custom/Timeline\";\nimport { Indicator } from \"./custom/Indicator\";\nimport { Tags } from \"./custom/Tags\";\nimport { createElement } from \"react\";\n\nconst getWidgetType = (type: string) => {\n switch (type) {\n case \"form\":\n return Form;\n case \"tree\":\n return Tree;\n case \"notebook\":\n return Notebook;\n case \"group\":\n return Group;\n case \"label\":\n return Label;\n case \"char\":\n return Char;\n case \"text\":\n return Text;\n case \"button\":\n return Button;\n case \"buttonGroup\":\n return ButtonGroup;\n case \"selection\":\n return Selection;\n case \"many2one\":\n return Many2one;\n case \"boolean\":\n return Boolean;\n case \"integer\":\n return Integer;\n case \"float\":\n return Float;\n case \"progressbar\":\n return ProgressBar;\n case \"date\":\n return Date;\n case \"datetime\":\n return DateTime;\n case \"time\":\n return Time;\n case \"one2many\":\n case \"one2many_list\":\n case \"many2many\":\n return One2many;\n case \"separator\":\n return Separator;\n case \"reference\":\n return Reference;\n case \"binary\":\n return Binary;\n case \"image\":\n return Image;\n case \"url\":\n return Url;\n case \"email\":\n return Email;\n case \"float_time\":\n return FloatTime;\n case \"fiber_grid\":\n return FiberGrid;\n case \"timeline\":\n return Timeline;\n case \"indicator\":\n return Indicator;\n case \"tags\":\n return Tags;\n case \"tag\":\n return Tag;\n case \"multicheckbox\":\n return MultiCheckbox;\n case \"markdown\":\n return Markdown;\n case \"radio\":\n return Radio;\n case \"switch\":\n return Switch;\n case \"steps\":\n return Steps;\n case \"codeeditor\":\n return CodeEditor;\n case \"comments_timeline\":\n return CommentsTimelineField;\n case \"html_preview\":\n return HTMLPreview;\n case \"alert\":\n return Alert;\n default:\n return undefined;\n }\n};\n\nconst createReactWidget = (props: any) => {\n const { ooui } = props;\n const { type }: { type: string } = ooui;\n\n const widgetClass: any = getWidgetType(type);\n\n if (!widgetClass) {\n return null;\n }\n\n return createElement(widgetClass, props);\n};\n\nexport { createReactWidget };\n","import { Widget, Label, Field, Container } from \"@gisce/ooui\";\n\nconst getSpanStyleForItem = ({\n item,\n responsiveBehaviour,\n}: {\n item: Widget;\n responsiveBehaviour: boolean;\n}) => {\n return {\n gridColumnStart: \"span \" + (responsiveBehaviour ? 1 : item.colspan),\n };\n};\n\nconst fillRowWithEmptiesToFit = ({\n row,\n mustFillWithEmpties,\n numberOfColumns,\n}: {\n row: any;\n mustFillWithEmpties: boolean;\n numberOfColumns: number;\n}) => {\n const rowWithEmptiesToFit: any = [];\n let totalColSpan = 0;\n\n const isLastItemAndMustFit = (columnIndex: number) => {\n return (\n columnIndex + 1 === row.length &&\n totalColSpan < numberOfColumns &&\n !mustFillWithEmpties\n );\n };\n\n row.map((item: Widget, columnIndex: number) => {\n totalColSpan += item.colspan;\n\n if (isLastItemAndMustFit(columnIndex)) {\n const gapsToAdjust = numberOfColumns - totalColSpan;\n item.colspan = item.colspan + gapsToAdjust;\n totalColSpan += gapsToAdjust;\n }\n\n rowWithEmptiesToFit.push(item);\n\n if (isLastItemAndMustFit(columnIndex)) {\n const gapsToFill = numberOfColumns - totalColSpan;\n for (let i = 0; i < gapsToFill; i += 1) {\n rowWithEmptiesToFit.push(new Label({ string: \"\" }));\n }\n }\n });\n\n return rowWithEmptiesToFit;\n};\n\nconst expandWidgetsIfNeeded = ({\n row,\n numberOfColumns,\n}: {\n row: any;\n numberOfColumns: number;\n}) => {\n return row.map((item: Widget) => {\n if ((item as any)._mustExpand) {\n (item as any).colspan = numberOfColumns;\n return item;\n }\n return item;\n });\n};\n\nconst getSingleRowTemplateColumns = (\n row: Widget[],\n numberOfColumns: number,\n) => {\n const gridOptions = row.map((item: Widget) => {\n if (item instanceof Label && (item as Label).fieldForLabel) {\n return \"auto\";\n }\n if (item instanceof Container) {\n return \"auto\";\n }\n return \"1fr\";\n });\n\n if (gridOptions.length < numberOfColumns) {\n const columnsToAdd = numberOfColumns - gridOptions.length;\n for (let i = 0; i < columnsToAdd; i++) {\n gridOptions.push(\"1fr\");\n }\n }\n return gridOptions.join(\" \");\n};\n\nconst getTemplateColumns = (columns: number, fieldInRows: boolean) => {\n // We check if we have any label+field inside (fieldInRows) the container.\n // In this scenario, we must format the grid accordingly\n // Otherwise, the grid will divide uniformly (auto)\n const odd = fieldInRows ? \"1fr\" : \"auto\";\n const even = \"auto\";\n let templateColumns = \"\";\n for (let i = 0; i < columns; i++) {\n templateColumns += i % 2 ? odd : even;\n if (i + 1 < columns) {\n templateColumns += \" \";\n }\n }\n return templateColumns;\n};\n\nconst getMaxColspanForRows = (rows: Widget[][]) => {\n const maxColspan = rows.map((row: Widget[]) => {\n return row.reduce((prev, current) => {\n return prev + current.colspan;\n }, 0);\n });\n return maxColspan.reduce((a, b) => {\n return Math.max(a, b);\n });\n};\n\nconst rowsHaveAnyField = (rows: Widget[][]) => {\n let found = false;\n\n rows.map((row: Widget[]) => {\n row.map((item: Widget) => {\n if (item instanceof Field) {\n found = true;\n }\n });\n });\n\n return found;\n};\n\nexport {\n fillRowWithEmptiesToFit,\n getSpanStyleForItem,\n expandWidgetsIfNeeded,\n getMaxColspanForRows,\n rowsHaveAnyField,\n getSingleRowTemplateColumns,\n getTemplateColumns,\n};\n","import React from \"react\";\nimport { Container as ContainerOoui, Widget, Label } from \"@gisce/ooui\";\nimport { createReactWidget } from \"@/widgets/WidgetFactory\";\n\nimport {\n getTemplateColumns,\n fillRowWithEmptiesToFit,\n getSpanStyleForItem,\n expandWidgetsIfNeeded,\n getMaxColspanForRows,\n getSingleRowTemplateColumns,\n} from \"@/helpers/containerHelper\";\n\ntype Props = {\n container: ContainerOoui;\n responsiveBehaviour: boolean;\n};\n\nconst Container = (props: Props): React.ReactElement => {\n const { container, responsiveBehaviour } = props;\n const { rows } = container;\n let { columns } = container;\n\n // We check for the largest colspan for each row\n // And if the value is smaller than the columns value\n // We adjust the columns value\n const maxColspanForRows = getMaxColspanForRows(rows);\n if (maxColspanForRows < columns) {\n columns = maxColspanForRows;\n }\n\n let fieldInRows = false;\n let firstRow: Widget[] = [];\n\n const content = rows.map((row: Widget[], i) => {\n const rowWithoutInvisibleFields = row.filter((widget) => {\n return !widget.invisible;\n });\n\n const rowWithExpandedItems = expandWidgetsIfNeeded({\n row: rowWithoutInvisibleFields,\n numberOfColumns: columns,\n });\n\n let rowWithEmptiesToFit = rowWithExpandedItems;\n if (\n i === 0 ||\n !(row.length === 1 && row.some((widget) => widget.type === \"group\"))\n ) {\n rowWithEmptiesToFit = fillRowWithEmptiesToFit({\n row: rowWithExpandedItems,\n numberOfColumns: columns,\n mustFillWithEmpties: responsiveBehaviour,\n });\n\n firstRow = firstRow.concat(rowWithEmptiesToFit);\n }\n\n return rowWithEmptiesToFit.map((item: Widget) => {\n // We check if we have any label+field inside the container.\n // In this scenario, we must format the grid accordingly\n // Otherwise, the grid will divide uniformly\n if (item instanceof Label && (item as Label).fieldForLabel) {\n fieldInRows = true;\n }\n\n return (\n <div\n key={item.key}\n style={{\n ...getSpanStyleForItem({ item, responsiveBehaviour }),\n minWidth: 0,\n }}\n >\n {createReactWidget({\n ooui: item,\n responsiveBehaviour,\n })}\n </div>\n );\n });\n });\n\n const templateColumns =\n rows.length === 1\n ? getSingleRowTemplateColumns(firstRow, columns)\n : getTemplateColumns(columns, fieldInRows);\n const gridStyle = {\n display: \"grid\",\n gridTemplateColumns: responsiveBehaviour ? \"auto\" : templateColumns,\n gap: \"1rem\",\n minHeight: 0,\n minWidth: 0,\n };\n\n return <div style={gridStyle}>{content}</div>;\n};\n\nexport default Container;\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { confirm } = Modal;\n\nconst showDialog = ({\n onOk,\n onCancel,\n t,\n}: {\n onOk: () => void;\n onCancel?: () => void;\n t: (key: string) => string;\n}) => {\n confirm({\n title: t(\"unsavedChanges\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmCloseWithoutSave\"),\n okText: t(\"closeWithoutSaving\"),\n onOk,\n onCancel,\n cancelText: t(\"cancel\"),\n });\n};\n\nexport default showDialog;\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { error } = Modal;\n\nconst showDialog = (t: (key: string) => string) => {\n error({\n title: t(\"formHasErrors\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"fillRequiredFields\"),\n });\n};\n\nexport default showDialog;\n","import React from \"react\";\nimport { Modal } from \"antd\";\nimport { WarningOutlined } from \"@ant-design/icons\";\n\nconst { warning } = Modal;\n\nconst showDialog = (title: string, message: string, onOk?: () => void) => {\n warning({\n title,\n icon: <WarningOutlined />,\n centered: true,\n content: message,\n onOk,\n });\n};\n\nexport default showDialog;\n","import React from \"react\";\n\nexport type FormModalContextType = {\n setTitle?: (title: string) => void;\n};\n\nexport const FormModalContext =\n React.createContext<FormModalContextType | null>(null);\n\ntype FormModalProviderProps = FormModalContextType & {\n children: React.ReactNode;\n};\n\nconst FormModalProvider = (props: FormModalProviderProps): any => {\n const { children, setTitle } = props;\n\n return (\n <FormModalContext.Provider\n value={{\n setTitle,\n }}\n >\n {children}\n </FormModalContext.Provider>\n );\n};\n\nexport default FormModalProvider;\n","import { FormView, GenerateReportOptions, ViewType } from \"@/types\";\nimport React, {\n useContext,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { openBase64InNewTab, getMimeType } from \"@/helpers/filesHelper\";\nimport { parseContext } from \"@gisce/ooui\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Modal, Spin } from \"antd\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { FormModal } from \"@/widgets/modals/FormModal\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { transformPlainMany2Ones, stringFormat } from \"@/helpers/formHelper\";\n\nexport type ContentRootContextType = {\n processAction: ({\n actionData,\n fields,\n values,\n context,\n }: {\n actionData: any;\n fields: any;\n values: any;\n context?: any;\n onRefreshParentValues?: () => void;\n }) => Promise<any>;\n globalValues?: any;\n};\n\ntype ActionModalOpts = {\n model?: string;\n domain?: any;\n context: any;\n formView?: FormView;\n actionData?: any;\n};\n\nexport const ContentRootContext =\n React.createContext<ContentRootContextType | null>(null);\n\ntype ContentRootProviderProps = {\n children: React.ReactNode;\n globalValues?: any;\n};\n\nconst callRefreshValues = async (fns: any[]) => {\n for (let i = 0; i < fns.length; i++) {\n await fns?.[i]?.();\n }\n};\n\nconst ContentRootProvider = (\n props: ContentRootProviderProps,\n ref: any,\n): any => {\n const { children, globalValues = {} } = props;\n const reportInProgressInterval = useRef<any>();\n const waitingForReport = useRef<boolean>();\n const [reportGenerating, setReportGenerating] = useState<boolean>(false);\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openAction } = tabManagerContext || {};\n const onRefreshParentValues = useRef<any>([]);\n const { t } = useLocale();\n\n useImperativeHandle(ref, () => ({\n openActionModal,\n }));\n\n // Action modal state\n const [actionModalVisible, setActionModalVisible] = useState<boolean>(false);\n\n const [actionModalOptions, setActionModalOptions] = useState<ActionModalOpts>(\n {\n context: {},\n },\n );\n\n async function generateReport(options: GenerateReportOptions) {\n const { reportData, fields, values, context = {} } = options;\n\n const {\n context: reportContext,\n model,\n datas = {},\n report_name,\n type,\n } = reportData;\n\n if (type !== \"ir.actions.report.xml\") {\n showErrorDialog(`${type} action not supported`);\n return;\n }\n\n const { ids } = datas || {};\n\n const idsToExecute = ids || [];\n\n const reportContextParsed =\n typeof reportContext === \"string\"\n ? parseContext({\n context: reportContext,\n fields,\n values,\n })\n : reportContext;\n\n try {\n const newReportId = await ConnectionProvider.getHandler().createReport({\n model,\n name: report_name,\n datas,\n ids: idsToExecute,\n context: { ...context, ...reportContextParsed },\n });\n\n setReportGenerating(true);\n\n waitingForReport.current = true;\n reportInProgressInterval.current = setInterval(() => {\n evaluateReportStatus(newReportId);\n }, 1000);\n } catch (err) {\n waitingForReport.current = false;\n clearInterval(reportInProgressInterval.current);\n showErrorDialog(err);\n setReportGenerating(false);\n }\n }\n\n async function evaluateReportStatus(id: any) {\n let reportState;\n try {\n reportState = await ConnectionProvider.getHandler().getReport({\n id,\n });\n if (reportState.state && waitingForReport.current === true) {\n waitingForReport.current = false;\n clearInterval(reportInProgressInterval.current);\n setReportGenerating(false);\n const fileType: any = await getMimeType(reportState.result);\n openBase64InNewTab(reportState.result, fileType.mime);\n }\n } catch (error) {\n waitingForReport.current = false;\n clearInterval(reportInProgressInterval.current);\n setReportGenerating(false);\n showErrorDialog(error.exception || error);\n }\n }\n\n async function processAction({\n actionData,\n fields,\n values,\n context,\n onRefreshParentValues: onRefreshParentValuesFn,\n }: {\n actionData: any;\n fields: any;\n values: any;\n context?: any;\n onRefreshParentValues?: any;\n }) {\n const { type } = actionData;\n onRefreshParentValues.current.push(onRefreshParentValuesFn);\n\n if (type === \"ir.actions.report.xml\") {\n return await generateReport({\n reportData: actionData,\n fields,\n values,\n context,\n });\n } else if (type === \"ir.actions.act_window\") {\n return await runAction({ actionData, fields, values, context });\n } else if (type === \"ir.actions.act_url\") {\n window.open(\n stringFormat(actionData.url, { ...values, context }),\n \"_blank\",\n );\n } else {\n showErrorDialog(`${type} action not supported`);\n return {};\n }\n }\n\n async function runAction({\n actionData: _actionData,\n fields = {},\n values = {},\n context = {},\n }: {\n actionData: any;\n fields?: any;\n values?: any;\n context?: any;\n }) {\n let actionData = _actionData;\n\n if (!_actionData.res_model) {\n actionData = (\n await ConnectionProvider.getHandler().readObjects({\n model: \"ir.actions.act_window\",\n ids: [parseInt(_actionData.id)],\n context,\n })\n )[0];\n }\n\n const responseContext =\n typeof actionData?.context === \"string\"\n ? parseContext({\n context: actionData.context,\n fields,\n values: { ...values, ...globalValues },\n })\n : actionData.context;\n\n const mergedContext = {\n ...context,\n ...responseContext,\n };\n\n let parsedDomain = [];\n\n if (actionData.domain) {\n parsedDomain = await ConnectionProvider.getHandler().evalDomain({\n domain: actionData.domain,\n values: transformPlainMany2Ones({\n fields,\n values: { ...values, ...globalValues },\n }),\n fields,\n context: mergedContext,\n });\n }\n\n // -- Possible values for target property --\n // * new ==> modal\n // * current ==> new tab\n // * undefined ==> new tab\n if (actionData.target === \"new\") {\n const formView = (await ConnectionProvider.getHandler().getView({\n model: actionData.res_model,\n type: \"form\",\n id: actionData?.view_id?.[0] || undefined,\n context: mergedContext,\n })) as FormView;\n\n openActionModal({\n domain: parsedDomain,\n model: actionData.res_model,\n formView,\n context: mergedContext,\n });\n\n return {};\n } else {\n const { initialView, views } = await getViewsAndInitialView({\n model: actionData.res_model,\n context: mergedContext,\n view_mode: actionData.view_mode,\n views: actionData.views,\n });\n\n openAction?.({\n target: \"current\",\n context: mergedContext,\n domain: parsedDomain,\n model: actionData.res_model,\n views,\n title: actionData.name,\n initialView,\n action_id: actionData.id,\n action_type: actionData.type,\n });\n\n return { closeParent: true };\n }\n }\n\n function openActionModal({\n domain,\n model,\n formView,\n context,\n actionData,\n }: {\n domain: any;\n model: string;\n formView: FormView;\n context: any;\n actionData?: any;\n }) {\n if (actionModalVisible) {\n openNewActionModal({ domain, model, formView, context, actionData });\n } else {\n setActionModalOptions({ domain, model, context, formView, actionData });\n setActionModalVisible(true);\n }\n }\n\n async function openNewActionModal({\n domain,\n model,\n formView,\n context,\n actionData,\n }: {\n domain: any;\n model: string;\n formView: FormView;\n context: any;\n actionData?: any;\n }) {\n setActionModalOptions({\n domain: undefined,\n model: undefined,\n context: {},\n formView: undefined,\n actionData: undefined,\n });\n setActionModalVisible(false);\n await new Promise((resolve) => setTimeout(resolve, 300));\n setActionModalOptions({ domain, model, context, formView, actionData });\n setActionModalVisible(true);\n }\n\n async function onFormModalSucceed() {\n callRefreshValues(onRefreshParentValues.current);\n onRefreshParentValues.current = [];\n setActionModalVisible(false);\n setActionModalOptions({\n domain: undefined,\n model: undefined,\n context: {},\n formView: undefined,\n actionData: undefined,\n });\n }\n\n return (\n <>\n <ContentRootContext.Provider\n value={{\n processAction,\n globalValues,\n }}\n >\n <>\n {children}\n <Modal\n title={t(\"generatingReport\")}\n open={reportGenerating}\n footer={null}\n closable={false}\n centered\n maskClosable={false}\n >\n <Spin />\n </Modal>\n <FormModal\n buttonModal\n parentContext={actionModalOptions.context}\n model={actionModalOptions.model!}\n formView={actionModalOptions.formView}\n visible={actionModalVisible}\n onSubmitSucceed={onFormModalSucceed}\n onCancel={() => {\n callRefreshValues(onRefreshParentValues.current);\n onRefreshParentValues.current = [];\n setActionModalVisible(false);\n setActionModalOptions({\n domain: undefined,\n model: undefined,\n context: {},\n formView: undefined,\n actionData: undefined,\n });\n }}\n showFooter={false}\n actionDomain={actionModalOptions.domain}\n isMenuAction={actionModalOptions?.actionData !== undefined}\n actionData={actionModalOptions?.actionData}\n />\n </>\n </ContentRootContext.Provider>\n </>\n );\n};\n\nasync function getViewsAndInitialView({\n views,\n view_mode,\n model,\n context,\n view_id,\n}: {\n views: any[];\n view_mode: string;\n model: string;\n context: any;\n view_id?: number;\n}) {\n const retriedViewData = [];\n let initialView;\n\n if (views) {\n for (const view of views) {\n const viewData = await ConnectionProvider.getHandler().getView({\n model,\n type: view[1],\n id: view[0],\n context,\n });\n retriedViewData.push([viewData.view_id, view[1]]);\n }\n } else {\n const viewTypes = view_mode.split(\",\");\n for (const viewType of viewTypes) {\n const viewData = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType as ViewType,\n context,\n });\n retriedViewData.push([viewData.view_id, viewType]);\n }\n }\n if (views && views.length > 0) {\n const [id, type] = views[0];\n initialView = {\n id,\n type,\n };\n } else if (!view_id) {\n const type = view_mode.split(\",\")[0];\n const [retrievedViewId] = retriedViewData.find(\n ([_, viewType]) => viewType === type,\n )!;\n initialView = { id: retrievedViewId, type };\n } else {\n initialView = {\n id: view_id,\n type: view_mode.split(\",\")[0],\n };\n }\n\n return { views: retriedViewData, initialView };\n}\n\nexport default forwardRef(ContentRootProvider);\n","export const mergeFieldsContext = (fields: any, contextFields: any) => {\n const output: any = {};\n\n Object.keys(fields).forEach((key) => {\n output[key] = fields[key];\n if (contextFields?.[key]) {\n output[key].context = contextFields[key];\n }\n });\n\n return output;\n};\n","import React, {\n useState,\n forwardRef,\n useImperativeHandle,\n useEffect,\n useRef,\n useContext,\n} from \"react\";\nimport { Form as FormOoui, parseContext } from \"@gisce/ooui\";\nimport {\n Form as AntForm,\n Button,\n Divider,\n Space,\n Row,\n Spin,\n message,\n} from \"antd\";\nimport Measure from \"react-measure\";\nimport { CheckOutlined, CloseOutlined } from \"@ant-design/icons\";\nimport debounce from \"lodash/debounce\";\n\nimport Container from \"@/widgets/containers/Container\";\nimport {\n processValues,\n getTouchedValues,\n checkFieldsType,\n mergeFieldsDomain,\n getValuesForDomain,\n getOnChangePayload,\n} from \"@/helpers/formHelper\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport formErrorsDialog from \"@/ui/FormErrorsDialog\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport showWarningDialog from \"@/ui/WarningDialog\";\nimport FormProvider, {\n FormContext,\n FormContextType,\n} from \"@/context/FormContext\";\nimport { FormView, One2manyItem } from \"@/index\";\nimport {\n FormModalContext,\n FormModalContextType,\n} from \"@/context/FormModalContext\";\n\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\n\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport {\n convertFrom2ManyRawValues,\n convertToPlain2ManyValues,\n} from \"@/helpers/one2manyHelper\";\nimport { ErrorAlert } from \"@/ui/ErrorAlert\";\nimport { mergeFieldsContext } from \"@/helpers/fieldsHelper\";\n\nexport type FormProps = {\n model: string;\n readOnly?: boolean;\n id?: number;\n formView?: FormView;\n values?: any;\n showFooter?: boolean;\n getDataFromAction?: boolean;\n mustClearAfterSave?: boolean;\n submitMode?: \"api\" | \"values\" | \"2many\";\n onSubmitSucceed?: (\n id?: number,\n values?: any,\n formValues?: any,\n x2manyPendingLink?: boolean,\n mustRefreshParent?: boolean,\n ) => void;\n onSubmitError?: (error: any) => void;\n onCancel?: () => void;\n onFieldsChange?: (values: any) => void;\n postSaveAction?: (event: any) => Promise<void>;\n insideButtonModal?: boolean;\n parentContext?: any;\n actionDomain?: any;\n visible?: boolean;\n rootForm?: boolean;\n defaultValues?: any;\n forcedValues?: any;\n parentWidth?: number;\n onMustRefreshParent?: () => void;\n};\n\nconst WIDTH_BREAKPOINT = 800;\n\nfunction Form(props: FormProps, ref: any) {\n const {\n model,\n id,\n onCancel: propsOnCancel,\n onSubmitSucceed: propsOnSubmitSucceed,\n showFooter = false,\n getDataFromAction = false,\n onFieldsChange,\n onSubmitError: propsOnSubmitError,\n readOnly = false,\n mustClearAfterSave = false,\n submitMode = \"api\",\n values: valuesProps,\n formView: formViewProps,\n postSaveAction,\n insideButtonModal = false,\n parentContext = {},\n actionDomain,\n visible = true,\n rootForm = false,\n defaultValues,\n forcedValues = {},\n parentWidth,\n onMustRefreshParent,\n } = props;\n const { t } = useLocale();\n\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const [formOoui, setFormOoui] = useState<FormOoui>();\n const [antForm] = AntForm.useForm();\n const [arch, setArch] = useState<string>();\n const [fields, setFields] = useState<any>();\n const formModalContext = useContext(FormModalContext) as FormModalContextType;\n const [containerWidth, setContainerWidth] = useState<any>();\n const [defaultGetCalled, setDefaultGetCalled] = useState<boolean>(false);\n\n const createdId = useRef<number>();\n const originalFormValues = useRef<any>({});\n const lastAssignedValues = useRef<any>({});\n const warningIsShown = useRef<boolean>(false);\n const formSubmitting = useRef<boolean>(false);\n const x2manyPendingLink = useRef<boolean>(false);\n\n const widthToEvaluate =\n parentWidth !== undefined ? parentWidth : containerWidth;\n const responsiveBehaviour = widthToEvaluate < WIDTH_BREAKPOINT;\n\n const formContext = useContext(FormContext) as FormContextType;\n const { activeId: parentId, getPlainValues: getParentPlainValues } =\n formContext || {};\n\n const mustFetchParentValues = useRef<boolean>(false);\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const {\n setFormIsSaving = undefined,\n setFormHasChanges = undefined,\n setCurrentId = undefined,\n setFormIsLoading = undefined,\n setAttachments = undefined,\n title = undefined,\n setTitle = undefined,\n } = (rootForm ? actionViewContext : {}) || {};\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction, globalValues } = contentRootContext || {};\n\n useImperativeHandle(ref, () => ({\n submitForm,\n getFields,\n getValues,\n getPlainValues,\n getContext,\n fetchValues,\n cancelUnsavedChanges,\n clearAndReload: () => {\n createdId.current = undefined;\n setFormOoui(undefined);\n fetchData();\n },\n }));\n\n useEffect(() => {\n setError(undefined);\n\n if (!model && !formViewProps) {\n return;\n }\n\n if (!visible) {\n createdId.current = undefined;\n setFormOoui(undefined);\n return;\n }\n\n // In the case we set the id to undefined for creating a new item\n if (\n (id === undefined && fields) ||\n (id !== undefined && fields && id < 0)\n ) {\n createdId.current = undefined;\n setFormOoui(undefined);\n }\n\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id, model, valuesProps, formViewProps, visible]);\n\n useEffect(() => {\n if (defaultGetCalled) {\n checkFieldsChanges({\n elementHasLostFocus: true,\n });\n setDefaultGetCalled(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [defaultGetCalled]);\n\n const onSubmitSucceed = (\n id?: number,\n values?: any,\n formValues?: any,\n x2manyPendingLink?: boolean,\n ) => {\n setFormHasChanges?.(false);\n setFormIsSaving?.(false);\n propsOnSubmitSucceed?.(id, values, formValues, x2manyPendingLink);\n setCurrentId?.(id);\n if (mustFetchParentValues.current) {\n onMustRefreshParent?.();\n }\n };\n\n const onCancel = () => {\n if (mustFetchParentValues.current) {\n onMustRefreshParent?.();\n }\n setFormIsSaving?.(false);\n propsOnCancel?.();\n };\n\n const onSubmitError = (error: any) => {\n setFormIsSaving?.(false);\n propsOnSubmitError?.(error);\n };\n\n function getCurrentId() {\n return id || createdId.current;\n }\n\n function getFields() {\n return fields;\n }\n\n function getValues() {\n const values = {\n ...getCurrentValues(fields),\n ...getAdditionalValues(),\n };\n\n for (const key in values) {\n if (values[key] === undefined) {\n delete values[key];\n }\n }\n\n return values;\n }\n\n function getPlainValues() {\n const values: any = getValues();\n const fields: any = getFields();\n const reformattedValues: { [key: string]: any } = {};\n\n Object.keys(values).forEach((key) => {\n const value = values[key];\n\n if (\n fields[key] &&\n fields[key].type === \"many2one\" &&\n value &&\n Array.isArray(value) &&\n value.length === 2\n ) {\n reformattedValues[key] = value[0];\n } else if (\n fields[key] &&\n (fields[key].type === \"one2many\" || fields[key].type === \"many2many\") &&\n value &&\n value.items\n ) {\n reformattedValues[key] = value.items\n .filter((item: One2manyItem) => item.operation !== \"pendingRemove\")\n .map((val: any) => val.id);\n } else {\n reformattedValues[key] = value;\n }\n });\n\n return reformattedValues;\n }\n\n function getFormValues() {\n const values = {\n ...getCurrentValues(fields),\n };\n\n for (const key in values) {\n if (values[key] === undefined) {\n delete values[key];\n }\n }\n\n return values;\n }\n\n function getContext() {\n return { ...parentContext, ...formOoui?.context };\n }\n\n function getActiveIdsContext() {\n const currentId = getCurrentId()!;\n\n if (!currentId) {\n return {};\n }\n return { active_id: getCurrentId()!, active_ids: [getCurrentId()!] };\n }\n\n function getAdditionalValues() {\n return {\n id: getCurrentId()!,\n active_id: getCurrentId()!,\n active_ids: [getCurrentId()!],\n parent_id: parentId,\n ...globalValues,\n };\n }\n\n const getDefaultValues = async (fields: any) => {\n const formContext = getCurrentId() ? formOoui?.context : {};\n return await ConnectionProvider.getHandler().defaultGet({\n model,\n fields,\n context: { ...parentContext, ...formContext },\n extraValues: defaultValues,\n });\n };\n\n const formHasChanges = () => {\n return (\n Object.keys(\n getTouchedValues({\n source: originalFormValues.current,\n target: getCurrentValues(fields),\n fields,\n }),\n ).length !== 0\n );\n };\n\n const getCurrentValues = (fields: any) => {\n const currentValues = antForm.getFieldsValue(true);\n return processValues(currentValues, fields);\n };\n\n const setFieldValue = (field: string, value?: string) => {\n assignNewValuesToForm({\n values: {\n ...processValues(antForm.getFieldsValue(true), fields),\n [field]: value,\n },\n fields,\n reset: false,\n });\n };\n\n const getFieldValue = (field: string) => {\n const values = antForm.getFieldsValue(true);\n return values[field];\n };\n\n async function checkIfFormHasErrors() {\n try {\n await antForm.validateFields();\n return false;\n } catch (verror) {\n message.error(t(\"fillRequiredFields\"));\n return true;\n }\n }\n const fetchData = async () => {\n setError(undefined);\n setFormIsLoading?.(true);\n\n let view;\n\n try {\n if (formViewProps) {\n view = { arch: formViewProps.arch, fields: formViewProps.fields };\n } else {\n view = await getFormView();\n }\n\n const { fields, arch } = view;\n setFields(fields);\n setArch(arch);\n\n await fetchValues({\n fields,\n arch,\n });\n } catch (err) {\n setError(err?.message ? err.message + err.stack : err);\n setFormIsLoading?.(false);\n // setLoading(false);\n }\n };\n\n type FetchValuesOptions = {\n fields?: any;\n arch?: string;\n forceRefresh?: boolean;\n };\n\n const fetchValues = async (options?: FetchValuesOptions) => {\n let values;\n let _fields;\n let _arch;\n let hasDefaultGetCalled;\n\n setFormIsLoading?.(true);\n setError(undefined);\n\n if (options?.fields) {\n _fields = options.fields;\n _arch = options.arch;\n } else {\n _fields = fields;\n _arch = arch;\n }\n\n if (valuesProps && options?.forceRefresh !== true) {\n values = valuesProps;\n } else {\n ({ values, defaultGetCalled: hasDefaultGetCalled } =\n await fetchValuesFromApi({\n fields: _fields,\n arch: _arch!,\n }));\n }\n\n if (actionDomain) {\n values = { ...getValuesForDomain(actionDomain), ...values };\n }\n\n originalFormValues.current = processValues(values, _fields);\n\n assignNewValuesToForm({\n values,\n fields: _fields,\n reset: true,\n isDefaultGet: hasDefaultGetCalled,\n });\n parseForm({ fields: _fields, arch: _arch!, values });\n setFormIsLoading?.(false);\n setFormHasChanges?.(false);\n\n if (hasDefaultGetCalled) {\n setDefaultGetCalled(true);\n }\n };\n\n const cancelUnsavedChanges = async () => {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n if (formHasChanges()) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n onCancel?.();\n resolve(true);\n },\n onCancel: () => {\n resolve(false);\n },\n });\n } else {\n onCancel?.();\n resolve(true);\n }\n });\n };\n\n const getFormView = async (): Promise<FormView> => {\n if (getDataFromAction) {\n const action =\n await ConnectionProvider.getHandler().getActionStringForModel(model);\n const viewsForAction =\n await ConnectionProvider.getHandler().getViewsForAction({\n action,\n context: parentContext,\n });\n return viewsForAction.views.get(\"form\");\n }\n\n return (await ConnectionProvider.getHandler().getView({\n model,\n type: \"form\",\n context: parentContext,\n })) as FormView;\n };\n\n const assignNewValuesToForm = ({\n values: newValues,\n fields,\n reset,\n isDefaultGet = false,\n }: {\n values: any;\n fields: any;\n reset: boolean;\n isDefaultGet?: boolean;\n }) => {\n const currentValues = reset ? {} : antForm.getFieldsValue(true);\n const mergedValues = { ...currentValues, ...newValues };\n const valuesProcessed = processValues(mergedValues, fields);\n const fieldsToUpdate = Object.keys(fields).map((fieldName) => {\n const fieldValue =\n valuesProcessed[fieldName] !== undefined\n ? valuesProcessed[fieldName]\n : undefined;\n return {\n name: fieldName,\n touched: false,\n value: fieldValue,\n };\n });\n\n if (!isDefaultGet) {\n lastAssignedValues.current = valuesProcessed;\n }\n\n antForm.setFields(fieldsToUpdate);\n };\n\n const fetchValuesFromApi = async ({\n fields,\n arch,\n }: {\n fields: any;\n arch: string;\n }) => {\n let values = {};\n let defaultGetCalled = false;\n\n if (getCurrentId()!) {\n const ooui =\n formOoui ||\n getFormOoui({\n arch: arch!,\n fields,\n values: {},\n });\n values = (\n await ConnectionProvider.getHandler().readObjects({\n model,\n ids: [getCurrentId()!],\n fields: mergeFieldsContext(fields, ooui?.contextForFields),\n context: parentContext,\n })\n )[0];\n\n // If we are inside a modal, we don't want to fetch the attachments\n if (insideButtonModal) {\n return { values, defaultGetCalled };\n }\n const results = await ConnectionProvider.getHandler().search({\n params: [\n [\"res_model\", \"=\", model],\n [\"res_id\", \"=\", getCurrentId()!],\n ],\n fieldsToRetrieve: [\"id\", \"name\"],\n context: getContext(),\n model: \"ir.attachment\",\n });\n setAttachments?.(results);\n } else {\n setAttachments?.([]);\n values = await getDefaultValues(fields);\n defaultGetCalled = true;\n }\n return { values, defaultGetCalled };\n };\n\n const submitApi = async (options?: { callOnSubmitSucceed?: boolean }) => {\n const { callOnSubmitSucceed = true } = options || {};\n\n if (getCurrentId()) {\n const touchedValues = getTouchedValues({\n source: originalFormValues.current,\n target: getCurrentValues(fields),\n fields,\n });\n\n await ConnectionProvider.getHandler().update({\n model,\n id: getCurrentId()!,\n values: { ...touchedValues, ...forcedValues },\n fields,\n context: {\n ...parentContext,\n ...formOoui?.context,\n },\n });\n originalFormValues.current = getCurrentValues(fields);\n } else {\n const currentValues = getCurrentValues(fields);\n\n const newId = await ConnectionProvider.getHandler().create({\n model,\n values: { ...currentValues, ...forcedValues },\n fields,\n context: {\n ...parentContext,\n ...formOoui?.context,\n },\n });\n createdId.current = newId;\n originalFormValues.current = currentValues;\n }\n\n if (postSaveAction) {\n await postSaveAction([getCurrentId()]);\n }\n\n if (!insideButtonModal && callOnSubmitSucceed) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n }\n };\n\n const submitValues = async (options?: { callOnSubmitSucceed?: boolean }) => {\n const { callOnSubmitSucceed = true } = options || {};\n\n if (!insideButtonModal && callOnSubmitSucceed) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n }\n };\n\n const submitForm = async (options?: { callOnSubmitSucceed?: boolean }) => {\n let submitSucceed = false;\n const { callOnSubmitSucceed = true } = options || {};\n formSubmitting.current = true;\n\n setError(undefined);\n\n if (\n x2manyPendingLink.current &&\n !formHasChanges() &&\n getCurrentId()! &&\n callOnSubmitSucceed\n ) {\n formSubmitting.current = false;\n setFormHasChanges?.(false);\n onSubmitSucceed?.(\n getCurrentId(),\n getValues(),\n getFormValues(),\n x2manyPendingLink.current,\n );\n x2manyPendingLink.current = false;\n const currentId = getCurrentId()!;\n\n if (mustClearAfterSave) {\n createdId.current = undefined;\n assignNewValuesToForm({ values: {}, fields, reset: true });\n }\n\n return { succeed: true, id: currentId };\n }\n\n if (!formHasChanges() && getCurrentId()! && callOnSubmitSucceed) {\n formSubmitting.current = false;\n setFormHasChanges?.(false);\n onCancel?.();\n return { succeed: true, id: getCurrentId()! };\n }\n\n if (await checkIfFormHasErrors()) {\n formSubmitting.current = false;\n formErrorsDialog(t);\n return { succeed: false, id: getCurrentId()! };\n }\n\n setIsSubmitting(true);\n setFormIsSaving?.(true);\n\n try {\n if (submitMode === \"api\") {\n await submitApi(options);\n } else {\n await submitValues(options);\n }\n\n if (mustClearAfterSave) {\n createdId.current = undefined;\n assignNewValuesToForm({ values: {}, fields, reset: true });\n }\n\n await fetchValues({ forceRefresh: true });\n submitSucceed = true;\n message.success(t(\"savedRegisters\"));\n } catch (err) {\n formSubmitting.current = false;\n setIsSubmitting(false);\n setFormIsSaving?.(false);\n onSubmitError?.(err);\n message.error(t(\"errorWhileSavingForm\"));\n setError(err?.message ? err.message : err);\n } finally {\n formSubmitting.current = false;\n setFormIsSaving?.(false);\n setIsSubmitting(false);\n }\n\n return { succeed: submitSucceed, id: getCurrentId()! };\n };\n\n const getFormOoui = ({\n fields,\n arch,\n values,\n operationInProgress = false,\n }: {\n arch: string;\n fields: any;\n values: any;\n operationInProgress?: boolean;\n }) => {\n const ooui = new FormOoui(fields);\n // Here we must inject `values` to the ooui parser in order to evaluate arch+values and get the new form container\n ooui.parse(arch, {\n readOnly: readOnly || operationInProgress,\n values: convertToPlain2ManyValues(\n {\n ...values,\n ...getAdditionalValues(),\n },\n fields,\n ),\n });\n return ooui;\n };\n\n const parseForm = ({\n fields,\n arch,\n values,\n operationInProgress = false,\n }: {\n arch: string;\n fields: any;\n values: any;\n operationInProgress?: boolean;\n }) => {\n const ooui = getFormOoui({\n arch,\n fields,\n values,\n operationInProgress,\n });\n\n setFormOoui(ooui);\n\n if (ooui.string && ooui.string !== title) {\n setTitle?.(ooui.string);\n }\n\n if (formModalContext && ooui.string)\n formModalContext.setTitle?.(ooui.string);\n };\n\n const checkFieldsChanges = async ({\n elementHasLostFocus = false,\n }: {\n elementHasLostFocus?: boolean;\n }) => {\n if (formSubmitting.current) return;\n\n const touchedValues = getTouchedValues({\n source: lastAssignedValues.current,\n target: getCurrentValues(fields),\n fields,\n });\n\n const changedFields = Object.keys(touchedValues);\n\n if (changedFields.length !== 0) {\n // We check if there are any field of type text, email, url or char inside the changed values\n // in order to ignore the call, because it will fire when element lost focus\n if (\n checkFieldsType({\n changedFields,\n formOoui: formOoui!,\n types: [\n \"text\",\n \"codeeditor\",\n \"email\",\n \"url\",\n \"char\",\n \"float\",\n \"float_time\",\n \"integer\",\n \"many2one\",\n ],\n }) &&\n elementHasLostFocus !== true\n ) {\n /* empty */\n } else {\n const values = processValues(antForm.getFieldsValue(true), fields);\n lastAssignedValues.current = values;\n\n onFieldsChange?.(values);\n setFormHasChanges?.(true);\n\n evaluateChanges(changedFields);\n }\n }\n };\n\n const debouncedCheckFieldsChanges = debounce(checkFieldsChanges, 100);\n\n const evaluateChanges = async (changedFields: any) => {\n try {\n for (let i = 0; i < changedFields.length; i += 1) {\n const changedField = changedFields[i];\n await processFieldOnChange(changedField);\n }\n } catch (err) {\n showErrorDialog(err);\n }\n };\n\n const processFieldOnChange = async (fieldName: string) => {\n const onChangeFieldAction = formOoui?.onChangeFields[fieldName];\n\n if (!onChangeFieldAction) {\n parseForm({\n fields,\n arch: arch!,\n values: getCurrentValues(fields),\n });\n return;\n }\n\n const payload = getOnChangePayload({\n values: {\n ...getCurrentValues(fields),\n context: {\n ...parentContext,\n ...formOoui?.context,\n },\n },\n parentValues: getParentPlainValues?.(),\n onChangeFieldActionArgs: onChangeFieldAction.args,\n });\n\n const response = await ConnectionProvider.getHandler().executeOnChange({\n model,\n action: onChangeFieldAction.method,\n ids: getCurrentId()! ? [getCurrentId()!] : [],\n payload,\n fields,\n });\n\n if (response.value) {\n const processedValues = {\n ...getCurrentValues(fields),\n ...response.value,\n };\n\n const valuesWith2ManyValuesConverted = convertFrom2ManyRawValues({\n values: processedValues,\n fields,\n });\n\n parseForm({\n fields,\n arch: arch!,\n values: valuesWith2ManyValuesConverted,\n });\n\n assignNewValuesToForm({\n values: valuesWith2ManyValuesConverted,\n fields,\n reset: false,\n });\n }\n\n if (\n response.warning &&\n response.warning.title &&\n response.warning.message &&\n !warningIsShown.current\n ) {\n const { title, message } = response.warning;\n warningIsShown.current = true;\n showWarningDialog(title, message, () => {\n warningIsShown.current = false;\n });\n }\n\n if (response.domain && Object.keys(response.domain).length > 0) {\n const proccessedFields = mergeFieldsDomain({\n fieldsDomain: response.domain,\n fields,\n });\n\n parseForm({\n fields: proccessedFields,\n arch: arch!,\n values: getCurrentValues(proccessedFields),\n });\n setFields(proccessedFields);\n }\n };\n\n async function runObjectButton({\n action,\n context,\n }: {\n action: string;\n context: any;\n }) {\n const response = await ConnectionProvider.getHandler().execute({\n model,\n action,\n payload: [getCurrentId()!],\n context: {\n ...formOoui?.context,\n ...parentContext,\n ...context,\n },\n });\n\n if (\n typeof response === \"object\" &&\n response !== null &&\n Object.keys(response).length === 0 &&\n insideButtonModal\n ) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n } else if (\n response.type &&\n response.type === \"ir.actions.act_window_close\"\n ) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n } else if (response.type) {\n let responseContext = {};\n\n if (response.context) {\n responseContext = parseContext({\n context: response.context,\n fields,\n values: getValues(),\n });\n }\n\n await runAction({\n actionData: response,\n context: { ...context, ...responseContext },\n });\n } else {\n await fetchValues({ forceRefresh: true });\n }\n }\n\n async function runWorkflowButton({ action }: { action: string }) {\n const response = await ConnectionProvider.getHandler().executeWorkflow({\n model,\n action,\n payload: getCurrentId()!,\n });\n\n if (response.type && response.type === \"ir.actions.act_window_close\") {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n } else {\n await fetchValues({ forceRefresh: true });\n }\n }\n\n async function runActionButton({\n action,\n context,\n }: {\n action: string;\n context: any;\n }) {\n const actionData = (\n await ConnectionProvider.getHandler().readObjects({\n model: \"ir.actions.actions\",\n ids: [parseInt(action)],\n context: parentContext,\n })\n )[0];\n\n await runAction({ actionData, context });\n }\n\n async function runAction({\n actionData,\n context,\n }: {\n actionData: any;\n context: any;\n }) {\n const { closeParent } =\n (await processAction?.({\n actionData,\n fields,\n values: getValues(),\n context: {\n ...parentContext,\n ...formOoui?.context,\n ...context,\n },\n onRefreshParentValues: async () => {\n mustFetchParentValues.current = true;\n await fetchValues({ forceRefresh: true });\n },\n })) || {};\n\n if (!rootForm && closeParent) {\n onSubmitSucceed?.(getCurrentId(), getValues(), getFormValues());\n }\n }\n\n function elementHasLostFocus() {\n checkFieldsChanges({ elementHasLostFocus: true });\n }\n\n function updateOperationInProgress(value: boolean) {\n parseForm({\n fields,\n arch: arch!,\n values: getCurrentValues(fields),\n operationInProgress: value,\n });\n }\n\n async function executeButtonAction({\n type,\n action,\n context,\n }: {\n type: string;\n action: string;\n context?: any;\n }) {\n // If the type of the button it's a cancel, we just close our form\n if (type === \"cancel\") {\n onCancel?.();\n return;\n }\n\n // We check for required fields\n if (await checkIfFormHasErrors()) {\n formErrorsDialog(t);\n return;\n }\n\n let mustBlockButtons = false;\n\n try {\n if (!readOnly && (formHasChanges() || getCurrentId() === undefined)) {\n mustBlockButtons = true;\n updateOperationInProgress(true);\n if (submitMode === \"2many\") {\n await submitApi({ callOnSubmitSucceed: false });\n x2manyPendingLink.current = true;\n } else {\n await submitForm({ callOnSubmitSucceed: false });\n }\n }\n\n const additionalContext = x2manyPendingLink.current\n ? getActiveIdsContext()\n : {};\n\n const updatedContext = { ...context, ...additionalContext };\n\n if (type === \"object\") {\n await runObjectButton({ action, context: updatedContext });\n } else if (type === \"workflow\") {\n await runWorkflowButton({ action });\n } else if (type === \"action\") {\n await runActionButton({ action, context: updatedContext });\n }\n mustBlockButtons && updateOperationInProgress(false);\n } catch (err) {\n mustBlockButtons && updateOperationInProgress(false);\n showErrorDialog(err);\n }\n }\n\n const content = () => {\n if (!formOoui && !error) {\n return <Spin />;\n }\n\n if (!model && !formViewProps) {\n return null;\n }\n\n if (!visible) {\n return null;\n }\n\n return (\n <>\n <FormProvider\n getValues={getValues}\n getPlainValues={getPlainValues}\n getFields={getFields}\n domain={actionDomain}\n activeId={id}\n activeModel={model}\n setFieldValue={setFieldValue}\n getFieldValue={getFieldValue}\n executeButtonAction={executeButtonAction}\n getContext={getContext}\n submitForm={submitForm}\n fetchValues={fetchValues}\n formHasChanges={formHasChanges}\n elementHasLostFocus={elementHasLostFocus}\n formView={formViewProps}\n >\n <AntForm\n form={antForm}\n onFieldsChange={() => {\n debouncedCheckFieldsChanges({ elementHasLostFocus: false });\n }}\n component={false}\n >\n {formOoui && (\n <Container\n container={formOoui.container}\n responsiveBehaviour={responsiveBehaviour}\n />\n )}\n </AntForm>\n </FormProvider>\n </>\n );\n };\n\n const footer = () => {\n return (\n <>\n <Divider />\n <Row justify=\"end\">\n <Space>\n <Button\n icon={<CloseOutlined />}\n disabled={isSubmitting}\n onClick={async () => {\n await cancelUnsavedChanges();\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isSubmitting || readOnly}\n loading={isSubmitting}\n icon={<CheckOutlined />}\n onClick={async () => {\n await submitForm();\n }}\n type=\"primary\"\n >\n OK\n </Button>\n </Space>\n </Row>\n </>\n );\n };\n\n if (!visible) {\n return null;\n }\n\n return (\n <Measure\n bounds\n onResize={(contentRect) => {\n setContainerWidth(contentRect.bounds?.width!);\n }}\n >\n {({ measureRef }) => (\n <div className=\"pb-2\" ref={measureRef}>\n {error && <ErrorAlert className=\"mt-5 mb-10\" error={error} />}\n {content()}\n {showFooter && footer()}\n </div>\n )}\n </Measure>\n );\n}\n\nexport default forwardRef(Form);\n","import React, { useEffect, useState } from \"react\";\nimport { Button, Col, Modal, Row, Tooltip } from \"antd\";\nimport Form, { FormProps } from \"@/widgets/views/Form\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport FormModalProvider from \"@/context/FormModalContext\";\nimport { StarOutlined, StarFilled } from \"@ant-design/icons\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\ntype FormModalProps = FormProps & {\n visible: boolean;\n title?: string;\n buttonModal?: boolean;\n isMenuAction?: boolean;\n actionData?: any;\n};\n\nexport const FormModal = (props: FormModalProps) => {\n const {\n visible,\n id,\n title,\n buttonModal = false,\n onCancel,\n isMenuAction = false,\n actionData,\n ...rest\n } = props;\n\n const { model } = rest;\n\n const { modalWidth } = useWindowDimensions();\n const [formTitle, setFormTitle] = useState<string>(title!);\n const [isFavourite, setIsFavourite] = useState(false);\n const [currentShortcutId, setCurrentShortcutId] = useState<number>();\n const { action_id, res_id, action_type, view_id } = actionData || {};\n\n useEffect(() => {\n if (isMenuAction) {\n checkFavourite();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [actionData, isMenuAction]);\n\n async function checkFavourite() {\n const result = await ConnectionProvider.getHandler().isShortcutFavorite({\n action_id,\n action_type,\n view_id,\n res_id: res_id || false,\n });\n\n setIsFavourite(result !== false);\n\n if (result !== false) {\n setCurrentShortcutId(result as number);\n }\n }\n\n async function toggleFavourite() {\n if (isFavourite && currentShortcutId) {\n await ConnectionProvider.getHandler().removeFavourite({\n shortcut_id: currentShortcutId,\n });\n } else {\n const { action_id, res_id, action_type, view_id } = actionData;\n\n await ConnectionProvider.getHandler().addFavourite({\n action_id,\n action_type,\n view_id,\n res_id: res_id || false,\n });\n }\n\n setIsFavourite(!isFavourite);\n }\n\n function header() {\n return (\n <Row align=\"middle\">\n <Col>\n <Button\n type={isFavourite ? \"primary\" : \"default\"}\n icon={\n isFavourite ? (\n <StarFilled style={{ color: \"white\" }} />\n ) : (\n <StarOutlined />\n )\n }\n style={{ width: 30 }}\n onClick={toggleFavourite}\n ></Button>\n </Col>\n <Col style={{ paddingLeft: 10 }}>{formTitle}</Col>\n </Row>\n );\n }\n\n const contentWidth = modalWidth * 0.95;\n return (\n <FormModalProvider setTitle={setFormTitle}>\n <Modal\n title={isMenuAction ? header() : formTitle}\n centered\n width={modalWidth}\n open={visible}\n footer={null}\n destroyOnClose\n onCancel={onCancel}\n maskClosable={false}\n >\n <Form\n key={`${model}-${id}-${action_id}-${res_id}-${action_type}-${view_id}-${title}`}\n id={id}\n showFooter={true}\n insideButtonModal={buttonModal}\n onCancel={onCancel}\n parentWidth={contentWidth}\n {...rest}\n />\n </Modal>\n </FormModalProvider>\n );\n};\n","import { DatePicker } from \"antd\";\n\nimport React from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\nexport const DateRangePicker = (props: WidgetProps) => {\n return (\n <Field {...props} layout={\"vertical\"}>\n <DatePicker.RangePicker\n allowEmpty={[true, true]}\n format={\"DD/MM/YYYY\"}\n ></DatePicker.RangePicker>\n </Field>\n );\n};\n","import { TimePicker as AntTimePicker } from \"antd\";\nimport { useRef } from \"react\";\nimport { Dayjs } from \"dayjs\";\n\ninterface TimePickerProps {\n value?: Dayjs | null;\n onChange: (newValue: Dayjs | null, timestring?: string) => void;\n numberOfSelectsToHide?: number;\n [key: string]: any; // Accept any additional props\n}\n\nexport const TimePicker = ({\n value,\n onChange,\n numberOfSelectsToHide = 2,\n ...rest\n}: TimePickerProps) => {\n const picker = useRef<any>();\n const pickerSelectedTimes = useRef(0);\n return (\n <AntTimePicker\n {...rest}\n ref={picker}\n value={value}\n onChange={onChange}\n showNow={false}\n changeOnBlur={true}\n onSelect={(newValue) => {\n onChange?.(newValue);\n pickerSelectedTimes.current += 1;\n if (pickerSelectedTimes.current === numberOfSelectsToHide) {\n picker.current?.blur();\n pickerSelectedTimes.current = 0;\n }\n }}\n />\n );\n};\n","import { DatePicker, Row, Col } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Field as FieldOoui, Label as LabelOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport Label from \"@/widgets/base/Label\";\nimport { TimePicker } from \"../../../common/TimePicker\";\n\nexport const DateTimeRangePicker = (props: WidgetProps) => {\n const { ooui, showLabel = false } = props;\n const { label, id } = ooui;\n\n const fields = [\n new FieldOoui({\n name: id + \"#date\",\n label: \"\",\n }),\n new FieldOoui({\n name: id + \"#time\",\n label: \"\",\n }),\n ];\n\n return (\n <>\n {showLabel && (\n <Label\n ooui={\n new LabelOoui({\n name: id + \"_label\",\n string: label,\n help: ooui.tooltip,\n fieldForLabel: id,\n })\n }\n align={\"left\"}\n />\n )}\n <Row align={\"bottom\"} className=\"p-0\">\n <Col className=\"mr-2\">\n <Field {...props} ooui={fields[0]} showLabel={false}>\n <DatePicker.RangePicker\n className=\"w-60\"\n allowEmpty={[true, true]}\n format={\"DD/MM/YYYY\"}\n ></DatePicker.RangePicker>\n </Field>\n </Col>\n <Col>\n <Field {...props} ooui={fields[1]} showLabel={false}>\n <TimeRangePicker />\n </Field>\n </Col>\n </Row>\n </>\n );\n};\n\nconst TimeRangePicker = ({\n value,\n onChange,\n}: {\n value?: any;\n onChange?: (newValue: any) => void;\n}) => {\n return (\n <div style={{ marginTop: 5 }}>\n <TimePicker\n placeholder=\"Start time\"\n format={\"HH:mm\"}\n style={{ width: 115, marginRight: 10 }}\n value={value?.[0]}\n onChange={(newValue) => {\n onChange?.([newValue, value?.[1]]);\n }}\n />\n <TimePicker\n placeholder=\"End time\"\n style={{ width: 115 }}\n format={\"HH:mm\"}\n value={value?.[1]}\n onChange={(newValue) => {\n onChange?.([value?.[0], newValue]);\n }}\n />\n </div>\n );\n};\n","import React, { useContext } from \"react\";\nimport { InputNumber, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Float as FloatOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\nexport const Float = (props: WidgetProps) => {\n const { ooui } = props;\n const { id, decimalDigits, readOnly, required } = ooui as FloatOoui;\n const { token } = useToken();\n\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n return (\n <Field required={required} type={\"number\"} {...props}>\n <InputNumber\n disabled={readOnly}\n className={\"w-full\"}\n style={requiredStyle}\n id={id}\n precision={decimalDigits}\n formatter={(value) => {\n return `${value}`.replace(/[^0-9.-]+/g, \"\");\n }}\n decimalSeparator={\".\"}\n onBlur={elementHasLostFocus}\n wheel={false}\n />\n </Field>\n );\n};\n","import React, { useContext } from \"react\";\nimport { InputNumber, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\ntype IntegerProps = WidgetProps & {\n onChange?: (newValue: number) => void;\n};\n\nexport const Integer = (props: IntegerProps) => {\n const { ooui, onChange } = props;\n const { id, readOnly, required } = ooui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n return (\n <Field required={required} type={\"number\"} {...props}>\n <InputNumber\n id={id}\n className={\"w-full \"}\n disabled={readOnly}\n formatter={(value) => {\n // Check if value is not undefined and is a valid number\n if (value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\" && !isNaN(parseFloat(value))) {\n const truncatedValue = Math.trunc(parseFloat(value));\n return `${truncatedValue}`.replace(/[^0-9\\-]+/g, \"\");\n } else if (typeof value === \"number\") {\n const truncatedValue = Math.trunc(value);\n return `${truncatedValue}`.replace(/[^0-9\\-]+/g, \"\");\n }\n\n return \"\";\n }}\n onChange={(newValue: any) => {\n const newNumber = newValue as number;\n onChange?.(newNumber);\n }}\n onBlur={elementHasLostFocus}\n precision={0}\n style={requiredStyle}\n wheel={false}\n />\n </Field>\n );\n};\n","import React from \"react\";\nimport { Row, Col } from \"antd\";\nimport { Float } from \"@/widgets/base/Float\";\nimport { Integer } from \"@/widgets/base/Integer\";\nimport { Integer as IntegerOoui, Label as LabelOoui } from \"@gisce/ooui\";\nimport Label from \"@/widgets/base/Label\";\nimport { WidgetProps } from \"@/types\";\n\ntype Props = {\n ooui: any;\n};\n\nexport function PairFields(props: WidgetProps): React.ReactElement {\n const { ooui, showLabel } = props;\n const { id, label, tooltip } = ooui;\n const Widget = ooui instanceof IntegerOoui ? Integer : Float;\n\n const getWidget = (suffix: string) => {\n return (\n <Widget\n ooui={{\n ...(ooui as any),\n id: id + suffix,\n label: \"\",\n tooltip: undefined,\n }}\n layout=\"vertical\"\n />\n );\n };\n\n return (\n <>\n {showLabel && (\n <Label\n ooui={\n new LabelOoui({\n name: id + \"_label\",\n string: label,\n help: tooltip,\n fieldForLabel: id,\n })\n }\n align={\"left\"}\n />\n )}\n <Row align={\"bottom\"} className=\"mt-0\" wrap={false}>\n <Col>{getWidget(\"#from\")}</Col>\n <Col className=\"pb-1\">\n <span className=\"pl-2 pr-2 h-full\"> - </span>\n </Col>\n <Col>{getWidget(\"#to\")}</Col>\n </Row>\n </>\n );\n}\n","import React from \"react\";\nimport { Select, theme } from \"antd\";\nimport styled from \"styled-components\";\n\nimport Field from \"@/common/Field\";\nimport { Selection as SelectionOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\nconst { Option } = Select;\n\nexport const MultiSelection = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <MultiSelectionInput {...props} />\n </Field>\n );\n};\n\ntype SelectionInputProps = WidgetProps & {\n onChange?: (value: any) => void;\n value?: string[];\n};\n\nexport const MultiSelectionInput = (props: SelectionInputProps) => {\n const { ooui, onChange, value } = props;\n const { selectionValues, readOnly, required } = ooui as SelectionOoui;\n\n const values = Array.from(selectionValues.entries());\n\n const options =\n values &&\n values.length &&\n values\n .filter((optionValueKeyPair) => {\n const [optionKey] = optionValueKeyPair;\n if (!value) {\n return true;\n }\n return !value.includes(optionKey);\n })\n .map((entry: string[]) => {\n const [key, value] = entry;\n return (\n <Option key={key} value={value}>\n {value}\n </Option>\n );\n });\n\n const CustomSelect: any = required && !readOnly ? RequiredSelect : Select;\n\n function handleChange(changedValues: string[]) {\n const keysForChangedValues = changedValues.map((changedValue) => {\n const entry = values.find(([key, value]) => changedValue === value);\n return entry && entry[0];\n });\n\n if (keysForChangedValues.length === 0) {\n onChange?.(undefined);\n return;\n }\n\n onChange?.(keysForChangedValues);\n }\n\n return (\n <CustomSelect\n disabled={readOnly}\n onChange={handleChange}\n value={value?.map((key) => selectionValues.get(key))}\n mode=\"multiple\"\n showArrow={true}\n >\n {options}\n </CustomSelect>\n );\n};\n\nconst RequiredSelect = styled(Select)`\n &.ant-select:not(.ant-select-customize-input) .ant-select-selector {\n background-color: ${mapToken.colorPrimaryBg};\n }\n`;\n","import React, { useContext } from \"react\";\n\nimport { Char } from \"@/widgets/base/Char\";\nimport { Selection } from \"@/widgets/base/Selection\";\nimport { DateRangePicker } from \"./DateRangePicker\";\nimport { DateTimeRangePicker } from \"./DateTimeRangePicker\";\nimport { PairFields } from \"./PairFields\";\n\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nimport {\n Field,\n SearchFieldTypes,\n Selection as SelectionOoui,\n} from \"@gisce/ooui\";\nimport { MultiSelection } from \"@/widgets/base/MultiSelection\";\n\ntype Props = {\n field: Field;\n};\n\nexport function SearchField(props: Props) {\n const { field } = props;\n field.readOnly = false;\n field.required = false;\n\n const { t } = useLocale();\n\n const widgetType = field.type;\n\n switch (widgetType) {\n case SearchFieldTypes.boolean: {\n const ooui = new SelectionOoui({\n name: field._id,\n string: field.label,\n selection: [\n [\"true\", t(\"true\")],\n [\"false\", t(\"false\")],\n ],\n });\n\n return <Selection layout=\"vertical\" ooui={ooui} showLabel />;\n }\n case SearchFieldTypes.float:\n case SearchFieldTypes.progressbar:\n case SearchFieldTypes.float_time:\n case SearchFieldTypes.integer: {\n return <PairFields ooui={field} showLabel />;\n }\n case SearchFieldTypes.date: {\n return <DateRangePicker ooui={field} layout=\"vertical\" showLabel />;\n }\n case SearchFieldTypes.datetime: {\n return <DateTimeRangePicker ooui={field} layout=\"vertical\" showLabel />;\n }\n case SearchFieldTypes.selection: {\n return <MultiSelection layout=\"vertical\" ooui={field} showLabel />;\n }\n default: {\n return <Char ooui={field} layout=\"vertical\" showLabel isSearchField />;\n }\n }\n}\n","import { ReactElement, useContext } from \"react\";\n\nimport { Row, Col, Button } from \"antd\";\nimport {\n DownOutlined,\n UpOutlined,\n SearchOutlined,\n ClearOutlined,\n} from \"@ant-design/icons\";\n\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n advancedFilter: boolean;\n isSearching: boolean;\n onAdvancedFilterToggle: () => void;\n onClear: () => void;\n};\n\nexport function SearchBottomBar(props: Props): ReactElement {\n const { onAdvancedFilterToggle, advancedFilter, onClear, isSearching } =\n props;\n\n const { t } = useLocale();\n\n return (\n <Row>\n <Col span={12} className=\"text-left pt-4 pb-2 pl-2\">\n <a className=\"text-xs\" onClick={onAdvancedFilterToggle}>\n {advancedFilter ? (\n <UpOutlined className=\"pr-1\" />\n ) : (\n <DownOutlined className=\"pr-1\" />\n )}\n {advancedFilter ? t(\"simple_search\") : t(\"advanced_search\")}\n </a>\n </Col>\n <Col span={12} className=\"text-right pb-2\">\n <Button className=\"mr-5\" icon={<ClearOutlined />} onClick={onClear}>\n {t(\"clear\")}\n </Button>\n <Button\n icon={<SearchOutlined />}\n loading={isSearching}\n className=\"mr-2\"\n type=\"primary\"\n htmlType=\"submit\"\n >\n {t(\"search\")}\n </Button>\n </Col>\n </Row>\n );\n}\n","import React, { useContext } from \"react\";\n\nimport { Integer } from \"@/widgets/base/Integer\";\nimport { Row, Space } from \"antd\";\nimport { Integer as IntegerOoui } from \"@gisce/ooui\";\n\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype SearchParamsProps = {\n onLimitChange?: (limit: number) => void;\n};\n\nexport function SearchParams(props: SearchParamsProps): React.ReactElement {\n const { onLimitChange } = props;\n const { t } = useLocale();\n\n const limitOoui = new IntegerOoui({ name: \"limit\" });\n const offsetOoui = new IntegerOoui({ name: \"offset\" });\n return (\n <div className=\"pl-2 pt-2\">\n <Row key={\"count_params\"}>{t(\"parameters\")}</Row>\n <Space align=\"center\">\n {t(\"limit\") + \" :\"}\n <Integer\n ooui={limitOoui}\n onChange={(newValue: number) => {\n onLimitChange?.(newValue);\n }}\n />\n {t(\"first\") + \" :\"}\n <Integer ooui={offsetOoui} />\n </Space>\n </div>\n );\n}\n","const convertBooleanParamIfNeeded = (value: any) => {\n if ((typeof value === \"string\" && value === \"true\") || value === \"false\") {\n return value === \"true\";\n }\n return value;\n};\n\nexport const getParamsForFields = (values: any, widgetContainer: any) => {\n const filteredValues = removeUndefinedFields(values);\n const groupedDateTime = groupDateTimeValuesIfNeeded(filteredValues);\n const groupedValues = ungroupDateValuesIfNeeded(\n groupedDateTime,\n widgetContainer,\n );\n\n const params = [\n ...Object.keys(groupedValues).map((key) => {\n return getParamForField(key, groupedValues[key], widgetContainer);\n }),\n ];\n\n // This is needed because in case of datetime we receive an array of arrays\n const paramsForFields = params.reduce((acc, curVal) => {\n if (Array.isArray(curVal[0])) {\n return acc.concat(curVal);\n }\n return [...acc, curVal];\n }, []);\n\n return paramsForFields;\n};\n\nconst getParamForField = (key: string, value: any, widgetContainer: any) => {\n const filteredKey = key.split(\"#\")[0];\n const type = widgetContainer.findById(filteredKey)?.type;\n\n if (\n type === \"char\" ||\n type === \"text\" ||\n type === \"many2one\" ||\n type === \"many2many\" ||\n type === \"one2many\"\n ) {\n return [key, \"ilike\", value];\n } else if (\n type === \"float\" ||\n type === \"integer\" ||\n type === \"float_time\" ||\n type === \"progressbar\"\n ) {\n const operator = key.indexOf(\"#from\") !== -1 ? \">=\" : \"<=\";\n return [filteredKey, operator, value];\n } else if (type === \"date\") {\n const operator = key.indexOf(\"#from\") !== -1 ? \">=\" : \"<=\";\n return [filteredKey, operator, value.format(\"YYYY-MM-DD\")];\n } else if (type === \"datetime\") {\n const filteredValues = [];\n if (value[0]) {\n filteredValues.push([filteredKey, \">=\", value[0]]);\n }\n if (value[1]) {\n filteredValues.push([filteredKey, \"<=\", value[1]]);\n }\n return filteredValues;\n } else if (type === \"selection\") {\n return [\n key,\n \"in\",\n value.map((valueEntry: string) =>\n convertBooleanParamIfNeeded(valueEntry),\n ),\n ];\n } else {\n return [key, \"=\", convertBooleanParamIfNeeded(value)];\n }\n};\n\nconst getDatetimeDateFields = (values: any) => {\n return Object.keys(values).filter((key) => {\n return key.indexOf(\"#date\") !== -1;\n });\n};\n\nconst removeDateTimeSingleFields = (values: any) => {\n const newValues = { ...values };\n Object.keys(newValues).forEach(\n (key) =>\n (key.indexOf(\"#time\") !== -1 || key.indexOf(\"#date\") !== -1) &&\n delete newValues[key],\n );\n return newValues;\n};\n\nexport const groupDateTimeValuesIfNeeded = (values: any) => {\n const newValues: any = { ...removeDateTimeSingleFields(values) };\n\n const datetimeDateFields = getDatetimeDateFields(values);\n\n datetimeDateFields.forEach((field) => {\n const datePair = values[field];\n const baseKey = field.split(\"#\")[0];\n const timeKey = baseKey + \"#time\";\n const timePair = values[timeKey];\n\n let from, to;\n\n if (datePair[0] !== null) {\n const dateValueFrom = datePair[0].format(\"YYYY-MM-DD\");\n from = dateValueFrom;\n\n if (timePair && timePair[0] !== null) {\n const timeValueFrom = timePair[0].format(\"HH:mm:ss\");\n from = from + \" \" + timeValueFrom;\n }\n }\n\n if (datePair[1] !== null) {\n const dateValueTo = datePair[1].format(\"YYYY-MM-DD\");\n to = dateValueTo;\n\n if (timePair && timePair[1] !== null) {\n const timeValueTo = timePair[1].format(\"HH:mm:ss\");\n to = to + \" \" + timeValueTo;\n }\n }\n\n newValues[baseKey + \"#datetime\"] = [from, to];\n });\n\n return newValues;\n};\n\nconst ungroupDateValuesIfNeeded = (values: any, widgetContainer: any) => {\n const dateFields = Object.keys(values).filter((key) => {\n const widget = widgetContainer.findById(key);\n return widget && widget.type === \"date\";\n });\n\n const newValues: any = { ...values };\n\n dateFields.forEach((key) => {\n delete newValues[key];\n if (values[key][0] !== null) {\n newValues[key + \"#from\"] = values[key][0];\n }\n\n if (values[key][1] !== null) {\n newValues[key + \"#to\"] = values[key][1];\n }\n });\n\n return newValues;\n};\n\nexport const removeUndefinedFields = (values: any) => {\n const newValues = { ...values };\n Object.keys(newValues).forEach(\n (key) =>\n (newValues[key] === undefined ||\n newValues[key] === null ||\n newValues[key] === \"\") &&\n delete newValues[key],\n );\n return newValues;\n};\n\nexport const getUniqueFieldsForParams = (params: any[]) => {\n const uniqueFields: any = {};\n\n params.forEach((param) => {\n if (Array.isArray(param) && param[0]) {\n uniqueFields[param[0]] = true;\n } else {\n uniqueFields[param] = true;\n }\n });\n\n return Object.keys(uniqueFields);\n};\n\nexport const mergeParams = (searchParams: any[], domainParams: any[]) => {\n const finalParams = [...searchParams];\n const uniqueParams = getUniqueFieldsForParams(searchParams);\n\n domainParams.forEach((element) => {\n if (Array.isArray(element) && element[0]) {\n if (!uniqueParams.includes(element[0])) {\n finalParams.push(element);\n }\n } else if (!uniqueParams.includes(element)) {\n finalParams.push(element);\n }\n });\n\n return finalParams;\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { Form, Row, Col, Alert, theme } from \"antd\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\n\nimport {\n SearchFilter as SearchFilterOoui,\n Container,\n Field,\n} from \"@gisce/ooui\";\n\nimport { SearchField } from \"./SearchField\";\nimport { SearchBottomBar } from \"./SearchBottomBar\";\nimport { SearchFields } from \"@/types\";\nimport { SearchParams } from \"./SearchParams\";\n\nimport { getParamsForFields } from \"@/helpers/searchHelper\";\nimport Measure from \"react-measure\";\nconst { useToken } = theme;\n\ntype Props = {\n fields: any;\n searchFields: SearchFields;\n onClear: () => void;\n onSubmit: (values: any) => void;\n isSearching: boolean;\n limit: number;\n offset: number;\n onLimitChange?: (limit: number) => void;\n searchVisible?: boolean;\n setSearchFilterHeight?: (height: number) => void;\n searchError?: string;\n searchValues?: any;\n showLimitOptions?: boolean;\n};\n\nfunction SearchFilter(props: Props) {\n const {\n fields,\n searchFields = { primary: [], secondary: [] },\n onClear,\n onSubmit,\n isSearching,\n offset,\n limit,\n onLimitChange,\n searchVisible,\n setSearchFilterHeight,\n searchError,\n searchValues,\n showLimitOptions = true,\n } = props;\n\n const [simpleSearchFields, setSimpleSearchFields] = useState<Container>();\n const [advancedSearchFields, setAdvancedSearchFields] = useState<Container>();\n const [advancedFilter, setAdvancedFilter] = useState(false);\n const sfo = useRef<SearchFilterOoui>();\n const { token } = useToken();\n\n const [form] = Form.useForm();\n\n useEffect(() => {\n form.setFieldsValue(searchValues);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchValues]);\n\n const getRowsAndCols = () => {\n if (!advancedSearchFields) {\n return;\n }\n\n const fields = advancedFilter ? advancedSearchFields : simpleSearchFields;\n const rows = fields?.rows;\n\n return rows?.map((row, i) => {\n return (\n <Row key={i}>\n {row.map((item, j) => {\n return (\n <Col xs={24} className=\"p-2\" xl={6} key={j}>\n <SearchField field={item as Field} />\n </Col>\n );\n })}\n </Row>\n );\n });\n };\n\n useDeepCompareEffect(() => {\n setAdvancedFilter(false);\n sfo.current = new SearchFilterOoui(searchFields, fields);\n sfo.current.parse();\n setSimpleSearchFields(sfo.current._simpleSearchContainer);\n setAdvancedSearchFields(sfo.current._advancedSearchContainer);\n }, [fields, searchFields]);\n\n const rows = getRowsAndCols();\n\n const onFinish = (values: any) => {\n const { limit, offset } = values;\n delete values.offset;\n delete values.limit;\n const newParams = getParamsForFields(\n values,\n sfo.current?._advancedSearchContainer,\n );\n\n onSubmit({ params: newParams, offset, limit, searchValues: values });\n };\n\n return (\n <Measure\n bounds\n onResize={(contentRect) => {\n setSearchFilterHeight?.(contentRect.bounds?.height!);\n }}\n >\n {({ measureRef }) => (\n <div ref={measureRef}>\n <div style={{ display: searchVisible ? \"block\" : \"none\" }}>\n <Form\n className=\"p-3 shadow-md\"\n style={{ borderRadius: token.borderRadius }}\n form={form}\n onFinish={onFinish}\n initialValues={{ offset, limit }}\n >\n {rows}\n {advancedFilter && showLimitOptions && (\n <SearchParams onLimitChange={onLimitChange} />\n )}\n <SearchBottomBar\n advancedFilter={advancedFilter}\n onAdvancedFilterToggle={() => {\n setAdvancedFilter(!advancedFilter);\n }}\n onClear={() => {\n form.resetFields();\n onClear();\n }}\n isSearching={isSearching}\n />\n </Form>\n {searchError && (\n <Alert\n className=\"mt-10\"\n message={searchError}\n type=\"error\"\n banner\n />\n )}\n <div className=\"pb-5\" />\n </div>\n </div>\n )}\n </Measure>\n );\n}\n\nexport default SearchFilter;\n","/**\n * This function calculate the width of a string based on its length\n * @param {String} text\n * @param {String} font\n */\nconst getTextWidth = (text: string, font = \"14px -apple-system\") => {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n context!.font = font;\n const metrics = context!.measureText(text);\n return Math.round((metrics.width + 80) * 1.5);\n};\n\n/**\n * This function calculates the width of each column based in all CELL VALUES\n * @param {Array} columns\n * @param {Array} source\n * @param {Number} maxWidthPerCell\n */\nexport const calculateColumnsWidth = (\n columns: any,\n source: any,\n maxWidthPerCell = 500,\n) => {\n if (columns.length === 0) {\n return { columns };\n }\n\n // First we calculate the width for each column\n // The column width is based on its string length\n\n const columnsWithWidth = columns.map((column: any) =>\n Object.assign(column, {\n width: getTextWidth(column.title),\n }),\n );\n\n // Since we have a minimum width (column's width already calculated),\n // now we are going to verify if the cell value is bigger\n // than the column width which is already set\n\n source.map((entry: any) => {\n columnsWithWidth.map((column: any, indexColumn: number) => {\n const columnWidth = column.width;\n const cellValue = (entry[column.key] as string) || \"\";\n\n // Get the string width based on chars length\n let cellWidth = getTextWidth(cellValue);\n\n // Verify if the cell value is smaller than column's width\n if (cellWidth < columnWidth) cellWidth = columnWidth;\n\n // Verify if the cell value width is bigger than our max width flag\n if (cellWidth > maxWidthPerCell) cellWidth = maxWidthPerCell;\n\n // Update the column width\n columnsWithWidth[indexColumn].width = cellWidth;\n });\n });\n\n // Sum of all columns width to determine the table max width\n const tableWidth = columnsWithWidth\n .map((column: any) => column.width)\n .reduce((a: any, b: any) => {\n return a + b;\n });\n\n return {\n columns: columnsWithWidth,\n source,\n tableWidth,\n };\n};\n","import styled from \"styled-components\";\nimport React, { useContext, useState } from \"react\";\nimport { Spin } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport Link from \"antd/es/typography/Link\";\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const SelectAllRecordsRow = ({\n numberOfVisibleSelectedRows,\n totalRecords,\n numberOfTotalRows,\n onSelectAllRecords,\n numberOfRealSelectedRows,\n}: {\n numberOfVisibleSelectedRows: number;\n totalRecords: number;\n numberOfTotalRows: number;\n numberOfRealSelectedRows: number;\n onSelectAllRecords: () => Promise<void>;\n}) => {\n const [loading, setLoading] = useState(false);\n const { t } = useLocale();\n\n const translations = {\n recordsSelected: t(\"recordsSelected\"),\n selectAllRecords: t(\"selectAllRecords\"),\n allRecordsSelected: t(\"allRecordsSelected\"),\n };\n\n if (numberOfTotalRows === 0) {\n return null;\n }\n\n if (\n numberOfVisibleSelectedRows < numberOfTotalRows &&\n numberOfRealSelectedRows <= numberOfTotalRows\n ) {\n return null;\n }\n\n if (totalRecords === numberOfVisibleSelectedRows) {\n return null;\n }\n\n const handleClick = async (event: any) => {\n event.preventDefault(); // prevent the default action (navigation) from happening\n event.stopPropagation();\n setLoading(true);\n await onSelectAllRecords();\n setLoading(false);\n };\n\n const selectRowsComponent = (\n <span>\n {translations.recordsSelected.replace(\n \"{numberOfSelectedRows}\",\n numberOfVisibleSelectedRows.toString(),\n ) + \" \"}\n\n {loading ? (\n <Spin />\n ) : (\n <Link onClick={handleClick} style={{ fontWeight: 600 }}>\n {translations.selectAllRecords.replace(\n \"{totalRecords}\",\n totalRecords.toString(),\n )}\n </Link>\n )}\n </span>\n );\n\n const allRowsAreSelected = (\n <span style={{ fontWeight: 600 }}>\n {translations.allRecordsSelected.replace(\n \"{totalRecords}\",\n numberOfRealSelectedRows.toString(),\n ) + \" \"}\n </span>\n );\n\n return (\n <Container>\n {numberOfRealSelectedRows > numberOfTotalRows\n ? allRowsAreSelected\n : selectRowsComponent}\n </Container>\n );\n};\n","function parseStringToFloat(text?: string) {\n if (!text) {\n return undefined;\n }\n\n try {\n if (text.includes(\":\")) {\n const splitted = text.trim().split(\":\");\n return (\n Math.round(\n (parseInt(splitted[0]) + parseInt(splitted[1]) / 60.0) * 10000,\n ) / 10000\n );\n } else {\n return parseFloat(text.trim());\n }\n } catch (err) {\n return 0;\n }\n}\n\nfunction parseFloatToString(num?: number) {\n if (num === undefined) {\n return undefined;\n }\n\n let finalString;\n let hours = Math.floor(Math.abs(num));\n let mins = Math.round((Math.abs(num) % 1) * 100) / 100;\n\n if (mins >= 1) {\n hours = hours + 1;\n mins = 0.0;\n } else {\n mins = mins * 60;\n }\n\n const hoursString = hours.toLocaleString(\"en-US\", {\n minimumIntegerDigits: 2,\n maximumFractionDigits: 0,\n useGrouping: false,\n });\n const minsStrings = mins.toLocaleString(\"en-US\", {\n minimumIntegerDigits: 2,\n maximumFractionDigits: 0,\n useGrouping: false,\n });\n\n finalString = `${hoursString}:${minsStrings}`;\n\n if (num < 0) {\n finalString = \"-\" + finalString;\n }\n\n return finalString;\n}\n\nexport { parseStringToFloat, parseFloatToString };\n","import React from \"react\";\nimport { Progress } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport styled from \"styled-components\";\n\nexport const ProgressBar = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <ProgressBarInput />\n </Field>\n );\n};\n\nexport const ProgressBarInput = ({ value }: { value?: number }) => {\n const textValue = `${(value || 0).toLocaleString(\"en-US\", {\n minimumIntegerDigits: 1,\n maximumFractionDigits: 4,\n useGrouping: false,\n })}%`;\n\n return (\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\" }}>\n <StyledProgress percent={value} />\n <div style={{ flexGrow: 1, paddingLeft: 10 }}>{textValue}</div>\n </div>\n );\n};\n\nconst StyledProgress = styled(Progress)`\n .ant-progress-outer {\n margin-right: 0px;\n padding-right: 0px;\n }\n .ant-progress-text {\n display: none;\n }\n`;\n","import { Fragment, useCallback, useState } from \"react\";\nimport {\n PrinterOutlined,\n ThunderboltOutlined,\n EnterOutlined,\n} from \"@ant-design/icons\";\nimport {\n useLocale,\n DropdownMenuGroup,\n DropdownMenuItem,\n Many2OneSuffixModal,\n Many2OneSuffix as Many2OneSuffixUi,\n} from \"@gisce/react-formiga-components\";\n\nexport type Action = Record<string, any> & {\n id: number;\n name: string;\n type: string;\n context: any;\n domain: any;\n};\n\nexport type ActionRelatePrint = {\n actionItems: Action[];\n relateItems: Action[];\n printItems: Action[];\n};\n\nexport type Many2OneSuffixOnItemClickOpts = {\n item: DropdownMenuItem;\n type: \"action\" | \"print\" | \"relate\";\n};\n\ntype Many2oneSuffixProps = {\n onRetrieveData: () => Promise<\n | {\n actionItems: Action[];\n relateItems: Action[];\n printItems: Action[];\n }\n | undefined\n >;\n onItemClick?: (opts: Many2OneSuffixOnItemClickOpts) => void;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport const Many2oneSuffixOoui = ({\n onRetrieveData,\n onItemClick,\n onOpenChange,\n}: Many2oneSuffixProps) => {\n const [actionModalVisible, setActionModalVisible] = useState<boolean>(false);\n const [printModalVisible, setPrintModalVisible] = useState<boolean>(false);\n const { t } = useLocale();\n const [data, setData] = useState<{\n actionItems: Action[];\n relateItems: Action[];\n printItems: Action[];\n }>();\n\n const fetchMenuItems = useCallback(async (): Promise<DropdownMenuGroup[]> => {\n const {\n actionItems = [],\n relateItems = [],\n printItems = [],\n } = (await onRetrieveData()) || {};\n setData({ actionItems, relateItems, printItems });\n return [\n {\n sticky: true,\n items: [\n {\n id: \"action\",\n name: t(\"action\"),\n disabled: !actionItems || actionItems.length === 0,\n icon: <ThunderboltOutlined />,\n },\n {\n id: \"print\",\n name: t(\"report\"),\n disabled: !printItems || printItems.length === 0,\n icon: <PrinterOutlined />,\n },\n {\n id: \"divider\",\n type: \"divider\",\n },\n ],\n },\n {\n label: t(\"related\"),\n icon: <EnterOutlined />,\n items: relateItems as DropdownMenuItem[],\n },\n ];\n }, [t, onRetrieveData]);\n\n return (\n <Fragment>\n <Many2OneSuffixUi\n onRetrieveData={fetchMenuItems}\n onItemClick={(item) => {\n if (item.id === \"action\") {\n setActionModalVisible(true);\n } else if (item.id === \"print\") {\n setPrintModalVisible(true);\n } else {\n onItemClick?.({ item, type: \"relate\" });\n }\n }}\n onOpenChange={(open) => {\n onOpenChange?.(open);\n if (!open) {\n setActionModalVisible(false);\n setPrintModalVisible(false);\n }\n }}\n />\n <Many2OneSuffixModal\n visible={actionModalVisible}\n items={data?.actionItems as DropdownMenuItem[]}\n onItemClicked={(item) => {\n setActionModalVisible(false);\n onItemClick?.({ item, type: \"action\" });\n }}\n onCancel={() => setActionModalVisible(false)}\n />\n <Many2OneSuffixModal\n visible={printModalVisible}\n items={data?.printItems as DropdownMenuItem[]}\n onItemClicked={(item) => {\n setPrintModalVisible(false);\n onItemClick?.({ item, type: \"print\" });\n }}\n onCancel={() => setPrintModalVisible(false)}\n />\n </Fragment>\n );\n};\n","import { useCallback, useContext, useEffect, useState } from \"react\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { FormView } from \"@/types\";\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { processValues } from \"@/helpers/formHelper\";\nimport { parseContextFields, parseDomainFields } from \"@gisce/ooui\";\nimport {\n ActionRelatePrint,\n Many2OneSuffixOnItemClickOpts,\n Many2oneSuffixOoui,\n} from \"./Many2oneSuffixOoui\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\n\ntype Props = {\n id: number;\n model: string;\n context?: any;\n};\n\nexport const Many2oneSuffix = (props: Props) => {\n const { id, model, context = {} } = props;\n const [formView, setFormView] = useState<FormView>();\n const [targetValues, setTargetValues] = useState<any>();\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openRelate } = tabManagerContext || {};\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n\n const [getView, cancelGetViewRequest] = useNetworkRequest(\n ConnectionProvider.getHandler().getView,\n );\n const [readObjects, cancelReadObjectsRequest] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n\n const cancelRequests = useCallback(() => {\n cancelGetViewRequest();\n cancelReadObjectsRequest();\n }, [cancelGetViewRequest, cancelReadObjectsRequest]);\n\n const fetchData = useCallback(async (): Promise<\n ActionRelatePrint | undefined\n > => {\n const formView = (await getView({\n model,\n type: \"form\",\n context,\n })) as FormView;\n setFormView(formView);\n\n // We get all the fields that are used in context or domains of each action\n // In order to get the data of the target record\n const fields = getFieldsToRetrieve(formView);\n\n let values = {};\n\n if (fields.length > 0) {\n const objectValues = (\n await readObjects({\n model,\n ids: [id],\n fieldsToRetrieve: fields,\n context,\n })\n )?.[0];\n values = { ...objectValues };\n }\n values = { ...processValues(values, fields), active_id: id };\n setTargetValues(values);\n\n if (!formView || !formView.toolbar) {\n return undefined;\n }\n\n return {\n actionItems: formView.toolbar.action,\n relateItems: formView.toolbar.relate,\n printItems: formView.toolbar.print,\n };\n }, [context, getView, id, model, readObjects]);\n\n // If there is no id (no record attached to the Many2one), we don't show the suffix\n if (!id) {\n return null;\n }\n\n function handleMenuClick({ item, type }: Many2OneSuffixOnItemClickOpts) {\n const commonParams = {\n values: targetValues,\n fields: formView!.fields,\n };\n\n switch (type) {\n case \"action\":\n processAction?.({\n actionData: item,\n context: { active_id: id, active_ids: [id] },\n ...commonParams,\n });\n break;\n\n case \"print\":\n processAction?.({\n actionData: {\n ...item,\n datas: { ...item.datas, ids: [id] },\n },\n ...commonParams,\n });\n break;\n\n case \"relate\":\n openRelate({\n relateData: item,\n action_id: item.id as number,\n action_type: item.type!,\n ...commonParams,\n });\n break;\n }\n }\n\n return (\n <Many2oneSuffixOoui\n onRetrieveData={fetchData}\n onItemClick={handleMenuClick}\n onOpenChange={(open) => {\n if (!open) {\n cancelRequests();\n }\n }}\n />\n );\n};\n\nexport const getFieldsToRetrieve = (formView: FormView): string[] => {\n const { toolbar } = formView;\n const fieldNames = [\"action\", \"relate\", \"print\"];\n\n const extractedFields = fieldNames.flatMap((fieldName) => {\n const toolbarField = toolbar[fieldName];\n return (\n toolbarField?.flatMap((item: any) => {\n const fields = [];\n if (\"context\" in item) fields.push(...parseContextFields(item.context));\n if (\"domain\" in item) fields.push(...parseDomainFields(item.domain));\n return fields;\n }) || []\n );\n });\n\n return [\n ...new Set(extractedFields.filter((field) => field in formView.fields)),\n ];\n};\n","import { Space } from \"antd\";\nimport React from \"react\";\nimport { Many2oneSuffix } from \"./Many2oneSuffix\";\n\nexport type Many2oneTreeProps = { m2oField: any };\n\nexport const Many2oneTree = (props: Many2oneTreeProps): React.ReactElement => {\n const { m2oField } = props;\n if (!m2oField) {\n return <></>;\n }\n return (\n <Space>\n <>{m2oField.value}</>\n <Many2oneSuffix id={m2oField.id} model={m2oField.model} />\n </Space>\n );\n};\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { Space } from \"antd\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { Many2oneSuffix } from \"./many2one/Many2oneSuffix\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\n\nexport type ReferenceTreeProps = {\n value: string;\n context?: any;\n selectionValues?: any;\n};\n\nexport const ReferenceTree = (\n props: ReferenceTreeProps,\n): React.ReactElement => {\n const { value, context, selectionValues } = props;\n const [name, setName] = useState();\n const [loading, setLoading] = useState(false);\n\n const [model, id] = value ? value.split(\",\") : [];\n const intId = parseInt(id);\n\n const fetchName = useCallback(async () => {\n if (!value) {\n return;\n }\n if (value && name) {\n return;\n }\n setLoading(true);\n const nameResponse = await ConnectionProvider.getHandler().execute({\n action: \"name_get\",\n payload: [intId],\n model,\n context,\n });\n setName(nameResponse[0][1]);\n setLoading(false);\n }, [value, name]);\n\n useEffect(() => {\n fetchName();\n }, [value]);\n\n if (!value && !loading) {\n return <></>;\n }\n\n if (loading) {\n return <LoadingOutlined />;\n }\n\n const selectionDescription = selectionValues.get(model);\n\n return (\n <Space>\n <>{`${selectionDescription}:`}</>\n <>{name}</>\n <Many2oneSuffix id={intId} model={model} />\n </Space>\n );\n};\n","import React from \"react\";\nimport { WidgetProps } from \"@/types\";\nimport { Avatar as AntdAvatar, Tooltip } from \"antd\";\nimport { Avatar as AvatarOoui } from \"@gisce/ooui\";\nimport { colorFromString } from \"@/helpers/formHelper\";\n\ntype AvatarProps = WidgetProps & {\n ooui: AvatarOoui;\n value?: any;\n};\n\nconst Avatar = (props: AvatarProps): React.ReactElement | null => {\n const { ooui, value } = props;\n if (!value) {\n return null;\n }\n let formattedValue = value;\n if (ooui.selectionValues.size) {\n formattedValue = ooui.selectionValues.get(value);\n } else if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n const text = formattedValue\n .toString()\n .split(\" \")\n .filter((word: string) => word.length > 1)\n .slice(0, 3)\n .map((word: string) => word[0].toUpperCase())\n .join(\"\");\n const backgroundColor = colorFromString(formattedValue);\n return (\n <Tooltip title={formattedValue}>\n <AntdAvatar alt={formattedValue} style={{ backgroundColor }}>\n {text}\n </AntdAvatar>\n </Tooltip>\n );\n};\n\nexport default Avatar;\n","import { DatePicker as AntDatePicker, theme } from \"antd\";\n\nimport React from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport { Date as DateOoui } from \"@gisce/ooui\";\nimport dayjs from \"@/helpers/dayjs\";\nconst { useToken } = theme;\n\ntype DatePickerProps = WidgetProps & {\n showTime?: boolean;\n};\n\nexport const DatePickerConfig = {\n date: {\n placeholder: \"__/__/____\",\n dateDisplayFormat: \"DD/MM/YYYY\",\n dateInternalFormat: \"YYYY-MM-DD\",\n },\n time: {\n placeholder: \"__/__/____ __:__:__\",\n dateDisplayFormat: \"DD/MM/YYYY HH:mm:ss\",\n dateInternalFormat: \"YYYY-MM-DD HH:mm:ss\",\n },\n};\n\nconst DatePicker = (props: DatePickerProps) => {\n const { ooui, showTime = false } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} {...props}>\n <DatePickerInput ooui={ooui} showTime={showTime} />\n </Field>\n );\n};\n\ninterface DatePickerInputProps {\n ooui: DateOoui;\n value?: undefined | string;\n onChange?: (value: undefined | string) => void;\n showTime?: boolean;\n}\n\nconst DatePickerInput: React.FC<DatePickerInputProps> = (\n props: DatePickerInputProps,\n) => {\n const { value, onChange, ooui, showTime } = props;\n const { id, readOnly, required } = ooui as DateOoui;\n const { token } = useToken();\n\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n\n const mode = showTime ? \"time\" : \"date\";\n\n const triggerChange = (changedValue: undefined | string) => {\n onChange?.(changedValue);\n };\n\n const onValueStringChange = (momentDate: any) => {\n if (momentDate === null || momentDate === undefined) {\n triggerChange(momentDate);\n return;\n }\n\n triggerChange(momentDate.format(DatePickerConfig[mode].dateInternalFormat));\n };\n\n const dateValue = value\n ? dayjs(value, DatePickerConfig[mode].dateInternalFormat)\n : undefined;\n\n return (\n <AntDatePicker\n style={{ width: \"100%\", ...requiredStyle }}\n placeholder={\n showTime\n ? DatePickerConfig.time.placeholder\n : DatePickerConfig.date.placeholder\n }\n disabled={readOnly}\n id={id}\n picker={\"date\"}\n showTime={showTime}\n format={DatePickerConfig[mode].dateDisplayFormat}\n value={dateValue}\n onChange={onValueStringChange}\n showNow={false}\n showToday={false}\n changeOnBlur={true}\n />\n );\n};\n\nexport default DatePicker;\n","import { ReactElement, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Checkbox, Spin } from \"antd\";\nimport { parseFloatToString } from \"@/helpers/timeHelper\";\nimport { ProgressBarInput } from \"../../base/ProgressBar\";\nimport { One2manyValue } from \"../../base/one2many/One2manyInput\";\nimport { Interweave } from \"interweave\";\nimport { Many2oneTree } from \"../../base/many2one/Many2oneTree\";\nimport { ReferenceTree } from \"../../base/ReferenceTree\";\nimport dayjs from \"@/helpers/dayjs\";\nimport Avatar from \"../../custom/Avatar\";\nimport { CustomTag, TagInput } from \"../../custom/Tag\";\nimport { DatePickerConfig } from \"@/common/DatePicker\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { colorFromString } from \"@/helpers/formHelper\";\n\nexport const BooleanComponent = ({\n value,\n}: {\n value: boolean;\n}): ReactElement => {\n return useMemo(\n () => (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignContent: \"center\",\n }}\n >\n <Checkbox checked={value} disabled />\n </div>\n ),\n [value],\n );\n};\n\nexport const Many2OneComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => <Many2oneTree m2oField={value} />, [value]);\n};\n\nexport const TextComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(\n () => (\n <Interweave\n content={value?.toString().replace(/(?:\\r\\n|\\r|\\n)/g, \"<br>\")}\n />\n ),\n [value],\n );\n};\n\nexport const DateComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => {\n if (!value || (value && value.length === 0)) return <></>;\n\n const formattedValue = dayjs(\n value,\n DatePickerConfig.date.dateInternalFormat,\n ).format(DatePickerConfig.date.dateDisplayFormat);\n return <>{formattedValue}</>;\n }, [value]);\n};\n\nexport const DateTimeComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => {\n if (!value || (value && value.length === 0)) return <></>;\n const formattedValue = dayjs(\n value,\n DatePickerConfig.time.dateInternalFormat,\n ).format(DatePickerConfig.time.dateDisplayFormat);\n return <>{formattedValue}</>;\n }, [value]);\n};\n\nexport const One2ManyComponent = ({\n value,\n}: {\n value: One2manyValue;\n}): ReactElement => {\n return useMemo(() => {\n const length = Array.isArray(value?.items) ? value?.items.length : 0;\n return <>{`( ${length} )`}</>;\n }, [value]);\n};\n\nexport const ProgressBarComponent = ({\n value,\n}: {\n value: any;\n}): ReactElement => {\n return useMemo(() => <ProgressBarInput value={value} />, [value]);\n};\n\nexport const FloatTimeComponent = ({ value }: { value: any }): ReactElement => {\n return useMemo(() => <>{parseFloatToString(value)}</>, [value]);\n};\n\nexport const NumberComponent = ({ value }: { value: number }): ReactElement => {\n return useMemo(\n () => <div style={{ textAlign: \"right\" }}>{value}</div>,\n [value],\n );\n};\n\nexport const ImageComponent = ({ value }: { value: string }): ReactElement => {\n return useMemo(\n () => (\n <img\n src={`data:image/*;base64,${value}`}\n style={{ maxWidth: \"50px\", padding: \"5px\" }}\n />\n ),\n [value],\n );\n};\n\nexport const TagComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(() => <TagInput ooui={ooui} value={value} />, [ooui, value]);\n};\n\nexport const SelectionComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(() => {\n let selectionKey = value;\n\n if (Array.isArray(value) && value.length === 2) {\n selectionKey = value[0];\n }\n return <>{ooui.selectionValues.get(selectionKey)}</>;\n }, [ooui, value]);\n};\n\nexport const ReferenceComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(\n () => (\n <ReferenceTree\n value={value}\n selectionValues={ooui.selectionValues}\n context={context}\n />\n ),\n [context, ooui.selectionValues, value],\n );\n};\n\nexport const AvatarComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n return useMemo(() => <Avatar ooui={ooui} value={value} />, [ooui, value]);\n};\n\nexport const TagsComponent = ({\n value,\n key,\n ooui,\n context,\n}: {\n value: any;\n key: string;\n ooui: any;\n context: any;\n}): ReactElement => {\n const [values, setValues] = useState<Array<{ id: number; name: string }>>([]);\n const [loading, setLoading] = useState<boolean>(false);\n const { relation, field } = ooui;\n\n const loadValues = useCallback(async () => {\n try {\n setLoading(true);\n const optionsRead = await ConnectionProvider.getHandler().search({\n model: relation,\n params: [[\"id\", \"in\", value.items.map((v: any) => v.id)]],\n fields: [field],\n context,\n });\n setValues(\n optionsRead.map((i: any) => {\n return { id: i.id, name: i[field] };\n }),\n );\n } catch (error) {\n console.error(\"Error loading data\", error);\n } finally {\n setLoading(false);\n }\n }, [context, field, relation, value.items]);\n\n useEffect(() => {\n if (value?.items && value?.items.length > 0) {\n loadValues();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value?.items]);\n\n const tags = useMemo(\n () =>\n values.map((entry) => {\n const { id, name } = entry;\n const color = colorFromString(name);\n return (\n <CustomTag key={`${id}`} color={color}>\n {name}\n </CustomTag>\n );\n }),\n [values],\n );\n\n return useMemo(() => {\n if (loading) {\n return <Spin />;\n }\n return (\n <div\n style={{\n maxWidth: \"300px\",\n whiteSpace: \"break-spaces\",\n lineHeight: \"30px\",\n }}\n >\n {tags}\n </div>\n );\n }, [tags, loading]);\n};\n\nexport const COLUMN_COMPONENTS = {\n boolean: BooleanComponent,\n many2one: Many2OneComponent,\n text: TextComponent,\n one2many: One2ManyComponent,\n many2many: One2ManyComponent,\n progressbar: ProgressBarComponent,\n float_time: FloatTimeComponent,\n image: ImageComponent,\n integer: NumberComponent,\n float: NumberComponent,\n reference: ReferenceComponent,\n tag: TagComponent,\n selection: SelectionComponent,\n date: DateComponent,\n datetime: DateTimeComponent,\n avatar: AvatarComponent,\n tags: TagsComponent,\n};\n","import {\n forwardRef,\n memo,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Pagination as AntPagination, Row, Col, Spin, Badge } from \"antd\";\nimport {\n getTree,\n getTableColumns,\n getTableItems,\n hasActualValues,\n} from \"@/helpers/treeHelper\";\nimport { Tree as TreeOoui } from \"@gisce/ooui\";\nimport { TreeView } from \"@/types\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { calculateColumnsWidth } from \"@/helpers/dynamicColumnsHelper\";\nimport { Table as GisceTable, TableRef } from \"@gisce/react-formiga-table\";\nimport {\n PlusSquareOutlined,\n MinusSquareOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { SelectAllRecordsRow } from \"@/common/SelectAllRecordsRow\";\nimport { COLUMN_COMPONENTS } from \"./treeComponents\";\nimport ErrorBoundary from \"antd/es/alert/ErrorBoundary\";\n\ntype Props = {\n total?: number;\n limit: number;\n page?: number;\n loading: boolean;\n treeView: TreeView;\n results: any[];\n showPagination?: boolean;\n onRequestPageChange?: (page: number, pageSize?: number) => void;\n onRowClicked?: (record: any) => void;\n onRowSelectionChange?: (selectedRowKeys: any[]) => void;\n selectedRowKeys?: number[];\n scrollY?: number;\n colorsForResults?: { [key: number]: string };\n statusForResults?: { [key: number]: string };\n onChangeSort?: (results: any) => void;\n sorter?: any;\n onFetchChildrenForRecord?: (item: any) => Promise<any[]>;\n childField?: string;\n rootTree?: boolean;\n context?: any;\n readonly?: boolean;\n onSelectAllRecords?: () => Promise<void>;\n};\n\nexport const UnmemoizedTree = forwardRef<TableRef, Props>(\n (props: Props, ref) => {\n const {\n page = 1,\n limit,\n total,\n treeView,\n results,\n onRequestPageChange,\n loading,\n onRowClicked,\n showPagination = true,\n selectedRowKeys = [],\n onRowSelectionChange,\n scrollY,\n colorsForResults = {},\n statusForResults = {},\n onChangeSort,\n sorter,\n onFetchChildrenForRecord,\n childField,\n rootTree = false,\n context,\n readonly,\n onSelectAllRecords,\n } = props;\n\n const tableRef = useRef<TableRef>(null);\n\n const [items, setItems] = useState<any[]>([]);\n\n const errorInParseColors = useRef<boolean>(false);\n\n const [treeOoui, setTreeOoui] = useState<TreeOoui>();\n\n const { t } = useLocale();\n const internalLimit = useRef(limit);\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { title = undefined, setTitle = undefined } =\n (rootTree ? actionViewContext : {}) || {};\n\n const columns = useMemo(() => {\n if (!treeOoui) {\n return undefined;\n }\n\n return getTableColumns(\n treeOoui,\n {\n ...COLUMN_COMPONENTS,\n },\n context,\n );\n }, [context, treeOoui]);\n\n useImperativeHandle(ref, () => ({\n unselectAll: () => {\n tableRef.current?.unselectAll();\n },\n }));\n\n useEffect(() => {\n const treeOoui = getTree(treeView);\n setTreeOoui(treeOoui);\n if (treeOoui.string && title !== treeOoui.string) {\n setTitle?.(treeOoui.string);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [treeView, title]);\n\n useEffect(() => {\n if (!treeOoui) {\n return;\n }\n errorInParseColors.current = false;\n const items = getTableItems(treeOoui, results);\n setItems(items);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results]);\n\n useEffect(() => {\n internalLimit.current = limit;\n }, [limit]);\n\n const from = (page - 1) * internalLimit.current + 1;\n const to = from - 1 + items.length;\n const summary =\n total === undefined\n ? null\n : total === 0\n ? t(\"no_results\")\n : t(\"summary\")\n .replace(\"{from}\", from?.toString())\n .replace(\"{to}\", to?.toString())\n .replace(\"{total}\", total?.toString());\n\n const pagination = useMemo(() => {\n if (!showPagination || treeView.isExpandable) {\n return null;\n }\n\n const numberOfVisibleSelectedRows = items?.filter(\n (entry) => selectedRowKeys && selectedRowKeys.includes(entry.id),\n ).length;\n\n return loading ? null : total === undefined ? (\n <Spin className=\"pb-4\" />\n ) : (\n <Row align=\"bottom\" className=\"pb-4\">\n <Col span={onSelectAllRecords ? 8 : 12}>\n <AntPagination\n total={total}\n pageSize={\n internalLimit.current === 0 ? total : internalLimit.current\n }\n current={page}\n showSizeChanger={false}\n onChange={onRequestPageChange}\n />\n </Col>\n {onSelectAllRecords && (\n <Col span={8} className=\"text-center\">\n <SelectAllRecordsRow\n numberOfVisibleSelectedRows={numberOfVisibleSelectedRows}\n numberOfRealSelectedRows={selectedRowKeys?.length || 0}\n numberOfTotalRows={items.length}\n totalRecords={total || 0}\n onSelectAllRecords={onSelectAllRecords}\n />\n </Col>\n )}\n <Col span={onSelectAllRecords ? 8 : 12} className=\"text-right\">\n {summary}\n </Col>\n </Row>\n );\n }, [\n items,\n loading,\n onRequestPageChange,\n onSelectAllRecords,\n page,\n selectedRowKeys,\n showPagination,\n summary,\n total,\n treeView.isExpandable,\n ]);\n\n const sums = useMemo(() => {\n if (!treeOoui) {\n return null;\n }\n const sumFields = treeOoui.columns\n .filter((it) => it.sum !== undefined)\n .map((it) => {\n return { label: it.sum, field: it.id };\n });\n\n if (!sumFields || sumFields.length === 0) {\n return null;\n }\n\n const summary: string[] = [];\n const sumItems =\n selectedRowKeys?.length > 0\n ? items.filter((result: any) => {\n return selectedRowKeys.includes(result.id);\n })\n : items;\n\n sumFields.forEach((sumField) => {\n const total = sumItems.reduce((prev, current) => {\n if (current[sumField.field] && !isNaN(current[sumField.field]))\n return prev + current[sumField.field];\n else return prev;\n }, 0);\n\n summary.push(`${sumField.label}: ${Math.round(total * 100) / 100}`);\n });\n\n return <div className=\"p-1 pb-0 pl-2 mt-2 \">{summary.join(\", \")}</div>;\n }, [items, selectedRowKeys, treeOoui]);\n\n const dataTable = useMemo(() => {\n if (treeOoui !== null && columns && columns.length > 0) {\n const maxWidthPerCell = 600;\n return calculateColumnsWidth(columns, items, maxWidthPerCell);\n }\n return undefined;\n }, [columns, items, treeOoui]);\n\n const adjustedHeight = useMemo(() => {\n if (\n scrollY &&\n treeOoui?.columns.some((it: any) => it.sum !== undefined)\n ) {\n return scrollY - 30;\n }\n return scrollY;\n }, [scrollY, treeOoui?.columns]);\n\n if (treeOoui === null || !dataTable || dataTable?.columns?.length === 0) {\n return <Spin style={{ padding: \"2rem\" }} />;\n }\n\n return (\n <ErrorBoundary>\n {pagination}\n <GisceTable\n ref={tableRef}\n height={adjustedHeight!}\n columns={dataTable.columns}\n dataSource={items}\n loading={loading}\n loadingComponent={<Spin />}\n onRowStyle={(record: any) => {\n if (colorsForResults![record.id]) {\n return { color: colorsForResults![record.id] };\n }\n return undefined;\n }}\n onRowStatus={\n hasActualValues(statusForResults)\n ? (record: any) => {\n if (statusForResults![record.id]) {\n return <Badge color={statusForResults[record.id]} />;\n }\n return undefined;\n }\n : undefined\n }\n onRowDoubleClick={onRowClicked}\n onRowSelectionChange={onRowSelectionChange}\n onChangeSort={onChangeSort}\n sorter={sorter}\n readonly={readonly}\n expandableOpts={\n onFetchChildrenForRecord\n ? {\n expandIcon: PlusSquareOutlined,\n collapseIcon: MinusSquareOutlined,\n loadingIcon: LoadingOutlined,\n onFetchChildrenForRecord,\n childField: childField!,\n }\n : undefined\n }\n />\n {sums}\n </ErrorBoundary>\n );\n },\n);\n\nexport const Tree = memo(UnmemoizedTree);\nTree.displayName = \"Tree\";\nUnmemoizedTree.displayName = \"UnmemoizedTree\";\n","import { mergeParams } from \"@/helpers/searchHelper\";\nimport {\n getColorMap,\n getStatusMap,\n getTableItems,\n getTree,\n sortResults,\n} from \"@/helpers/treeHelper\";\nimport { useState, useCallback, useRef } from \"react\";\nimport { ConnectionProvider, FormView, TreeView } from \"..\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype UseSearchOpts = {\n model: string;\n setSearchTreeNameSearch?: (searchString?: string) => void;\n setSelectedRowItems?: (value: any[]) => void;\n searchParams?: any[];\n setSearchParams?: (value: any[]) => void;\n setSearchVisible?: (value: boolean) => void;\n setTreeIsLoading?: (value: boolean) => void;\n nameSearch?: string;\n searchNameGetDoneRef?: any;\n context?: any;\n setActionViewTotalItems?: (totalItems: number) => void;\n formView: FormView;\n treeView: TreeView;\n sorter: any;\n setSorter?: (sorter: any) => void;\n setCurrentItemIndex?: (value?: number) => void;\n setResultsActionView?: (value: any[]) => void;\n resultsActionView?: any[];\n domain: any;\n currentId?: number;\n limit?: number;\n setLimit?: (value: number) => void;\n setSearchValues?: (value: any) => void;\n clearSelection?: () => void;\n};\n\nexport const useSearch = (opts: UseSearchOpts) => {\n const {\n model,\n setSearchTreeNameSearch,\n setSelectedRowItems,\n setSearchParams,\n setSearchVisible,\n setTreeIsLoading,\n nameSearch,\n searchNameGetDoneRef,\n context,\n setActionViewTotalItems,\n treeView,\n formView,\n sorter,\n setSorter,\n setCurrentItemIndex,\n setResultsActionView,\n resultsActionView,\n domain,\n currentId,\n limit,\n setLimit,\n searchParams = [],\n setSearchValues,\n clearSelection,\n } = opts;\n\n const [tableRefreshing, setTableRefreshing] = useState<boolean>(false);\n const [searchFilterLoading, setSearchFilterLoading] =\n useState<boolean>(false);\n const [searchError, setSearchError] = useState<string>();\n const [page, setPage] = useState<number>(1);\n const [offset, setOffset] = useState<number>(0);\n const [totalItems, setTotalItems] = useState<number>();\n const [resultsInternal, setResultsInternal] = useState<any>([]);\n const [colorsForResults, setColorsForResults] = useState<any>(undefined);\n const [statusForResults, setStatusForResults] = useState<any>(undefined);\n const internalLimit = useRef(limit || DEFAULT_SEARCH_LIMIT);\n\n const originalResults = useRef<any[]>([]);\n\n const setResults = useCallback(\n (results: any) => {\n setResultsActionView?.([...results]);\n setResultsInternal([...results]);\n },\n [setResultsActionView],\n );\n\n const getResults = useCallback(() => {\n if (!resultsActionView) {\n return resultsInternal;\n }\n return resultsActionView;\n }, [resultsActionView, resultsInternal]);\n\n const searchByNameSearch = useCallback(async () => {\n const searchResults = await ConnectionProvider.getHandler().nameSearch({\n model,\n payload: nameSearch,\n limit: internalLimit.current,\n attrs: domain,\n context,\n });\n\n setTotalItems(searchResults.length);\n setActionViewTotalItems?.(searchResults.length);\n\n if (searchResults.length > 0) {\n const resultsIds = searchResults.map((item: any) => {\n return item?.[0];\n });\n\n const { colors, status } = getTree(treeView!);\n const attrs: any = {};\n if (colors) {\n attrs.colors = colors;\n }\n if (status) {\n attrs.status = status;\n }\n\n const resultsWithData =\n await ConnectionProvider.getHandler().readEvalUiObjects({\n model,\n ids: resultsIds,\n arch: treeView?.arch!,\n fields: treeView!.field_parent\n ? { ...treeView!.fields, [treeView!.field_parent]: {} }\n : treeView!.fields,\n context,\n attrs,\n });\n const resultsData = resultsWithData[0];\n\n originalResults.current = [...resultsData];\n\n setColorsForResults(getColorMap(resultsWithData[1]));\n setStatusForResults(getStatusMap(resultsWithData[1]));\n\n const newResultIds = resultsData.map((item: any) => item.id);\n\n const resultsSorted =\n sorter !== undefined\n ? sortResults({\n resultsToSort: resultsData,\n sorter,\n fields: { ...treeView!.fields, ...formView!.fields },\n })\n : [...originalResults.current];\n\n setResults(resultsSorted);\n\n if (newResultIds.length > 0) {\n setCurrentItemIndex?.(0);\n } else {\n setCurrentItemIndex?.(undefined);\n }\n } else {\n setResults([]);\n setCurrentItemIndex?.(undefined);\n }\n setTableRefreshing(false);\n searchNameGetDoneRef.current = true;\n }, [\n setResults,\n searchNameGetDoneRef,\n nameSearch,\n model,\n context,\n domain,\n treeView,\n formView,\n sorter,\n setCurrentItemIndex,\n setActionViewTotalItems,\n ]);\n\n const searchResults = useCallback(\n async (opts?: { params: any; newOffset?: number }) => {\n const { params, newOffset } = opts || {};\n\n const mergedParams = mergeParams(params || searchParams, domain);\n const { colors, status } = getTree(treeView!);\n const attrs: any = {};\n if (colors) {\n attrs.colors = colors;\n }\n if (status) {\n attrs.status = status;\n }\n\n const { totalItems, results, attrsEvaluated } =\n await ConnectionProvider.getHandler().searchForTree({\n params: mergedParams,\n limit: internalLimit.current,\n offset: newOffset || offset,\n model,\n fields: treeView!.field_parent\n ? { ...treeView!.fields, [treeView!.field_parent]: {} }\n : treeView!.fields,\n context,\n attrs,\n });\n setColorsForResults(getColorMap(attrsEvaluated));\n setStatusForResults(getStatusMap(attrsEvaluated));\n\n originalResults.current = [...results];\n\n const resultsSorted =\n sorter !== undefined\n ? sortResults({\n resultsToSort: results,\n sorter,\n fields: { ...treeView!.fields, ...formView!.fields },\n })\n : [...originalResults.current];\n\n setResults(resultsSorted);\n\n if (resultsActionView && resultsSorted.length > 0) {\n const newCurrentItemIndex = resultsSorted.findIndex(\n (item) => currentId === item.id,\n );\n\n if (newCurrentItemIndex === -1) {\n setCurrentItemIndex?.(0);\n } else {\n setCurrentItemIndex?.(newCurrentItemIndex);\n }\n } else {\n setCurrentItemIndex?.(undefined);\n }\n setTableRefreshing(false);\n\n const totalItemsValue = await totalItems;\n\n setTotalItems(totalItemsValue);\n setActionViewTotalItems?.(totalItemsValue);\n },\n [\n setCurrentItemIndex,\n resultsActionView,\n setResults,\n currentId,\n model,\n context,\n domain,\n treeView,\n formView,\n sorter,\n setActionViewTotalItems,\n offset,\n searchParams,\n ],\n );\n\n const fetchResults = useCallback(\n async (opts?: { params: any; newOffset?: number }) => {\n try {\n setTableRefreshing(true);\n setTreeIsLoading?.(true);\n if (nameSearch && !searchNameGetDoneRef.current) {\n await searchByNameSearch();\n } else {\n await searchResults(opts);\n }\n clearSelection?.();\n } catch (error) {\n setSearchError(typeof error === \"string\" ? error : error.message);\n setTableRefreshing(false);\n } finally {\n setSelectedRowItems?.([]);\n setSearchFilterLoading(false);\n setTreeIsLoading?.(false);\n }\n },\n [\n clearSelection,\n nameSearch,\n searchByNameSearch,\n searchNameGetDoneRef,\n searchResults,\n setSelectedRowItems,\n setTreeIsLoading,\n ],\n );\n\n const changeSort = useCallback(\n (newSorter: any) => {\n if (JSON.stringify(newSorter) === JSON.stringify(sorter)) return;\n setSorter?.(newSorter);\n const sortedResults =\n newSorter !== undefined\n ? sortResults({\n resultsToSort: getResults(),\n sorter: newSorter,\n fields: { ...treeView.fields, ...formView.fields },\n })\n : [...originalResults.current];\n setResults(sortedResults);\n },\n [\n sorter,\n setSorter,\n getResults,\n treeView?.fields,\n formView?.fields,\n setResults,\n ],\n );\n\n const submit = useCallback(\n (opts: {\n params: any;\n limit: number;\n offset: number;\n searchValues: any;\n }) => {\n const { params, searchValues, limit: newLimit, offset: newOffset } = opts;\n\n if (tableRefreshing) return;\n setSearchTreeNameSearch?.(undefined);\n setSelectedRowItems?.([]);\n setSearchValues?.(searchValues);\n setSearchParams?.(params);\n setSearchVisible?.(false);\n setSearchFilterLoading(true);\n setSearchError(undefined);\n setPage(1);\n\n if (newLimit) {\n internalLimit.current = newLimit;\n setLimit?.(newLimit);\n }\n if (newOffset) setOffset(newOffset);\n fetchResults({\n params,\n newOffset,\n });\n },\n [\n tableRefreshing,\n setSearchTreeNameSearch,\n setSelectedRowItems,\n setSearchValues,\n setSearchParams,\n setSearchVisible,\n fetchResults,\n setLimit,\n ],\n );\n\n const requestPageChange = useCallback(\n (page: number) => {\n setTableRefreshing(true);\n setPage(page);\n setOffset((page - 1) * limit!);\n },\n [setTableRefreshing, limit, setOffset, setPage],\n );\n\n const clear = useCallback(() => {\n if (tableRefreshing) return;\n setSearchTreeNameSearch?.(undefined);\n setSearchParams?.([]);\n setSearchValues?.({});\n setSearchError(undefined);\n setOffset(0);\n setPage(1);\n setLimit?.(limit || DEFAULT_SEARCH_LIMIT);\n }, [\n tableRefreshing,\n setSearchTreeNameSearch,\n setSearchParams,\n setSearchValues,\n setLimit,\n limit,\n ]);\n\n const fetchChildrenForRecord = useCallback(\n async (record: any) => {\n const child_id = record[treeView?.field_parent || \"child_id\"];\n\n const children = await ConnectionProvider.getHandler().readObjects({\n model,\n ids: child_id,\n fields: treeView!.field_parent\n ? { ...treeView!.fields, [treeView!.field_parent]: {} }\n : treeView!.fields,\n context,\n });\n\n setResults([...getResults(), ...children]);\n\n return getTableItems(getTree(treeView!), children);\n },\n [treeView, model, context, getResults, setResults],\n );\n\n const getAllIds = useCallback(async () => {\n return await ConnectionProvider.getHandler().searchAllIds({\n params: mergeParams(searchParams, domain),\n model,\n context,\n totalItems,\n });\n }, [model, context, totalItems, searchParams, domain]);\n\n return {\n submit,\n clear,\n fetchResults,\n tableRefreshing,\n searchFilterLoading,\n searchError,\n page,\n offset,\n limit: internalLimit.current,\n getResults,\n requestPageChange,\n changeSort,\n fetchChildrenForRecord,\n colorsForResults,\n statusForResults,\n totalItems,\n getAllIds,\n };\n};\n","import {\n useEffect,\n useState,\n useRef,\n useContext,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useCallback,\n} from \"react\";\nimport { Alert, Spin } from \"antd\";\n\nimport SearchFilter from \"@/widgets/views/searchFilter/SearchFilter\";\nimport { Tree } from \"@/widgets/views/Tree\";\nimport { FormView, TreeView } from \"@/types/index\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport { mergeSearchFields } from \"@/helpers/formHelper\";\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { useSearch } from \"@/hooks/useSearch\";\nimport { TableRef } from \"@gisce/react-formiga-table\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype OnRowClickedData = {\n id: number;\n model: string;\n formView: FormView;\n treeView: TreeView;\n};\n\ntype Props = {\n model?: string;\n formView?: FormView;\n treeView?: TreeView;\n onRowClicked: (data: OnRowClickedData) => void;\n nameSearch?: string;\n treeScrollY?: number;\n domain?: any;\n visible?: boolean;\n rootTree?: boolean;\n parentContext?: any;\n onChangeSelectedRowKeys?: (selectedRowKeys: any) => void;\n};\n\nfunction SearchTree(props: Props, ref: any) {\n const {\n model,\n formView: formViewProps,\n treeView: treeViewProps,\n onRowClicked,\n nameSearch,\n treeScrollY,\n domain = [],\n visible = true,\n rootTree = false,\n parentContext = {},\n onChangeSelectedRowKeys,\n } = props;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [initialFetchDone, setInitialFetchDone] = useState<boolean>(false);\n\n const searchNameGetDoneRef = useRef(false);\n const tableRef = useRef<TableRef>(null);\n\n const [currentModel, setCurrentModel] = useState<string>();\n const [treeView, setTreeView] = useState<TreeView>();\n const [formView, setFormView] = useState<FormView>();\n\n const [initialError, setInitialError] = useState<string>();\n\n const [searchFilterHeight, setSearchFilterHeight] = useState<number>(200);\n\n const expandableClickActionData = useRef<any>();\n\n const { height } = useWindowDimensions();\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const {\n setResults: setResultsActionView = undefined,\n setCurrentItemIndex = undefined,\n currentId = undefined,\n results: resultsActionView = undefined,\n selectedRowItems = undefined,\n setSelectedRowItems = undefined,\n searchParams = [],\n setSearchParams = undefined,\n searchVisible = true,\n setSearchVisible = undefined,\n sorter = undefined,\n setSorter = undefined,\n setTotalItems: setActionViewTotalItems = undefined,\n setSearchTreeNameSearch = undefined,\n setTreeIsLoading = undefined,\n searchValues = {},\n setSearchValues = undefined,\n limit = DEFAULT_SEARCH_LIMIT,\n setLimit = undefined,\n } = (rootTree ? actionViewContext : {}) || {};\n\n const changeSelectedRowKeys = useCallback(\n (newSelectedRowKeys: any[]) => {\n setSelectedRowItems?.(newSelectedRowKeys.map((id: number) => ({ id })));\n onChangeSelectedRowKeys?.(newSelectedRowKeys);\n },\n [onChangeSelectedRowKeys, setSelectedRowItems],\n );\n\n const {\n submit,\n clear,\n fetchResults,\n tableRefreshing,\n searchFilterLoading,\n searchError,\n page,\n limit: limitUsedInSearch,\n offset,\n getResults,\n requestPageChange,\n changeSort,\n fetchChildrenForRecord,\n colorsForResults,\n statusForResults,\n totalItems,\n getAllIds,\n } = useSearch({\n model: currentModel!,\n setSearchTreeNameSearch,\n setSelectedRowItems: changeSelectedRowKeys,\n setSearchParams,\n setSearchValues,\n searchParams,\n setSearchVisible,\n setTreeIsLoading,\n nameSearch,\n searchNameGetDoneRef,\n context: parentContext,\n formView: formView!,\n treeView: treeView!,\n sorter,\n setSorter,\n setCurrentItemIndex,\n setResultsActionView,\n resultsActionView,\n domain,\n currentId,\n setActionViewTotalItems,\n limit,\n setLimit,\n clearSelection: tableRef.current?.unselectAll,\n });\n\n useImperativeHandle(ref, () => ({\n refreshResults: () => {\n searchNameGetDoneRef.current = false;\n fetchResults();\n },\n getFields: () => treeView?.fields,\n getDomain: () => domain,\n }));\n\n useEffect(() => {\n if (!initialFetchDone) {\n return;\n }\n\n if (visible && treeView) {\n searchNameGetDoneRef.current = false;\n fetchResults();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [page, offset, initialFetchDone, visible, nameSearch, treeView]);\n\n const fetchData = async () => {\n setInitialFetchDone(false);\n setIsLoading(true);\n setInitialError(undefined);\n setTreeIsLoading?.(true);\n\n try {\n await fetchModelData();\n setInitialFetchDone(true);\n } catch (error) {\n setInitialError(error);\n setTreeIsLoading?.(false);\n } finally {\n setIsLoading(false);\n }\n };\n\n const fetchModelData = async () => {\n setCurrentModel(model);\n\n let _formView = formViewProps;\n\n if (!formViewProps) {\n _formView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"form\",\n context: parentContext,\n })) as FormView;\n }\n\n let _treeView = treeViewProps;\n\n if (!treeViewProps) {\n _treeView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"tree\",\n context: parentContext,\n })) as TreeView;\n }\n\n setFormView(_formView as FormView);\n setTreeView(_treeView as TreeView);\n };\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model]);\n\n const onSearchTreeLimitChange = useCallback(\n (newLimit: number) => {\n setLimit?.(newLimit);\n },\n [setLimit],\n );\n\n const treeButOpen = useCallback(\n async (record: any) => {\n const { id } = record;\n\n if (!expandableClickActionData.current) {\n expandableClickActionData.current =\n await ConnectionProvider.getHandler().treeButOpen({\n id: treeView!.view_id,\n model: currentModel!,\n context: parentContext,\n });\n }\n\n const actionData: any = expandableClickActionData.current[0][2];\n\n await processAction?.({\n actionData,\n fields: treeView!.fields,\n values: {\n active_id: id,\n ...record,\n },\n context: parentContext,\n });\n },\n [currentModel, parentContext, processAction, treeView],\n );\n\n const onRowClickedHandler = useCallback(\n async (record: any) => {\n const { id } = record;\n\n if (treeView?.isExpandable) {\n try {\n await treeButOpen(record);\n } catch (err) {\n showErrorDialog(err);\n }\n return;\n }\n\n onRowClicked({\n id,\n model: currentModel!,\n formView: formView!,\n treeView: treeView!,\n });\n },\n [currentModel, formView, onRowClicked, treeButOpen, treeView],\n );\n\n const selectAllRecords = useCallback(async () => {\n const allIds = await getAllIds();\n setSelectedRowItems?.(allIds.map((id: number) => ({ id })));\n onChangeSelectedRowKeys?.(allIds);\n }, [getAllIds, onChangeSelectedRowKeys, setSelectedRowItems]);\n\n const calculatedTableHeight = useMemo(() => {\n if (treeView?.isExpandable) {\n return height - 160;\n }\n return height - (searchFilterHeight + 240);\n }, [height, searchFilterHeight, treeView?.isExpandable]);\n\n const selectedRowKeys = useMemo(\n () => selectedRowItems?.map((item) => item.id),\n [selectedRowItems],\n );\n\n const content = useCallback(() => {\n if (!treeView || !formView) {\n return null;\n }\n\n return (\n <>\n <SearchFilter\n fields={{ ...formView.fields, ...treeView.fields }}\n searchFields={mergeSearchFields([\n formView.search_fields,\n treeView.search_fields,\n ])}\n onClear={clear}\n limit={limit}\n offset={offset}\n isSearching={searchFilterLoading}\n onSubmit={submit}\n onLimitChange={onSearchTreeLimitChange}\n setSearchFilterHeight={setSearchFilterHeight}\n searchError={searchError}\n searchVisible={searchVisible}\n searchValues={searchValues}\n />\n <Tree\n ref={tableRef}\n context={parentContext}\n total={totalItems}\n limit={limitUsedInSearch}\n page={page}\n treeView={treeView}\n results={getResults()}\n onRequestPageChange={requestPageChange}\n loading={tableRefreshing}\n onRowClicked={onRowClickedHandler}\n scrollY={treeScrollY || calculatedTableHeight}\n colorsForResults={colorsForResults}\n statusForResults={statusForResults}\n selectedRowKeys={selectedRowKeys}\n onRowSelectionChange={changeSelectedRowKeys}\n sorter={sorter}\n onChangeSort={changeSort}\n onFetchChildrenForRecord={\n treeView.isExpandable ? fetchChildrenForRecord : undefined\n }\n childField={treeView.field_parent}\n rootTree={rootTree}\n onSelectAllRecords={selectAllRecords}\n />\n </>\n );\n }, [\n calculatedTableHeight,\n changeSelectedRowKeys,\n changeSort,\n clear,\n colorsForResults,\n fetchChildrenForRecord,\n formView,\n getResults,\n limit,\n limitUsedInSearch,\n offset,\n onRowClickedHandler,\n onSearchTreeLimitChange,\n page,\n parentContext,\n requestPageChange,\n rootTree,\n searchError,\n searchFilterLoading,\n searchValues,\n searchVisible,\n selectAllRecords,\n selectedRowKeys,\n sorter,\n statusForResults,\n submit,\n tableRefreshing,\n totalItems,\n treeScrollY,\n treeView,\n ]);\n\n const error = initialError || searchError;\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n return (\n <div style={!visible ? { display: \"none\" } : {}}>\n {isLoading ? <Spin /> : content()}\n </div>\n );\n}\n\nexport default forwardRef(SearchTree);\n","import { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { error } = Modal;\n\nexport const showErrorDialog = (message: string) => {\n error({\n title: \"Error\",\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: message,\n });\n};\n\nexport const showErrorExceptionDialog = (error: any) => {\n const messageContent = error.message\n ? JSON.stringify(error.message)\n : JSON.stringify(error);\n showErrorDialog(messageContent);\n};\n","import { useCallback, useState } from \"react\";\nimport { Modal, Button, Divider, Row, Space } from \"antd\";\nimport { FormModal } from \"./FormModal\";\nimport SearchTree from \"@/widgets/views/SearchTree\";\nimport {\n FileAddOutlined,\n CloseOutlined,\n CheckOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport useWindowDimensions from \"@/hooks/useWindowDimensions\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { showErrorDialog } from \"@/ui/GenericErrorDialog\";\n\ntype SearchSelectionProps = {\n visible: boolean;\n model: string;\n nameSearch?: string;\n onSelectValues: (values: number[]) => Promise<void>;\n onCloseModal: () => void;\n domain?: any;\n context?: any;\n};\n\nexport const SearchModal = (props: SearchSelectionProps) => {\n const {\n visible,\n onCloseModal: onCloseModalProps,\n onSelectValues: onSelectValuesProps,\n model,\n nameSearch,\n domain,\n context = {},\n } = props;\n const [showCreateModal, setShowCreateModal] = useState<boolean>(false);\n\n const { modalWidth, modalHeight } = useWindowDimensions();\n const { t } = useLocale();\n const [selectedRowKeys, setSelectedRowKeys] = useState<any[]>([]);\n const [operationInProgress, setOperationInProgress] =\n useState<boolean>(false);\n\n const onSelectValues = useCallback(\n async (keys: any[]) => {\n setOperationInProgress(true);\n try {\n await onSelectValuesProps(keys);\n } catch (err) {\n showErrorDialog(err);\n }\n setOperationInProgress(false);\n },\n [onSelectValuesProps],\n );\n\n const onCloseModal = async () => {\n await new Promise((resolve) => setTimeout(resolve, 5));\n onCloseModalProps();\n };\n\n const onRowClicked = async (event: any) => {\n const { id } = event;\n onSelectValues([id]);\n };\n\n function submit() {\n if (selectedRowKeys.length === 0) {\n onCloseModal();\n return;\n }\n\n void onSelectValues(selectedRowKeys);\n }\n\n const content = () => {\n return (\n <>\n <SearchTree\n model={model}\n nameSearch={nameSearch}\n onRowClicked={onRowClicked}\n treeScrollY={modalHeight * 0.3}\n domain={domain}\n parentContext={context}\n onChangeSelectedRowKeys={setSelectedRowKeys}\n />\n <Divider />\n <Row justify=\"end\">\n <Space>\n <Button\n disabled={operationInProgress}\n icon={<FileAddOutlined />}\n onClick={() => {\n setShowCreateModal(true);\n }}\n >\n {t(\"new\")}\n </Button>\n <Button\n disabled={operationInProgress}\n icon={\n operationInProgress ? <LoadingOutlined /> : <CheckOutlined />\n }\n onClick={() => {\n submit();\n }}\n type=\"primary\"\n >\n {t(\"ok\")}\n </Button>\n <Button icon={<CloseOutlined />} onClick={onCloseModal}>\n {t(\"cancel\")}\n </Button>\n </Space>\n </Row>\n </>\n );\n };\n\n return (\n <>\n <Modal\n title={t(\"search\")}\n centered\n width={modalWidth}\n open={visible && !showCreateModal}\n closable={true}\n onCancel={onCloseModal}\n footer={null}\n destroyOnClose\n maskClosable={false}\n >\n {content()}\n </Modal>\n <FormModal\n model={model}\n visible={showCreateModal}\n parentContext={context}\n onSubmitSucceed={(id?: number) => {\n setShowCreateModal(false);\n onCloseModal();\n onSelectValues([id!]);\n }}\n onCancel={() => {\n setShowCreateModal(false);\n onCloseModal();\n }}\n />\n </>\n );\n};\n","import React, { useState, useRef, useEffect, useContext } from \"react\";\nimport { Input, Button, Row, Col, theme } from \"antd\";\nimport {\n SearchOutlined,\n FolderOpenOutlined,\n LoadingOutlined,\n} from \"@ant-design/icons\";\nimport styled from \"styled-components\";\n\nimport {\n Many2one as Many2oneOoui,\n transformDomainForChildWidget,\n} from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { SearchModal } from \"@/widgets/modals/SearchModal\";\nimport { FormModal } from \"@/widgets/modals/FormModal\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { Many2oneSuffix } from \"./Many2oneSuffix\";\nimport { showErrorDialog } from \"@/ui/GenericErrorDialog\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\n\nconst { defaultAlgorithm, defaultSeed } = theme;\n\nconst mapToken = defaultAlgorithm(defaultSeed);\n\ntype Props = {\n ooui: Many2oneOoui;\n onOpenDetailClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n onSearchClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n};\n\nexport const Many2one = (props: Props) => {\n const { ooui } = props;\n const { required } = ooui;\n const validator = async (_: any, value: any) => {\n if (!value) throw new Error();\n if (!Array.isArray(value)) throw new Error();\n if (Array.isArray(value) && !value[0]) throw new Error();\n };\n\n return (\n <Field required={required} type={\"array\"} validator={validator} {...props}>\n <Many2oneInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface Many2oneInputProps {\n ooui: Many2oneOoui;\n value?: any[];\n onChange?: (value: any[]) => void;\n}\n\nexport const Many2oneInput: React.FC<Many2oneInputProps> = (\n props: Many2oneInputProps,\n) => {\n const { value, onChange, ooui } = props;\n const {\n required,\n relation,\n readOnly,\n context,\n id: fieldName,\n domain: widgetDomain,\n } = ooui;\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: mapToken.colorPrimaryBg }\n : undefined;\n const [showSearchModal, setShowSearchModal] = useState<boolean>(false);\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [searching, setSearching] = useState<boolean>(false);\n const [searchText, setSearchText] = useState<string>();\n const searchButtonTappedRef = useRef<boolean>(false);\n const [inputText, setInputText] = useState<string>(\"\");\n const inputTextRef = useRef<string>();\n const formContext = useContext(FormContext) as FormContextType;\n const { domain, getValues, getFields, getContext, elementHasLostFocus } =\n formContext || {};\n const transformedDomain = useRef<any[]>([]);\n const [searchDomain, setSearchDomain] = useState<any>([]);\n\n const id = (value && value[0]) || undefined;\n const text = (value && value[1]) || \"\";\n\n useEffect(() => {\n if (!Array.isArray(value) && value) {\n fetchNameAndUpdate(value as any);\n }\n }, [value]);\n\n useEffect(() => {\n if (id && text.length === 0) {\n fetchNameAndUpdate(id);\n } else if (id && text.length > 0) {\n setInputText(text);\n } else if (!id && !text) {\n setInputText(inputTextRef.current || \"\");\n }\n }, [value]);\n\n const triggerChange = (changedValue: any[]) => {\n onChange?.(changedValue);\n elementHasLostFocus?.();\n };\n\n const onValueStringChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n inputTextRef.current = e.target.value;\n triggerChange([undefined, \"\"]);\n };\n\n const onElementLostFocus = async () => {\n if (!searching && inputText !== text) {\n // Debounce this event to give time to the search button onClick to set the flag\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n // If the focus is lost because the user tapped the search button, we don't need to do nothing here\n if (searchButtonTappedRef.current) {\n triggerChange([undefined, \"\"]);\n return;\n }\n\n setSearching(true);\n\n try {\n if (transformedDomain.current && transformedDomain.current.length > 0) {\n tryFetchFirstResultOrShowSearch(inputTextRef.current as string);\n } else {\n const results: any[] =\n await ConnectionProvider.getHandler().nameSearch({\n model: relation,\n payload: inputTextRef.current as string,\n context: { ...getContext?.(), ...context },\n });\n\n if (results.length === 1) {\n inputTextRef.current = undefined;\n triggerChange(results[0]);\n } else {\n tryFetchFirstResultOrShowSearch(inputTextRef.current as string);\n }\n }\n } catch (err) {\n showErrorDialog(err);\n } finally {\n setSearching(false);\n }\n }\n };\n\n const tryFetchFirstResultOrShowSearch = async (text: string) => {\n await parseDomain();\n\n if (transformedDomain.current && transformedDomain.current.length > 0) {\n const resultIds = await ConnectionProvider.getHandler().searchAllIds({\n params: transformedDomain.current,\n model: relation,\n context: { ...getContext?.(), ...context },\n totalItems: 2,\n });\n\n if (resultIds.length === 1) {\n fetchNameAndUpdate(resultIds[0]);\n } else {\n setSearchText(text);\n setShowSearchModal(true);\n }\n return;\n }\n\n setSearchText(text);\n setShowSearchModal(true);\n };\n\n const fetchNameAndUpdate = async (id: number) => {\n setSearching(true);\n\n try {\n const value = await ConnectionProvider.getHandler().execute({\n action: \"name_get\",\n payload: [id],\n model: relation,\n context: { ...getContext?.(), ...context },\n });\n\n triggerChange([id, value[0][1]]);\n } catch (err) {\n showErrorDialog(err);\n } finally {\n setSearching(false);\n }\n };\n\n async function parseDomain() {\n if (widgetDomain) {\n transformedDomain.current =\n await ConnectionProvider.getHandler().evalDomain({\n domain: widgetDomain,\n values: transformPlainMany2Ones({\n fields: getFields(),\n values: getValues(),\n }),\n fields: getFields(),\n context: getContext(),\n });\n }\n\n if (domain && domain.length > 0) {\n transformedDomain.current = transformedDomain.current.concat(\n transformDomainForChildWidget({\n domain,\n widgetFieldName: fieldName,\n }),\n );\n }\n\n setSearchDomain(transformedDomain.current);\n }\n\n async function onKeyDown(event: any) {\n if (event.keyCode === 13) {\n event.preventDefault();\n event.stopPropagation();\n await onElementLostFocus();\n } else if (event.code === \"Backspace\" && id !== undefined) {\n event.preventDefault();\n event.stopPropagation();\n triggerChange([undefined, \"\"]);\n }\n }\n\n const CustomInput: any = required && !readOnly ? RequiredInput : Input;\n\n return (\n <Row gutter={8} wrap={false}>\n <Col flex=\"auto\" style={{ paddingRight: 0 }}>\n <CustomInput\n type=\"text\"\n value={inputText}\n disabled={readOnly}\n onChange={onValueStringChange}\n style={{\n ...requiredStyle,\n ...{ borderTopRightRadius: 0, borderBottomRightRadius: 0 },\n }}\n onBlur={onElementLostFocus}\n onKeyDown={onKeyDown}\n suffix={\n <Many2oneSuffix\n id={id}\n model={relation}\n context={{ ...getContext?.(), ...context }}\n />\n }\n />\n </Col>\n <Col flex=\"none\" style={{ paddingRight: 0, paddingLeft: 0 }}>\n <Button\n icon={<FolderOpenOutlined />}\n disabled={id === undefined || text === \"\" || inputText === undefined}\n onClick={() => {\n setShowFormModal(true);\n }}\n style={{ borderRadius: 0 }}\n tabIndex={-1}\n />\n </Col>\n <Col flex=\"none\" style={{ paddingLeft: 0 }}>\n <Button\n icon={searching ? <LoadingOutlined /> : <SearchOutlined />}\n disabled={readOnly || searching}\n onClick={() => {\n searchButtonTappedRef.current = true;\n tryFetchFirstResultOrShowSearch(text);\n }}\n style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0 }}\n tabIndex={-1}\n />\n </Col>\n <SearchModal\n model={relation}\n domain={searchDomain}\n context={{ ...getContext?.(), ...context }}\n visible={showSearchModal}\n nameSearch={!id ? searchText : undefined}\n onSelectValues={async (ids: number[]) => {\n setShowSearchModal(false);\n fetchNameAndUpdate(ids[0]);\n searchButtonTappedRef.current = false;\n inputTextRef.current = undefined;\n }}\n onCloseModal={() => {\n setShowSearchModal(false);\n searchButtonTappedRef.current = false;\n }}\n />\n <FormModal\n model={relation}\n parentContext={{ ...getContext?.(), ...context }}\n id={value && value[0]}\n visible={showFormModal}\n onSubmitSucceed={(id?: number) => {\n setShowFormModal(false);\n fetchNameAndUpdate(id!);\n }}\n onCancel={() => {\n setShowFormModal(false);\n }}\n mustClearAfterSave={true}\n readOnly={readOnly}\n />\n </Row>\n );\n};\n\nconst RequiredInput = styled(Input)`\n .ant-input {\n background-color: ${mapToken.colorPrimaryBg};\n }\n`;\n","import { ViewType } from \"@/types\";\nimport React, { useState } from \"react\";\n\nexport type One2manyContextType = {\n currentView: ViewType;\n setCurrentView: (view: ViewType) => void;\n itemIndex: number;\n setItemIndex: (value: number) => void;\n manualTriggerChange: boolean;\n setManualTriggerChange: (value: boolean) => void;\n};\n\nexport const One2manyContext = React.createContext<One2manyContextType | null>(\n null,\n);\n\nconst One2manyProvider = ({\n children,\n initialView,\n}: {\n children: React.ReactNode;\n initialView: ViewType;\n}): any => {\n const [currentView, setCurrentView] = useState<ViewType>(initialView);\n const [itemIndex, setItemIndex] = useState<number>(0);\n const [manualTriggerChange, setManualTriggerChange] =\n useState<boolean>(false);\n\n return (\n <One2manyContext.Provider\n value={{\n currentView,\n setCurrentView,\n itemIndex,\n setItemIndex,\n manualTriggerChange,\n setManualTriggerChange,\n }}\n >\n {children}\n </One2manyContext.Provider>\n );\n};\n\nexport default One2manyProvider;\n","import React, { useState } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { Modal } from \"antd\";\nimport { ConfirmConfig } from \"./asyncConfirm\";\n\nexport const AsyncConfirmModal: React.FC<ConfirmConfig> = ({\n title,\n content,\n onOk,\n icon,\n okText,\n cancelText,\n centered,\n}) => {\n const [confirmLoading, setConfirmLoading] = useState(false);\n const [visible, setVisible] = useState(true);\n\n const handleOk = async () => {\n setConfirmLoading(true);\n try {\n await onOk();\n } finally {\n setConfirmLoading(false);\n closeModal();\n }\n };\n\n const handleCancel = () => {\n closeModal();\n };\n\n const closeModal = () => {\n setVisible(false);\n const container = document.querySelector(\"#confirm-modal-container\");\n if (container) {\n const root = createRoot(container); // Create a root.\n root.unmount(); // Unmount the component.\n container.remove(); // Remove the container from the DOM.\n }\n };\n\n const modalTitle = (\n <span>\n {icon && <span style={{ marginRight: 8 }}>{icon}</span>}\n {title}\n </span>\n );\n\n return (\n <Modal\n title={modalTitle}\n zIndex={9999}\n open={visible}\n centered={centered || false}\n onOk={handleOk}\n onCancel={handleCancel}\n confirmLoading={confirmLoading}\n okText={okText}\n cancelText={cancelText}\n >\n {content}\n </Modal>\n );\n};\n","import { createRoot } from \"react-dom/client\";\nimport { AsyncConfirmModal } from \"./AsyncConfirmModal\";\n\nexport interface ConfirmConfig {\n title: string;\n content: React.ReactNode;\n onOk: () => Promise<void>;\n okText?: string;\n cancelText?: string;\n icon?: React.ReactNode;\n centered?: boolean;\n}\n\nexport const asyncConfirm = (config: ConfirmConfig) => {\n const container = document.createElement(\"div\");\n document.body.appendChild(container);\n\n const root = createRoot(container); // This creates the root instance.\n root.render(\n <AsyncConfirmModal\n {...config}\n onOk={async () => {\n try {\n await config.onOk(); // Execute the async confirm function\n } finally {\n root.unmount(); // Properly unmount using the root instance\n container.remove(); // Remove the container element\n }\n }}\n />,\n );\n\n return {\n destroy: () => {\n root.unmount(); // Use the root instance to unmount\n container.remove(); // Make sure to also remove the container\n },\n };\n};\n","import { ExclamationCircleOutlined } from \"@ant-design/icons\";\nimport { asyncConfirm } from \"./asyncConfirm\";\n\nexport const showRemoveItemDialog = ({\n t,\n onOk,\n}: {\n onOk: () => Promise<void>;\n t: (key: string) => string;\n}) => {\n asyncConfirm({\n title: t(\"removeItems\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmRemove\"),\n okText: t(\"yesConfirmRemove\"),\n cancelText: t(\"cancel\"),\n onOk,\n });\n};\n","import { ExclamationCircleOutlined } from \"@ant-design/icons\";\nimport { asyncConfirm } from \"./asyncConfirm\";\n\nexport const showUnlinkItemDialog = ({\n t,\n onOk,\n}: {\n onOk: () => Promise<void>;\n t: (key: string) => string;\n}) => {\n asyncConfirm({\n title: t(\"unlinkItems\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmUnlink\"),\n okText: t(\"yesConfirmUnlink\"),\n onOk,\n cancelText: t(\"cancel\"),\n });\n};\n","import React from \"react\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\n\nimport {\n FileAddOutlined,\n DeleteOutlined,\n LeftOutlined,\n RightOutlined,\n AlignLeftOutlined,\n SearchOutlined,\n ApiOutlined,\n} from \"@ant-design/icons\";\nimport { ViewType } from \"@/types\";\nimport { theme } from \"antd\";\nconst { useToken } = theme;\n\ntype One2manyTopBarProps = {\n title: string;\n mode: ViewType;\n isMany2Many: boolean;\n readOnly: boolean;\n formHasChanges: boolean;\n onToggleViewMode: () => void;\n onCreateItem: () => void;\n onDelete: () => void;\n totalItems: number;\n currentItemIndex: number;\n onPreviousItem: () => void;\n onNextItem: () => void;\n onSearchItem: () => void;\n selectedRowKeys: string[];\n showToggleButton: boolean;\n showCreateButton: boolean;\n};\n\nexport const One2manyTopBar = (props: One2manyTopBarProps) => {\n const {\n title: titleString,\n readOnly,\n onCreateItem,\n onToggleViewMode,\n mode,\n onDelete,\n totalItems,\n currentItemIndex,\n onPreviousItem,\n onNextItem,\n isMany2Many,\n onSearchItem,\n selectedRowKeys,\n showCreateButton,\n showToggleButton,\n } = props;\n const { token } = useToken();\n\n function separator() {\n return <div className=\"inline-block w-3\" />;\n }\n\n function title() {\n return (\n <div\n className=\"flex flex-grow h-8 text-white\"\n style={{\n borderRadius: token.borderRadius,\n backgroundColor: token.colorPrimaryActive,\n }}\n >\n <div className=\"flex flex-col items-center justify-center h-full\">\n <span className=\"pl-2 font-bold\">{titleString}</span>\n </div>\n </div>\n );\n }\n\n function deleteButton() {\n return (\n <ButtonWithTooltip\n tooltip={isMany2Many ? \"Unlink\" : \"Delete\"}\n icon={isMany2Many ? <ApiOutlined /> : <DeleteOutlined />}\n onClick={onDelete}\n disabled={\n totalItems === 0 ||\n readOnly ||\n (mode !== \"form\" && selectedRowKeys.length === 0)\n }\n />\n );\n }\n\n function index() {\n let itemToShow = \"_\";\n if (totalItems === 0) {\n itemToShow = \"_\";\n } else {\n itemToShow = (currentItemIndex + 1).toString();\n }\n return (\n <span className=\"pl-1 pr-1\">\n ({itemToShow}/{totalItems})\n </span>\n );\n }\n\n function itemBrowser() {\n return (\n <>\n {separator()}\n <ButtonWithTooltip\n tooltip={\"Previous item\"}\n icon={<LeftOutlined />}\n onClick={onPreviousItem}\n />\n {index()}\n <ButtonWithTooltip\n tooltip={\"Next item\"}\n icon={<RightOutlined />}\n onClick={onNextItem}\n />\n </>\n );\n }\n\n return (\n <div className=\"flex mb-2\">\n {title()}\n <div className=\"flex-none h-8 pl-2\">\n {mode !== \"graph\" && showCreateButton && (\n <ButtonWithTooltip\n tooltip={\"Create new item\"}\n icon={<FileAddOutlined />}\n disabled={readOnly}\n onClick={onCreateItem}\n />\n )}\n {isMany2Many && showCreateButton && (\n <>\n {separator()}\n <ButtonWithTooltip\n tooltip={\"Search existing item\"}\n icon={<SearchOutlined />}\n disabled={readOnly}\n onClick={onSearchItem}\n />\n </>\n )}\n {mode !== \"graph\" && separator()}\n {mode !== \"graph\" && deleteButton()}\n {mode === \"form\" && itemBrowser()}\n {separator()}\n {showToggleButton && (\n <ButtonWithTooltip\n tooltip={\"Toggle view mode\"}\n icon={<AlignLeftOutlined />}\n onClick={onToggleViewMode}\n />\n )}\n </div>\n </div>\n );\n};\n","import React, {\n useState,\n useRef,\n useContext,\n useEffect,\n useCallback,\n} from \"react\";\nimport {\n One2many as One2manyOoui,\n Form as FormOoui,\n Tree as TreeOoui,\n parseGraph,\n transformDomainForChildWidget,\n} from \"@gisce/ooui\";\nimport { Alert, Spin } from \"antd\";\nimport { Form, Tree } from \"@/index\";\nimport { Graph } from \"@/widgets/views/Graph/Graph\";\nimport { Views, ViewType } from \"@/types\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { FormModal } from \"@/widgets/modals/FormModal\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport { showRemoveItemDialog } from \"@/ui/RemoveItemDialog\";\nimport { showUnlinkItemDialog } from \"@/ui/UnlinkItemDialog\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { One2manyTopBar } from \"@/widgets/base/one2many/One2manyTopBar\";\nimport { readObjectValues, getNextPendingId } from \"@/helpers/one2manyHelper\";\nimport { SearchModal } from \"@/widgets/modals/SearchModal\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { sortResults } from \"@/helpers/treeHelper\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\n\ntype One2manyValue = {\n fields?: any;\n items: One2manyItem[];\n};\n\nconst ViewObjects = {\n form: FormOoui,\n tree: TreeOoui,\n graph: Graph,\n};\n\ntype One2manyItem = {\n operation?:\n | \"original\"\n | \"pendingRemove\"\n | \"pendingUpdate\"\n | \"pendingCreate\"\n | \"pendingLink\";\n id?: number;\n values?: any;\n treeValues?: any;\n defaultValues?: any;\n};\n\ninterface One2manyInputProps {\n ooui: One2manyOoui;\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n views: Views;\n}\n\nfunction filterDuplicateItems(items: any) {\n const ids = items.map((o: any) => o.id);\n const filtered = items.filter((item: any, index: number) => {\n const { id } = item;\n return !ids.includes(id, index + 1);\n });\n return filtered;\n}\n\nconst One2manyInput: React.FC<One2manyInputProps> = (\n props: One2manyInputProps,\n) => {\n const { value, onChange, ooui, views } = props;\n const { items = [] } = value || {};\n\n const { currentView, setCurrentView, itemIndex, setItemIndex } = useContext(\n One2manyContext,\n ) as One2manyContextType;\n\n const formContext = useContext(FormContext) as FormContextType;\n const {\n activeId,\n getFields,\n getValues,\n getContext,\n domain,\n fetchValues: fetchParentFormValues,\n } = formContext || {};\n const { t } = useLocale();\n\n const [formHasChanges, setFormHasChanges] = useState<boolean>(false);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [showSearchModal, setShowSearchModal] = useState<boolean>(false);\n const [modalItem, setModalItem] = useState<One2manyItem>();\n const [selectedRowKeys, setSelectedRowKeys] = useState<any[]>([]);\n const [continuousEntryMode, setContinuousEntryMode] =\n useState<boolean>(false);\n const transformedDomain = useRef<any[]>([]);\n const [sorter, setSorter] = useState<any>();\n const originalSortItemIds = useRef<number[]>();\n const [colorsForResults, setColorsForResults] = useState<any>(undefined);\n\n const {\n readOnly,\n relation,\n context,\n domain: widgetDomain,\n } = ooui as One2manyOoui;\n const isMany2many = ooui.type === \"many2many\";\n const { id: fieldName } = ooui;\n const itemsToShow = items.filter(\n (item) =>\n (item.values || item.treeValues) && item.operation !== \"pendingRemove\",\n );\n const previousCurrentView = useRef<ViewType>();\n\n useEffect(() => {\n if (previousCurrentView.current !== currentView) {\n previousCurrentView.current = currentView;\n fetchDataIfNeeded();\n return;\n }\n\n fetchDataIfNeeded();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, currentView]);\n\n const fetchDataIfNeeded = useCallback(() => {\n if (currentView === \"form\" && items.some((item) => !item.values)) {\n fetchData();\n } else if (\n currentView === \"tree\" &&\n items.some((item) => !item.treeValues)\n ) {\n fetchData();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, currentView]);\n\n useEffect(() => {\n parseDomain();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [domain]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n fields: views.get(\"form\")?.fields || views.get(\"tree\")?.fields,\n items: filterDuplicateItems(changedValue),\n });\n };\n\n const fetchData = async () => {\n await fetchOriginalItemsFromApi();\n if (itemIndex > itemsToShow.length - 1 && itemIndex !== 0) {\n setItemIndex(0);\n }\n };\n\n const fetchOriginalItemsFromApi = async (mode?: ViewType) => {\n setIsLoading(true);\n setFormHasChanges(false);\n setError(undefined);\n\n try {\n const [itemsWithValues, evaluatedColorsForTree] = await readObjectValues({\n treeView: {\n arch: views.get(\"tree\")?.arch,\n fields: views.get(\"tree\")?.fields,\n },\n formView: {\n fields: views.get(\"form\")?.fields || {},\n },\n model: relation,\n items,\n context: { ...getContext?.(), ...context },\n currentView: mode || currentView,\n });\n\n if (!originalSortItemIds.current) {\n originalSortItemIds.current = itemsWithValues.map((item) => item.id!);\n }\n\n if ((currentView || mode) === \"tree\" && evaluatedColorsForTree) {\n setColorsForResults(evaluatedColorsForTree);\n }\n\n triggerChange(itemsWithValues);\n return itemsWithValues;\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoading(false);\n }\n };\n\n async function parseDomain() {\n if (widgetDomain) {\n transformedDomain.current =\n await ConnectionProvider.getHandler().evalDomain({\n domain: widgetDomain,\n values: transformPlainMany2Ones({\n fields: getFields(),\n values: getValues(),\n }),\n fields: getFields(),\n context: getContext(),\n });\n }\n\n if (domain && domain.length > 0) {\n transformedDomain.current = transformedDomain.current.concat(\n transformDomainForChildWidget({\n domain,\n widgetFieldName: fieldName,\n }),\n );\n }\n }\n\n const toggleViewMode = () => {\n const keys = Array.from(views.keys());\n const nextView = keys[\n (keys.indexOf(currentView) + 1) % keys.length\n ] as ViewType;\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setCurrentView(nextView);\n });\n } else {\n setCurrentView(nextView);\n }\n };\n\n const previousItem = () => {\n if (itemIndex > 0) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex - 1);\n });\n } else {\n setItemIndex(itemIndex - 1);\n }\n }\n };\n\n const nextItem = () => {\n const totalItems = itemsToShow.length;\n if (itemIndex < totalItems - 1) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex + 1);\n });\n } else {\n setItemIndex(itemIndex + 1);\n }\n }\n };\n\n const reloadOriginalValuesForFormItem = async () => {\n const currentId = itemsToShow[itemIndex].id!;\n\n const updatedFormObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [currentId],\n fields: views.get(\"form\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n const updatedTreeObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [currentId],\n fields: views.get(\"tree\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n\n const updatedItems: One2manyItem[] = items.map((item) => {\n if (item.id === currentId) {\n return {\n ...item,\n operation: \"original\",\n values: updatedFormObject,\n treeValues: updatedTreeObject,\n };\n }\n return item;\n });\n\n triggerChange(updatedItems);\n };\n\n const showFormChangesDialogIfNeeded = (callback: () => void) => {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n reloadOriginalValuesForFormItem();\n callback();\n setFormHasChanges(false);\n },\n });\n } else {\n callback();\n }\n };\n\n const showRemoveConfirm = () => {\n if (isMany2many) {\n showUnlinkItemDialog({\n t,\n onOk: async () => {\n if (currentView === \"form\") {\n removeCurrentItem();\n } else {\n removeSelectedItems();\n }\n },\n });\n return;\n }\n\n showRemoveItemDialog({\n t,\n onOk: async () => {\n if (currentView === \"form\") {\n removeCurrentItem();\n } else {\n removeSelectedItems();\n }\n },\n });\n };\n\n const createItem = async () => {\n const { inv_field } = ooui;\n let defaultValues: any;\n\n if (inv_field && activeId) {\n defaultValues = { [inv_field]: activeId };\n }\n\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n });\n } else {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n }\n };\n\n const searchItem = async () => {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setShowSearchModal(true);\n });\n } else {\n setShowSearchModal(true);\n }\n };\n\n const removeCurrentItem = async () => {\n setIsLoading(true);\n setFormHasChanges(false);\n setError(undefined);\n\n try {\n if (itemsToShow[itemIndex].id! > 0) {\n const updatedItems = items.map((item) => {\n if (item.id === itemsToShow[itemIndex].id!) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n } else {\n triggerChange(\n items.filter((item) => item.id !== itemsToShow[itemIndex].id!),\n );\n }\n } catch (err) {\n setError(err as any);\n }\n\n setItemIndex(0);\n setIsLoading(false);\n };\n\n const removeSelectedItems = async () => {\n const itemsToRemove = itemsToShow.filter((item) => {\n return selectedRowKeys.includes(item.id);\n });\n\n setIsLoading(true);\n setFormHasChanges(false);\n setError(undefined);\n\n try {\n const idsToRemove: number[] = itemsToRemove.map((item) => item.id!);\n\n const updatedItems = items\n .filter((item) => {\n if (idsToRemove.includes(item.id!) && item.id! < 0) {\n return false;\n }\n return true;\n })\n .map((item) => {\n if (idsToRemove.includes(item.id!)) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n } catch (err) {\n setError(err as any);\n }\n\n setItemIndex(0);\n setIsLoading(false);\n };\n\n // This is the callback called when a modal is done creating/updating the object\n const onFormModalSubmitSucceed = (\n id: number | undefined,\n _: any,\n values: any,\n x2manyPendingLink: boolean = false,\n mustRefreshParent: boolean = false,\n ) => {\n let updatedItems: One2manyItem[];\n\n if (x2manyPendingLink) {\n updatedItems = items.concat({\n id,\n operation: \"pendingLink\",\n values: { ...values, id },\n treeValues: { ...values, id },\n });\n } else if (id) {\n updatedItems = items.map((item: One2manyItem) => {\n if (item.id === id) {\n return {\n id,\n operation: id > 0 ? \"pendingUpdate\" : \"pendingCreate\",\n values: { ...values, id },\n treeValues: { ...values, id },\n };\n }\n return item;\n });\n } else {\n const nextId = getNextPendingId(items);\n updatedItems = items.concat({\n id: nextId,\n operation: \"pendingCreate\",\n values: { ...values, id: nextId },\n treeValues: { ...values, id: nextId },\n });\n }\n\n triggerChange(updatedItems);\n\n if (!continuousEntryMode) {\n setShowFormModal(false);\n }\n };\n\n const onTreeRowClicked = async (record: any) => {\n const { id: itemId } = record;\n\n let itemsToLoadFrom: One2manyItem[] | undefined = items;\n\n // We should fetch the form data if needed in order to get the form values\n const modalItem = items.find((item) => item.id === itemId);\n if (modalItem?.values === undefined) {\n itemsToLoadFrom = await fetchOriginalItemsFromApi(\"form\");\n }\n\n // We show the detail for the clicked item in a Form modal\n setModalItem(itemsToLoadFrom!.find((item) => item.id === itemId));\n setContinuousEntryMode(false);\n setShowFormModal(true);\n };\n\n const onSearchModalSelectValue = async (ids: number[]) => {\n setIsLoading(true);\n\n const updatedItems = items;\n const filteredIds = ids.filter((id) => {\n return !items.find((item) => item.id === id);\n });\n\n try {\n for (const id of filteredIds) {\n const updatedFormObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: views.get(\"form\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n const updatedTreeObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: views.get(\"tree\").fields,\n context: { ...getContext?.(), ...context },\n })\n )[0];\n updatedItems.push({\n id,\n operation: \"pendingLink\",\n values: updatedFormObject,\n treeValues: updatedTreeObject,\n });\n }\n\n triggerChange(updatedItems);\n } catch (e) {\n setError(e as any);\n } finally {\n setIsLoading(false);\n }\n };\n\n // TODO: improve this. Do we really have to parse the entire object just to get the title?\n function getTitle() {\n const ViewType: any = (ViewObjects as any)[currentView];\n if (currentView === \"graph\") {\n const parsedGraph = parseGraph(views.get(\"graph\").arch);\n return parsedGraph.string!;\n } else {\n const ooui = new ViewType(views.get(currentView).fields);\n ooui.parse(views.get(currentView).arch);\n return ooui.string!;\n }\n }\n\n const content = () => {\n if (currentView === \"form\") {\n if (itemsToShow.length === 0) {\n return t(\"noCurrentEntries\");\n }\n\n if (\n currentView !== previousCurrentView.current &&\n items.some((item) => !item.values)\n ) {\n return <Spin />;\n }\n\n return (\n <Form\n formView={views.get(\"form\")}\n values={itemsToShow[itemIndex]?.values}\n parentContext={{ ...getContext?.(), ...context }}\n model={relation}\n id={itemsToShow[itemIndex]?.id}\n submitMode={\"values\"}\n onFieldsChange={(values: any) => {\n const currentItemId = itemsToShow[itemIndex]?.id;\n\n const updatedItems = items.map((item) => {\n if (item.id === currentItemId) {\n return {\n ...item,\n operation:\n item.operation === \"original\"\n ? \"pendingUpdate\"\n : item.operation,\n values: { ...values, id: currentItemId },\n treeValues: { ...values, id: currentItemId },\n };\n }\n return item;\n });\n\n triggerChange(updatedItems);\n\n setFormHasChanges(true);\n }}\n readOnly={readOnly}\n />\n );\n }\n\n let resultsToShow = [];\n\n if (itemsToShow.some((item) => item.treeValues)) {\n resultsToShow = sorter\n ? sortResults({\n resultsToSort: itemsToShow.map((item) => item.treeValues),\n sorter,\n fields: {\n ...views.get(\"tree\").fields,\n ...(views.get(\"form\")?.fields || {}),\n },\n })\n : itemsToShow.map((item) => item.treeValues);\n }\n\n if (currentView === \"tree\") {\n return (\n <Tree\n total={itemsToShow.length}\n limit={itemsToShow.length}\n treeView={views.get(\"tree\")}\n results={resultsToShow}\n loading={isLoading}\n onRowClicked={\n views.get(\"form\")?.fields !== undefined\n ? onTreeRowClicked\n : undefined\n }\n showPagination={false}\n selectedRowKeys={selectedRowKeys}\n onRowSelectionChange={setSelectedRowKeys}\n sorter={sorter}\n onChangeSort={setSorter}\n context={{ ...getContext?.(), ...context }}\n colorsForResults={colorsForResults}\n readonly={readOnly}\n scrollY={ooui?.height}\n />\n );\n }\n if (currentView === \"graph\") {\n const domain = [[`${ooui.inv_field}`, \"=\", activeId]];\n return (\n <Graph\n view_id={views.get(\"graph\").view_id}\n model={ooui.relation}\n domain={domain}\n context={{ ...getContext?.(), ...context }}\n limit={0}\n />\n );\n }\n };\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n // If we are in create mode we have to show the modal in continuous mode.\n // This means the modal won't close after clicking OK, the modal will add the new item\n // and will reset to defaults to let the user add a new item.\n const mustClearAfterSave = continuousEntryMode;\n\n if (isLoading) {\n return <Spin />;\n }\n\n return (\n <>\n <One2manyTopBar\n mode={currentView}\n title={getTitle()}\n readOnly={readOnly || false}\n isMany2Many={isMany2many}\n formHasChanges={formHasChanges}\n totalItems={itemsToShow.length}\n currentItemIndex={itemIndex}\n onDelete={showRemoveConfirm}\n onCreateItem={createItem}\n onToggleViewMode={toggleViewMode}\n onPreviousItem={previousItem}\n onNextItem={nextItem}\n onSearchItem={searchItem}\n selectedRowKeys={selectedRowKeys}\n showCreateButton={views.get(\"form\")?.fields !== undefined}\n showToggleButton={views.size > 1}\n />\n {content()}\n <FormModal\n formView={views.get(\"form\")}\n model={relation}\n id={modalItem?.id}\n submitMode={\"2many\"}\n values={modalItem?.values}\n defaultValues={modalItem?.defaultValues}\n visible={showFormModal}\n onSubmitSucceed={onFormModalSubmitSucceed}\n parentContext={{ ...getContext?.(), ...context }}\n onCancel={() => {\n setContinuousEntryMode(false);\n setShowFormModal(false);\n }}\n readOnly={readOnly}\n mustClearAfterSave={mustClearAfterSave}\n onMustRefreshParent={() => {\n fetchParentFormValues?.({ forceRefresh: true });\n }}\n />\n <SearchModal\n domain={transformedDomain.current}\n model={relation}\n context={{ ...getContext?.(), ...context }}\n visible={showSearchModal}\n onSelectValues={async (ids: number[]) => {\n setShowSearchModal(false);\n onSearchModalSelectValue(ids);\n }}\n onCloseModal={() => {\n setShowSearchModal(false);\n }}\n />\n </>\n );\n};\n\nexport { One2manyInput, One2manyItem, One2manyValue };\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\nimport { transformDomainForChildWidget } from \"@gisce/ooui\";\nimport { useContext, useEffect, useRef } from \"react\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\n\nexport const useOne2ManyDomain = ({\n fieldName,\n widgetDomain,\n}: {\n fieldName: string;\n widgetDomain?: string;\n}) => {\n const transformedDomain = useRef<any[]>([]);\n const {\n getFields,\n getValues,\n getContext,\n domain: formDomain,\n } = (useContext(FormContext) as FormContextType) || {};\n\n useEffect(() => {\n parseDomain();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [formDomain]);\n\n async function parseDomain() {\n if (widgetDomain) {\n transformedDomain.current =\n await ConnectionProvider.getHandler().evalDomain({\n domain: widgetDomain,\n values: transformPlainMany2Ones({\n fields: getFields(),\n values: getValues(),\n }),\n fields: getFields(),\n context: getContext(),\n });\n }\n\n if (formDomain && formDomain.length > 0) {\n transformedDomain.current = transformedDomain.current.concat(\n transformDomainForChildWidget({\n domain: formDomain,\n widgetFieldName: fieldName,\n }),\n );\n }\n }\n\n return transformedDomain.current;\n};\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport { getColorMap, getTree } from \"@/helpers/treeHelper\";\nimport { TreeView } from \"@/types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport const useOne2manyTree = ({\n treeView,\n relation,\n context,\n}: {\n treeView: TreeView;\n relation: string;\n context: any;\n}) => {\n const [selectedRowKeys, setSelectedRowKeys] = useState<any>([]);\n const firstVisibleRowIndex = useRef(0);\n const selectedRowKeysRef = useRef(selectedRowKeys);\n const allRowSelectedMode = useRef(false);\n\n const onChangeAllRowSelectedMode = useCallback((value: boolean) => {\n allRowSelectedMode.current = value;\n }, []);\n\n const onChangeFirstVisibleRowIndex = useCallback((index: number) => {\n firstVisibleRowIndex.current = index;\n }, []);\n\n const onGetFirstVisibileRowIndex = useCallback(() => {\n return firstVisibleRowIndex.current;\n }, []);\n\n useEffect(() => {\n selectedRowKeysRef.current = selectedRowKeys;\n }, [selectedRowKeys]);\n\n const onGetSelectedRowKeys = useCallback(() => {\n if (allRowSelectedMode) {\n return [];\n }\n return selectedRowKeysRef.current;\n }, []);\n\n const treeOoui = useMemo(() => {\n return getTree(treeView);\n }, [treeView]);\n\n const onTreeFetchRows = useDeepCompareCallback(\n async (idsToFetch: number[]) => {\n const fetchedData =\n await ConnectionProvider.getHandler().readEvalUiObjects({\n model: relation,\n ids: idsToFetch,\n arch: treeView.arch,\n fields: treeView.fields,\n context,\n attrs: treeOoui.colors && {\n colors: treeOoui.colors,\n },\n });\n const results = fetchedData[0];\n const colors = getColorMap(fetchedData[1]);\n return { results, colors };\n },\n [context, relation, treeOoui.colors, treeView],\n );\n\n return {\n onTreeFetchRows,\n treeOoui,\n setSelectedRowKeys,\n selectedRowKeys,\n onChangeFirstVisibleRowIndex,\n onGetFirstVisibileRowIndex,\n onGetSelectedRowKeys,\n onChangeAllRowSelectedMode,\n allRowSelectedMode: allRowSelectedMode.current,\n };\n};\n","import { useCallback, useContext, useEffect, useState } from \"react\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { TreeView, FormView } from \"@/types\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\n\nexport const useOne2manyForm = ({\n items,\n relation,\n context,\n treeView,\n formView,\n triggerChange,\n}: {\n items: One2manyItem[];\n context: any[];\n relation: string;\n treeView: TreeView;\n formView: FormView;\n triggerChange: (items: One2manyItem[]) => void;\n}) => {\n const [formHasChanges, setFormHasChanges] = useState<boolean>(false);\n const { itemIndex } = useContext(One2manyContext) as One2manyContextType;\n const { t } = useLocale();\n\n // Whenever we save the form, we must reset the formHasChanges state\n useEffect(() => {\n const currentItem = items[itemIndex];\n if (!currentItem || currentItem?.operation === \"original\") {\n setFormHasChanges(false);\n }\n }, [itemIndex, items]);\n\n const getOriginalItemsWithRestoredItemId = useCallback(\n async ({ id }: { id: number }) => {\n const updatedFormObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: formView.fields,\n context,\n })\n )[0];\n\n const updatedTreeObject = (\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [id],\n fields: treeView.fields,\n context,\n })\n )[0];\n\n const updatedItems: One2manyItem[] = items.map((item) => {\n if (item.id === id) {\n return {\n ...item,\n operation: \"original\",\n values: updatedFormObject,\n treeValues: updatedTreeObject,\n };\n }\n return item;\n });\n\n return updatedItems;\n },\n [context, formView.fields, items, relation, treeView.fields],\n );\n\n const onFormChanges = useCallback(\n (newUpdatedItems: One2manyItem[]) => {\n setFormHasChanges(true);\n triggerChange(newUpdatedItems);\n },\n [setFormHasChanges, triggerChange],\n );\n\n const reloadOriginalValuesForCurrentItem = useCallback(async () => {\n const { id } = items[itemIndex];\n if (!id) return;\n const originalItems = await getOriginalItemsWithRestoredItemId({ id });\n triggerChange(originalItems);\n }, [getOriginalItemsWithRestoredItemId, itemIndex, items, triggerChange]);\n\n const showFormChangesDialogIfNeeded = useCallback(\n (callback: () => void) => {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n reloadOriginalValuesForCurrentItem();\n callback();\n setFormHasChanges(false);\n },\n });\n } else {\n callback();\n }\n },\n [formHasChanges, reloadOriginalValuesForCurrentItem, setFormHasChanges, t],\n );\n\n return {\n showFormChangesDialogIfNeeded,\n formHasChanges,\n setFormHasChanges,\n getOriginalItemsWithRestoredItemId,\n onFormChanges,\n };\n};\n","import { One2manyItem } from \"./One2manyInput\";\nimport { useDeepCompareMemo } from \"use-deep-compare\";\n\nexport const useOne2manyItems = ({\n one2manyItems,\n}: {\n one2manyItems: One2manyItem[];\n}) => {\n return useDeepCompareMemo(() => {\n return one2manyItems.filter((item) => item.operation !== \"pendingRemove\");\n }, [one2manyItems]);\n};\n","import { FormView } from \"@/types\";\nimport Form from \"@/widgets/views/Form\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { useContext } from \"react\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { filterDuplicateItems } from \"@/helpers/one2manyHelper\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nexport type One2manyFormProps = {\n formView: FormView;\n items: One2manyItem[];\n context: any;\n relation: string;\n readOnly: boolean;\n onChange: (items: One2manyItem[]) => void;\n};\n\nexport const One2manyForm = ({\n formView,\n items,\n context,\n relation,\n readOnly,\n onChange,\n}: One2manyFormProps) => {\n const { itemIndex } = useContext(One2manyContext) as One2manyContextType;\n\n const { t } = useLocale();\n\n if (items.length === 0) {\n return t(\"noCurrentEntries\");\n }\n\n return (\n <Form\n formView={formView}\n values={items[itemIndex]?.values}\n parentContext={context}\n model={relation}\n id={items[itemIndex]?.id}\n submitMode={\"values\"}\n onFieldsChange={(values: any) => {\n const currentItemId = items[itemIndex]?.id;\n\n const updatedItems = items.map((item) => {\n if (item.id === currentItemId) {\n return {\n ...item,\n operation:\n item.operation === \"original\"\n ? \"pendingUpdate\"\n : item.operation,\n values: { ...values, id: currentItemId },\n treeValues: { ...values, id: currentItemId },\n };\n }\n return item;\n });\n\n onChange(filterDuplicateItems(updatedItems));\n }}\n readOnly={readOnly}\n />\n );\n};\n","import { showRemoveItemDialog } from \"@/ui/RemoveItemDialog\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { useCallback, useContext } from \"react\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { showUnlinkItemDialog } from \"@/ui/UnlinkItemDialog\";\nimport { showErrorExceptionDialog } from \"@/ui/GenericErrorDialog\";\n\nexport const useOne2manyRemove = ({\n isMany2many,\n triggerChange,\n items,\n setFormHasChanges,\n selectedRowKeys,\n setSelectedRowKeys,\n}: {\n isMany2many: boolean;\n triggerChange: (items: One2manyItem[]) => void;\n items: One2manyItem[];\n setFormHasChanges: (hasChanges: boolean) => void;\n selectedRowKeys: number[];\n setSelectedRowKeys: (selectedRowKeys: number[]) => void;\n}) => {\n const { t } = useLocale();\n const { currentView, itemIndex, setItemIndex } = useContext(\n One2manyContext,\n ) as One2manyContextType;\n\n const removeSelectedItems = useCallback(async () => {\n const itemsToRemove: One2manyItem[] = getItemsToRemove({\n selectedRowKeys,\n items,\n });\n\n setFormHasChanges(false);\n\n try {\n const idsToRemove: number[] = itemsToRemove.map((item) => item.id!);\n\n const updatedItems = items\n .filter((item) => {\n if (idsToRemove.includes(item.id!) && item.id! < 0) {\n return false;\n }\n return true;\n })\n .map((item) => {\n if (idsToRemove.includes(item.id!)) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n setSelectedRowKeys([]);\n } catch (err) {\n showErrorExceptionDialog(err);\n }\n\n setItemIndex(0);\n }, [\n items,\n selectedRowKeys,\n setFormHasChanges,\n setItemIndex,\n setSelectedRowKeys,\n triggerChange,\n ]);\n\n const removeCurrentItem = useCallback(async () => {\n setFormHasChanges(false);\n\n try {\n if (items[itemIndex].id! > 0) {\n const updatedItems = items.map((item) => {\n if (item.id === items[itemIndex].id!) {\n return {\n ...item,\n operation: \"pendingRemove\",\n } as One2manyItem;\n } else {\n return item;\n }\n });\n triggerChange(updatedItems);\n } else {\n triggerChange(items.filter((item) => item.id !== items[itemIndex].id!));\n }\n } catch (err) {\n showErrorExceptionDialog(err);\n }\n\n setItemIndex(0);\n }, [items, itemIndex, setFormHasChanges, setItemIndex, triggerChange]);\n\n const onOk = useCallback(async () => {\n return currentView === \"form\"\n ? await removeCurrentItem()\n : await removeSelectedItems();\n }, [currentView, removeCurrentItem, removeSelectedItems]);\n\n const showRemoveConfirm = useCallback(() => {\n if (isMany2many) {\n showUnlinkItemDialog({\n t,\n onOk,\n });\n return;\n }\n\n showRemoveItemDialog({\n t,\n onOk,\n });\n }, [isMany2many, onOk, t]);\n\n return { showRemoveConfirm };\n};\n\ninterface IdCount {\n [key: number]: number;\n}\n\nfunction getItemsToRemove({\n selectedRowKeys,\n items,\n}: {\n selectedRowKeys: number[];\n items: One2manyItem[];\n}) {\n const itemsToRemove: One2manyItem[] = [];\n // Count the number of times each id appears in selectedRowKeys\n const idCount = selectedRowKeys.reduce<IdCount>((acc: IdCount, id) => {\n acc[id] = (acc[id] || 0) + 1;\n return acc;\n }, {});\n\n // Loop over items and push items to remove based on the count\n items.forEach((item) => {\n if (item.id && idCount[item.id] > 0) {\n itemsToRemove.push(item);\n idCount[item.id] -= 1; // Decrement the count each time an item is added to itemsToRemove\n }\n });\n return itemsToRemove;\n}\n","import { getNextPendingId } from \"@/helpers/one2manyHelper\";\nimport { ConnectionProvider, One2manyItem } from \"@/index\";\nimport { FormView, ViewType } from \"@/types\";\nimport { useCallback, useState } from \"react\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport const useOne2manyFormModal = ({\n currentView,\n inv_field,\n activeId,\n showFormChangesDialogIfNeeded,\n items,\n triggerChange,\n setCurrentView,\n setItemIndex,\n relation,\n formView,\n context,\n}: {\n currentView: string;\n inv_field?: string;\n activeId?: number;\n showFormChangesDialogIfNeeded: (callback: () => void) => void;\n items: One2manyItem[];\n triggerChange: (items: One2manyItem[]) => void;\n setCurrentView: (view: ViewType) => void;\n setItemIndex: (index: number) => void;\n relation: string;\n formView: FormView;\n context: any;\n}) => {\n const [showFormModal, setShowFormModal] = useState<boolean>(false);\n const [modalItem, setModalItem] = useState<One2manyItem>();\n const [continuousEntryMode, setContinuousEntryMode] =\n useState<boolean>(false);\n\n const createItem = useCallback(async () => {\n let defaultValues: any;\n\n if (inv_field && activeId) {\n defaultValues = { [inv_field]: activeId };\n }\n\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n });\n } else {\n setContinuousEntryMode(true);\n setModalItem({ defaultValues });\n setShowFormModal(true);\n }\n }, [activeId, currentView, inv_field, showFormChangesDialogIfNeeded]);\n\n const onCancelFormModal = useCallback(() => {\n setShowFormModal(false);\n setContinuousEntryMode(false);\n }, []);\n\n const onFormModalSubmitSucceed = useDeepCompareCallback(\n (\n id: number | undefined,\n _: any,\n values: any,\n x2manyPendingLink: boolean = false,\n ) => {\n let updatedItems: One2manyItem[];\n\n if (x2manyPendingLink) {\n updatedItems = items.concat({\n id,\n operation: \"pendingLink\",\n values: { ...values, id },\n treeValues: { ...values, id },\n });\n } else if (id) {\n updatedItems = items.map((item: One2manyItem) => {\n if (item.id === id) {\n return {\n id,\n operation: id > 0 ? \"pendingUpdate\" : \"pendingCreate\",\n values: { ...values, id },\n treeValues: { ...values, id },\n };\n }\n return item;\n });\n } else {\n const nextId = getNextPendingId(items);\n updatedItems = items.concat({\n id: nextId,\n operation: \"pendingCreate\",\n values: { ...values, id: nextId },\n treeValues: { ...values, id: nextId },\n });\n }\n\n triggerChange(updatedItems);\n\n if (!continuousEntryMode) {\n setShowFormModal(false);\n }\n },\n [continuousEntryMode, items, triggerChange],\n );\n\n const openItemInFormModal = useDeepCompareCallback(\n async (item: One2manyItem) => {\n const { id: itemId } = item;\n\n let itemsToLoadFrom: One2manyItem[] | undefined = items;\n\n // We should fetch the form data if needed in order to get the form values\n const modalItem = items.find((item) => item.id === itemId);\n if (modalItem?.values === undefined) {\n itemsToLoadFrom = await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: [item.id!],\n fields: formView.fields,\n context,\n });\n }\n\n // We show the detail for the clicked item in a Form modal\n setModalItem(itemsToLoadFrom!.find((item) => item.id === itemId));\n setContinuousEntryMode(false);\n setShowFormModal(true);\n },\n [context, formView.fields, items, relation, setCurrentView, setItemIndex],\n );\n\n return {\n showFormModal,\n modalItem,\n continuousEntryMode,\n createItem,\n onCancelFormModal,\n onFormModalSubmitSucceed,\n openItemInFormModal,\n };\n};\n","import { getValuesForFields } from \"@/helpers/one2manyHelper\";\nimport { ConnectionProvider, One2manyItem, Views } from \"@/index\";\nimport { showErrorExceptionDialog } from \"@/ui/GenericErrorDialog\";\nimport { useCallback, useState } from \"react\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport const useOne2manySearchModal = ({\n currentView,\n showFormChangesDialogIfNeeded,\n items,\n triggerChange,\n context,\n views,\n relation,\n}: {\n currentView: string;\n showFormChangesDialogIfNeeded: (callback: () => void) => void;\n items: One2manyItem[];\n triggerChange: (items: One2manyItem[]) => void;\n context: any[];\n views: Views;\n relation: string;\n}) => {\n const [showSearchModal, setShowSearchModal] = useState<boolean>(false);\n\n const searchItem = async () => {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setShowSearchModal(true);\n });\n } else {\n setShowSearchModal(true);\n }\n };\n\n const onCloseSearchModal = useCallback(() => {\n setShowSearchModal(false);\n }, []);\n\n const onSearchModalSelectValue = useDeepCompareCallback(\n async (ids: number[]) => {\n const updatedItems = [...items];\n const filteredIds = ids.filter((id) => {\n return !items.find((item) => item.id === id);\n });\n\n try {\n const updatedObjects =\n await ConnectionProvider.getHandler().readObjects({\n model: relation,\n ids: filteredIds,\n fields: {\n ...views.get(\"form\").fields,\n ...views.get(\"tree\").fields,\n },\n context,\n });\n\n updatedObjects.forEach((item: any) => {\n updatedItems.push({\n id: item.id,\n operation: \"pendingLink\",\n values: getValuesForFields({\n values: item,\n fields: [\"id\", ...Object.keys(views.get(\"form\").fields)],\n }),\n treeValues: getValuesForFields({\n values: item,\n fields: [\"id\", ...Object.keys(views.get(\"tree\").fields)],\n }),\n });\n });\n\n triggerChange(updatedItems);\n } catch (e) {\n showErrorExceptionDialog(e);\n }\n },\n [context, items, relation, triggerChange, views],\n );\n\n const onSelectSearchValues = useCallback(\n async (ids: number[]) => {\n await onSearchModalSelectValue(ids);\n setShowSearchModal(false);\n },\n [onSearchModalSelectValue],\n );\n\n return {\n searchItem,\n showSearchModal,\n onCloseSearchModal,\n onSelectSearchValues,\n };\n};\n","import { ColumnState } from \"@gisce/react-formiga-table\";\nimport { One2manyTreeDataForHash } from \"./One2manyTree\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\n\nexport type DataForHashWithModel = One2manyTreeDataForHash & { model: string };\n\nexport const useOne2manyColumnStorage = (dataForHash: DataForHashWithModel) => {\n const getColumnState = useDeepCompareCallback(():\n | ColumnState[]\n | undefined => {\n // Get the column state values from the localstorage for the curent model\n const columnState = localStorage.getItem(getKey(dataForHash));\n return columnState ? JSON.parse(columnState) : undefined;\n }, [dataForHash]);\n\n const updateColumnState = useDeepCompareCallback(\n (state: ColumnState[]) => {\n localStorage.setItem(getKey(dataForHash), JSON.stringify(state));\n },\n [dataForHash],\n );\n\n return { getColumnState, updateColumnState };\n};\n\nconst getKey = (dataForHash: DataForHashWithModel) => {\n return `columnState-${dataForHash.parentViewId}-${dataForHash.treeViewId}-${dataForHash.one2ManyFieldName}-${dataForHash.model}`;\n};\n","import { InfiniteTable, InfiniteTableRef } from \"@gisce/react-formiga-table\";\nimport { One2manyItem } from \"./One2manyInput\";\nimport { Tree as TreeOoui } from \"@gisce/ooui\";\nimport { RefObject, useCallback, useRef } from \"react\";\nimport { getTableColumns, getTableItems } from \"@/helpers/treeHelper\";\nimport { COLUMN_COMPONENTS } from \"@/widgets/views/Tree/treeComponents\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { useOne2manyColumnStorage } from \"./useOne2manyColumnStorage\";\nimport { useDeepCompareMemo } from \"use-deep-compare\";\n\nexport type One2manyTreeDataForHash = {\n parentViewId?: number;\n treeViewId?: number;\n one2ManyFieldName: string;\n};\n\nexport type One2manyTreeProps = {\n items: One2manyItem[];\n onRowDoubleClick: (record: any) => void;\n readOnly: boolean;\n height?: number;\n ooui: TreeOoui;\n context: any;\n onFetchRecords: (idsToFetch: number[]) => Promise<{\n results: any[];\n colors: { [key: number]: string };\n }>;\n onRowSelectionChange: (selectedIds: number[]) => void;\n gridRef?: React.RefObject<InfiniteTableRef>;\n relation: string;\n onChangeFirstVisibleRowIndex?: (index: number) => void;\n onGetFirstVisibleRowIndex?: () => number | undefined;\n onGetSelectedRowKeys?: () => any[];\n onAllRowSelectedModeChange?: (allRowSelectedMode: boolean) => void;\n allRowSelectedMode?: boolean;\n dataForHash: One2manyTreeDataForHash;\n};\n\nconst DEFAULT_HEIGHT = 400;\n\nexport const One2manyTree = ({\n items,\n height,\n onRowDoubleClick,\n readOnly,\n ooui,\n context,\n onFetchRecords,\n onRowSelectionChange,\n gridRef,\n relation,\n onChangeFirstVisibleRowIndex,\n onGetFirstVisibleRowIndex,\n onGetSelectedRowKeys,\n onAllRowSelectedModeChange,\n allRowSelectedMode,\n dataForHash,\n}: One2manyTreeProps) => {\n const internalGridRef = useRef<InfiniteTableRef>();\n const tableRef: RefObject<InfiniteTableRef> = gridRef! || internalGridRef!;\n\n const colorsForResults = useRef<{ [key: number]: string }>({});\n\n const prevItemsValue = useRef<One2manyItem[]>();\n const itemsRef = useRef<One2manyItem[]>(items);\n\n useDeepCompareEffect(() => {\n itemsRef.current = items;\n if (prevItemsValue.current === undefined) {\n prevItemsValue.current = items;\n return;\n }\n\n prevItemsValue.current = items;\n tableRef?.current?.refresh();\n tableRef?.current?.unselectAll();\n }, [items]);\n\n const totalRows = useDeepCompareMemo(() => items.length, [items]);\n\n const columns = useDeepCompareMemo(() => {\n return getTableColumns(\n ooui,\n {\n ...COLUMN_COMPONENTS,\n },\n context,\n );\n }, [context, ooui]);\n\n const onRequestData = useCallback(\n async (startRow: number, endRow: number) => {\n const itemsToFetch = itemsRef.current;\n const idsToFetch = itemsToFetch.map((item) => item.id) as number[];\n // now slice the records with startRow and endRow\n const idsToFetchSliced = idsToFetch.slice(startRow, endRow);\n\n // in this idsToFetchSliced we have the ids of the records that theoretically we have to fetch\n // however, it's possible that these items have operation different than original,\n // and we have to skip these items to being fetched, and passed later on to the callback as they were originally\n const realIdsToFetch = idsToFetchSliced.filter((id) => {\n const item = itemsToFetch.find((item) => item.id === id);\n return (\n item &&\n (item.operation === \"original\" || item.operation === \"pendingLink\")\n );\n });\n const otherItems = itemsToFetch.filter((item) => {\n return (\n item &&\n item.operation !== \"original\" &&\n item.operation !== \"pendingLink\"\n );\n });\n\n if (realIdsToFetch.length === 0 && otherItems.length === 0) {\n return [];\n }\n\n const { results, colors } = await onFetchRecords(realIdsToFetch);\n\n const preparedResults = getTableItems(ooui, results);\n\n // now we have to map the results to the original ids\n const resultsMapped = idsToFetchSliced.map((id) => {\n const result = preparedResults.find((result) => result.id === id);\n if (result) {\n return result;\n }\n return itemsToFetch.find((item) => item.id === id)?.treeValues;\n });\n\n colorsForResults.current = { ...colorsForResults.current, ...colors };\n return resultsMapped;\n },\n [onFetchRecords, ooui],\n );\n\n const onRowStyle = useCallback((record: any) => {\n if (colorsForResults.current[record.node?.data?.id]) {\n return { color: colorsForResults.current[record.node?.data?.id] };\n }\n return undefined;\n }, []);\n\n const { getColumnState, updateColumnState } = useOne2manyColumnStorage({\n ...dataForHash,\n model: relation,\n });\n\n return (\n <InfiniteTable\n ref={tableRef}\n height={height || DEFAULT_HEIGHT}\n columns={columns}\n onRequestData={onRequestData}\n onRowDoubleClick={onRowDoubleClick}\n readonly={readOnly}\n onRowStyle={onRowStyle}\n onRowSelectionChange={onRowSelectionChange}\n onColumnChanged={updateColumnState}\n onGetColumnsState={getColumnState}\n onChangeFirstVisibleRowIndex={onChangeFirstVisibleRowIndex}\n onGetFirstVisibleRowIndex={onGetFirstVisibleRowIndex}\n onGetSelectedRowKeys={onGetSelectedRowKeys}\n allRowSelectedMode={allRowSelectedMode}\n onAllRowSelectedModeChange={onAllRowSelectedModeChange}\n totalRows={totalRows}\n />\n );\n};\n","import React, { useCallback, useContext, useMemo, useRef } from \"react\";\nimport { One2manyInputProps } from \"./One2many.types\";\nimport {\n One2manyContext,\n One2manyContextType,\n} from \"@/context/One2manyContext\";\nimport { One2many as One2manyOoui } from \"@gisce/ooui\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { useOne2ManyDomain } from \"./useOne2manyDomain\";\nimport { useOne2manyTree } from \"./useOne2manyTree\";\nimport { One2manyTopBar } from \"./One2manyTopBar\";\nimport { ViewType } from \"@/types\";\nimport { useOne2manyForm } from \"./useOne2manyForm\";\nimport { useOne2manyItems } from \"./useOne2manyItems\";\nimport { One2manyForm } from \"./One2manyForm\";\nimport { useOne2manyRemove } from \"./useOne2manyRemove\";\nimport { InfiniteTableRef } from \"@gisce/react-formiga-table\";\nimport { useDeepCompareCallback } from \"use-deep-compare\";\nimport { FormModal, SearchModal } from \"@/index\";\nimport { useOne2manyFormModal } from \"./useOne2manyFormModal\";\nimport { useOne2manySearchModal } from \"./useOne2manySearchModal\";\nimport { One2manyTree } from \"./One2manyTree\";\nimport \"@gisce/react-formiga-table/style.css\";\nimport { Graph } from \"@/widgets/views/Graph/Graph\";\n\nconst SUPPORTED_VIEWS = [\"form\", \"tree\", \"graph\"];\n\nexport type One2manyValue = {\n fields?: any;\n items: One2manyItem[];\n};\n\nexport type One2manyItem = {\n operation?:\n | \"original\"\n | \"pendingRemove\"\n | \"pendingUpdate\"\n | \"pendingCreate\"\n | \"pendingLink\";\n id?: number;\n values?: any;\n treeValues?: any;\n defaultValues?: any;\n};\n\nexport type One2manyInputInfiniteProps = One2manyInputProps & {\n parentViewId?: number;\n treeViewId?: number;\n};\n\nexport const One2manyInput: React.FC<One2manyInputInfiniteProps> = (\n props: One2manyInputInfiniteProps,\n) => {\n const gridRef = useRef<InfiniteTableRef>(null);\n const { value, onChange, ooui, views } = props;\n const { items: one2manyItems = [] } = value || {};\n const items = useOne2manyItems({ one2manyItems });\n const { currentView, setCurrentView, itemIndex, setItemIndex } = useContext(\n One2manyContext,\n ) as One2manyContextType;\n const {\n readOnly,\n relation,\n context: widgetContext,\n domain: widgetDomain,\n id: fieldName,\n } = ooui as One2manyOoui;\n const formContext = useContext(FormContext) as FormContextType;\n const {\n activeId,\n getContext,\n fetchValues: fetchParentFormValues,\n } = formContext || {};\n\n const showToggleButton = views.size > 1;\n const showCreateButton = views.get(\"form\")?.fields !== undefined;\n\n const context = useMemo(() => {\n return { ...getContext?.(), ...widgetContext };\n }, [getContext, widgetContext]);\n\n const domain = useOne2ManyDomain({\n widgetDomain,\n fieldName,\n });\n\n const {\n treeOoui,\n onTreeFetchRows,\n selectedRowKeys,\n setSelectedRowKeys,\n onChangeFirstVisibleRowIndex,\n onGetFirstVisibileRowIndex,\n onGetSelectedRowKeys,\n allRowSelectedMode,\n onChangeAllRowSelectedMode,\n } = useOne2manyTree({\n treeView: views.get(\"tree\"),\n relation,\n context,\n });\n\n const title = useMemo(() => {\n const { title } = views.get(currentView) || {};\n return title || ooui.label;\n }, [currentView, ooui.label, views]);\n\n const isMany2many = ooui.type === \"many2many\";\n\n const triggerChange = useCallback(\n (changedValues: One2manyItem[]) => {\n onChange?.({\n fields: views.get(\"form\")?.fields || views.get(\"tree\")?.fields,\n items: changedValues,\n });\n },\n [onChange, views],\n );\n\n const {\n formHasChanges,\n onFormChanges,\n showFormChangesDialogIfNeeded,\n setFormHasChanges,\n } = useOne2manyForm({\n items,\n formView: views.get(\"form\"),\n treeView: views.get(\"tree\"),\n relation,\n context,\n triggerChange,\n });\n\n const {\n showFormModal,\n modalItem,\n continuousEntryMode,\n onCancelFormModal,\n onFormModalSubmitSucceed,\n createItem,\n openItemInFormModal,\n } = useOne2manyFormModal({\n activeId,\n inv_field: ooui.inv_field,\n showFormChangesDialogIfNeeded,\n currentView,\n triggerChange,\n items,\n setCurrentView,\n setItemIndex,\n context,\n relation,\n formView: views.get(\"form\"),\n });\n\n const {\n showSearchModal,\n onSelectSearchValues,\n onCloseSearchModal,\n searchItem,\n } = useOne2manySearchModal({\n showFormChangesDialogIfNeeded,\n currentView,\n triggerChange,\n items,\n views,\n context,\n relation,\n });\n\n const { showRemoveConfirm } = useOne2manyRemove({\n isMany2many,\n items,\n triggerChange,\n setFormHasChanges,\n selectedRowKeys,\n setSelectedRowKeys,\n });\n\n const toggleViewMode = () => {\n const keys = Array.from(views.keys());\n const nextView = keys[\n (keys.indexOf(currentView) + 1) % keys.length\n ] as ViewType;\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setCurrentView(nextView);\n });\n } else {\n setCurrentView(nextView);\n }\n };\n\n const onRowDoubleClick = useDeepCompareCallback(\n (item: any) => {\n if (!views.get(\"form\")?.fields) return;\n openItemInFormModal(item);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [items],\n );\n\n const onPreviousItem = useCallback(() => {\n if (itemIndex > 0) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex - 1);\n });\n } else {\n setItemIndex(itemIndex - 1);\n }\n }\n }, [currentView, itemIndex, setItemIndex, showFormChangesDialogIfNeeded]);\n\n const onNextItem = useCallback(() => {\n const totalItems = items.length;\n if (itemIndex < totalItems - 1) {\n if (currentView === \"form\") {\n showFormChangesDialogIfNeeded(() => {\n setItemIndex(itemIndex + 1);\n });\n } else {\n setItemIndex(itemIndex + 1);\n }\n }\n }, [\n currentView,\n itemIndex,\n items.length,\n setItemIndex,\n showFormChangesDialogIfNeeded,\n ]);\n\n return (\n <>\n <One2manyTopBar\n mode={currentView}\n title={title}\n readOnly={readOnly || false}\n isMany2Many={isMany2many}\n formHasChanges={formHasChanges}\n totalItems={items.length}\n currentItemIndex={itemIndex}\n onDelete={showRemoveConfirm}\n onCreateItem={createItem}\n onToggleViewMode={toggleViewMode}\n onPreviousItem={onPreviousItem}\n onNextItem={onNextItem}\n onSearchItem={searchItem}\n selectedRowKeys={selectedRowKeys}\n showCreateButton={showCreateButton}\n showToggleButton={showToggleButton}\n />\n {currentView === \"tree\" && (\n <One2manyTree\n gridRef={gridRef}\n items={items}\n readOnly={readOnly || false}\n onFetchRecords={onTreeFetchRows}\n ooui={treeOoui}\n context={context}\n onRowDoubleClick={onRowDoubleClick}\n onRowSelectionChange={setSelectedRowKeys}\n relation={relation}\n onChangeFirstVisibleRowIndex={onChangeFirstVisibleRowIndex}\n onGetFirstVisibleRowIndex={onGetFirstVisibileRowIndex}\n onGetSelectedRowKeys={onGetSelectedRowKeys}\n allRowSelectedMode={allRowSelectedMode}\n onAllRowSelectedModeChange={onChangeAllRowSelectedMode}\n dataForHash={{\n parentViewId: props.parentViewId,\n treeViewId: props.treeViewId,\n one2ManyFieldName: fieldName,\n }}\n />\n )}\n {currentView === \"form\" && (\n <One2manyForm\n items={items}\n formView={views.get(\"form\")}\n context={context}\n relation={relation}\n readOnly={readOnly || false}\n onChange={onFormChanges}\n />\n )}\n <FormModal\n formView={views.get(\"form\")}\n model={relation}\n id={modalItem?.id}\n submitMode={\"2many\"}\n values={modalItem?.values}\n defaultValues={modalItem?.defaultValues}\n visible={showFormModal}\n onSubmitSucceed={onFormModalSubmitSucceed}\n parentContext={context}\n onCancel={onCancelFormModal}\n readOnly={readOnly}\n mustClearAfterSave={continuousEntryMode}\n onMustRefreshParent={() => {\n fetchParentFormValues?.({ forceRefresh: true });\n }}\n />\n <SearchModal\n domain={domain}\n model={relation}\n context={context}\n visible={showSearchModal}\n onSelectValues={onSelectSearchValues}\n onCloseModal={onCloseSearchModal}\n />\n {currentView === \"graph\" && (\n <Graph\n view_id={views.get(\"graph\").view_id}\n model={relation}\n domain={[[`${ooui.inv_field}`, \"=\", activeId]]}\n context={context}\n limit={0}\n />\n )}\n {!SUPPORTED_VIEWS.includes(currentView) && (\n <span>Unsupported view {currentView}</span>\n )}\n </>\n );\n};\n","import { useContext, useState } from \"react\";\nimport { One2many as One2manyOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { Spin, Alert } from \"antd\";\nimport { Views, ViewType } from \"@/types\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport One2manyProvider from \"@/context/One2manyContext\";\nimport { One2manyInput } from \"@/widgets/base/one2many/One2manyInput\";\nimport { One2manyInput as One2manyInputInfinite } from \"@/widgets/base/one2many/One2manyInputInfinite\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\n\ntype Props = {\n ooui: One2manyOoui;\n};\n\nexport const One2many = (props: Props) => {\n const { ooui } = props;\n const { mode, relation, views: oouiViews, required, context } = ooui;\n\n let initialView: ViewType;\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<string>();\n const [views, setViews] = useState<Views>(new Map<string, any>());\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext, formView } = formContext || {};\n const { view_id: parentViewId } = formView || {};\n\n useDeepCompareEffect(() => {\n fetchData();\n }, [ooui]);\n\n const getViewData = async (type: ViewType) => {\n if (oouiViews && oouiViews[type]) {\n return oouiViews[type];\n }\n return await ConnectionProvider.getHandler().getView({\n model: relation,\n type,\n context: { ...getContext?.(), ...context },\n });\n };\n\n const fetchData = async () => {\n setIsLoading(true);\n setError(undefined);\n\n try {\n if (mode && mode.length > 0) {\n for (const m of mode as ViewType[]) {\n const v = await getViewData(m);\n views.set(m, v);\n }\n setViews(views);\n } else {\n const formView = await getViewData(\"form\");\n const treeView = await getViewData(\"tree\");\n views.set(\"form\", formView);\n views.set(\"tree\", treeView);\n setViews(views);\n }\n } catch (err) {\n setError(JSON.stringify(err));\n } finally {\n setIsLoading(false);\n }\n };\n\n if (mode && mode.length > 0) {\n initialView = mode[0] as ViewType;\n } else {\n initialView = \"tree\";\n }\n\n if (isLoading) {\n return <Spin />;\n }\n\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n\n const validator = async (_: any, value: any) => {\n if (!value) throw new Error();\n if (!value.items) throw new Error();\n if (!Array.isArray(value.items)) throw new Error();\n if (value.items.length === 0) throw new Error();\n };\n\n return (\n <One2manyProvider initialView={initialView}>\n <Field\n required={required}\n type={\"array\"}\n validator={validator}\n {...props}\n >\n {ooui.infinite ? (\n <One2manyInputInfinite\n ooui={ooui}\n views={views}\n parentViewId={parentViewId}\n treeViewId={views.get(\"tree\")?.view_id}\n />\n ) : (\n <One2manyInput ooui={ooui} views={views} />\n )}\n </Field>\n </One2manyProvider>\n );\n};\n","import React, { useContext, useEffect, useRef, useState } from \"react\";\nimport { Input, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Float as FloatOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport { parseFloatToString, parseStringToFloat } from \"@/helpers/timeHelper\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\nexport const FloatTime = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as FloatOoui;\n\n return (\n <Field required={required} type={\"number\"} {...props}>\n <FloatTimeInput ooui={ooui as FloatOoui} />\n </Field>\n );\n};\n\ninterface FloatTimeInputProps {\n ooui: FloatOoui;\n value?: number;\n onChange?: (value?: number) => void;\n}\n\nexport const FloatTimeInput: React.FC<FloatTimeInputProps> = (\n props: FloatTimeInputProps,\n) => {\n const { ooui, value, onChange } = props;\n const { id, readOnly, required } = ooui as FloatOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const inputTextRef = useRef<string>();\n const [inputText, setInputText] = useState<string>();\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n useEffect(() => {\n setInputText(parseFloatToString(value!));\n }, [value]);\n\n const triggerChange = (changedValue?: number) => {\n onChange?.(changedValue);\n };\n\n function onValueStringChange(e: React.ChangeEvent<HTMLInputElement>) {\n inputTextRef.current = e.target.value;\n setInputText(e.target.value);\n }\n\n async function onElementLostFocus() {\n triggerChange(parseStringToFloat(inputText));\n await new Promise((resolve) => setTimeout(resolve, 300));\n elementHasLostFocus?.();\n }\n\n return (\n <Input\n value={inputText}\n disabled={readOnly}\n className={\"w-full\"}\n style={requiredStyle}\n id={id}\n placeholder={\"00:00\"}\n onChange={onValueStringChange}\n onBlur={onElementLostFocus}\n />\n );\n};\n","import React from \"react\";\nimport { Group as GroupOoui } from \"@gisce/ooui\";\nimport Container from \"./Container\";\nimport { FieldSet } from \"@gisce/react-formiga-components\";\nimport { Space } from \"antd\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\ntype Props = {\n ooui: GroupOoui;\n showLabel?: boolean;\n responsiveBehaviour: boolean;\n};\n\nfunction Group(props: Props): React.ReactElement {\n const { ooui, showLabel = true, responsiveBehaviour } = props;\n const icon: React.ElementType | undefined = iconMapper(ooui.icon || \"\");\n\n return (\n <>\n {(ooui.label || icon) && showLabel ? (\n <FieldSet label={ooui.label} icon={icon}>\n <Container\n container={ooui!.container}\n responsiveBehaviour={responsiveBehaviour}\n />\n </FieldSet>\n ) : (\n <Container\n container={ooui!.container}\n responsiveBehaviour={responsiveBehaviour}\n />\n )}\n </>\n );\n}\n\nexport default Group;\n","import React from \"react\";\nimport { Tabs } from \"antd\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\nimport { Notebook as NotebookOoui, Group as GroupOoui } from \"@gisce/ooui\";\nimport { Group } from \"@/index\";\nconst { TabPane } = Tabs;\n\ntype Props = {\n ooui: NotebookOoui;\n responsiveBehaviour: boolean;\n};\n\nfunction Notebook(props: Props): React.ReactElement {\n const { ooui, responsiveBehaviour } = props;\n const tabs = ooui.pages;\n\n function getPageIcon(icon: string) {\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <Tabs defaultActiveKey=\"1\" tabPosition={ooui.tabPosition}>\n {tabs\n .filter((page: any) => !page.invisible)\n .map((page: any) => {\n return (\n <TabPane\n tab={\n <>\n {getPageIcon(page.icon)} {page.label}\n </>\n }\n key={page.label}\n >\n <Group\n ooui={page as GroupOoui}\n showLabel={false}\n responsiveBehaviour={responsiveBehaviour}\n />\n </TabPane>\n );\n })}\n </Tabs>\n );\n}\n\nexport default Notebook;\n","import React, { CSSProperties, useContext, useState } from \"react\";\nimport { Input, Row, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Text as TextOoui } from \"@gisce/ooui\";\nimport { TranslationModal } from \"../modals/TranslationModal\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { TranslationOutlined } from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport showInfo from \"@/ui/InfoDialog\";\nconst { useToken } = theme;\n\nconst { TextArea } = Input;\n\ntype Props = {\n ooui: TextOoui;\n};\n\nconst Text = (props: Props) => {\n const { ooui } = props;\n const { id, readOnly, required, height, translatable } = ooui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n return (\n <Field required={required} {...props}>\n {translatable ? (\n <TranslatableText\n field={id}\n height={height}\n requiredStyle={requiredStyle}\n />\n ) : (\n <TextArea\n disabled={readOnly || translatable}\n style={{\n minHeight: height ? height + \"px\" : \"100%\",\n ...requiredStyle,\n }}\n rows={4}\n onBlur={elementHasLostFocus}\n />\n )}\n </Field>\n );\n};\n\nconst TranslatableText = ({\n value,\n field,\n requiredStyle,\n onChange,\n height,\n}: {\n value?: string;\n field: string;\n requiredStyle: CSSProperties | undefined;\n height: number | undefined;\n onChange?: (value: string) => void;\n}) => {\n const formContext = useContext(FormContext) as FormContextType;\n const {\n activeId,\n activeModel,\n fetchValues,\n formHasChanges,\n elementHasLostFocus,\n } = formContext || {};\n const [translationModalVisible, setTranslationModalVisible] = useState(false);\n const { t } = useLocale();\n\n if (!activeId) {\n return (\n <>\n <Row gutter={8} wrap={false}>\n <TextArea\n value={value}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n style={{\n height: height ? height + \"px\" : \"100%\",\n ...requiredStyle,\n }}\n id={field}\n rows={4}\n onBlur={elementHasLostFocus}\n />\n </Row>\n <Row justify=\"end\" style={{ paddingTop: 5 }}>\n <ButtonWithTooltip\n tooltip={t(\"translate\")}\n icon={<TranslationOutlined />}\n onClick={async () => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n } else {\n showInfo(t(\"enterTextBeforeTranslate\"));\n }\n }}\n >\n {t(\"translate\")}\n </ButtonWithTooltip>\n </Row>\n </>\n );\n }\n\n return (\n <>\n <div\n onClick={() => {\n if (formHasChanges?.()) {\n showInfo(t(\"saveBeforeTranslate\"));\n return;\n }\n\n if (!translationModalVisible) {\n setTranslationModalVisible(true);\n }\n }}\n >\n <TextArea\n value={value}\n onChange={(event: any) => {\n onChange?.(event.target.value);\n }}\n style={{\n height: height ? height + \"px\" : \"100%\",\n cursor: \"pointer\",\n pointerEvents: \"none\",\n ...requiredStyle,\n }}\n id={field}\n disabled={true}\n rows={4}\n onBlur={elementHasLostFocus}\n />\n </div>\n <TranslationModal\n id={activeId!}\n model={activeModel}\n field={field}\n visible={translationModalVisible}\n onCloseModal={() => {\n setTranslationModalVisible(false);\n }}\n onSubmitSucceed={() => {\n setTranslationModalVisible(false);\n fetchValues?.();\n }}\n />\n </>\n );\n};\n\nexport default Text;\n","import React from \"react\";\nimport { Divider, Space } from \"antd\";\nimport { Separator as SeparatorOoui } from \"@gisce/ooui\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\ntype Props = {\n ooui: SeparatorOoui;\n};\n\nexport const Separator = (props: Props) => {\n const { ooui } = props;\n const { label, icon } = ooui;\n const Icon: React.ElementType | undefined = iconMapper(icon || \"\");\n\n return (\n <Divider orientation=\"left\" className=\"text-sm\">\n {(Icon || label) && (\n <Space>\n {Icon ? <Icon /> : null}\n {label}\n </Space>\n )}\n </Divider>\n );\n};\n","import {\n ExportField,\n ExportOptions,\n PredefinedExport,\n PredefinedExportField,\n useLocale,\n} from \"@gisce/react-formiga-components\";\nimport { useCallback, useRef } from \"react\";\nimport { ConnectionProvider } from \"..\";\nimport showInfo from \"@/ui/InfoDialog\";\nimport { getMimeType, openBase64InNewTab } from \"@/helpers/filesHelper\";\n\nexport const useExport = ({\n model,\n context,\n selectedRegistersToExport,\n domain,\n limit,\n onClose,\n}: {\n model: string;\n context: any;\n selectedRegistersToExport?: any[];\n domain: any[];\n limit?: number;\n onClose: () => void;\n}) => {\n const fields = useRef<any>({});\n const exportModelFields = useRef<Map<string, any>>(new Map<string, any>());\n const { t } = useLocale();\n\n const onExport = useCallback(\n async (options: ExportOptions) => {\n if (\n options.selectedKeys === undefined ||\n options.selectedKeys.length === 0\n ) {\n showInfo(t(\"selectAtLeastOneField\"));\n return;\n }\n\n let exportDomain = domain;\n\n if (\n options.registersAmount === \"selected\" &&\n selectedRegistersToExport?.length !== 0\n ) {\n exportDomain = [\n [\"id\", \"in\", selectedRegistersToExport?.map((r) => r.id)],\n ];\n }\n\n const { datas } = await ConnectionProvider.getHandler().exportData({\n model,\n fields: addIdToRelationFields({\n keys: options.selectedKeys,\n fields: fields.current,\n }),\n domain: exportDomain,\n limit: options.registersAmount === \"all\" ? 0 : limit,\n context,\n format: options.exportType,\n });\n\n onClose();\n\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n const fileType: any = await getMimeType(datas);\n openBase64InNewTab(datas, fileType.mime);\n },\n [domain, selectedRegistersToExport, model, limit, context, onClose, t],\n );\n\n const onGetFields = useCallback(async () => {\n const viewData = await ConnectionProvider.getHandler().getFields({\n model,\n context,\n fields: [],\n });\n fields.current[\"/\"] = viewData;\n return convertToExportFields({ fields: viewData });\n }, [model, context, fields]);\n\n const onGetFieldChilds = useCallback(\n async (key: string) => {\n const fieldDefinition = getFieldDefinition(key, fields.current);\n const optsForField = fieldDefinition[getChildKey(key)];\n const relation = optsForField.relation;\n const viewData = await ConnectionProvider.getHandler().getFields({\n model: relation,\n context,\n fields: [],\n });\n\n // We must iterate over each key of viewData in order to replace the string value\n for (const [key, value] of Object.entries(viewData)) {\n viewData[key].string = getTitle({\n parentTitle: optsForField.string,\n title: (value as any).string,\n });\n }\n\n fields.current[key] = viewData;\n\n return convertToExportFields({\n fields: viewData,\n parentKey: key,\n });\n },\n [context],\n );\n\n const onGetPredefinedExports = useCallback(async () => {\n const predefinedExports = await listPredefinedExports({ model, context });\n\n const keysWithChilds = await retrieveKeyFieldsForPredefinedExports({\n predefinedExports,\n fields: fields.current,\n onGetFieldChilds,\n });\n\n // Then we reformat predefined exports to get the title\n const predefinedExportsAdjusted = predefinedExports.map((pExport) => {\n return {\n ...pExport,\n fields: pExport.fields.map((field: PredefinedExportField) => {\n const childKey = getChildKey(field.key);\n const fieldDefinition = getFieldDefinition(field.key, fields.current);\n const optsForField = fieldDefinition[childKey];\n\n if (!optsForField) {\n return {\n key: field.key,\n };\n }\n\n return {\n key: field.key,\n title: optsForField.string,\n };\n }),\n };\n });\n\n return {\n predefinedExports: predefinedExportsAdjusted,\n keysWithChilds,\n };\n }, [context, model, onGetFieldChilds]);\n\n const onRemovePredefinedExport = useCallback(\n async (pExport: PredefinedExport) => {\n await ConnectionProvider.getHandler().deleteObjects({\n model: \"ir.exports\",\n ids: [pExport.id!],\n context,\n });\n },\n [context],\n );\n\n const getModelFields = useCallback(\n async (model: string) => {\n if (exportModelFields.current.has(model)) {\n return exportModelFields.current.get(model);\n }\n\n const fieldsForModel = ConnectionProvider.getHandler().getFields({\n model,\n context,\n fields: [],\n });\n\n exportModelFields.current.set(model, fieldsForModel);\n },\n [exportModelFields, context],\n );\n\n const onSavePredefinedExport = useCallback(\n async (pExport: PredefinedExport) => {\n const fieldsForExport = await getModelFields(\"ir.exports\");\n const fieldsForExportLine = await getModelFields(\"ir.exports.line\");\n\n // First we must create the parent object\n const exportId = await ConnectionProvider.getHandler().create({\n model: \"ir.exports\",\n values: {\n name: pExport.name,\n resource: model,\n },\n fields: fieldsForExport,\n context,\n });\n\n // We create the lines\n await Promise.all(\n pExport.fields.map(async (field: any) => {\n return await ConnectionProvider.getHandler().create({\n model: \"ir.exports.line\",\n values: {\n name: field.key,\n export_id: exportId,\n },\n fields: fieldsForExportLine,\n context,\n });\n }),\n );\n\n return { ...pExport, id: exportId };\n },\n [context, getModelFields, model],\n );\n\n return {\n onGetFields,\n onGetFieldChilds,\n onExport,\n onGetPredefinedExports,\n onSavePredefinedExport,\n onRemovePredefinedExport,\n };\n};\n\nconst convertToExportFields = ({\n fields,\n parentKey,\n}: {\n fields: any;\n parentKey?: string;\n}) => {\n const exportFields = [];\n\n for (const key of Object.keys(fields)) {\n const valuesForField = fields[key];\n\n if (valuesForField.relation && valuesForField.is_function === true) {\n continue;\n }\n\n const relationField = isRelationField(valuesForField);\n\n exportFields.push({\n key: compoundId({ key, parentKey }),\n title: valuesForField.string,\n tooltip: valuesForField.help,\n required: valuesForField.required,\n isLeaf: !relationField,\n });\n }\n return exportFields;\n};\n\nconst isRelationField = (fieldDefinition: any) => {\n return (\n fieldDefinition.type === \"many2one\" ||\n fieldDefinition.type === \"one2many\" ||\n fieldDefinition.type === \"many2many\"\n );\n};\n\nconst compoundId = ({\n parentKey,\n key,\n}: {\n parentKey?: string;\n key: string;\n}) => {\n return `${parentKey ? parentKey + \"/\" : \"\"}${key}`;\n};\n\nconst getParentKey = (key: string) => {\n if (key.indexOf(\"/\") === -1) {\n return key;\n }\n const items = key.split(\"/\");\n return items.slice(0, -1).join(\"/\");\n};\n\nconst getChildKey = (key: string) => {\n if (key.indexOf(\"/\") === -1) {\n return key;\n }\n const items = key.split(\"/\");\n return items[items.length - 1];\n};\n\nconst getFieldDefinition = (key: string, fields: any) => {\n if (key.indexOf(\"/\") === -1) {\n return fields[\"/\"];\n } else {\n return fields[getParentKey(key)];\n }\n};\n\nconst getTitle = ({\n title,\n parentTitle,\n}: {\n title: string;\n parentTitle?: string;\n}) => {\n return `${parentTitle ? parentTitle + \" → \" : \"\"}${title}`;\n};\n\nconst listPredefinedExports = async ({\n model,\n context,\n}: {\n model: string;\n context: any;\n}) => {\n const pExports = await ConnectionProvider.getHandler().search({\n model: \"ir.exports\",\n params: [[\"resource\", \"=\", model]],\n context,\n });\n\n const exportLinesIds = pExports.flatMap((exp: any) => exp.export_fields);\n\n // Now we must read each id of the export lines\n const exportLinesObjects = await ConnectionProvider.getHandler().readObjects({\n model: \"ir.exports.line\",\n ids: exportLinesIds,\n context,\n });\n\n return pExports.map((pExport) => ({\n id: pExport.id,\n name: pExport.name,\n fields: pExport.export_fields.map((id: number) => {\n const exportLine = exportLinesObjects.find((e: any) => e.id === id);\n return {\n key: exportLine.name,\n };\n }),\n }));\n};\n\nconst getKeysWithoutChildsInFields = ({\n fields,\n keys,\n}: {\n fields: any;\n keys: string[];\n}) => {\n return splitAndSortKeys([\n ...new Set(\n keys\n .filter((key) => {\n if (key.indexOf(\"/\") === -1) {\n return !fields[\"/\"]?.[key];\n } else {\n return !fields?.[getParentKey(key)]?.[key];\n }\n })\n .map((key) => getParentKey(key)),\n ),\n ]);\n};\n\nconst retrieveKeyFieldsForPredefinedExports = async ({\n predefinedExports,\n fields,\n onGetFieldChilds,\n}: {\n predefinedExports: PredefinedExport[];\n fields: any;\n onGetFieldChilds: (key: string) => Promise<ExportField[]>;\n}) => {\n const allPredefinedExportKeys = predefinedExports.flatMap(\n (exp: PredefinedExport) => exp.fields.map((field: any) => field.key),\n );\n\n const keysWithoutChildsInFields = getKeysWithoutChildsInFields({\n fields,\n keys: allPredefinedExportKeys,\n });\n\n const keysWithChilds = [];\n\n // We must load the fields info for each key if not loaded yet in fields and store them in an array to pass them to the formiga component\n for (const key of keysWithoutChildsInFields) {\n try {\n const childs = await onGetFieldChilds(key);\n keysWithChilds.push({ key, childs });\n } catch (err) {\n console.warn(\n `Export field ${key} has raised an error - has been migrated? does the field exist?`,\n );\n }\n }\n\n return keysWithChilds;\n};\n\nconst addIdToRelationFields = ({\n keys,\n fields,\n}: {\n keys: string[];\n fields: any;\n}) =>\n keys.map((key) => {\n const childKey = getChildKey(key);\n const fieldDefinition = getFieldDefinition(key, fields);\n const optsForField = fieldDefinition[childKey];\n const relationField = isRelationField(optsForField);\n return relationField ? `${key}/id` : key;\n });\n\nconst splitAndSortKeys = (keys: string[]): string[] => {\n // We must split the keys that have more than one level (character / ocurrences in the string > 1)\n // Into an array of keys with only one level\n // For example: \"partner_id/country_id/name\" => [\"partner_id\", \"partner_id/country_id\", \"partner_id/country_id/name\"]\n // We must do this because we must load the fields info for each key if not loaded yet in fields\n // And we must load the fields info for the parent key first\n //\n // We must also sort the keys by the number of levels they have\n // For example: [\"partner_id\", \"partner_id/country_id\", \"partner_id/country_id/name\"]\n\n const keysMap: Map<string, boolean> = new Map();\n const result: string[] = [];\n\n // Split keys with more than one level\n for (const key of keys) {\n const subKeys = key.split(\"/\");\n let parentKey = \"\";\n for (const subKey of subKeys) {\n const currentKey = parentKey ? `${parentKey}/${subKey}` : subKey;\n if (!keysMap.has(currentKey)) {\n result.push(currentKey);\n keysMap.set(currentKey, true);\n }\n parentKey = currentKey;\n }\n }\n\n // Sort keys by number of levels\n result.sort((a, b) => {\n const aLevels = a.split(\"/\").length;\n const bLevels = b.split(\"/\").length;\n return aLevels - bLevels;\n });\n\n return result;\n};\n","import { ExportModal as ExportModalFmg } from \"@gisce/react-formiga-components\";\nimport { useExport } from \"@/hooks/useExport\";\n\nexport type ExportModalProps = {\n visible: boolean;\n onClose: () => void;\n selectedRegistersToExport?: any[];\n totalRegisters: number;\n model: string;\n domain: any[];\n limit?: number;\n context?: any;\n visibleRegisters: number;\n};\n\nexport const ExportModal = (props: ExportModalProps) => {\n const {\n visible,\n onClose,\n model,\n context,\n selectedRegistersToExport,\n totalRegisters,\n domain,\n limit,\n visibleRegisters,\n } = props;\n\n const {\n onExport,\n onGetFieldChilds,\n onGetFields,\n onGetPredefinedExports,\n onSavePredefinedExport,\n onRemovePredefinedExport,\n } = useExport({\n model,\n context,\n domain,\n limit,\n selectedRegistersToExport,\n onClose,\n });\n\n return (\n <ExportModalFmg\n visible={visible}\n onSucceed={onExport}\n onCancel={onClose}\n selectedRegistersToExport={\n selectedRegistersToExport &&\n selectedRegistersToExport.length &&\n selectedRegistersToExport.length > 0\n ? selectedRegistersToExport.length\n : undefined\n }\n totalRegisters={totalRegisters}\n onGetFieldChilds={onGetFieldChilds}\n onGetFields={onGetFields}\n visibleRegisters={visibleRegisters}\n onGetPredefinedExports={onGetPredefinedExports}\n onSavePredefinedExport={onSavePredefinedExport}\n onRemovePredefinedExport={onRemovePredefinedExport}\n />\n );\n};\n","import DatePicker from \"@/common/DatePicker\";\n\nimport React from \"react\";\nimport { WidgetProps } from \"@/types\";\n\nconst Date = (props: WidgetProps) => {\n const { ooui } = props;\n\n return <DatePicker ooui={ooui} />;\n};\n\nexport default Date;\n","import DatePicker from \"@/common/DatePicker\";\n\nimport React from \"react\";\nimport { WidgetProps } from \"@/types\";\n\nconst DateTime = (props: WidgetProps) => {\n const { ooui } = props;\n\n return <DatePicker ooui={ooui} showTime />;\n};\n\nexport default DateTime;\n","import Field from \"@/common/Field\";\nimport { Time as TimeOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\nimport dayjs from \"@/helpers/dayjs\";\nimport { Dayjs } from \"dayjs\";\nimport { TimePicker } from \"../../common/TimePicker\";\n\nconst Time = (props: WidgetProps) => {\n const { ooui } = props;\n\n return (\n <Field {...props}>\n <TimeInput ooui={ooui as TimeOoui} />\n </Field>\n );\n};\n\ntype TimeInputProps = {\n ooui: TimeOoui;\n value?: string;\n onChange?: (value?: string) => void;\n};\n\nexport const TimeInput = (props: TimeInputProps) => {\n const onChange = (time: Dayjs | null, timestring?: string) => {\n if (props.onChange) {\n props.onChange(timestring);\n }\n };\n\n return (\n <TimePicker\n onChange={onChange}\n numberOfSelectsToHide={3} // Since it has hours, minutes, and seconds\n value={props.value ? dayjs(props.value, \"HH:mm:ss\") : undefined}\n />\n );\n};\n\nexport default Time;\n","import React, { useEffect, useState } from \"react\";\nimport { Row, Col } from \"antd\";\nimport {\n Reference as ReferenceOoui,\n Selection as SelectionOoui,\n Many2one as Many2oneOoui,\n} from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { Many2oneInput } from \"./many2one/Many2one\";\nimport { SelectionInput } from \"./Selection\";\n\ntype Props = {\n ooui: ReferenceOoui;\n onOpenDetailClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n onSearchClick?:\n | ((event: React.MouseEvent<HTMLElement, MouseEvent>) => void)\n | undefined;\n};\n\nexport const Reference = (props: Props) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} {...props}>\n <ReferenceInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface ReferenceInputProps {\n ooui: ReferenceOoui;\n value?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport const ReferenceInput: React.FC<ReferenceInputProps> = (\n props: ReferenceInputProps,\n) => {\n const { value, onChange, ooui } = props;\n const { required, selectionValues, readOnly, domain } = ooui;\n\n const splittedValue = value?.split(\",\");\n\n const [many2oneValue, setMany2oneValue] = useState<any[]>([]);\n const [selectionValue, setSelectionValue] = useState<string>();\n\n useEffect(() => {\n if (!value) {\n setSelectionValue(undefined);\n setMany2oneValue([]);\n return;\n }\n\n const model = value && splittedValue && splittedValue[0];\n const id =\n value && splittedValue && splittedValue[1] && parseInt(splittedValue[1]);\n setMany2oneValue([id, undefined]);\n setSelectionValue(model!);\n }, [value]);\n\n return (\n <Row gutter={8} wrap={false}>\n <Col flex=\"1\">\n <SelectionInput\n ooui={\n new SelectionOoui({\n name: \"model_selection\",\n selection: selectionValues,\n readonly: readOnly,\n required,\n })\n }\n onChange={(changedValue: string) => {\n setSelectionValue(changedValue);\n let m2oValue = many2oneValue[0] || 0;\n if (changedValue !== selectionValue) {\n setMany2oneValue([]);\n m2oValue = 0;\n }\n const referenceValue = `${changedValue},${m2oValue}`;\n if (referenceValue === value) {\n return;\n }\n onChange?.(referenceValue);\n }}\n value={selectionValue}\n />\n </Col>\n <Col flex=\"3\">\n <Many2oneInput\n ooui={\n new Many2oneOoui({\n name: \"object_value\",\n relation: selectionValue,\n readonly: readOnly,\n required,\n domain,\n })\n }\n value={many2oneValue}\n onChange={(changedValue: any[]) => {\n setMany2oneValue(changedValue);\n const referenceValue = `${selectionValue},${changedValue[0] || 0}`;\n if (referenceValue === value) {\n return;\n }\n onChange?.(referenceValue);\n }}\n />\n </Col>\n </Row>\n );\n};\n","import React, { useRef, useContext } from \"react\";\nimport { Row, Col, Button, Input, Space, theme } from \"antd\";\nimport Field from \"@/common/Field\";\nimport { Binary as BinaryOoui } from \"@gisce/ooui\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport {\n FolderOpenOutlined,\n DownloadOutlined,\n ClearOutlined,\n EyeOutlined,\n} from \"@ant-design/icons\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nimport {\n getFilesize,\n getMimeType,\n openBase64InNewTab,\n toBase64,\n} from \"@/helpers/filesHelper\";\nconst { useToken } = theme;\n\ntype Props = {\n ooui: BinaryOoui;\n};\n\nexport const Binary = (props: Props) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} {...props}>\n <BinaryInput ooui={ooui} />\n </Field>\n );\n};\n\ninterface BinaryInputProps {\n ooui: BinaryOoui;\n value?: string;\n onChange?: (value: string | undefined) => void;\n}\n\nexport const BinaryInput = (props: BinaryInputProps) => {\n const { ooui, value, onChange } = props;\n const { readOnly, required, filenameField } = ooui as BinaryOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const inputFile = useRef(null);\n const { setFieldValue, getFieldValue } =\n (useContext(FormContext) as FormContextType) || {};\n const { t } = useLocale();\n\n const filesize = value ? getFilesize(value) : \"\";\n\n const triggerChange = (changedValue?: string) => {\n onChange?.(changedValue);\n };\n\n async function downloadFile() {\n const fileType = await getMimeType(value!);\n const linkSource = `data:${fileType?.mime};base64,${value}`;\n const downloadLink = document.createElement(\"a\");\n const fileName = getFieldValue(filenameField);\n const name = getFieldValue(\"name\");\n\n downloadLink.href = linkSource;\n downloadLink.download = fileName || name;\n downloadLink.click();\n }\n\n async function openFile() {\n const fileType: any = await getMimeType(value!);\n openBase64InNewTab(value!, fileType.mime);\n }\n\n async function onChangeFile(event: any) {\n event.stopPropagation();\n event.preventDefault();\n const file = event.target.files[0];\n const b64: string = await toBase64(file);\n triggerChange(b64);\n\n if (filenameField) {\n setFieldValue(filenameField, file.name);\n }\n }\n\n function clearFile() {\n setFieldValue(filenameField, undefined);\n triggerChange(undefined);\n }\n\n return (\n <Row gutter={8}>\n <Col style={{ paddingBottom: 5 }}>\n <input\n type=\"file\"\n id=\"file\"\n ref={inputFile}\n style={{ display: \"none\" }}\n onChange={onChangeFile}\n />\n <Input\n type=\"text\"\n disabled={true}\n style={requiredStyle}\n value={filesize}\n />\n </Col>\n <Col>\n <Space>\n <Button\n icon={<FolderOpenOutlined />}\n disabled={readOnly}\n onClick={() => {\n const fileUploadField = inputFile.current as any;\n fileUploadField.click();\n }}\n >\n Select\n </Button>\n <Button icon={<EyeOutlined />} disabled={!value} onClick={openFile}>\n {t(\"open\")}\n </Button>\n <ButtonWithTooltip\n tooltip={t(\"download\")}\n disabled={!value}\n onClick={downloadFile}\n icon={<DownloadOutlined />}\n />\n <ButtonWithTooltip\n tooltip={t(\"clear\")}\n disabled={readOnly || !value}\n onClick={clearFile}\n icon={<ClearOutlined />}\n />\n </Space>\n </Col>\n </Row>\n );\n};\n","import { useMemo } from \"react\";\nimport { Button } from \"antd\";\nimport {\n DownOutlined,\n TableOutlined,\n FormOutlined,\n AreaChartOutlined,\n CalendarOutlined,\n} from \"@ant-design/icons\";\nimport {\n useLocale,\n Dropdown,\n DropdownMenuItem,\n} from \"@gisce/react-formiga-components\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { View } from \"@/types\";\n\ntype Props = {\n onChangeView: (view: View) => void;\n currentView: View;\n availableViews: View[];\n disabled?: boolean;\n formHasChanges?: boolean;\n previousView?: View;\n};\n\nconst iconsForViewTypes = {\n tree: <TableOutlined />,\n form: <FormOutlined />,\n graph: <AreaChartOutlined />,\n calendar: <CalendarOutlined />,\n};\n\nfunction getIconForView(view?: View) {\n if (!view) {\n return <FormOutlined />;\n }\n\n return (iconsForViewTypes as any)?.[view.type] || <FormOutlined />;\n}\n\nfunction ChangeViewButton(props: Props) {\n const {\n currentView,\n availableViews,\n onChangeView,\n disabled = false,\n formHasChanges = false,\n previousView,\n } = props;\n const { t } = useLocale();\n\n const dropdownData = useMemo(() => {\n return [\n {\n label: t(\"viewAs\"),\n items: availableViews.map((view, idx) => {\n const fallbackTitle =\n view.type.charAt(0).toUpperCase() + view.type.slice(1);\n return {\n id: view.view_id || idx,\n name: view.title || fallbackTitle,\n icon: getIconForView(view),\n selected: currentView.view_id === view.view_id,\n };\n }),\n },\n ];\n }, [availableViews, currentView.view_id, t]);\n\n function tryNavigate(callback: any) {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n callback();\n },\n });\n return;\n }\n\n callback();\n }\n\n function handleMenuClick(item: DropdownMenuItem) {\n tryNavigate(() => {\n const selectedView = availableViews.find(\n (view) => view.view_id === parseInt(item.id as string),\n );\n onChangeView(selectedView!);\n });\n }\n\n return (\n <div style={{ display: \"flex\" }}>\n <ButtonWithTooltip\n tooltip={previousView ? t(\"viewAs\") + \" \" + t(previousView.type) : \"\"}\n icon={getIconForView(previousView)}\n style={{\n width: 50,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n }}\n onClick={() => {\n handleMenuClick({ id: previousView?.view_id as number });\n }}\n disabled={disabled || availableViews.length === 1}\n />\n <Dropdown\n onRetrieveData={async () => dropdownData}\n onItemClick={handleMenuClick}\n placement=\"bottomRight\"\n disabled={disabled || availableViews.length === 1}\n >\n <Button\n style={{\n width: 25,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n }}\n icon={<DownOutlined style={{ fontSize: \"0.5em\" }} />}\n onClick={(e) => e.preventDefault()}\n ></Button>\n </Dropdown>\n </div>\n );\n}\n\nexport default ChangeViewButton;\n","import React from \"react\";\nimport ButtonWithTooltip from \"@/common/ButtonWithTooltip\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\n\ntype Props = {\n tooltip: string;\n onClick: any;\n icon: any;\n disabled?: boolean;\n label?: string;\n loading?: boolean;\n type?: string;\n};\n\nfunction ActionButton(props: Props) {\n const {\n onClick,\n disabled = false,\n loading = false,\n tooltip,\n icon,\n label,\n type = \"default\",\n } = props;\n const finalIcon = loading ? <LoadingOutlined /> : icon;\n\n return (\n <ButtonWithTooltip\n type={type as any}\n tooltip={tooltip}\n onClick={onClick}\n disabled={disabled}\n >\n {finalIcon}\n {label}\n </ButtonWithTooltip>\n );\n}\n\nexport default ActionButton;\n","import React, { useContext } from \"react\";\nimport { FileAddOutlined } from \"@ant-design/icons\";\nimport ActionButton from \"./ActionButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n disabled?: boolean;\n};\n\nfunction NewButton(props: Props) {\n const { disabled = false } = props;\n\n const { formHasChanges, onNewClicked: onNewClickedProps } = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const { t } = useLocale();\n\n const onNewClicked = () => {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n onNewClickedProps();\n },\n });\n return;\n }\n\n onNewClickedProps();\n };\n\n return (\n <ActionButton\n icon={<FileAddOutlined />}\n tooltip={t(\"new\")}\n onClick={onNewClicked}\n disabled={disabled}\n />\n );\n}\nexport default NewButton;\n","import { Modal } from \"antd\";\nimport { ExclamationCircleOutlined } from \"@ant-design/icons\";\n\nconst { confirm } = Modal;\n\nconst showDialog = ({\n onOk,\n onCancel,\n t,\n}: {\n onOk: () => void;\n onCancel?: () => void;\n t: (key: string) => string;\n}) => {\n confirm({\n title: t(\"unsavedChanges\"),\n icon: <ExclamationCircleOutlined />,\n centered: true,\n content: t(\"confirmRefreshWithoutSave\"),\n okText: t(\"discardAndRefresh\"),\n cancelText: t(\"cancel\"),\n onOk,\n onCancel,\n });\n};\n\nexport default showDialog;\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport React from \"react\";\nimport showInfo from \"@/ui/InfoDialog\";\n\nasync function showLogInfo(\n model: string,\n currentId: number,\n translateFn: Function,\n) {\n const logInfo = (\n (await ConnectionProvider.getHandler().getLogInfo({\n model,\n ids: [currentId],\n })) as any\n )[0];\n\n const { create_date, create_uid, id, write_date, write_uid } = logInfo;\n\n showInfo(\n <div>\n {\"ID: \" + id} <br />\n {translateFn(\"createdBy\") + \": \" + create_uid[1]} <br />\n {translateFn(\"creationDate\") + \": \" + create_date} <br />\n {translateFn(\"lastUpdatedBy\") + \": \" + write_uid[1]} <br />\n {translateFn(\"lastUpdatedDate\") + \": \" + write_date}\n </div>,\n );\n}\n\nexport { showLogInfo };\n","import { useRef } from \"react\";\nimport {\n DownOutlined,\n FormOutlined,\n DownloadOutlined,\n LinkOutlined,\n FileAddOutlined,\n TableOutlined,\n} from \"@ant-design/icons\";\nimport { Button, Row, Col, Tooltip } from \"antd\";\nimport {\n Dropdown,\n DropdownRef,\n useLocale,\n} from \"@gisce/react-formiga-components\";\n\nexport type Attachment = {\n id: number;\n name: string;\n datas: string;\n link: string;\n};\n\nexport type AttachmentsButtonWrapperProps = {\n attachments: Attachment[] | undefined;\n numberOfAttachments: number;\n disabled: boolean;\n loading: boolean;\n onAddNewAttachment: () => void;\n onListAllAttachments: () => void;\n onOpenAttachmentLink: (attachment: Attachment) => void;\n onOpenAttachmentDetail: (attachment: Attachment) => void;\n};\n\nexport const AttachmentsButtonWrapper = (\n props: AttachmentsButtonWrapperProps,\n) => {\n const {\n numberOfAttachments,\n attachments = [],\n disabled,\n onAddNewAttachment,\n onOpenAttachmentLink,\n onOpenAttachmentDetail,\n onListAllAttachments,\n } = props;\n const { t } = useLocale();\n const dropdownRef = useRef<DropdownRef>(null);\n\n const button = (\n <Button>\n <LinkOutlined />\n {`(${numberOfAttachments})`}\n <DownOutlined style={{ fontSize: 12 }} />\n </Button>\n );\n\n return (\n <Dropdown\n ref={dropdownRef}\n onRetrieveData={async () => [\n {\n items: attachments.map((attachment) => {\n const Icon = attachment.link ? LinkOutlined : DownloadOutlined;\n const right = (\n <Row wrap={false} align=\"middle\" key={attachment.id} gutter={8}>\n <Col style={{ textAlign: \"center\" }}>\n {((attachment as any).datas_fname || attachment.link) && (\n <Tooltip\n title={\n attachment.link\n ? t(\"openAttachmentLink\")\n : t(\"download\")\n }\n >\n <Icon\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n dropdownRef.current?.close();\n onOpenAttachmentLink(attachment);\n }}\n />\n </Tooltip>\n )}\n </Col>\n <Col style={{ textAlign: \"center\" }}>\n <Tooltip title={t(\"openAttachment\")}>\n <FormOutlined\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n dropdownRef.current?.close();\n onOpenAttachmentDetail(attachment);\n }}\n />\n </Tooltip>\n </Col>\n </Row>\n );\n\n return {\n id: attachment.id as number,\n name: attachment.name,\n disableClick: true,\n right,\n };\n }),\n },\n ]}\n placement=\"bottomRight\"\n disabled={disabled}\n header={\n <div style={{ padding: 5 }}>\n <a\n style={{ display: \"block\", paddingBottom: 5 }}\n href=\"#\"\n onClick={() => {\n dropdownRef.current?.close();\n onListAllAttachments();\n }}\n >\n <TableOutlined /> {t(\"listAllAttachments\")}\n </a>\n <a\n style={{ display: \"block\" }}\n href=\"#\"\n onClick={() => {\n dropdownRef.current?.close();\n onAddNewAttachment();\n }}\n >\n <FileAddOutlined /> {t(\"addNewAttachment\")}\n </a>\n </div>\n }\n >\n {button}\n </Dropdown>\n );\n};\n","import { useCallback, useContext, useEffect, useState } from \"react\";\nimport { getMimeType, openBase64InNewTab } from \"@/helpers/filesHelper\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport {\n Attachment,\n AttachmentsButtonWrapper,\n} from \"./AttachmentsButtonWrapper\";\nimport { Modal, Spin } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nexport type AttachmentsButtonProps = {\n attachments?: any;\n disabled?: boolean;\n onAddNewAttachment: () => void;\n onListAllAttachments: () => void;\n onViewAttachmentDetails: (attachment: Attachment) => void;\n};\n\nfunction AttachmentsButton(props: AttachmentsButtonProps) {\n const {\n attachments,\n disabled = false,\n onAddNewAttachment,\n onListAllAttachments,\n onViewAttachmentDetails,\n } = props;\n const { formRef } = useContext(ActionViewContext) as ActionViewContextType;\n const [preloading, setPreloading] = useState(false);\n const [preloadedAttachments, setPreloadedAttachments] = useState<\n Attachment[]\n >([]);\n const [downloading, setDownloading] = useState(false);\n const { t } = useLocale();\n\n const preloadAttachments = useCallback(async () => {\n if (!attachments || attachments.length === 0) {\n return;\n }\n setPreloading(true);\n try {\n const results = await ConnectionProvider.getHandler().readObjects({\n model: \"ir.attachment\",\n ids: attachments.map((a: any) => a.id),\n fieldsToRetrieve: [\"name\", \"datas_fname\", \"link\"],\n context: (formRef.current as any).getContext(),\n });\n setPreloadedAttachments(\n results.map((r: any) => ({\n id: r.id,\n name: r.name,\n datas_fname: r.datas_fname,\n link: r.link,\n })),\n );\n } catch (error) {\n showErrorDialog(error as any);\n }\n setPreloading(false);\n }, [attachments, formRef]);\n\n const openAttachmentLink = useCallback(\n async (attachment: any) => {\n if (attachment.link) {\n window.open(attachment.link);\n return;\n }\n\n setDownloading(true);\n\n let retrievedAttachment;\n\n try {\n const results = await ConnectionProvider.getHandler().readObjects({\n model: \"ir.attachment\",\n ids: [attachment.id],\n context: (formRef.current as any).getContext(),\n });\n retrievedAttachment = results[0];\n } catch (error) {\n showErrorDialog(error as any);\n }\n\n setDownloading(false);\n\n if (!retrievedAttachment) {\n return;\n }\n\n if (retrievedAttachment.datas) {\n const fileType: any = await getMimeType(retrievedAttachment.datas);\n openBase64InNewTab(retrievedAttachment.datas, fileType.mime);\n } else {\n onViewAttachmentDetails(retrievedAttachment);\n }\n },\n [formRef, onViewAttachmentDetails],\n );\n\n const openAttachmentDetail = useCallback(\n async (attachment: any) => {\n onViewAttachmentDetails(attachment);\n },\n [onViewAttachmentDetails],\n );\n\n useEffect(() => {\n preloadAttachments();\n }, [preloadAttachments]);\n\n return (\n <>\n <AttachmentsButtonWrapper\n numberOfAttachments={attachments.length}\n attachments={preloadedAttachments}\n disabled={disabled}\n loading={preloading}\n onAddNewAttachment={onAddNewAttachment}\n onListAllAttachments={onListAllAttachments}\n onOpenAttachmentLink={openAttachmentLink}\n onOpenAttachmentDetail={openAttachmentDetail}\n />\n <Modal\n title={t(\"downloadingAttachment\")}\n open={downloading}\n footer={null}\n closable={false}\n centered\n maskClosable={false}\n >\n <Spin />\n </Modal>\n </>\n );\n}\n\nexport default AttachmentsButton;\n","import { useContext } from \"react\";\nimport { Space, Spin } from \"antd\";\nimport {\n SaveOutlined,\n RightOutlined,\n LeftOutlined,\n DeleteOutlined,\n ThunderboltOutlined,\n PrinterOutlined,\n EnterOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n} from \"@ant-design/icons\";\nimport ChangeViewButton from \"./ChangeViewButton\";\nimport ActionButton from \"./ActionButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport NewButton from \"./NewButton\";\nimport showUnsavedChangesDialog from \"@/ui/UnsavedChangesDialog\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport { showErrorDialog } from \"@/ui/GenericErrorDialog\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport refreshChangesDialog from \"@/ui/RefreshItemDialog\";\nimport { showLogInfo } from \"@/helpers/logInfoHelper\";\nimport { DropdownButton, useLocale } from \"@gisce/react-formiga-components\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\n\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport AttachmentsButton from \"./AttachmentsButton\";\nimport { Attachment } from \"./AttachmentsButtonWrapper\";\n\nfunction FormActionBar({ toolbar }: { toolbar: any }) {\n const {\n availableViews,\n currentView,\n setCurrentView,\n onFormSave,\n formHasChanges,\n formIsSaving,\n currentId,\n results,\n setCurrentItemIndex,\n currentItemIndex,\n setCurrentId,\n currentModel,\n setRemovingItem,\n removingItem,\n duplicatingItem,\n setDuplicatingItem,\n setResults,\n formIsLoading,\n attachments,\n formRef,\n setFormHasChanges,\n previousView,\n setPreviousView,\n goToResourceId,\n } = useContext(ActionViewContext) as ActionViewContextType;\n const { t } = useLocale();\n\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openRelate, openDefaultActionForModel } = tabManagerContext || {};\n\n function tryRefresh(callback: any) {\n if (formHasChanges) {\n refreshChangesDialog({\n t,\n onOk: () => {\n callback();\n },\n });\n return;\n }\n\n callback();\n }\n\n function tryNavigate(callback: any) {\n if (formHasChanges) {\n showUnsavedChangesDialog({\n t,\n onOk: () => {\n callback();\n },\n });\n return;\n }\n\n callback();\n }\n\n function onNextClick() {\n if (results && results.length > currentItemIndex! + 1) {\n setCurrentItemIndex?.(currentItemIndex! + 1);\n setCurrentId?.(results[currentItemIndex! + 1].id);\n } else if (results && currentItemIndex! + 1 === results.length) {\n setCurrentItemIndex?.(0);\n setCurrentId?.(results[0].id);\n }\n }\n\n function onPreviousClick() {\n if (results && currentItemIndex! > 0) {\n setCurrentItemIndex?.(currentItemIndex! - 1);\n setCurrentId?.(results[currentItemIndex! - 1].id);\n } else if (results && currentItemIndex === 0) {\n setCurrentItemIndex?.(results.length - 1);\n setCurrentId?.(results[results.length - 1].id);\n }\n }\n\n function tryDelete() {\n showConfirmDialog({\n confirmMessage: t(\"confirmRemoveItem\"),\n t,\n onOk: () => {\n remove();\n },\n });\n }\n\n async function remove() {\n try {\n setRemovingItem?.(true);\n\n await ConnectionProvider.getHandler().deleteObjects({\n model: currentModel!,\n ids: [currentId!],\n context: (formRef.current as any).getContext(),\n });\n\n const filteredResults = results?.filter((item: any) => {\n return item.id !== currentId;\n });\n setResults?.(filteredResults!);\n\n let newIndex = 0;\n\n if (currentItemIndex! > 0 && currentItemIndex! <= results!.length - 1) {\n newIndex = currentItemIndex! - 1;\n }\n\n if (!filteredResults?.[newIndex]) {\n setCurrentId?.(undefined);\n setCurrentItemIndex?.(undefined);\n } else {\n setCurrentId?.(filteredResults?.[newIndex].id);\n setCurrentItemIndex?.(newIndex);\n }\n } catch (e) {\n showErrorDialog(JSON.stringify(e));\n } finally {\n setRemovingItem?.(false);\n }\n }\n\n async function duplicate() {\n try {\n setDuplicatingItem?.(true);\n\n const newId = await ConnectionProvider.getHandler().duplicate({\n id: currentId!,\n model: currentModel!,\n context: (formRef.current as any).getContext(),\n });\n\n if (newId) {\n await goToResourceId?.([newId]);\n }\n } catch (e) {\n showErrorDialog(JSON.stringify(e));\n } finally {\n setDuplicatingItem?.(false);\n }\n }\n\n const mustDisableButtons =\n formIsSaving || removingItem || formIsLoading || duplicatingItem;\n\n function runAction(actionData: any) {\n processAction?.({\n actionData,\n values: (formRef.current as any).getValues(),\n fields: (formRef.current as any).getFields(),\n context: (formRef.current as any).getContext(),\n onRefreshParentValues: () => {\n (formRef.current as any).fetchValues();\n },\n });\n }\n\n if (!currentView) {\n return null;\n }\n\n return (\n <Space wrap={true}>\n {formIsLoading && (\n <>\n <Spin />\n {separator()}\n {separator()}\n </>\n )}\n <NewButton\n disabled={\n formIsSaving || formIsLoading || removingItem || duplicatingItem\n }\n />\n <ActionButton\n icon={<SaveOutlined />}\n tooltip={t(\"save\")}\n disabled={!formHasChanges || mustDisableButtons}\n loading={formIsSaving}\n onClick={onFormSave}\n />\n <ActionButton\n icon={<CopyOutlined />}\n tooltip={t(\"duplicate\")}\n disabled={\n formHasChanges ||\n formIsSaving ||\n currentId === undefined ||\n duplicatingItem ||\n formIsLoading\n }\n loading={duplicatingItem}\n onClick={duplicate}\n />\n <ActionButton\n icon={<DeleteOutlined />}\n tooltip={t(\"delete\")}\n disabled={\n formIsSaving ||\n currentId === undefined ||\n removingItem ||\n duplicatingItem ||\n formIsLoading\n }\n loading={removingItem}\n onClick={tryDelete}\n />\n {separator()}\n <ActionButton\n icon={<InfoCircleOutlined />}\n tooltip={t(\"showLogs\")}\n disabled={\n formIsSaving ||\n currentId === undefined ||\n removingItem ||\n duplicatingItem ||\n formIsLoading\n }\n loading={false}\n onClick={() => {\n showLogInfo(currentModel!, currentId!, t);\n }}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={\n formIsSaving ||\n currentId === undefined ||\n removingItem ||\n duplicatingItem ||\n formIsLoading\n }\n loading={false}\n onClick={() => {\n tryRefresh(() => {\n (formRef.current as any).fetchValues();\n });\n }}\n />\n {separator()}\n <ChangeViewButton\n currentView={currentView}\n previousView={previousView}\n availableViews={availableViews}\n onChangeView={(view: any) => {\n setPreviousView?.(currentView);\n setFormHasChanges?.(false);\n setCurrentView?.(view);\n }}\n disabled={mustDisableButtons}\n formHasChanges={formHasChanges}\n />\n {separator()}\n <Space>\n <ActionButton\n icon={<LeftOutlined />}\n tooltip={t(\"previous\")}\n disabled={mustDisableButtons}\n loading={false}\n onClick={() => {\n tryNavigate(onPreviousClick);\n }}\n />\n <ActionButton\n icon={<RightOutlined />}\n tooltip={t(\"next\")}\n disabled={mustDisableButtons}\n loading={false}\n onClick={() => {\n tryNavigate(onNextClick);\n }}\n />\n </Space>\n {separator()}\n <DropdownButton\n icon={<ThunderboltOutlined />}\n placement=\"bottomRight\"\n disabled={mustDisableButtons}\n onRetrieveData={async () => [\n { label: t(\"actions\"), items: toolbar?.action },\n ]}\n onItemClick={async (action: any) => {\n if (!action) {\n return;\n }\n\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n runAction(action);\n }}\n />\n <DropdownButton\n icon={<PrinterOutlined />}\n disabled={mustDisableButtons}\n placement=\"bottomRight\"\n onRetrieveData={async () => [\n { label: t(\"reports\"), items: toolbar?.print },\n ]}\n onItemClick={async (report: any) => {\n if (!report) {\n return;\n }\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n runAction({\n ...report,\n datas: {\n ...(report.datas || {}),\n ids: [result.currentId as number],\n },\n });\n }}\n />\n <DropdownButton\n icon={<EnterOutlined />}\n disabled={mustDisableButtons}\n placement=\"bottomRight\"\n onRetrieveData={async () => [\n { label: t(\"related\"), items: toolbar?.relate },\n ]}\n onItemClick={async (relate: any) => {\n if (!relate) {\n return;\n }\n\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n openRelate({\n relateData: relate,\n values: (formRef.current as any).getValues(),\n fields: (formRef.current as any).getFields(),\n action_id: relate.id,\n action_type: relate.type,\n });\n }}\n />\n <AttachmentsButton\n disabled={mustDisableButtons}\n attachments={attachments}\n onAddNewAttachment={async () => {\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n const res_id = result.currentId as number;\n const res_model = currentModel as string;\n openDefaultActionForModel({\n ...getAttachmentActionPayload(res_model, res_id),\n initialViewType: \"form\",\n });\n }}\n onListAllAttachments={async () => {\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n const res_id = result.currentId as number;\n const res_model = currentModel as string;\n openDefaultActionForModel({\n ...getAttachmentActionPayload(res_model, res_id),\n initialViewType: \"tree\",\n });\n }}\n onViewAttachmentDetails={async (attachment: Attachment) => {\n const result = await saveDocument({\n onFormSave,\n });\n\n if (!result.succeed) {\n return;\n }\n\n openDefaultActionForModel({\n model: \"ir.attachment\",\n res_id: attachment.id,\n initialViewType: \"form\",\n });\n }}\n />\n </Space>\n );\n}\n\nfunction separator() {\n return <div className=\"inline-block w-2\" />;\n}\n\nasync function saveDocument({\n onFormSave,\n}: {\n onFormSave?: () => Promise<{ succeed: boolean; id: number }>;\n}): Promise<{ succeed: boolean; currentId?: number }> {\n const result = await onFormSave?.();\n if (result?.succeed) {\n return { succeed: true, currentId: result.id };\n } else {\n return { succeed: false, currentId: undefined };\n }\n}\n\nfunction getAttachmentActionPayload(res_model: string, res_id: number) {\n return {\n model: \"ir.attachment\",\n domain: [\n [\"res_model\", \"=\", `${res_model}`],\n [\"res_id\", \"=\", `${res_id}`],\n ],\n values: {\n selection_associated_object: `${res_model},${res_id}`,\n },\n forced_values: {\n res_model,\n res_id,\n },\n };\n}\nexport default FormActionBar;\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { Input, Button, Row, Col, theme } from \"antd\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\nimport { EditOutlined, CheckOutlined } from \"@ant-design/icons\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nconst { useToken } = theme;\n\ninterface LinkInputProps {\n ooui: CharOoui;\n value?: string;\n onChange?: (value: string) => void;\n valueValidator: (value?: string) => boolean;\n linkPrefix?: string;\n}\n\nexport const LinkInput = (props: LinkInputProps) => {\n const { ooui, value, onChange, valueValidator, linkPrefix = \"\" } = props;\n const { id, readOnly, required } = ooui as CharOoui;\n const { token } = useToken();\n const requiredStyle =\n required && !readOnly\n ? { backgroundColor: token.colorPrimaryBg }\n : undefined;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n const [editMode, setEditMode] = useState(false);\n const [showInput, setShowInput] = useState(false);\n\n useEffect(() => {\n if (readOnly && !editMode) {\n setShowInput(false);\n }\n\n if (!value && !readOnly) {\n setEditMode(true);\n setShowInput(true);\n }\n }, [editMode, readOnly]);\n\n const onValueStringChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.value);\n };\n\n return (\n <Row gutter={8} wrap={false} align=\"middle\">\n {!readOnly ? (\n <Col flex=\"none\">\n {editMode ? (\n <Button\n icon={<CheckOutlined />}\n onClick={() => {\n if (valueValidator(value)) {\n setEditMode(false);\n setShowInput(false);\n }\n }}\n style={{ borderTopRightRadius: 0, borderBottomRightRadius: 0 }}\n tabIndex={-1}\n />\n ) : (\n <Button\n icon={<EditOutlined />}\n onClick={() => {\n setEditMode(true);\n setShowInput(true);\n }}\n style={{ borderTopRightRadius: 0, borderBottomRightRadius: 0 }}\n tabIndex={-1}\n />\n )}\n </Col>\n ) : null}\n <Col flex=\"auto\">\n {showInput ? (\n <Input\n style={{\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n ...requiredStyle,\n }}\n id={id}\n onChange={onValueStringChange}\n value={value}\n onBlur={() => {\n if (valueValidator(value)) {\n setEditMode(false);\n setShowInput(false);\n elementHasLostFocus?.();\n }\n }}\n />\n ) : (\n <a\n href={`${linkPrefix}${value}`}\n style={{ color: token.colorPrimary, paddingRight: 15 }}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {value}\n </a>\n )}\n </Col>\n </Row>\n );\n};\n","import React from \"react\";\nimport isURL from \"validator/lib/isURL\";\nimport Field from \"@/common/Field\";\n\nimport { WidgetProps } from \"@/types\";\nimport { LinkInput } from \"./LinkInput\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\n\nexport const Url = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as CharOoui;\n\n return (\n <Field required={required} {...props}>\n <LinkInput\n ooui={ooui as CharOoui}\n valueValidator={(value) => {\n if (!value) {\n return false;\n }\n return isURL(value);\n }}\n />\n </Field>\n );\n};\n","import React from \"react\";\nimport isEmail from \"validator/lib/isEmail\";\nimport Field from \"@/common/Field\";\n\nimport { WidgetProps } from \"@/types\";\nimport { LinkInput } from \"./LinkInput\";\nimport { Char as CharOoui } from \"@gisce/ooui\";\n\nexport const Email = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui as CharOoui;\n\n return (\n <Field required={required} {...props}>\n <LinkInput\n ooui={ooui as CharOoui}\n linkPrefix={\"mailto:\"}\n valueValidator={(value) => {\n if (!value) {\n return false;\n }\n return isEmail(value);\n }}\n />\n </Field>\n );\n};\n","import { useRef } from \"react\";\nimport { Button, Col, Form, Input, Modal, Row, Space } from \"antd\";\nimport { PlusOutlined, EnterOutlined, CloseOutlined } from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\ntype Props = {\n visible: boolean;\n onIdSubmitted: (ids: number[], openInSameTab?: boolean) => void;\n onCancel: () => void;\n isSearching: boolean;\n};\n\nexport const GoToResourceModal = (props: Props) => {\n const { visible, onIdSubmitted, onCancel, isSearching } = props;\n\n const { t } = useLocale();\n const inputRef = useRef<null | HTMLElement>(null);\n const openInSameTab = useRef(false);\n\n function handleSubmit(values: any) {\n const ids = values.id.split(\",\").map((id: string) => parseInt(id.trim()));\n onIdSubmitted(ids, openInSameTab.current);\n openInSameTab.current = false;\n }\n\n return (\n <Modal\n title={t(\"goToResourceId\")}\n centered\n open={visible}\n width={600}\n footer={null}\n destroyOnClose\n onCancel={onCancel}\n maskClosable={false}\n afterOpenChange={(open) => open && inputRef.current?.focus()}\n >\n <Form layout=\"vertical\" onFinish={handleSubmit} autoComplete=\"off\">\n <Form.Item\n name={\"id\"}\n label={t(\"searchId\")}\n rules={[\n {\n required: true,\n },\n ]}\n help={t(\"searchIdHelp\")}\n >\n <Input style={{ width: \"100%\" }} autoFocus ref={inputRef as any} />\n </Form.Item>\n <Row align=\"middle\" justify=\"end\">\n <Col>\n <Space>\n <Button\n icon={<CloseOutlined />}\n htmlType=\"button\"\n onClick={onCancel}\n disabled={isSearching}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n tabIndex={1}\n loading={isSearching}\n style={{ marginLeft: 15 }}\n icon={<PlusOutlined />}\n htmlType=\"submit\"\n disabled={isSearching}\n onClick={() => {\n openInSameTab.current = true;\n }}\n >\n {t(\"openInSameWindow\")}\n </Button>\n <Button\n tabIndex={0}\n loading={isSearching}\n style={{ marginLeft: 15 }}\n icon={<EnterOutlined />}\n htmlType=\"submit\"\n type=\"primary\"\n disabled={isSearching}\n onClick={() => {\n openInSameTab.current = false;\n }}\n >\n {t(\"openInNewTab\")}\n </Button>\n </Space>\n </Col>\n </Row>\n </Form>\n </Modal>\n );\n};\n","import React from \"react\";\nimport ButtonWithTooltip, {\n Props as ButtonWithTooltipProps,\n} from \"@/common/ButtonWithTooltip\";\nimport { theme } from \"antd\";\nconst { useToken } = theme;\n\ntype Props = ButtonWithTooltipProps & {\n badgeNumber?: number;\n};\n\nfunction ButtonWithBadge(props: Props) {\n const { badgeNumber = 0, ...restProps } = props;\n const { token } = useToken();\n\n return (\n <div style={{ position: \"relative\" }}>\n {badgeNumber > 0 && (\n <div style={{ position: \"absolute\", left: -10, top: -10, zIndex: 2 }}>\n <span\n style={{\n display: \"inline-block\",\n minWidth: \"22px\",\n padding: \"2px\",\n borderRadius: \"50%\",\n fontSize: \"12px\",\n textAlign: \"center\",\n background: token.colorPrimaryHover,\n color: token.colorPrimaryBg,\n }}\n >\n {badgeNumber}\n </span>\n </div>\n )}\n <ButtonWithTooltip\n {...restProps}\n style={{ width: 46, zIndex: 0 }}\n ></ButtonWithTooltip>\n </div>\n );\n}\n\nexport default ButtonWithBadge;\n","import React, { useContext } from \"react\";\nimport { Space } from \"antd\";\nimport ChangeViewButton from \"./ChangeViewButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport ActionButton from \"./ActionButton\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport ButtonWithBadge from \"./ButtonWithBadge\";\nimport { ReloadOutlined, FilterOutlined } from \"@ant-design/icons\";\nimport { View } from \"@/types\";\n\nfunction GraphActionBar({ refreshGraph }: { refreshGraph: () => void }) {\n const { t } = useLocale();\n const {\n availableViews,\n currentView,\n setCurrentView,\n searchParams,\n searchVisible,\n setSearchVisible,\n graphIsLoading,\n previousView,\n setPreviousView,\n } = useContext(ActionViewContext) as ActionViewContextType;\n\n return (\n <Space wrap={true}>\n <ButtonWithBadge\n icon={\n <FilterOutlined\n style={{ color: searchVisible ? \"white\" : undefined }}\n />\n }\n tooltip={t(\"advanced_search\")}\n type={searchVisible ? \"primary\" : \"default\"}\n onClick={() => {\n setSearchVisible?.(!searchVisible);\n }}\n disabled={graphIsLoading}\n badgeNumber={searchParams?.length}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={graphIsLoading}\n loading={false}\n onClick={() => {\n refreshGraph();\n }}\n />\n <ChangeViewButton\n currentView={currentView}\n availableViews={availableViews}\n onChangeView={(newView: View) => {\n setPreviousView?.(currentView);\n setCurrentView?.(newView);\n }}\n disabled={false}\n previousView={previousView}\n />\n </Space>\n );\n}\n\nexport default GraphActionBar;\n","import React, { useContext } from \"react\";\nimport { Row, Col, Typography, theme } from \"antd\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { CopyOutlined } from \"@ant-design/icons\";\n\nconst { useToken } = theme;\n\nconst { Title, Text } = Typography;\n\ntype Props = {\n title?: string;\n children?: any;\n};\n\nfunction TitleHeader(props: Props) {\n const { title: titleProps, children } = props;\n const {\n title,\n currentView,\n currentId,\n currentItemIndex,\n results,\n totalItems,\n selectedRowItems,\n } = useContext(ActionViewContext) as ActionViewContextType;\n const { t } = useLocale();\n const { token } = useToken();\n\n function getSummary() {\n if (currentView?.type === \"form\") {\n if (!currentId) {\n return \"\";\n }\n\n if (totalItems === 0) {\n return (\n <>\n {t(\"editingDocument\")} (id:{\" \"}\n <Text\n copyable={{ icon: <CopyOutlined style={{ color: \"red\" }} /> }}\n >\n {currentId}\n </Text>\n )\n </>\n );\n }\n\n return (\n <>\n {t(\"register\")}{\" \"}\n {currentItemIndex === undefined ? 1 : currentItemIndex + 1} /{\" \"}\n {results!.length} {t(\"of\")} {totalItems} - {t(\"editingDocument\")} (id:{\" \"}\n <Text copyable>{currentId}</Text>)\n </>\n );\n } else if (currentView?.type === \"tree\" && selectedRowItems) {\n if (selectedRowItems.length === 1) {\n return (\n <>\n 1 {t(\"selectedRegisters\")} - (id:{\" \"}\n <Text copyable>{selectedRowItems[0].id}</Text>)\n </>\n );\n } else if (selectedRowItems.length > 1) {\n return (\n <>\n {selectedRowItems.length} {t(\"selectedRegisters\")}\n <Text\n copyable={{\n text: selectedRowItems.map((reg) => reg.id).join(\", \"),\n }}\n ></Text>\n </>\n );\n }\n }\n return null;\n }\n return (\n <div\n style={{\n position: \"sticky\",\n top: 80,\n zIndex: 3,\n }}\n >\n <Row\n className=\"shadow-md\"\n style={{\n padding: \"1em\",\n borderRadius: token.borderRadius,\n backgroundColor: token.colorPrimaryBg,\n minHeight: \"82px\",\n }}\n align=\"middle\"\n >\n <Col flex={2}>\n <Title level={3} style={{ marginBottom: 0 }}>\n {titleProps || title}\n </Title>\n {getSummary()}\n </Col>\n <Col flex={3}>\n <Row justify=\"end\">{children}</Row>\n </Col>\n </Row>\n <div className=\"pb-5\" />\n </div>\n );\n}\n\nexport default TitleHeader;\n","import GraphActionBar from \"@/actionbar/GraphActionBar\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport { Graph } from \"@/widgets/views/Graph/Graph\";\nimport React, { useContext, useEffect, useRef, useState } from \"react\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport { FormView, TreeView } from \"@/types\";\nimport { mergeSearchFields } from \"@/helpers/formHelper\";\nimport { useSearch } from \"@/hooks/useSearch\";\nimport SearchFilter from \"@/widgets/views/searchFilter/SearchFilter\";\nimport { Spin } from \"antd\";\nimport { mergeParams } from \"@/helpers/searchHelper\";\n\nexport type GraphActionViewProps = {\n viewData: any;\n visible: boolean;\n model: string;\n context: any;\n domain: any;\n formView: FormView;\n treeView: TreeView;\n};\n\nexport const GraphActionView = (props: GraphActionViewProps) => {\n const { viewData, visible, model, context, domain, formView, treeView } =\n props;\n const graphRef = useRef();\n\n const actionViewContext = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n const {\n setResults: setResultsActionView = undefined,\n setCurrentItemIndex = undefined,\n currentId = undefined,\n results: resultsActionView = undefined,\n setSelectedRowItems = undefined,\n setSearchParams = undefined,\n searchVisible = true,\n setSearchVisible = undefined,\n sorter = undefined,\n setSorter = undefined,\n setTotalItems: setActionViewTotalItems = undefined,\n setSearchTreeNameSearch = undefined,\n setTreeIsLoading = undefined,\n limit,\n setLimit,\n searchParams,\n searchValues,\n setSearchValues,\n currentView,\n } = actionViewContext || {};\n\n const [applyLimit, setApplyLimit] = useState(true);\n\n useEffect(() => {\n (graphRef.current as any)?.refresh();\n }, [searchParams]);\n\n useEffect(() => {\n if (viewData.view_id !== currentView.view_id) {\n setApplyLimit(true);\n }\n }, [currentView]);\n\n const { clear, searchFilterLoading, searchError, offset, tableRefreshing } =\n useSearch({\n model,\n setSearchTreeNameSearch,\n setSelectedRowItems,\n searchParams,\n setSearchValues,\n setSearchParams,\n setSearchVisible,\n setTreeIsLoading,\n context,\n formView: formView!,\n treeView: treeView!,\n sorter,\n setSorter,\n setCurrentItemIndex,\n setResultsActionView,\n resultsActionView,\n domain,\n currentId,\n setActionViewTotalItems,\n limit,\n setLimit,\n });\n\n if (!visible) {\n return null;\n }\n\n if (!viewData) {\n return null;\n }\n\n return (\n <>\n <TitleHeader title={viewData.title || viewData.name}>\n <GraphActionBar\n refreshGraph={() => {\n (graphRef.current as any).refresh();\n }}\n />\n </TitleHeader>\n <SearchFilter\n fields={{ ...treeView.fields, ...formView.fields }}\n searchFields={mergeSearchFields([\n formView.search_fields,\n treeView.search_fields,\n ])}\n limit={limit!}\n onClear={clear}\n offset={offset}\n isSearching={searchFilterLoading}\n onSubmit={(opts: {\n params: any;\n limit: number;\n offset: number;\n searchValues: any;\n }) => {\n setApplyLimit(false);\n setSearchParams?.(opts.params);\n setSearchVisible?.(false);\n }}\n searchError={searchError}\n searchVisible={searchVisible}\n searchValues={searchValues}\n showLimitOptions={false}\n />\n {tableRefreshing ? (\n <Spin />\n ) : (\n <Graph\n ref={graphRef}\n view_id={viewData.view_id}\n model={model}\n context={context}\n domain={mergeParams(searchParams || [], domain)}\n limit={applyLimit ? limit : undefined}\n manualIds={\n applyLimit ? resultsActionView?.map((r) => r.id) : undefined\n }\n />\n )}\n </>\n );\n};\n","import FormActionBar from \"@/actionbar/FormActionBar\";\nimport { FormView } from \"@/types\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport Form from \"@/widgets/views/Form\";\nimport React from \"react\";\n\nexport type FormActionViewProps = {\n formView?: FormView;\n visible: boolean;\n formRef: any;\n model: string;\n currentId?: number;\n domain: any;\n context: any;\n defaultValues?: any;\n forcedValues?: any;\n results: any[];\n setResults: (value: any[]) => void;\n setCurrentItemIndex: (value?: number) => void;\n};\n\nexport const FormActionView = (props: FormActionViewProps) => {\n const {\n visible,\n formRef,\n model,\n currentId,\n domain,\n formView,\n context,\n defaultValues,\n forcedValues,\n results,\n setResults,\n setCurrentItemIndex,\n } = props;\n\n if (!visible) {\n return null;\n }\n\n return (\n <>\n <TitleHeader>\n <FormActionBar toolbar={formView?.toolbar} />\n </TitleHeader>\n <Form\n rootForm={true}\n ref={formRef}\n model={model}\n defaultValues={defaultValues}\n forcedValues={forcedValues}\n formView={formView}\n actionDomain={domain}\n id={currentId}\n parentContext={context}\n onSubmitSucceed={(id, values) => {\n const itemIndex = results!.findIndex((item: any) => {\n return item.id === id;\n });\n if (itemIndex === -1) {\n results!.push(values);\n setResults(results);\n setCurrentItemIndex(results!.length - 1);\n }\n }}\n />\n </>\n );\n};\n","import React, { useContext, useEffect, useState } from \"react\";\nimport { Button, Col, Form, Input, Row, Tooltip } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { CloseCircleFilled } from \"@ant-design/icons\";\n\ntype Props = {\n onSearch: (searchValue?: string) => void;\n searchText?: string;\n disabled?: boolean;\n};\n\nfunction SearchBar(props: Props) {\n const { onSearch, disabled = false, searchText } = props;\n const { t } = useLocale();\n const [form] = Form.useForm();\n const [mustShowClearSuffix, setMustShowClearSuffix] =\n useState<boolean>(false);\n\n function handleSubmit(values: any) {\n onSearch(values.search);\n }\n\n useEffect(() => {\n form.setFieldsValue({ search: searchText });\n }, [searchText]);\n\n function clear() {\n setMustShowClearSuffix(false);\n form.setFieldsValue({ search: undefined });\n onSearch(undefined);\n }\n\n return (\n <Form form={form} onFinish={handleSubmit} autoComplete=\"off\">\n <Row align=\"middle\" justify=\"end\">\n <Col>\n <Form.Item name={\"search\"} noStyle>\n <Input\n autoFocus\n disabled={disabled}\n onChange={(e) => {\n setMustShowClearSuffix(e.target.value.length > 0);\n }}\n style={{ borderTopRightRadius: 0, borderBottomRightRadius: 0 }}\n suffix={\n (mustShowClearSuffix ||\n (searchText && searchText.length > 0)) && (\n <Tooltip title={t(\"clear\")}>\n <CloseCircleFilled\n style={{ color: \"rgba(0,0,0,.45)\" }}\n onClick={clear}\n />\n </Tooltip>\n )\n }\n />\n </Form.Item>\n </Col>\n <Col>\n <Button\n htmlType=\"submit\"\n disabled={disabled}\n style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0 }}\n >\n {t(\"search\")}\n </Button>\n </Col>\n </Row>\n </Form>\n );\n}\n\nexport default SearchBar;\n","import { useContext, useState } from \"react\";\nimport { Space, Spin } from \"antd\";\nimport ChangeViewButton from \"./ChangeViewButton\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\nimport NewButton from \"./NewButton\";\nimport ActionButton from \"./ActionButton\";\nimport Icon, {\n DeleteOutlined,\n PrinterOutlined,\n ThunderboltOutlined,\n CopyOutlined,\n ReloadOutlined,\n InfoCircleOutlined,\n FilterOutlined,\n} from \"@ant-design/icons\";\nimport { useLocale, DropdownButton } from \"@gisce/react-formiga-components\";\nimport showConfirmDialog from \"@/ui/ConfirmDialog\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport {\n ContentRootContext,\n ContentRootContextType,\n} from \"@/context/ContentRootContext\";\nimport ButtonWithBadge from \"./ButtonWithBadge\";\nimport { showLogInfo } from \"@/helpers/logInfoHelper\";\nimport SearchBar from \"./SearchBar\";\nimport { ExportModal } from \"..\";\nimport { mergeParams } from \"@/helpers/searchHelper\";\nimport { useFeatureIsEnabled } from \"@/context/ConfigContext\";\nimport { ErpFeatureKeys } from \"@/models/erpFeature\";\n\ntype Props = {\n parentContext?: any;\n treeExpandable: boolean;\n toolbar: any;\n};\n\nfunction TreeActionBar(props: Props) {\n const {\n availableViews,\n currentView,\n setCurrentView,\n selectedRowItems,\n setRemovingItem,\n removingItem,\n duplicatingItem,\n setDuplicatingItem,\n currentModel,\n searchTreeRef,\n setCurrentId,\n setCurrentItemIndex,\n searchParams,\n searchVisible,\n setSearchVisible,\n setSearchTreeNameSearch,\n searchTreeNameSearch,\n treeIsLoading,\n setPreviousView,\n previousView,\n results,\n limit,\n totalItems,\n } = useContext(ActionViewContext) as ActionViewContextType;\n\n const { parentContext = {}, treeExpandable, toolbar } = props;\n const advancedExportEnabled = useFeatureIsEnabled(\n ErpFeatureKeys.FEATURE_ADVANCED_EXPORT,\n );\n const { t } = useLocale();\n const contentRootContext = useContext(\n ContentRootContext,\n ) as ContentRootContextType;\n const { processAction } = contentRootContext || {};\n const [exportModalVisible, setExportModalVisible] = useState(false);\n\n const hasNameSearch: boolean =\n searchTreeNameSearch !== undefined &&\n searchTreeNameSearch.trim().length > 0;\n\n function tryDelete() {\n showConfirmDialog({\n confirmMessage: t(\"confirmRemove\"),\n t,\n onOk: () => {\n remove();\n },\n });\n }\n\n async function remove() {\n try {\n setRemovingItem?.(true);\n\n await ConnectionProvider.getHandler().deleteObjects({\n model: currentModel!,\n ids: selectedRowItems!.map((item) => item.id),\n context: { ...parentContext },\n });\n\n setCurrentId?.(undefined);\n setCurrentItemIndex?.(undefined);\n\n searchTreeRef?.current?.refreshResults();\n } catch (e) {\n showErrorDialog(e);\n } finally {\n setRemovingItem?.(false);\n }\n }\n\n async function duplicate() {\n try {\n setDuplicatingItem?.(true);\n\n const currentId = selectedRowItems![0].id;\n\n const newId = await ConnectionProvider.getHandler().duplicate({\n id: currentId,\n model: currentModel!,\n context: { ...parentContext },\n });\n\n if (newId) {\n searchTreeRef?.current?.refreshResults();\n }\n } catch (e) {\n showErrorDialog(e);\n } finally {\n setDuplicatingItem?.(false);\n }\n }\n\n function runAction(actionData: any) {\n processAction?.({\n actionData,\n values: {\n active_id: selectedRowItems?.map((item) => item.id)[0],\n active_ids: selectedRowItems?.map((item) => item.id),\n },\n fields: {},\n context: {\n ...parentContext,\n active_id: selectedRowItems?.map((item) => item.id)[0],\n active_ids: selectedRowItems?.map((item) => item.id),\n },\n onRefreshParentValues: () => {\n searchTreeRef?.current?.refreshResults();\n },\n });\n }\n\n return (\n <Space wrap={true}>\n {treeIsLoading && (\n <>\n <Spin />\n {separator()}\n {separator()}\n </>\n )}\n {treeExpandable ? null : (\n <>\n <SearchBar\n disabled={duplicatingItem || removingItem || treeIsLoading}\n searchText={searchTreeNameSearch}\n onSearch={(searchString?: string) => {\n if (searchString && searchString.trim().length > 0) {\n setSearchTreeNameSearch?.(searchString);\n } else {\n setSearchTreeNameSearch?.(undefined);\n }\n }}\n />\n {!treeExpandable && (\n <ButtonWithBadge\n icon={\n <FilterOutlined\n style={{ color: searchVisible ? \"white\" : undefined }}\n />\n }\n tooltip={t(\"advanced_search\")}\n type={searchVisible ? \"primary\" : \"default\"}\n onClick={() => {\n setSearchVisible?.(!searchVisible);\n }}\n disabled={duplicatingItem || removingItem || treeIsLoading}\n badgeNumber={searchParams?.length}\n />\n )}\n {separator()}\n <NewButton disabled={treeIsLoading} />\n <ActionButton\n icon={<CopyOutlined />}\n tooltip={t(\"duplicate\")}\n disabled={\n !selectedRowItems ||\n selectedRowItems?.length !== 1 ||\n duplicatingItem ||\n treeIsLoading\n }\n loading={duplicatingItem}\n onClick={duplicate}\n />\n <ActionButton\n icon={<DeleteOutlined />}\n tooltip={t(\"delete\")}\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) ||\n treeIsLoading\n }\n loading={removingItem}\n onClick={tryDelete}\n />\n {separator()}\n </>\n )}\n <ActionButton\n icon={<InfoCircleOutlined />}\n tooltip={t(\"showLogs\")}\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) || treeIsLoading\n }\n loading={false}\n onClick={() => {\n showLogInfo(currentModel!, selectedRowItems![0].id, t);\n }}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={duplicatingItem || removingItem || treeIsLoading}\n loading={false}\n onClick={() => {\n searchTreeRef?.current?.refreshResults();\n }}\n />\n {!treeExpandable && (\n <>\n {separator()}\n <ChangeViewButton\n currentView={currentView}\n availableViews={availableViews}\n onChangeView={(newView) => {\n setPreviousView?.(currentView);\n setCurrentView?.(newView);\n }}\n previousView={previousView}\n disabled={treeIsLoading}\n />\n </>\n )}\n {separator()}\n <DropdownButton\n icon={<ThunderboltOutlined />}\n placement=\"bottomRight\"\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) || treeIsLoading\n }\n onRetrieveData={async () => [\n { label: t(\"actions\"), items: toolbar?.action },\n ]}\n onItemClick={(action: any) => {\n if (!action) {\n return;\n }\n\n runAction(action);\n }}\n />\n <DropdownButton\n icon={<PrinterOutlined />}\n placement=\"bottomRight\"\n disabled={\n !(selectedRowItems && selectedRowItems?.length > 0) || treeIsLoading\n }\n onRetrieveData={async () => [\n { label: t(\"reports\"), items: toolbar?.print },\n ]}\n onItemClick={(report: any) => {\n if (!report) {\n return;\n }\n\n runAction({\n ...report,\n datas: {\n ...(report.datas || {}),\n ids: selectedRowItems!.map((item) => item.id),\n },\n });\n }}\n />\n {advancedExportEnabled && (\n <>\n {separator()}\n <DropdownButton\n placement=\"bottomRight\"\n icon={\n <Icon\n component={() => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"icon icon-tabler icon-tabler-database-export\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <ellipse cx=\"12\" cy=\"6\" rx=\"8\" ry=\"3\" />\n <path d=\"M4 6v6c0 1.657 3.582 3 8 3a19.84 19.84 0 0 0 3.302 -.267m4.698 -2.733v-6\" />\n <path d=\"M4 12v6c0 1.599 3.335 2.905 7.538 2.995m8.462 -6.995v-2m-6 7h7m-3 -3l3 3l-3 3\" />\n </svg>\n )}\n />\n }\n onRetrieveData={async () => [\n {\n label: t(\"export\"),\n items: [\n {\n id: \"print_screen\",\n name: t(\"printScreen\"),\n },\n {\n id: \"export\",\n name: t(\"advancedExport\"),\n },\n ],\n },\n ]}\n onItemClick={(itemClicked: any) => {\n if (itemClicked.id === \"print_screen\") {\n let idsToExport =\n selectedRowItems?.map((item) => item.id) || [];\n\n if (idsToExport.length === 0) {\n idsToExport = results?.map((item) => item.id) || [];\n }\n\n runAction({\n id: -1,\n model: currentModel,\n report_name: \"printscreen.list\",\n type: \"ir.actions.report.xml\",\n datas: {\n model: currentModel,\n ids: idsToExport,\n },\n });\n return;\n }\n\n setExportModalVisible(true);\n }}\n disabled={\n duplicatingItem || removingItem || treeIsLoading || hasNameSearch\n }\n />\n <ExportModal\n visible={exportModalVisible}\n onClose={() => setExportModalVisible(false)}\n model={currentModel!}\n domain={mergeParams(\n searchTreeRef?.current?.getDomain() || [],\n searchParams || [],\n )}\n limit={limit}\n totalRegisters={totalItems || 0}\n selectedRegistersToExport={selectedRowItems}\n visibleRegisters={results?.length || 0}\n context={parentContext}\n />\n </>\n )}\n </Space>\n );\n}\n\nfunction separator() {\n return <div className=\"inline-block w-2\" />;\n}\n\nexport default TreeActionBar;\n","import TreeActionBar from \"@/actionbar/TreeActionBar\";\nimport { FormView, TreeView, View } from \"@/types\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport SearchTree from \"@/widgets/views/SearchTree\";\nimport React, { useContext } from \"react\";\nimport {\n ActionViewContext,\n ActionViewContextType,\n} from \"@/context/ActionViewContext\";\n\nexport type TreeActionViewProps = {\n formView?: FormView;\n treeView?: TreeView;\n visible: boolean;\n searchTreeRef: any;\n model: string;\n domain: any;\n context: any;\n results: any[];\n setCurrentItemIndex: (value?: number) => void;\n setCurrentId: (id?: number) => void;\n setCurrentView: (view: View) => void;\n availableViews: View[];\n searchTreeNameSearch?: string;\n limit?: number;\n};\n\nexport const TreeActionView = (props: TreeActionViewProps) => {\n const {\n visible,\n searchTreeRef,\n model,\n context,\n formView,\n treeView,\n domain,\n setCurrentItemIndex,\n results,\n setCurrentId,\n setCurrentView,\n availableViews,\n searchTreeNameSearch,\n } = props;\n\n const { currentView, setPreviousView } = useContext(\n ActionViewContext,\n ) as ActionViewContextType;\n\n if (!visible) {\n return null;\n }\n\n return (\n <>\n <TitleHeader>\n <TreeActionBar\n toolbar={treeView?.toolbar}\n parentContext={context}\n treeExpandable={treeView?.isExpandable || false}\n />\n </TitleHeader>\n <SearchTree\n ref={searchTreeRef}\n rootTree={true}\n model={model}\n parentContext={context}\n nameSearch={searchTreeNameSearch}\n formView={formView}\n treeView={treeView}\n domain={domain}\n onRowClicked={(event: any) => {\n const { id } = event;\n setCurrentId(id);\n const itemIndex = results.findIndex((item: any) => {\n return item.id === id;\n });\n setPreviousView?.(currentView);\n setCurrentItemIndex(itemIndex);\n const formView = availableViews.find(\n (v) => v.type === \"form\",\n ) as FormView;\n setCurrentView(formView);\n }}\n />\n </>\n );\n};\n","import { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport React, { useState } from \"react\";\n\nexport type DashboardActionContextType = {\n isLoading: boolean;\n setIsLoading: (value: boolean) => void;\n dashboardRef: any;\n openAction: (action?: ShortcutApi) => void;\n moveItemsEnabled: boolean;\n setMoveItemsEnabled: (value: boolean) => void;\n};\n\nexport const DashboardActionContext =\n React.createContext<DashboardActionContextType | null>(null);\n\ntype DashboardActionProviderProps = {\n children: React.ReactNode;\n dashboardRef: any;\n openAction: (action?: ShortcutApi) => void;\n};\n\nconst DashboardActionProvider = (props: DashboardActionProviderProps): any => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [moveItemsEnabled, setMoveItemsEnabled] = useState<boolean>(false);\n\n const { children, dashboardRef, openAction } = props;\n\n return (\n <DashboardActionContext.Provider\n value={{\n isLoading,\n setIsLoading,\n dashboardRef,\n openAction,\n moveItemsEnabled,\n setMoveItemsEnabled,\n }}\n >\n {children}\n </DashboardActionContext.Provider>\n );\n};\n\nexport default DashboardActionProvider;\n","import React, { useContext } from \"react\";\nimport {\n DashboardActionContext,\n DashboardActionContextType,\n} from \"@/context/DashboardActionContext\";\nimport { Space } from \"antd\";\nimport ActionButton from \"./ActionButton\";\nimport {\n ReloadOutlined,\n SettingOutlined,\n BorderOuterOutlined,\n} from \"@ant-design/icons\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nfunction DashboardActionBar() {\n const { isLoading, dashboardRef, moveItemsEnabled, setMoveItemsEnabled } =\n useContext(DashboardActionContext) as DashboardActionContextType;\n const { t } = useLocale();\n\n return (\n <Space wrap={true}>\n <ActionButton\n icon={\n <BorderOuterOutlined\n style={{ color: moveItemsEnabled ? \"white\" : undefined }}\n />\n }\n type={moveItemsEnabled ? \"primary\" : \"default\"}\n tooltip={t(\"moveDashboard\")}\n disabled={isLoading}\n loading={false}\n onClick={() => {\n setMoveItemsEnabled(!moveItemsEnabled);\n }}\n />\n {separator()}\n <ActionButton\n icon={<SettingOutlined />}\n tooltip={t(\"configDashboard\")}\n disabled={isLoading}\n loading={false}\n onClick={() => {\n dashboardRef?.current.configDashboard();\n }}\n />\n <ActionButton\n icon={<ReloadOutlined />}\n tooltip={t(\"refresh\")}\n disabled={isLoading}\n loading={false}\n onClick={() => {\n dashboardRef?.current.refresh();\n }}\n />\n </Space>\n );\n}\n\nfunction separator() {\n return <div className=\"inline-block w-2\" />;\n}\n\nexport default DashboardActionBar;\n","import DashboardActionBar from \"@/actionbar/DashboardActionBar\";\nimport DashboardActionProvider from \"@/context/DashboardActionContext\";\nimport TitleHeader from \"@/ui/TitleHeader\";\nimport Dashboard from \"@/widgets/views/Dashboard/Dashboard\";\nimport React, { useContext, useRef } from \"react\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { DashboardProps } from \"@/types\";\n\nexport type DashboardActionViewProps = {\n dashboardData: DashboardProps;\n visible: boolean;\n};\n\nexport const DashboardActionView = (props: DashboardActionViewProps) => {\n const { dashboardData, visible } = props;\n const dashboardRef = useRef();\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { openShortcut } = tabManagerContext || {};\n\n if (!dashboardData) {\n return null;\n }\n\n if (!visible) {\n return null;\n }\n\n return (\n <DashboardActionProvider\n dashboardRef={dashboardRef}\n openAction={(action) => {\n openShortcut(action!);\n }}\n >\n <TitleHeader>\n <DashboardActionBar />\n </TitleHeader>\n <Dashboard\n ref={dashboardRef}\n model={dashboardData!.model}\n id={dashboardData!.id}\n context={dashboardData?.context}\n configAction={dashboardData?.configAction}\n />\n </DashboardActionProvider>\n );\n};\n","import { ViewTuple } from \"@/types\";\n\nexport async function resolveViewInfoPromises(\n viewsToRetrieve: Array<{ viewTuple: ViewTuple; promise?: Promise<any> }>,\n) {\n const results = await Promise.all(\n viewsToRetrieve.map(async (item) => {\n try {\n return await item.promise;\n } catch (error) {\n return null;\n }\n }),\n );\n\n const updatedViews = viewsToRetrieve.map((item, index) => ({\n ...item,\n info: results[index],\n }));\n\n return updatedViews.filter((item) => item.info !== null);\n}\n","import React, {\n useEffect,\n useState,\n useRef,\n forwardRef,\n useImperativeHandle,\n useContext,\n} from \"react\";\n\nimport { Spin } from \"antd\";\n\nimport {\n DashboardView,\n FormView,\n GraphView,\n InitialViewData,\n TreeView,\n View,\n ViewType,\n} from \"@/types/index\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\nimport ActionViewProvider from \"@/context/ActionViewContext\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport { useHotkeys } from \"react-hotkeys-hook\";\nimport { GoToResourceModal } from \"@/ui/GoToResourceModal\";\nimport showInfo from \"@/ui/InfoDialog\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { GraphActionView } from \"@/views/actionViews/GraphActionView\";\nimport { FormActionView } from \"./actionViews/FormActionView\";\nimport { TreeActionView } from \"./actionViews/TreeActionView\";\nimport { DashboardActionView } from \"./actionViews/DashboardActionView\";\nimport { resolveViewInfoPromises } from \"@/helpers/viewHelper\";\n\ntype Props = {\n domain: any;\n context: any;\n model: string;\n views: Array<[number, ViewType]>;\n title: string;\n tabKey: string;\n setCanWeClose: (f: any) => void;\n initialView: InitialViewData;\n formDefaultValues?: any;\n formForcedValues?: any;\n res_id?: number | boolean;\n action_id: number;\n action_type: string;\n treeExpandable?: boolean;\n limit?: number;\n};\n\nfunction ActionView(props: Props, ref: any) {\n const {\n domain,\n model,\n context,\n views,\n title,\n setCanWeClose,\n tabKey,\n initialView,\n formDefaultValues,\n formForcedValues = {},\n res_id = false,\n action_id,\n action_type,\n treeExpandable = false,\n limit,\n } = props;\n const [currentView, setCurrentViewInternal] = useState<View>();\n\n const [availableViews, setAvailableViews] = useState<View[]>([]);\n\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const res_id_parsed: number | undefined = res_id\n ? (res_id as number)\n : undefined;\n\n const [currentId, setCurrentIdInternal] = useState<number | undefined>(\n res_id_parsed,\n );\n const [selectedRowItems, setSelectedRowItems] = useState<any[]>([]);\n const [currentItemIndex, setCurrentItemIndex] = useState<number>();\n const [results, setResults] = useState<any>([]);\n const [sorter, setSorter] = useState<any>();\n const [totalItems, setTotalItems] = useState<number>(0);\n const [gtResourceModalVisible, setGtResourceModalVisible] =\n useState<boolean>(false);\n const [searchingForResourceId, setSearchingForResourceId] =\n useState<boolean>(false);\n const [searchTreeNameSearch, setSearchTreeNameSearch] = useState<string>();\n\n const { t } = useLocale();\n\n const formRef = useRef();\n const searchTreeRef = useRef();\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const {\n setCurrentView: setCurrentViewTabContext,\n setCurrentId: setCurrentIdTabContext,\n tabs,\n activeKey,\n openAction,\n onRemoveTab,\n } = tabManagerContext || {};\n\n useHotkeys(\n \"ctrl+g,command+g\",\n (event) => {\n event.preventDefault();\n handleGoToRecordShortcut();\n },\n [activeKey, tabs, currentView, currentItemIndex, results],\n );\n\n function setCurrentId(id?: number) {\n setCurrentIdInternal(id);\n setCurrentIdTabContext?.(id);\n }\n\n function setCurrentView(view?: View) {\n setCurrentViewInternal(view);\n const extra = { action_id, action_type };\n setCurrentViewTabContext?.({ ...view, extra } as any);\n }\n\n useImperativeHandle(ref, () => ({\n canWeClose,\n }));\n\n const fetchData = async () => {\n setIsLoading(true);\n\n const viewDataRetrieved: View[] = [];\n\n const getViewsPromises = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n if (viewType !== \"dashboard\") {\n getViewsPromises.push({\n viewTuple: viewArray,\n promise: ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context,\n }),\n });\n } else {\n getViewsPromises.push({\n viewTuple: viewArray,\n });\n }\n }\n\n const viewsRetrieved = await resolveViewInfoPromises(getViewsPromises);\n\n for (const view of viewsRetrieved) {\n if (!view) {\n continue;\n }\n\n const [, viewType] = view.viewTuple;\n\n const viewInfo = view.info;\n\n switch (viewType) {\n case \"dashboard\": {\n const formView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"form\";\n });\n\n let configAction;\n\n if (formView) {\n configAction = {\n action_id,\n action_type,\n name: title,\n res_id: context[\"active_id\"],\n res_model: model,\n view_id: formView[0],\n view_type: formView[1],\n };\n }\n\n viewDataRetrieved.push({\n type: \"dashboard\",\n id: context[\"active_id\"],\n model,\n context,\n configAction,\n });\n break;\n }\n case \"form\": {\n viewDataRetrieved.push({\n ...(viewInfo as FormView),\n type: viewType,\n });\n break;\n }\n case \"tree\": {\n viewDataRetrieved.push({\n ...(viewInfo as TreeView),\n isExpandable: treeExpandable,\n type: viewType,\n });\n break;\n }\n case \"graph\": {\n viewDataRetrieved.push({\n ...(viewInfo as GraphView),\n type: viewType,\n });\n break;\n }\n default:\n break;\n }\n }\n let currentViewToAssign;\n\n if (!initialView && viewDataRetrieved.find((v) => v.type === \"tree\")) {\n const treeView: TreeView = viewDataRetrieved.find(\n (v) => v.type === \"tree\",\n ) as TreeView;\n currentViewToAssign = treeView;\n } else if (!initialView) {\n const formView: TreeView = viewDataRetrieved.find(\n (v) => v.type === \"form\",\n ) as TreeView;\n currentViewToAssign = formView;\n } else {\n const view = viewDataRetrieved.find((v) => {\n if (!initialView.id) {\n return v.type === initialView.type;\n } else {\n return v.type === initialView.type && v.view_id === initialView.id;\n }\n });\n currentViewToAssign = view;\n }\n\n if (!currentViewToAssign) {\n showErrorDialog(\n `Error determining the first view to show for model ${model}.\\nPlease, make sure the view ids on the fields_view_get responses are the same as the ones defined in the action`,\n );\n onRemoveTab?.(tabKey);\n }\n\n setCurrentView(currentViewToAssign);\n setAvailableViews(viewDataRetrieved);\n setIsLoading(false);\n };\n\n setCanWeClose({ tabKey, canWeClose });\n\n useEffect(() => {\n const treeView = availableViews.find((v) => v.type === \"tree\") as TreeView;\n const initialViewWithData: View = availableViews.find((v) => {\n if (!initialView.id) {\n return v.type === initialView.type;\n } else {\n return v.type === initialView.type && v.view_id === initialView.id;\n }\n }) as View;\n\n setCurrentView(initialViewWithData || treeView);\n if (!res_id) {\n setCurrentId(undefined);\n setCurrentItemIndex(undefined);\n } else {\n setCurrentIdTabContext?.(res_id_parsed);\n }\n fetchData();\n }, [model, views, res_id]);\n\n useEffect(() => {\n if (activeKey === tabKey) {\n setCurrentIdTabContext?.(currentId);\n const extra = { action_id, action_type };\n setCurrentViewTabContext?.({ ...currentView, extra } as any);\n }\n }, [tabs, activeKey]);\n\n async function canWeClose() {\n if (!currentView) {\n return true;\n } else if (currentView!.type === \"form\") {\n return await (formRef.current as any).cancelUnsavedChanges();\n } else {\n return true;\n }\n }\n\n async function handleGoToRecordShortcut() {\n if (activeKey !== tabKey) {\n return;\n }\n\n if (currentView!.type === \"form\") {\n const canWeClose = await (formRef.current as any).cancelUnsavedChanges();\n\n if (!canWeClose) {\n return;\n }\n }\n\n setGtResourceModalVisible(true);\n }\n\n async function goToResourceId(ids: number[], openInSameTab?: boolean) {\n setSearchingForResourceId(true);\n\n let mode: ViewType;\n let domain: any[];\n if (ids.length === 1) {\n mode = \"form\";\n domain = [];\n const id = ids[0];\n const itemIndex = results!.findIndex((item: any) => {\n return item.id === id;\n });\n let resource;\n\n if (itemIndex === -1) {\n try {\n resource = (\n await ConnectionProvider.getHandler().readObjects({\n model,\n ids: [id],\n context,\n })\n )?.[0];\n } catch (err) {}\n\n if (!resource) {\n setSearchingForResourceId(false);\n setGtResourceModalVisible(false);\n showInfo(t(\"idNotFound\"));\n return;\n }\n } else {\n resource = results[itemIndex];\n }\n } else {\n mode = \"tree\";\n domain = [[\"id\", \"in\", ids]];\n }\n\n setSearchingForResourceId(false);\n setGtResourceModalVisible(false);\n\n if (openInSameTab && mode === \"form\") {\n setCurrentId(ids[0]);\n const formView: FormView = availableViews.find(\n (v) => v.type === \"form\",\n ) as FormView;\n setCurrentView(formView);\n } else {\n const viewForm = views.find((v) => v[1] === mode);\n openAction({\n domain,\n context,\n model,\n views,\n title,\n target: \"current\",\n initialView: { id: viewForm?.[0]!, type: mode },\n action_id,\n action_type,\n res_id: ids[0],\n });\n }\n }\n\n function content() {\n return availableViews.map((view) => {\n switch (view.type) {\n case \"form\": {\n return (\n <FormActionView\n key={`${view.type}-${view.view_id}`}\n formRef={formRef}\n currentId={currentId}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n formView={view as FormView}\n model={model}\n context={context}\n domain={domain}\n defaultValues={formDefaultValues}\n forcedValues={formForcedValues}\n results={results}\n setResults={setResults}\n setCurrentItemIndex={setCurrentItemIndex}\n />\n );\n }\n case \"tree\": {\n return (\n <TreeActionView\n key={`${view.type}-${view.view_id}`}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n limit={limit}\n model={model}\n context={context}\n domain={domain}\n formView={\n availableViews.find((v) => v.type === \"form\") as FormView\n }\n treeView={view as TreeView}\n searchTreeRef={searchTreeRef}\n searchTreeNameSearch={searchTreeNameSearch}\n availableViews={availableViews}\n results={results}\n setCurrentItemIndex={setCurrentItemIndex}\n setCurrentId={setCurrentId}\n setCurrentView={setCurrentView}\n />\n );\n }\n case \"graph\": {\n return (\n <GraphActionView\n key={`${view.type}-${view.view_id}`}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n viewData={view as GraphView}\n model={model}\n context={context}\n domain={domain}\n treeView={\n availableViews.find((v) => v.type === \"tree\") as TreeView\n }\n formView={\n availableViews.find((v) => v.type === \"form\") as FormView\n }\n />\n );\n }\n case \"dashboard\": {\n return (\n <DashboardActionView\n key={`${view.type}-${view.view_id}`}\n dashboardData={view as DashboardView}\n visible={\n currentView!.type === view.type &&\n currentView!.view_id === view.view_id\n }\n />\n );\n }\n }\n });\n }\n\n function onNewClicked() {\n if (currentId === undefined && currentView!.type === \"form\") {\n (formRef.current as any).clearAndReload();\n } else {\n setCurrentId(undefined);\n const formView: FormView = availableViews.find(\n (v) => v.type === \"form\",\n ) as FormView;\n setCurrentView(formView);\n }\n }\n\n if (isLoading) {\n return <Spin />;\n }\n\n if (!currentView) {\n return null;\n }\n\n return (\n <ActionViewProvider\n title={title}\n currentView={currentView}\n setCurrentView={setCurrentView}\n availableViews={availableViews}\n formRef={formRef}\n searchTreeRef={searchTreeRef}\n onNewClicked={onNewClicked}\n currentId={currentId}\n setCurrentId={setCurrentId}\n setCurrentItemIndex={setCurrentItemIndex}\n currentItemIndex={currentItemIndex}\n results={results}\n setResults={setResults}\n currentModel={model}\n sorter={sorter}\n setSorter={setSorter}\n totalItems={totalItems}\n setTotalItems={setTotalItems}\n selectedRowItems={selectedRowItems}\n setSelectedRowItems={setSelectedRowItems}\n setSearchTreeNameSearch={setSearchTreeNameSearch}\n searchTreeNameSearch={searchTreeNameSearch}\n goToResourceId={goToResourceId}\n limit={limit}\n >\n {content()}\n <GoToResourceModal\n visible={gtResourceModalVisible}\n onIdSubmitted={goToResourceId}\n isSearching={searchingForResourceId}\n onCancel={() => {\n setGtResourceModalVisible(false);\n }}\n />\n </ActionViewProvider>\n );\n}\n\nexport default forwardRef(ActionView);\n","import React from \"react\";\nimport { DashboardGridProps } from \"./DashboardGrid.types\";\nimport { WidthProvider, Responsive } from \"react-grid-layout\";\nimport \"react-resizable/css/styles.css\";\nimport \"react-grid-layout/css/styles.css\";\n\nconst ResponsiveReactGridLayout = WidthProvider(Responsive);\n\nexport const DashboardGrid = (props: DashboardGridProps) => {\n const { children = [], onPositionItemsChanged } = props;\n\n const items = React.Children.map(\n children,\n (\n child:\n | boolean\n | React.ReactChild\n | React.ReactFragment\n | React.ReactPortal,\n ) => {\n const { parms, id } = (child as any).props;\n return (\n <div key={id} data-grid={parms}>\n {child}\n </div>\n );\n },\n );\n\n return (\n <ResponsiveReactGridLayout\n className=\"layout\"\n cols={{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }}\n draggableHandle={\".draggable-head\"}\n rowHeight={30}\n onLayoutChange={(layout) => {\n onPositionItemsChanged?.(\n layout.map((item) => {\n return {\n id: parseInt(item.i.replace(\".$\", \"\"), 10),\n x: item.x,\n y: item.y,\n w: item.w,\n h: item.h,\n };\n }),\n );\n }}\n >\n {items}\n </ResponsiveReactGridLayout>\n );\n};\n","import { useEffect, useState, useRef, memo } from \"react\";\nimport { Alert, Spin } from \"antd\";\n\nimport { Tree } from \"@/widgets/views/Tree\";\nimport { FormView, TreeView } from \"@/types/index\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\n\nimport { getColorMap, getTree, sortResults } from \"@/helpers/treeHelper\";\nimport { mergeParams } from \"@/helpers/searchHelper\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype OnRowClickedData = {\n id: number;\n model: string;\n treeView: TreeView;\n};\n\ntype Props = {\n action?: string;\n model?: string;\n view_id?: number;\n onRowClicked: (data: OnRowClickedData) => void;\n domain?: any;\n visible?: boolean;\n parentContext?: any;\n};\n\nfunction DashboardTree(props: Props) {\n const {\n action,\n model,\n view_id,\n onRowClicked,\n domain = [],\n visible = true,\n parentContext = {},\n } = props;\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [initialFetchDone, setInitialFetchDone] = useState<boolean>(false);\n\n const [currentModel, setCurrentModel] = useState<string>();\n const [treeView, setTreeView] = useState<TreeView>();\n const [formView, setFormView] = useState<FormView>();\n\n const [page, setPage] = useState<number>(1);\n const [offset, setOffset] = useState<number>(0);\n const limitRef = useRef<number>(DEFAULT_SEARCH_LIMIT);\n\n const paramsRef = useRef<any[]>([]);\n\n const [totalItems, setTotalItems] = useState<number>(0);\n const [results, setResults] = useState<any>([]);\n const [colorsForResults, setColorsForResults] = useState<any>(undefined);\n const [sorter, setSorter] = useState<any>();\n\n const [searchError, setSearchError] = useState<string>();\n const [initialError, setInitialError] = useState<string>();\n\n const [tableRefreshing, setTableRefreshing] = useState<boolean>(false);\n\n const actionDomain = useRef<any>([]);\n\n const onRequestPageChange = (page: number) => {\n setTableRefreshing(true);\n setPage(page);\n setOffset((page - 1) * limitRef.current!);\n };\n\n const searchResults = async () => {\n const domainParams =\n actionDomain.current.length > 0 ? actionDomain.current : domain;\n\n const searchParams = mergeParams(paramsRef.current, domainParams);\n const { colors } = getTree(treeView!);\n\n const { totalItems, results, attrsEvaluated } =\n await ConnectionProvider.getHandler().searchForTree({\n params: searchParams,\n limit: limitRef.current,\n offset,\n model: currentModel!,\n fields: treeView!.fields,\n context: parentContext,\n attrs: colors && { colors },\n });\n setColorsForResults(getColorMap(attrsEvaluated));\n\n const resultsSorted = sortResults({\n resultsToSort: results,\n sorter,\n fields: { ...treeView!.fields, ...formView!.fields },\n });\n setTableRefreshing(false);\n\n setResults(resultsSorted);\n const totalItemsResult = await totalItems;\n setTotalItems(totalItemsResult);\n };\n\n const fetchResults = async () => {\n try {\n setTableRefreshing(true);\n await searchResults();\n } catch (error) {\n setSearchError(JSON.stringify(error));\n }\n };\n\n useEffect(() => {\n if (!initialFetchDone) {\n return;\n }\n\n if (visible) {\n fetchResults();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [page, offset, initialFetchDone, visible]);\n\n const fetchData = async (type: \"action\" | \"model\") => {\n setInitialFetchDone(false);\n setIsLoading(true);\n setInitialError(undefined);\n\n try {\n if (type === \"action\") {\n await fetchActionData();\n } else {\n await fetchModelData();\n }\n setInitialFetchDone(true);\n } catch (error) {\n setInitialError(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const fetchActionData = async () => {\n const dataForAction =\n await ConnectionProvider.getHandler().getViewsForAction({\n action: action!,\n context: parentContext,\n });\n actionDomain.current = dataForAction.domain;\n setFormView(dataForAction.views.get(\"form\"));\n setTreeView(dataForAction.views.get(\"tree\"));\n setCurrentModel(dataForAction.model);\n limitRef.current = dataForAction.limit;\n };\n\n const fetchModelData = async () => {\n setCurrentModel(model);\n\n const _formView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"form\",\n context: parentContext,\n })) as FormView;\n setFormView(_formView as FormView);\n\n const _treeView = (await ConnectionProvider.getHandler().getView({\n model: model!,\n type: \"tree\",\n id: view_id,\n context: parentContext,\n })) as TreeView;\n\n setTreeView(_treeView as TreeView);\n };\n\n useEffect(() => {\n if (action) {\n fetchData(\"action\");\n } else if (model) {\n fetchData(\"model\");\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [action, model]);\n\n const onRowClickedHandler = (record: any) => {\n const { id } = record;\n onRowClicked({\n id,\n model: currentModel!,\n treeView: treeView!,\n });\n };\n\n const content = () => {\n if (!treeView || !formView) {\n return null;\n }\n\n return (\n <div style={{ overflowY: \"scroll\" }}>\n {searchError && (\n <Alert className=\"mt-10\" message={searchError} type=\"error\" banner />\n )}\n <Tree\n showPagination={false}\n total={totalItems}\n limit={limitRef.current}\n page={page}\n treeView={treeView}\n results={results}\n onRequestPageChange={onRequestPageChange}\n loading={tableRefreshing}\n onRowClicked={onRowClickedHandler}\n colorsForResults={colorsForResults}\n sorter={sorter}\n onChangeSort={(newSorter) => {\n setSorter?.(newSorter);\n const sortedResults = sortResults({\n resultsToSort: results,\n sorter: newSorter,\n fields: { ...treeView.fields, ...formView.fields },\n });\n setResults(sortedResults);\n }}\n context={parentContext}\n />\n </div>\n );\n };\n\n if (initialError) {\n return (\n <Alert className=\"mt-10\" message={initialError} type=\"error\" banner />\n );\n }\n\n return isLoading ? <Spin style={{ padding: \"2rem\" }} /> : content();\n}\nexport default memo(DashboardTree);\n","import ConnectionProvider from \"@/ConnectionProvider\";\nimport React, { useEffect, useState } from \"react\";\nimport Form, { FormProps } from \"../Form\";\n\nexport const DashboardForm = (props: FormProps) => {\n const { model } = props;\n const [firstId, setFirstId] = useState<number>();\n\n useEffect(() => {\n fetchData();\n }, [model]);\n\n async function fetchData() {\n const results: any[] = (await ConnectionProvider.getHandler().search({\n params: [],\n model,\n limit: 1,\n })) as any;\n\n if (results.length > 0) {\n setFirstId(results[0].id);\n }\n }\n\n return (\n <div style={{ padding: \"0.5rem\", overflowY: \"scroll\" }}>\n <Form {...props} model={model} id={firstId} readOnly />\n </div>\n );\n};\n","import React, {\n forwardRef,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport ActionView from \"@/views/ActionView\";\nimport { fetchAction } from \"./dashboardHelper\";\nimport \"react-resizable/css/styles.css\";\nimport \"react-grid-layout/css/styles.css\";\nimport { Graph } from \"../Graph/Graph\";\nimport { DashboardGrid } from \"../DashboardGrid\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { DashboardProps, FormView } from \"@/types\";\nimport { ErpFeatureKeys, GraphCard, One2manyItem } from \"@/index\";\nimport { readObjectValues } from \"@/helpers/one2manyHelper\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\nimport { Alert } from \"antd\";\nimport {\n DashboardActionContext,\n DashboardActionContextType,\n} from \"@/context/DashboardActionContext\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport DashboardTree from \"./DashboardTree\";\nimport { DashboardForm } from \"./DashboardForm\";\nimport { useNetworkRequest } from \"@/hooks/useNetworkRequest\";\nimport { GraphServer } from \"../Graph/GraphServer\";\nimport { useFeatureIsEnabled } from \"@/context/ConfigContext\";\n\nconst itemsField = \"line_ids\";\n\nfunction Dashboard(props: DashboardProps, ref: any) {\n const { model, context = {}, id, configAction } = props;\n const [dashboardItems, setDashboardItems] = useState<any[]>([]);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>();\n const {\n setIsLoading: setActionBarLoading,\n openAction,\n moveItemsEnabled,\n } = useContext(DashboardActionContext) as DashboardActionContextType;\n\n const itemsFields = useRef<any>();\n const boardFields = useRef<any>();\n const [getView] = useNetworkRequest(ConnectionProvider.getHandler().getView);\n const [readObjects] = useNetworkRequest(\n ConnectionProvider.getHandler().readObjects,\n );\n const [update] = useNetworkRequest(ConnectionProvider.getHandler().update);\n const readForViewEnabled = useFeatureIsEnabled(\n ErpFeatureKeys.FEATURE_READFORVIEW,\n );\n\n useEffect(() => {\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model, id, context]);\n\n useImperativeHandle(ref, () => ({\n refresh: () => {\n fetchData();\n },\n configDashboard: openConfigDashboard,\n }));\n\n async function fetchData() {\n setIsLoading(true);\n setActionBarLoading(true);\n setError(undefined);\n\n try {\n const view: FormView = (await fetchView()) as FormView;\n const values = await fetchValues(view);\n const model = view.fields[itemsField].relation;\n const items: One2manyItem[] = values[itemsField].items;\n boardFields.current = view.fields;\n\n const originalItems: One2manyItem[] = await fetchDashboardItems({\n items,\n model,\n context,\n });\n\n const itemsWithActions = await getItemsWithActions(originalItems);\n setError(undefined);\n setDashboardItems(itemsWithActions);\n setIsLoading(false);\n setActionBarLoading(false);\n } catch (err) {\n setError(JSON.stringify(err));\n }\n }\n\n async function fetchView() {\n return await getView({\n model,\n type: \"form\",\n context,\n });\n }\n\n async function fetchDashboardItems({\n items,\n model,\n context,\n }: {\n items: One2manyItem[];\n model: string;\n context: any;\n }) {\n itemsFields.current = (\n (await getView({\n model,\n type: \"form\",\n context,\n })) as FormView\n ).fields;\n\n const [results] = await readObjectValues({\n treeView: {\n fields: itemsFields.current,\n },\n formView: {\n fields: itemsFields.current,\n },\n model,\n items,\n context,\n currentView: \"form\",\n });\n return results;\n }\n\n async function fetchValues(view: FormView) {\n return (\n await readObjects({\n model,\n ids: [id],\n fields: view.fields,\n context,\n })\n )[0];\n }\n\n async function getItemsWithActions(items: One2manyItem[]) {\n const fetchPromises: Array<Promise<any>> = [];\n\n for (const dashboardItem of items) {\n const { values } = dashboardItem;\n if (values.action_id && values.action_id.length > 0) {\n const actionId = parseInt(values.action_id[0], 10);\n const promise = fetchAction({\n actionId,\n rootContext: context,\n }).then((actionData) => {\n return { ...dashboardItem, actionData };\n });\n fetchPromises.push(promise);\n }\n }\n\n const itemsWithActions = await Promise.all(fetchPromises);\n return itemsWithActions;\n }\n\n async function onPositionItemsChanged(itemPositions: any[]) {\n if (!moveItemsEnabled) {\n return;\n }\n\n const differences = itemPositions.filter((itemPosition) => {\n const dashboardItem = dashboardItems.find(\n (dashboardItem) => dashboardItem.id === itemPosition.id,\n );\n if (!dashboardItem) {\n return false;\n }\n\n if (!dashboardItem.position) {\n return true;\n }\n\n const remotePosition = {\n ...JSON.parse(dashboardItem.position.replace(/'/g, '\"')),\n id: dashboardItem.id,\n };\n\n return JSON.stringify(itemPosition) !== JSON.stringify(remotePosition);\n });\n\n if (differences.length === 0) {\n return;\n }\n\n const itemsToUpdate = dashboardItems.filter((dashboardItem) => {\n return differences.map((diff) => diff.id).includes(dashboardItem.id);\n });\n\n const itemsToUpdateWithUpdatedPos = itemsToUpdate.map((dashboardItem) => {\n const diffItem = {\n ...differences.find((diffItem) => diffItem.id === dashboardItem.id),\n };\n delete diffItem.id;\n\n const item = { ...dashboardItem };\n delete item.actionData;\n\n return {\n ...dashboardItem,\n operation: \"pendingUpdate\",\n values: {\n ...dashboardItem.values,\n position: JSON.stringify(diffItem).replace(/\"/g, \"'\"),\n },\n };\n });\n\n const valueToUpdate = {\n fields: itemsFields.current,\n items: itemsToUpdateWithUpdatedPos,\n };\n\n await update({\n model,\n id,\n values: { [itemsField]: valueToUpdate },\n fields: boardFields.current,\n context,\n });\n }\n\n async function openConfigDashboard() {\n openAction(configAction);\n }\n\n if (isLoading) {\n return <LoadingOutlined />;\n }\n\n if (error) {\n return (\n <Alert className=\"mt-10 mb-20\" message={error} type=\"error\" banner />\n );\n }\n\n return (\n <DashboardGrid onPositionItemsChanged={onPositionItemsChanged}>\n {dashboardItems.map((item, idx) => {\n const { actionData, values } = item;\n const { position, id } = values;\n\n const {\n actionId,\n actionType,\n key,\n title,\n views,\n model,\n context,\n domain,\n initialView,\n limit,\n } = actionData as any;\n\n let parmsParsed = {};\n\n try {\n parmsParsed = JSON.parse(position.replace(/'/g, '\"'));\n } catch (err) {\n // console.error(`Error parsing parms: ${action.position}`);\n parmsParsed = { x: idx * 2, y: 0, w: 2, h: 3 };\n }\n\n let childContent = null;\n\n if (initialView?.type === \"graph\") {\n const mustUseServerGraphs =\n values.server_action === true && readForViewEnabled;\n const GraphComponent = mustUseServerGraphs ? GraphServer : Graph;\n\n childContent = (\n <GraphComponent\n key={id}\n view_id={\n views.filter(\n (view: [number, string]) => view[1] === \"graph\",\n )[0][0]\n }\n model={model}\n context={context}\n domain={domain}\n limit={limit}\n />\n );\n } else if (initialView?.type === \"form\") {\n childContent = (\n <DashboardForm key={id} model={model} actionDomain={domain} />\n );\n } else if (initialView?.type === \"tree\") {\n childContent = (\n <DashboardTree\n key={id}\n model={model}\n domain={domain}\n view_id={\n views.filter(\n (view: [number, string]) => view[1] === \"tree\",\n )[0][0]\n }\n onRowClicked={(record) => {\n const formView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"form\";\n });\n if (formView) {\n const [id, type] = formView;\n const {\n actionId: action_id,\n actionType: action_type,\n title: name,\n model: res_model,\n } = actionData;\n\n const action: ShortcutApi = {\n action_id,\n action_type,\n name,\n res_id: record.id,\n res_model,\n view_id: id,\n view_type: type,\n };\n openAction(action);\n }\n }}\n />\n );\n } else if (initialView !== undefined) {\n const formattedInitialView =\n initialView && Array.isArray(initialView.id)\n ? { ...initialView, id: initialView.id[0] }\n : initialView;\n childContent = (\n <ActionView\n key={id}\n action_id={actionId}\n action_type={actionType}\n tabKey={key}\n title={title}\n views={views}\n model={model}\n context={context}\n domain={domain}\n setCanWeClose={() => {}}\n initialView={formattedInitialView}\n limit={limit}\n />\n );\n }\n\n let action: ShortcutApi;\n const treeView = views.find((view: any[]) => {\n const [, type] = view;\n return type === \"tree\";\n });\n if (treeView) {\n const [id, type] = treeView;\n const {\n actionId: action_id,\n actionType: action_type,\n title: name,\n model: res_model,\n } = actionData;\n\n action = {\n action_id,\n action_type,\n name,\n res_id: false,\n res_model,\n view_id: id,\n view_type: type,\n overrideUnsettedLimit: true,\n };\n }\n\n return (\n <GraphCard\n key={`griditem-${id}`}\n id={id}\n title={title}\n parms={parmsParsed}\n action={action!}\n openAction={openAction}\n >\n {childContent}\n </GraphCard>\n );\n })}\n </DashboardGrid>\n );\n}\n\nexport default forwardRef(Dashboard);\n","import React, { useContext, useState } from \"react\";\nimport { MultiCheckbox as MultiCheckboxOoui } from \"@gisce/ooui\";\nimport Field from \"@/common/Field\";\nimport { One2manyItem, One2manyValue } from \"../base/one2many/One2manyInput\";\nimport useDeepCompareEffect from \"use-deep-compare-effect\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { Alert, Checkbox, Spin, Col, Row, Button, Space } from \"antd\";\nimport ConnectionProvider from \"@/ConnectionProvider\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\n\ntype MultiCheckboxProps = {\n ooui: MultiCheckboxOoui;\n};\n\ntype MultiCheckboxInputProps = MultiCheckboxProps & {\n value?: One2manyValue;\n onChange?: (value: One2manyValue) => void;\n};\n\nexport const MultiCheckbox = (props: MultiCheckboxProps) => {\n const { ooui } = props;\n\n return (\n <Field type={\"array\"} {...props}>\n <MultiCheckboxInput ooui={ooui} />\n </Field>\n );\n};\n\nexport const MultiCheckboxInput = (props: MultiCheckboxInputProps) => {\n const { value, ooui, onChange } = props;\n const { items = [] } = value || {};\n const itemsToShow = items\n .filter((item) => item.operation !== \"pendingRemove\")\n .map((item) => item.id) as number[];\n\n const [options, setOptions] = useState<any[]>([]);\n const [error, setError] = useState<string>();\n const [isLoadingOptions, setIsLoadingOptions] = useState<boolean>(false);\n const { relation, context, readOnly, field, columns } = ooui;\n\n const formContext = useContext(FormContext) as FormContextType;\n const { getContext } = formContext || {};\n\n useDeepCompareEffect(() => {\n fetchOptions();\n }, [items]);\n\n const triggerChange = (changedValue: One2manyItem[]) => {\n onChange?.({\n items: changedValue,\n });\n };\n\n async function fetchOptions() {\n setIsLoadingOptions(true);\n let params: any = [];\n if (ooui.domain) {\n const evaluatedDomain = await ConnectionProvider.getHandler().evalDomain({\n domain: ooui.domain,\n values: transformPlainMany2Ones({\n fields: formContext?.getFields(),\n values: formContext.getPlainValues(),\n }),\n fields: formContext?.getFields(),\n context: formContext.getContext(),\n });\n params = [...params, ...evaluatedDomain];\n }\n try {\n const optionsRead = await ConnectionProvider.getHandler().search({\n model: relation,\n params,\n fieldsToRetrieve: [field],\n context: { ...getContext?.(), ...context },\n });\n const options = optionsRead.map((item: any) => {\n const value = item[field];\n let formattedValue = value;\n if (Array.isArray(value)) {\n formattedValue = value[1];\n }\n return { label: formattedValue, value: item.id };\n });\n setOptions(options);\n } catch (err) {\n setError(err as any);\n } finally {\n setIsLoadingOptions(false);\n }\n if (error) {\n return <Alert className=\"mt-10\" message={error} type=\"error\" banner />;\n }\n }\n\n const checkAll = () => {\n onChangeSelected(options.map((option) => option.value));\n };\n\n const uncheckAll = () => {\n onChangeSelected([]);\n };\n\n const onChangeSelected = (ids: any[]) => {\n const newItems: One2manyItem[] = items.map((item) => {\n if (ids.includes(item.id as number)) {\n if (item.operation == \"pendingRemove\") {\n return {\n ...item,\n operation: \"original\",\n };\n } else {\n return item;\n }\n } else {\n return { id: item.id, operation: \"pendingRemove\" };\n }\n });\n const currentIds = newItems.map((item) => item.id);\n ids\n .filter((id) => !currentIds.includes(id))\n .map((id) => {\n newItems.push({ id, operation: \"pendingLink\" });\n });\n triggerChange(newItems);\n };\n\n if (isLoadingOptions && options.length === 0) {\n return <Spin />;\n }\n\n return (\n <>\n <div className=\"flex flex-row\">\n <Checkbox.Group\n value={options.length ? itemsToShow : []}\n disabled={readOnly}\n onChange={onChangeSelected}\n style={{ width: \"100%\" }}\n >\n <Row>\n {options.map((option) => (\n <Col span={Math.floor(24 / columns)}>\n <Checkbox value={option.value}>{option.label}</Checkbox>\n </Col>\n ))}\n </Row>\n </Checkbox.Group>\n {!readOnly && (\n <Space>\n <Button\n onClick={checkAll}\n disabled={itemsToShow.length == options.length}\n >\n Check all\n </Button>\n <Button onClick={uncheckAll} disabled={itemsToShow.length === 0}>\n Uncheck all\n </Button>\n </Space>\n )}\n </div>\n </>\n );\n};\n","import Field from \"@/common/Field\";\nimport ReactMarkdown from \"react-markdown\";\nimport React from \"react\";\nimport { WidgetProps } from \"@/types\";\nimport remarkGfm from \"remark-gfm\";\n\nexport const Markdown = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <MarkdownInput {...props} />\n </Field>\n );\n};\n\nexport const MarkdownInput = (props: any) => {\n const { value, ooui } = props;\n return (\n <div\n style={{\n height: ooui?.height ? ooui.height + \"px\" : \"100%\",\n overflow: \"auto\",\n }}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n className=\"markdown-typography\"\n >\n {value}\n </ReactMarkdown>\n </div>\n );\n};\n","import React from \"react\";\nimport { Radio as RadioAnt, Space } from \"antd\";\n\nimport Field from \"@/common/Field\";\nimport { Radio as RadioOoui } from \"@gisce/ooui\";\nimport { WidgetProps } from \"@/types\";\n\nexport const Radio = (props: WidgetProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <SelectionInput {...props} />\n </Field>\n );\n};\n\ntype RadioInputProps = WidgetProps & {\n onChange?: (value: any) => void;\n value?: string;\n};\n\nexport const SelectionInput = (props: RadioInputProps) => {\n const { ooui, onChange, value } = props;\n const { selectionValues, readOnly, direction } = ooui as RadioOoui;\n\n const values = Array.from(selectionValues.entries());\n\n const options =\n values &&\n values.length &&\n values.map((entry: string[]) => {\n const [key, value] = entry;\n return (\n <RadioAnt key={key} value={key}>\n {value}\n </RadioAnt>\n );\n });\n\n return (\n <RadioAnt.Group disabled={readOnly} onChange={onChange} value={value}>\n <Space direction={direction}>{options}</Space>\n </RadioAnt.Group>\n );\n};\n","import React from \"react\";\nimport { Switch as AntdSwitch } from \"antd\";\n\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\nexport const Switch = (props: WidgetProps) => {\n const { ooui } = props;\n const { id, readOnly, required } = ooui;\n\n return (\n <Field {...props} valuePropName=\"checked\">\n <SwitchInput id={id} readOnly={readOnly} required={required} />\n </Field>\n );\n};\n\nconst SwitchInput = (props: any) => {\n const { required, readOnly, ...restProps } = props;\n\n return (\n <div className=\"flex flex-row\">\n <AntdSwitch disabled={readOnly} {...restProps} />\n </div>\n );\n};\n","import React, { useContext } from \"react\";\nimport { Steps as AntdSteps } from \"antd\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport Field from \"@/common/Field\";\nimport { Steps as StepsOoui } from \"@gisce/ooui\";\n\ntype StepsProps = {\n ooui: StepsOoui;\n value: any;\n};\n\ntype StatusType = \"wait\" | \"process\" | \"finish\" | \"error\";\n\nexport const Steps = (props: StepsProps) => {\n const { ooui } = props;\n const { required } = ooui;\n\n return (\n <Field required={required} type={\"any\"} {...props}>\n <StepsInput {...props} />\n </Field>\n );\n};\n\ntype StepsInputProps = StepsProps & {\n value?: any;\n};\n\nexport const StepsInput = (props: StepsInputProps) => {\n const { ooui, value } = props;\n const { selectionValues, errorField } = ooui as StepsOoui;\n const formContext = useContext(FormContext) as FormContextType;\n\n const values = Array.from(selectionValues.entries());\n const current = values.map((val) => val[0]).indexOf(value);\n let status: StatusType = \"process\";\n let error = \"\";\n\n if (errorField) {\n error = formContext.getFieldValue(errorField);\n if (error) {\n status = \"error\";\n }\n }\n\n return (\n <AntdSteps current={current} status={status}>\n {values.map((val, idx) => (\n <AntdSteps.Step\n title={val[1]}\n description={idx === current && status === \"error\" ? error : null}\n />\n ))}\n </AntdSteps>\n );\n};\n","import { useContext } from \"react\";\nimport Editor from \"@monaco-editor/react\";\nimport { FormContext, FormContextType } from \"@/context/FormContext\";\nimport { CodeEditor as CodeEditorOoui } from \"@gisce/ooui\";\n\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\n\ntype CodeEditorProps = WidgetProps & {\n ooui: CodeEditorOoui;\n};\n\nexport const CodeEditor = (props: CodeEditorProps) => {\n const { ooui } = props;\n const { lang, height, readOnly } = ooui;\n const formContext = useContext(FormContext) as FormContextType;\n const { elementHasLostFocus } = formContext || {};\n\n const onMount = (editor: any) => {\n editor.onDidBlurEditorWidget(elementHasLostFocus);\n };\n\n return (\n <Field {...props}>\n <Editor\n options={{\n readOnly,\n }}\n defaultLanguage={lang || \"\"}\n height={height || 300}\n onMount={onMount}\n />\n </Field>\n );\n};\n","import { Fragment, useContext } from \"react\";\nimport Field from \"@/common/Field\";\nimport { WidgetProps } from \"@/types\";\nimport {\n Card,\n Space,\n Typography,\n Avatar,\n Tag,\n Timeline,\n TimelineItemProps,\n} from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nimport dayjs from \"@/helpers/dayjs\";\nimport md5 from \"md5\";\n\nconst { Meta } = Card;\nconst { Text } = Typography;\n\ntype GravatarProps = {\n email: string;\n size?: number;\n theme: string;\n};\n\ntype CommentDataType = {\n id: number;\n isSender: boolean;\n isAuthor: boolean;\n text: string;\n email: string;\n date: string;\n author: string;\n};\n\ntype CommentProps = {\n data: CommentDataType;\n style?: any;\n};\n\ntype CommentsTypeProps = {\n data: CommentDataType[];\n};\n\ntype CommentsTimelineProps = {\n value?: EventsType[];\n};\n\ntype EventActionType = {\n date: string;\n action: string;\n};\n\nexport type EventsType = {\n type: \"action\" | \"comment\";\n event: EventActionType | CommentDataType;\n};\n\nconst Gravatar = ({ email, size = 40, theme = \"\" }: GravatarProps) => {\n // Genera el enlace de Gravatar utilizando el email\n const gravatarUrl = `https://www.gravatar.com/avatar/${md5(\n email,\n )}?s=${size}&d=${theme}`;\n\n return <Avatar src={gravatarUrl} size={size} />;\n};\n\nfunction TextWithNewlines({ text }: { text: string }) {\n const textParts = text.split(\"\\n\");\n\n return (\n <div>\n {textParts.map((part, index) => (\n <Fragment key={index}>\n {part}\n {index !== textParts.length - 1 && <br />}\n </Fragment>\n ))}\n </div>\n );\n}\n\nexport const Comment = (props: CommentProps) => {\n const { data, style } = props;\n const { t } = useLocale();\n return (\n <Card key={data.id} style={{ ...style, ...{ textAlign: \"start\" } }}>\n <Meta\n avatar={<Gravatar email={data.email} theme=\"mp\" />}\n title={data.author}\n description={\n <Space direction=\"horizontal\">\n <span title={data.date}>{dayjs(data.date).fromNow()}</span>\n {data.isAuthor && <Tag color=\"blue\">{t(\"author\")}</Tag>}\n </Space>\n }\n style={{ marginBottom: \"5px\" }}\n />\n <Text>\n <TextWithNewlines text={data.text} />\n </Text>\n </Card>\n );\n};\n\nexport const Comments = (props: CommentsTypeProps) => {\n const { data = [] } = props;\n const comments = data.map((c) => {\n const style = { float: c.isSender ? \"right\" : \"left\", width: \"60%\" };\n return <Comment data={c} style={style} />;\n });\n return (\n <div>\n <Space direction=\"vertical\" size=\"middle\" style={{ display: \"flex\" }}>\n {comments}\n </Space>\n </div>\n );\n};\n\nexport const CommentsTimeline = (props: CommentsTimelineProps) => {\n const { value } = props;\n const items = (value || []).map((i) => {\n if (i.type === \"action\") {\n return {\n children: `${i.event.date} - ${(i.event as EventActionType).action}`,\n };\n } else if (i.type === \"comment\") {\n return {\n color: \"gray\",\n position: (i.event as CommentDataType).isSender ? \"left\" : \"right\",\n label: i.event.date,\n children: <Comment data={i.event as CommentDataType} />,\n };\n }\n });\n return <Timeline mode=\"alternate\" items={items as TimelineItemProps[]} />;\n};\n\nexport const CommentsTimelineField = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <CommentsTimeline />\n </Field>\n );\n};\n","import React from \"react\";\nimport Field from \"@/common/Field\";\nimport { HTMLPreview as HTMLPreviewInput } from \"@gisce/react-formiga-components\";\nimport { WidgetProps } from \"@/types\";\n\nexport const HTMLPreview = (props: WidgetProps) => {\n return (\n <Field {...props}>\n <HTMLPreviewInput />\n </Field>\n );\n};\n","import React from \"react\";\nimport { Alert as AntdAlert } from \"antd\";\nimport { WidgetProps } from \"@/types\";\nimport { Alert as AlertOoui } from \"@gisce/ooui\";\nimport { Interweave } from \"interweave\";\nimport iconMapper from \"@/helpers/iconMapper\";\n\nexport const Alert = (props: WidgetProps) => {\n const { ooui } = props;\n const { title, text, alertType, icon } = ooui as AlertOoui;\n\n function getIcon(icon: string | null): React.JSX.Element | undefined {\n if (icon) {\n const Icon: React.ElementType = iconMapper(icon) as any;\n return Icon && <Icon />;\n }\n return undefined;\n }\n\n return (\n <AntdAlert\n message={<Interweave content={title} />}\n description={<Interweave content={text} />}\n type={alertType}\n showIcon\n icon={getIcon(icon)}\n />\n );\n};\n","import React, { useContext } from \"react\";\nimport { Layout, Typography } from \"antd\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\n\nconst { Content } = Layout;\nconst { Title } = Typography;\n\nfunction Welcome(): React.ReactElement {\n const { t } = useLocale();\n\n return (\n <Content className=\"m-5 select-none\">\n <Title level={5}>{t(\"welcome\")}</Title>\n </Content>\n );\n}\n\nexport default Welcome;\n","import {\n useState,\n forwardRef,\n useImperativeHandle,\n useRef,\n ReactNode,\n} from \"react\";\nimport { ConnectionProvider, ContentRootProvider, FormView } from \"..\";\nimport Welcome from \"./Welcome\";\nimport TabManagerProvider from \"@/context/TabManagerContext\";\nimport ActionView from \"./ActionView\";\nimport { parseContext } from \"@gisce/ooui\";\nimport { ShortcutApi } from \"@/ui/FavouriteButton\";\nimport showErrorDialog from \"@/ui/ActionErrorDialog\";\nimport { InitialViewData, ViewType } from \"@/types\";\nimport { transformPlainMany2Ones } from \"@/helpers/formHelper\";\nimport { nanoid } from \"nanoid\";\nimport { useLocale } from \"@gisce/react-formiga-components\";\nimport { useConfigContext } from \"@/context/ConfigContext\";\nimport { DEFAULT_SEARCH_LIMIT } from \"@/models/constants\";\n\ntype RootViewProps = {\n children: ReactNode;\n};\n\nexport type ActionInfo = {\n id: number;\n type: string;\n};\n\nfunction RootView(props: RootViewProps, ref: any) {\n const { children } = props;\n const [activeKey, setActiveKey] = useState<string>(\"welcome\");\n const { t } = useLocale();\n const { globalValues, rootContext } = useConfigContext();\n\n const [tabs, setTabs] = useState<any>([\n {\n title: t(\"welcome\"),\n key: \"welcome\",\n closable: true,\n content: <Welcome />,\n },\n ]);\n const tabViewsCloseFunctions = useRef(new Map<string, any>());\n const contentRootProvider = useRef();\n\n useImperativeHandle(ref, () => ({\n retrieveAndOpenAction,\n openShortcut,\n }));\n\n function remove(key: string) {\n if (key === activeKey) {\n const currentIndex = tabs.findIndex((tab: any) => tab.key === key);\n\n if (tabs[currentIndex - 1]) {\n setActiveKey(tabs[currentIndex - 1].key);\n }\n if (tabs[currentIndex + 1]) {\n setActiveKey(tabs[currentIndex + 1].key);\n }\n }\n\n setTabs(tabs.filter((tab: any) => tab.key !== key));\n tabViewsCloseFunctions.current.delete(key);\n }\n\n function registerViewCloseFn({\n tabKey,\n canWeClose,\n }: {\n tabKey: string;\n canWeClose: any;\n }) {\n tabViewsCloseFunctions.current.set(tabKey, canWeClose);\n }\n\n async function retrieveAndOpenAction({\n action,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain = [],\n }: {\n action: string;\n values?: any;\n forced_values?: any;\n initialViewType?: ViewType;\n res_id?: number;\n domain?: any;\n }) {\n const dataForAction = await ConnectionProvider.getHandler().getActionData({\n action,\n context: rootContext,\n });\n\n if (dataForAction.type === \"ir.actions.wizard\") {\n showErrorDialog(\"Action type not supported\");\n return;\n }\n\n const [action_type, action_id_string] = action.split(\",\");\n const action_id = parseInt(action_id_string);\n\n const parsedContext = parseContext({\n context: dataForAction.context,\n values: globalValues,\n fields: {},\n });\n\n const parsedDomain = dataForAction.domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain: dataForAction.domain,\n values: globalValues,\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n const {\n res_model: model,\n views,\n name: title,\n target,\n view_type,\n limit,\n } = dataForAction;\n\n const treeExpandable = view_type === \"tree\";\n\n const finalViews = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n\n if (!id) {\n if (viewType === \"dashboard\") {\n finalViews.push([undefined, \"dashboard\"]);\n } else {\n const { view_id } = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context: { ...rootContext, ...parsedContext },\n });\n finalViews.push([view_id, viewType]);\n }\n } else {\n finalViews.push(viewArray);\n }\n }\n\n let initialView;\n\n if (initialViewType) {\n const [id, type] = finalViews.find(\n ([_, type]) => type === initialViewType,\n );\n initialView = { id, type };\n } else {\n const [id, type] = finalViews[0];\n initialView = { id, type };\n }\n\n openAction({\n domain: [...parsedDomain, ...domain],\n context: { ...rootContext, ...parsedContext },\n model,\n views: finalViews,\n title,\n target,\n initialView,\n action_type,\n action_id,\n values,\n forced_values,\n res_id,\n treeExpandable,\n limit,\n });\n }\n\n function addNewTab({\n title,\n content,\n key,\n action,\n }: {\n title: string;\n content: any;\n key: string;\n action?: ActionInfo;\n }) {\n let newTabs = [...tabs];\n\n if (tabs.length === 1 && tabs[0].key === \"welcome\") {\n newTabs = [...tabs.filter((tab: any) => tab.key !== \"welcome\")];\n }\n\n setTabs([\n ...newTabs,\n {\n title,\n key,\n closable: true,\n content,\n action,\n },\n ]);\n\n setActiveKey(key);\n }\n\n async function openRelate({\n relateData,\n fields,\n values,\n action_id,\n action_type,\n }: {\n relateData: any;\n fields: any;\n values: any;\n action_id: number;\n action_type: string;\n }) {\n const {\n res_model: model,\n context,\n domain,\n views,\n target,\n string: title,\n limit,\n } = relateData;\n\n const [id, type] = views[0];\n const initialView = { id, type };\n\n const parsedContext = parseContext({\n context,\n values: { ...values, ...globalValues },\n fields,\n });\n\n const parsedDomain = domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain,\n values: transformPlainMany2Ones({\n fields,\n values: { ...values, ...globalValues },\n }),\n fields,\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n openAction({\n model,\n target,\n views,\n context: { ...rootContext, ...parsedContext },\n domain: parsedDomain,\n title,\n initialView,\n action_id,\n action_type,\n limit,\n });\n }\n\n async function openShortcut(shortcut: ShortcutApi) {\n const {\n action_id,\n action_type,\n res_id,\n view_id,\n overrideUnsettedLimit = false,\n values = {},\n } = shortcut;\n const action = `${action_type},${action_id}`;\n\n const dataForAction = await ConnectionProvider.getHandler().getActionData({\n action,\n context: rootContext,\n });\n const parsedContext = parseContext({\n context: dataForAction.context,\n values: { ...globalValues, ...values },\n fields: {},\n });\n\n const parsedDomain = dataForAction.domain\n ? await ConnectionProvider.getHandler().evalDomain({\n domain: dataForAction.domain,\n values: { ...globalValues, ...values },\n context: { ...rootContext, ...parsedContext },\n })\n : [];\n\n const {\n res_model: model,\n views,\n name: title,\n target,\n view_type,\n limit,\n } = dataForAction;\n const treeExpandable = view_type === \"tree\";\n\n const finalViews = [];\n\n for (const viewArray of views) {\n const [id, viewType] = viewArray;\n\n if (!id) {\n if (viewType === \"dashboard\") {\n finalViews.push([undefined, \"dashboard\"]);\n } else {\n const { view_id } = await ConnectionProvider.getHandler().getView({\n model,\n type: viewType,\n id,\n context: { ...rootContext, ...parsedContext },\n });\n finalViews.push([view_id, viewType]);\n }\n } else {\n finalViews.push(viewArray);\n }\n }\n\n let id, type;\n if (view_id === undefined || view_id === null) {\n const view = finalViews.find((view: any[]) => {\n return view[0] === undefined;\n });\n id = undefined;\n type = view[1];\n } else {\n [id, type] = finalViews.find((view: any[]) => {\n if (view[0] === undefined) {\n return false;\n }\n return view[0] === view_id;\n });\n }\n\n const initialView = { id, type };\n\n openAction({\n domain: parsedDomain,\n context: { ...rootContext, ...parsedContext },\n model,\n views: finalViews,\n title,\n target,\n initialView,\n action_id,\n action_type,\n res_id,\n treeExpandable,\n limit:\n overrideUnsettedLimit && (limit === 0 || limit === false)\n ? DEFAULT_SEARCH_LIMIT\n : limit,\n });\n }\n\n async function openDefaultActionForModel({\n model,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain,\n }: {\n model: string;\n values?: any;\n forced_values?: any;\n initialViewType?: ViewType;\n res_id?: number;\n domain?: any;\n }) {\n const actionString =\n await ConnectionProvider.getHandler().getActionStringForModel(model);\n await retrieveAndOpenAction({\n action: actionString,\n values,\n forced_values,\n initialViewType,\n res_id,\n domain,\n });\n }\n\n async function openAction({\n domain,\n context,\n model,\n views,\n title,\n target,\n initialView,\n action_id,\n action_type,\n res_id,\n values,\n forced_values,\n treeExpandable = false,\n limit,\n }: {\n domain: any;\n context: any;\n model: string;\n views: any[];\n title: string;\n target: string;\n initialView: InitialViewData;\n action_id: number;\n action_type: string;\n res_id?: number | boolean;\n values?: any;\n forced_values?: any;\n treeExpandable?: boolean;\n limit?: number;\n }) {\n const key = nanoid();\n\n if (target !== \"current\") {\n const formView = (await ConnectionProvider.getHandler().getView({\n model,\n type: \"form\",\n id: initialView.type === \"form\" ? initialView.id : undefined,\n context: { ...rootContext, ...context },\n })) as FormView;\n\n (contentRootProvider.current as any).openActionModal({\n domain,\n model,\n formView,\n context: { ...rootContext, ...context },\n actionData: {\n action_id,\n action_type,\n res_id,\n view_id: formView.view_id,\n },\n });\n } else {\n const formattedInitialView =\n initialView && Array.isArray(initialView.id)\n ? { ...initialView, id: initialView.id[0] }\n : initialView;\n\n addNewTab({\n title,\n action: {\n id: action_id,\n type: action_type,\n },\n content: (\n <ActionView\n action_id={action_id}\n action_type={action_type}\n tabKey={key}\n title={title}\n views={views}\n model={model}\n context={{ ...rootContext, ...context }}\n domain={domain}\n setCanWeClose={registerViewCloseFn}\n initialView={formattedInitialView}\n res_id={res_id}\n formDefaultValues={values}\n formForcedValues={forced_values}\n treeExpandable={treeExpandable}\n limit={limit}\n />\n ),\n key,\n });\n }\n }\n\n return (\n <TabManagerProvider\n openShortcut={openShortcut}\n openAction={openAction}\n openRelate={openRelate}\n openDefaultActionForModel={openDefaultActionForModel}\n tabs={tabs}\n activeKey={activeKey}\n onRemoveTab={async (key: string) => {\n const canWeCloseFn = tabViewsCloseFunctions.current.get(key as string);\n const canWeClose = await canWeCloseFn?.();\n\n if (canWeClose || activeKey === \"welcome\") {\n remove(key as string);\n }\n }}\n onChangeTab={(key: string) => {\n setActiveKey(key);\n }}\n >\n <ContentRootProvider\n ref={contentRootProvider}\n globalValues={globalValues}\n >\n {children}\n </ContentRootProvider>\n </TabManagerProvider>\n );\n}\n\nexport default forwardRef(RootView);\n","import React from \"react\";\nimport { CloseOutlined } from \"@ant-design/icons\";\nimport { theme } from \"antd\";\nconst { useToken } = theme;\n\ntype TabProps = {\n tabKey: string;\n label: string;\n onClose: (key: string) => void;\n isActive: boolean;\n onSelected: (key: string) => void;\n};\n\nfunction Tab(props: TabProps) {\n const { label, onClose, tabKey, isActive, onSelected } = props;\n const { token } = useToken();\n const bgColor = isActive ? token.colorBgContainer : token.colorPrimaryBg;\n\n return (\n <div\n onClick={() => {\n !isActive && onSelected(tabKey);\n }}\n style={{\n cursor: \"pointer\",\n height: 40,\n paddingTop: 7,\n paddingBottom: 5,\n paddingLeft: 10,\n paddingRight: 10,\n backgroundColor: bgColor,\n display: \"inline-flex\",\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderTopLeftRadius: token.borderRadius,\n borderTopRightRadius: token.borderRadius,\n marginLeft: 2,\n }}\n >\n <div\n style={{\n color: token.colorPrimaryActive,\n userSelect: \"none\",\n height: 40,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n paddingLeft: 5,\n paddingRight: 5,\n marginBottom: 2,\n fontWeight: isActive ? 500 : \"normal\",\n }}\n >\n {label}\n </div>\n <div\n style={{\n paddingLeft: 5,\n height: 40,\n\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <CloseOutlined\n style={{\n color: token.colorPrimaryActive,\n }}\n onClick={(e) => {\n e.stopPropagation();\n onClose(tabKey);\n }}\n />\n </div>\n </div>\n );\n}\n\nexport default Tab;\n","import React, { useContext, useState } from \"react\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport Tab from \"./tabs/Tab\";\n\nfunction TabSelector() {\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { activeKey, tabs, onRemoveTab, onChangeTab } = tabManagerContext || {};\n\n return (\n <>\n {tabs.map((tab: any) => (\n <Tab\n key={tab.key}\n tabKey={tab.key}\n label={tab.title}\n onClose={onRemoveTab}\n isActive={activeKey === tab.key}\n onSelected={onChangeTab}\n />\n ))}\n </>\n );\n}\n\nexport default TabSelector;\n","import React, { useContext } from \"react\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\n\ntype Props = {\n tab: any;\n};\n\nfunction TabContent(props: Props) {\n const { tab } = props;\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { activeKey } = tabManagerContext || {};\n\n const hiddenStyle: any = {\n display: \"none\",\n };\n\n return (\n <div style={tab.key !== activeKey ? hiddenStyle : undefined}>\n {tab.content}\n </div>\n );\n}\n\nexport default React.memo(TabContent, () => true);\n","import React, { useContext } from \"react\";\n\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport TabContent from \"./TabContent\";\n\nfunction CurrentTabContent() {\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const { tabs } = tabManagerContext || {};\n\n const tabsToRender =\n tabs?.map((tab) => <TabContent key={tab.key} tab={tab} />) || null;\n\n return <>{tabsToRender}</>;\n}\n\nexport default CurrentTabContent;\n","import {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { TableOutlined, FormOutlined, EditOutlined } from \"@ant-design/icons\";\nimport { Tooltip, theme } from \"antd\";\nimport {\n TabManagerContext,\n TabManagerContextType,\n} from \"@/context/TabManagerContext\";\nimport {\n useLocale,\n FavouriteButton as FavouriteButtonUi,\n FavouriteButtonRef,\n DropdownMenuGroup,\n DropdownMenuItem,\n} from \"@gisce/react-formiga-components\";\nconst { useToken } = theme;\n\nexport type ShortcutApi = {\n action_id: number;\n action_type: string;\n id?: number;\n name: string;\n res_id: number | boolean;\n res_model: string;\n view_id: number;\n view_type: string;\n overrideUnsettedLimit?: boolean;\n values?: any;\n};\n\nexport type FavouriteOptions = {\n action_id: number;\n action_type: string;\n res_id: number | boolean;\n view_id: number;\n};\n\ntype Props = {\n onRetrieveShortcuts: () => Promise<ShortcutApi[]>;\n onCheckIsFavourite: (options: FavouriteOptions) => Promise<number | boolean>;\n onAddFavourite: (options: FavouriteOptions) => Promise<number>;\n onRemoveFavourite: (shortcut_id: number) => Promise<void>;\n onDropdownClosed?: () => void;\n};\n\nconst FavouriteButton = (props: Props) => {\n const {\n onRetrieveShortcuts,\n onCheckIsFavourite,\n onAddFavourite,\n onRemoveFavourite,\n onDropdownClosed,\n } = props;\n\n const [isFavourite, setIsFavourite] = useState(false);\n const [currentShortcutId, setCurrentShortcutId] = useState<number>();\n const { t } = useLocale();\n\n const { token } = useToken();\n const favouriteButtonRef = useRef<FavouriteButtonRef>(null);\n\n const tabManagerContext = useContext(\n TabManagerContext,\n ) as TabManagerContextType;\n const {\n openShortcut,\n tabs,\n activeKey,\n currentView,\n currentId,\n openDefaultActionForModel,\n } = tabManagerContext || {};\n\n const favouriteQuery = useMemo(() => {\n if (!currentView || !currentView.view_id || !(currentView as any).extra) {\n return;\n }\n\n const { action_id, action_type } = (currentView as any).extra || {};\n\n if (!action_id || !action_type) {\n setIsFavourite(false);\n return;\n }\n\n const view_id = currentView.view_id!;\n let res_id: boolean | number = false;\n\n if (currentView.type === \"form\") {\n res_id = currentId ? (currentId as number) : false;\n }\n\n return {\n action_id,\n action_type,\n view_id,\n res_id,\n };\n }, [currentId, currentView]);\n\n const favouriteQueryString = useMemo(() => {\n if (!favouriteQuery) {\n return;\n }\n return JSON.stringify(favouriteQuery);\n }, [favouriteQuery]);\n\n useEffect(() => {\n checkFavourite();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [favouriteQueryString]);\n\n function handleMenuClick(item: DropdownMenuItem) {\n const shortcut = item as ShortcutApi;\n if (shortcut?.action_type === \"ir.actions.wizard\") {\n return;\n }\n openShortcut(shortcut);\n }\n\n const checkFavourite = useCallback(async () => {\n if (!favouriteQuery) {\n return;\n }\n\n const result = await onCheckIsFavourite(favouriteQuery);\n\n if (result !== false) {\n setCurrentShortcutId(result as number);\n }\n\n setIsFavourite(result !== false);\n }, [favouriteQuery, onCheckIsFavourite]);\n\n async function editFavourites() {\n favouriteButtonRef?.current?.close();\n openDefaultActionForModel?.({ model: \"ir.ui.view_sc\" });\n }\n\n const getShortcuts = useCallback(async (): Promise<DropdownMenuGroup[]> => {\n const shortcuts = await onRetrieveShortcuts();\n\n if (shortcuts.length === 0) {\n return [\n {\n label: t?.(\"no_favorites\"),\n items: [],\n },\n ];\n }\n\n const items: DropdownMenuItem[] = shortcuts.map((shortcut) => {\n return {\n ...shortcut,\n id: shortcut.id,\n name: shortcut.name,\n icon:\n shortcut.view_type === \"tree\" ? <TableOutlined /> : <FormOutlined />,\n } as DropdownMenuItem;\n });\n\n return [\n {\n items,\n },\n ];\n }, [onRetrieveShortcuts, t]);\n\n const toggleFavourite = useCallback(async () => {\n if (isFavourite && currentShortcutId) {\n await onRemoveFavourite(currentShortcutId);\n } else {\n if (!currentView) {\n return;\n }\n\n const currentTab = tabs.find((t) => t.key === activeKey);\n const { id: action_id, type: action_type } = currentTab?.action || {};\n const view_id = currentView.view_id!;\n let res_id: boolean | number = false;\n\n if (!action_id || !action_type) {\n setIsFavourite(false);\n return;\n }\n\n if (currentView.type === \"form\") {\n res_id = currentId ? (currentId as number) : false;\n }\n\n await onAddFavourite({\n action_id,\n action_type,\n view_id,\n res_id,\n });\n }\n\n await getShortcuts();\n setIsFavourite(!isFavourite);\n }, [\n activeKey,\n currentId,\n currentShortcutId,\n currentView,\n getShortcuts,\n isFavourite,\n onAddFavourite,\n onRemoveFavourite,\n tabs,\n ]);\n\n return (\n <FavouriteButtonUi\n ref={favouriteButtonRef}\n isFavourite={isFavourite}\n onToggleFavourite={toggleFavourite}\n onItemClick={handleMenuClick}\n placement={\"bottomRight\"}\n header={\n <div style={{ width: 300, padding: 5, display: \"flex\" }}>\n <div style={{ paddingLeft: 15, color: \"#ccc\" }}>\n {t?.(\"favorites\").toUpperCase()}\n </div>\n <div style={{ flexGrow: 1, paddingLeft: 10 }}>\n <Tooltip title={t?.(\"edit_favorites\")}>\n <EditOutlined\n style={{ color: token.colorPrimary, cursor: \"pointer\" }}\n onClick={editFavourites}\n />\n </Tooltip>\n </div>\n </div>\n }\n onOpenChange={(open: boolean) => {\n if (!open) {\n onDropdownClosed?.();\n }\n }}\n onRetrieveData={getShortcuts}\n />\n );\n};\n\nexport default FavouriteButton;\n"],"names":["Text","Title","Typography","useToken","theme","alignClass","Label","props","ooui","align","responsiveBehaviour","label","tooltip","fieldForLabel","labelSize","labelType","labelText","labelAlgin","token","TextType","jsxs","jsx","Tooltip","QuestionCircleOutlined","Interweave","Field","children","layout","valuePropName","showLabel","alignLabel","required","type","validator","id","t","useLocale","rules","formItem","Form","labelWidget","LabelOoui","Row","Col","Fragment","confirm","Modal","showDialog","onOk","confirmMessage","okText","cancelText","ExclamationCircleOutlined","FormContext","React","FormProvider","activeId","activeModel","setFieldValue","getFieldValue","executeButtonAction","getContext","getValues","getPlainValues","domain","submitForm","fetchValues","formHasChanges","elementHasLostFocus","getFields","formView","iconMapping","iconMapper","key","getIconForKey","toCamelCase","word","w","IconCamelCase","antKey","AntIcons","tablerKey","TablerIcons","TablerIcon","_a","Icon","Button","activated","buttonType","icon","context","readOnly","formContext","useContext","isRunning","setIsRunning","useState","onClick_confirm","onClick","showConfirmDialog","getButtonIcon","LoadingOutlined","AntButton","ButtonGroup","defaultButton","secondaryButtons","caption","primary","FieldOoui","Dropdown","DownOutlined","Items","items","button","danger","Menu","MODAL_WIDTH_CONSTANT","getWindowDimensions","width","height","useWindowDimensions","windowDimensions","setWindowDimensions","useEffect","handleResize","_ConnectionProvider","handler","__publicField","ConnectionProvider","parseError","errorResponse","message","title","splitted","args","error","warning","err","WarningOutlined","TranslationModal","visible","onCloseModal","model","field","onSubmitSucceed","modalWidth","langs","setLangs","isLoading","setIsLoading","submitLoading","setSubmitLoading","valuesForLangs","setValuesForLangs","originalValuesForLangs","useRef","fetchData","getLangs","getValuesForLangs","showErrorDialog","item","retrievedValuesForLang","lang","retrievedValue","getInputsForLangs","i","TextArea","event","onSubmit","langCode","content","Spin","Divider","Space","CloseOutlined","CheckOutlined","ButtonWithTooltip","restProps","info","Char","isSearchField","isPassword","translatable","requiredStyle","input","Input","TranslatableChar","value","onChange","translationModalVisible","setTranslationModalVisible","showInfo","TranslationOutlined","defaultAlgorithm","defaultSeed","mapToken","Option","Select","Selection","SelectionInput","selectionValues","values","options","entry","RequiredSelect","option","styled","Boolean","BooleanInput","RequiredCheckbox","AntCheckbox","getFilesize","base64string","inKbs","getMimeType","mimeInfo","fileTypeFromBuffer","toBase64","file","resolve","reject","reader","e","openBase64InNewTab","data","mimeType","byteCharacters","byteNumbers","byteArray","fileURL","Image","ImageInput","inputFile","triggerChange","changedValue","downloadFile","fileType","linkSource","downloadLink","onChangeFile","b64","clearFile","FolderOpenOutlined","DownloadOutlined","ClearOutlined","FiberGrid","FiberGridInput","GridUi","newValue","getTree","treeView","xml","fields","tree","TreeOoui","canRenderValue","getTableColumns","components","column","component","render","a","b","aItem","bItem","_b","getTableItems","treeOoui","results","parsedItem","widget","Reference","Many2one","getColorMap","colorsValue","getItemsAttributes","getStatusMap","attributes","attribute","map","sortResults","resultsToSort","sorter","desc","order","sortFn","hasActualValues","obj","readObjectValues","currentView","operationsToRead","temporalItems","idsToFetch","fieldsToRetrieve","evaluatedColorsForTree","colors","filteredValues","result","resultFormValues","fetchedItemValues","itemValues","itemWithFetchedValues","getNextPendingId","negativeIds","convertToPlain2ManyValues","convertFrom2ManyRawValues","formattedValues","itemsId","itemId","filterDuplicateItems","ids","index","getValuesForFields","Timeline","relation","oouiViews","setError","views","setViews","useDeepCompareEffect","getViewData","Alert","TimelineInput","showFormModal","setShowFormModal","modalItem","setModalItem","summaryField","titleField","itemsToShow","itemsWithValues","AntTimeline","searchItem","FormModal","ca_ES","en_US","es_ES","strings","defaultConfigContext","ConfigContext","useConfigContext","useFeatureIsEnabled","featureKey","erpFeatures","ConfigContextProvider","memo","locale","localizedStrings","globalValues","rootContext","devMode","providerValue","useMemo","FormigaConfigProvider","mergeStrings","fetchAction","actionId","actionType","action","dataForAction","parsedContext","parseContext","parsedDomain","limit","view_type","treeExpandable","finalViews","viewArray","viewType","view_id","initialView","nanoid","useFormGraphData","loading","setLoading","actionData","setActionData","treeShortcut","setTreeShortcut","view","action_id","action_type","name","res_model","CenteredSpinner","ErrorAlert","className","messageContent","messageType","useNetworkRequest","fn","abortControllersRef","cancelRequest","useCallback","payload","manualRequestId","requestId","abortController","controller","fontGrowFactor","minFontSize","GraphIndicatorComp","setHeight","setWidth","totalValue","percent","color","suffix","showPercent","Measure","contentRect","measureRef","PercentageIndicator","CommonIndicator","getTextWidth","text","font","total","fontSize","localeValue","finalValue","tw","IconElement","twoLinesHeight","percentValue","getValueForOperator","graphProcessor","GraphIndicator","colorCondition","totalDomain","iconProps","operator","manualIds","setValue","setPercent","setTotalValue","setColor","setIcon","searchAllIds","readObjects","searchCount","evalDomain","parseCondition","fetchValue","isTotal","fetchTotalValue","resultIds","r","totalRetrievedValue","conditionEval","iconEval","processGraphData","getFieldsToRetrieve","graphFieldUtils","useGraphData","opts","uninformedString","processedValues","setProcessedValues","evaluatedEntries","setEvaluatedEntries","setType","search","parseGraph","retrieveData","_processedValues","getFieldsForModel","methods","fieldsDefinition","dayjs","advancedFormat","customParseFormat","isoWeek","timezone","duration","relativeTime","weekday","localeData","formatter","graphType","object","formattedValue","axisFormatter","stringIsValidNumeric","isNumber","isValidDateString","dateType","getDateType","dateFormats","DefaultGraphOptions","variable","dateString","format","PieLabelOptions","calculateAdjustedPiePercentages","acc","roundedPercentages","p","num","types","Line","Column","Pie","GraphChartComp","isGroup","isStack","numItems","pieTotal","piePercents","getPercentValueForX","x","matchedDataEntry","d","pieItemValueFormatter","_","pieLabelFormatter","Chart","getGraphProps","graphProps","GraphDefaults","GraphChart","DEFAULT_SEARCH_LIMIT","ActionViewContext","createContext","ActionViewProvider","titleProps","setCurrentView","availableViews","formRef","searchTreeRef","onNewClicked","currentId","setCurrentId","setResults","currentItemIndex","setCurrentItemIndex","currentModel","setSorter","totalItems","setTotalItems","setSelectedRowItems","selectedRowItems","searchTreeNameSearch","setSearchTreeNameSearch","goToResourceId","limitProps","formIsSaving","setFormIsSaving","setFormHasChanges","removingItem","setRemovingItem","formIsLoading","setFormIsLoading","treeIsLoading","setTreeIsLoading","attachments","setAttachments","duplicatingItem","setDuplicatingItem","searchParams","setSearchParams","searchVisible","setSearchVisible","graphIsLoading","setGraphIsLoading","previousView","setPreviousView","searchValues","setSearchValues","setLimit","setTitle","callOnFormSave","GraphComp","ref","graphOoui","setGraphOoui","graphXml","setGraphXml","actionViewContext","getView","useImperativeHandle","viewData","graph","indicator","indicatorFieldopts","Graph","forwardRef","ErpFeatureKeys","ErpAllFeatureKeys","useServerGraphData","graphData","setGraphData","readForView","chart","GraphServer","TabManagerContext","TabManagerProvider","openAction","openRelate","openDefaultActionForModel","openShortcut","activeKey","onChangeTab","onRemoveTab","tabs","GraphCard","parms","hasDragAndDrop","ExportOutlined","ErrorBoundary","Indicator","hasActionId","GraphIndicatorInput","IndicatorInput","Statistic","Card","readForViewEnabled","tabManagerContext","GraphComponent","boolValue","processValues","getTouchedValues","source","target","differences","sourceValue","targetValue","isValidMany2OneValue","numericId","targetNumericId","checkFieldsType","changedFields","formOoui","fieldType","mergeFieldsDomain","fieldsDomain","output","getValuesForDomain","getOnChangePayload","onChangeFieldActionArgs","parentValues","arg","splittedArg","parentKey","mergeSearchFields","searchFields","mergedSearchFields","sf","onlyUnique","self","transformPlainMany2Ones","reformattedValues","colorFromString","hash","hexColour","stringFormat","match","Tag","TagInput","colorValue","CustomTag","style","isPresetStatusColor","isPresetColor","AntdTag","Tags","TagsInput","setOptions","isLoadingOptions","setIsLoadingOptions","fetchOptions","params","evaluatedDomain","onChangeSelected","newItems","currentIds","tagRender","closable","onClose","onPreventMouseDown","element","getWidgetType","Tree","Notebook","Group","Integer","Float","ProgressBar","Date","DateTime","Time","One2many","Separator","Binary","Url","Email","FloatTime","MultiCheckbox","Markdown","Radio","Switch","Steps","CodeEditor","CommentsTimelineField","HTMLPreview","createReactWidget","widgetClass","createElement","getSpanStyleForItem","fillRowWithEmptiesToFit","row","mustFillWithEmpties","numberOfColumns","rowWithEmptiesToFit","totalColSpan","isLastItemAndMustFit","columnIndex","gapsToAdjust","gapsToFill","expandWidgetsIfNeeded","getSingleRowTemplateColumns","gridOptions","Container","columnsToAdd","getTemplateColumns","columns","fieldInRows","odd","even","templateColumns","getMaxColspanForRows","rows","prev","current","container","maxColspanForRows","firstRow","rowWithoutInvisibleFields","rowWithExpandedItems","onCancel","FormModalContext","FormModalProvider","ContentRootContext","callRefreshValues","fns","ContentRootProvider","reportInProgressInterval","waitingForReport","reportGenerating","setReportGenerating","onRefreshParentValues","openActionModal","actionModalVisible","setActionModalVisible","actionModalOptions","setActionModalOptions","generateReport","reportData","reportContext","datas","report_name","idsToExecute","reportContextParsed","newReportId","evaluateReportStatus","reportState","processAction","onRefreshParentValuesFn","runAction","_actionData","responseContext","mergedContext","getViewsAndInitialView","openNewActionModal","onFormModalSucceed","view_mode","retriedViewData","viewTypes","retrievedViewId","ContentRootProvider$1","mergeFieldsContext","contextFields","WIDTH_BREAKPOINT","propsOnCancel","propsOnSubmitSucceed","showFooter","getDataFromAction","onFieldsChange","propsOnSubmitError","mustClearAfterSave","submitMode","valuesProps","formViewProps","postSaveAction","insideButtonModal","parentContext","actionDomain","rootForm","defaultValues","forcedValues","parentWidth","onMustRefreshParent","isSubmitting","setIsSubmitting","setFormOoui","antForm","AntForm","arch","setArch","setFields","formModalContext","containerWidth","setContainerWidth","defaultGetCalled","setDefaultGetCalled","createdId","originalFormValues","lastAssignedValues","warningIsShown","formSubmitting","x2manyPendingLink","parentId","getParentPlainValues","mustFetchParentValues","contentRootContext","cancelUnsavedChanges","checkFieldsChanges","formValues","onSubmitError","getCurrentId","getCurrentValues","getAdditionalValues","val","getFormValues","getActiveIdsContext","getDefaultValues","currentValues","assignNewValuesToForm","checkIfFormHasErrors","getFormView","_fields","_arch","hasDefaultGetCalled","fetchValuesFromApi","parseForm","showUnsavedChangesDialog","newValues","reset","isDefaultGet","mergedValues","valuesProcessed","fieldsToUpdate","fieldName","fieldValue","getFormOoui","submitApi","callOnSubmitSucceed","touchedValues","newId","submitValues","submitSucceed","formErrorsDialog","operationInProgress","FormOoui","evaluateChanges","debouncedCheckFieldsChanges","debounce","changedField","processFieldOnChange","onChangeFieldAction","response","valuesWith2ManyValuesConverted","proccessedFields","runObjectButton","runWorkflowButton","runActionButton","closeParent","updateOperationInProgress","mustBlockButtons","additionalContext","updatedContext","footer","Form$1","buttonModal","isMenuAction","rest","formTitle","setFormTitle","isFavourite","setIsFavourite","currentShortcutId","setCurrentShortcutId","res_id","checkFavourite","toggleFavourite","header","StarFilled","StarOutlined","contentWidth","DateRangePicker","DatePicker","TimePicker","numberOfSelectsToHide","picker","pickerSelectedTimes","AntTimePicker","DateTimeRangePicker","TimeRangePicker","decimalDigits","InputNumber","newNumber","PairFields","Widget","IntegerOoui","getWidget","MultiSelection","MultiSelectionInput","optionValueKeyPair","optionKey","CustomSelect","handleChange","changedValues","keysForChangedValues","SearchField","SearchFieldTypes","SelectionOoui","SearchBottomBar","onAdvancedFilterToggle","advancedFilter","onClear","isSearching","UpOutlined","SearchOutlined","SearchParams","onLimitChange","limitOoui","offsetOoui","convertBooleanParamIfNeeded","getParamsForFields","widgetContainer","removeUndefinedFields","groupedDateTime","groupDateTimeValuesIfNeeded","groupedValues","ungroupDateValuesIfNeeded","getParamForField","curVal","filteredKey","valueEntry","getDatetimeDateFields","removeDateTimeSingleFields","datePair","baseKey","timeKey","timePair","from","to","timeValueFrom","timeValueTo","dateFields","getUniqueFieldsForParams","uniqueFields","param","mergeParams","domainParams","finalParams","uniqueParams","SearchFilter","offset","setSearchFilterHeight","searchError","showLimitOptions","simpleSearchFields","setSimpleSearchFields","advancedSearchFields","setAdvancedSearchFields","setAdvancedFilter","sfo","form","getRowsAndCols","j","SearchFilterOoui","onFinish","newParams","metrics","calculateColumnsWidth","maxWidthPerCell","columnsWithWidth","indexColumn","columnWidth","cellValue","cellWidth","tableWidth","SelectAllRecordsRow","numberOfVisibleSelectedRows","totalRecords","numberOfTotalRows","onSelectAllRecords","numberOfRealSelectedRows","translations","handleClick","selectRowsComponent","Link","allRowsAreSelected","parseStringToFloat","parseFloatToString","finalString","hours","mins","hoursString","minsStrings","ProgressBarInput","textValue","StyledProgress","Progress","Many2oneSuffixOoui","onRetrieveData","onItemClick","onOpenChange","printModalVisible","setPrintModalVisible","setData","fetchMenuItems","actionItems","relateItems","printItems","ThunderboltOutlined","PrinterOutlined","EnterOutlined","Many2OneSuffixUi","open","Many2OneSuffixModal","Many2oneSuffix","setFormView","targetValues","setTargetValues","cancelGetViewRequest","cancelReadObjectsRequest","cancelRequests","handleMenuClick","commonParams","toolbar","extractedFields","toolbarField","parseContextFields","parseDomainFields","Many2oneTree","m2oField","ReferenceTree","setName","intId","fetchName","nameResponse","selectionDescription","Avatar","backgroundColor","AntdAvatar","DatePickerConfig","showTime","DatePickerInput","mode","onValueStringChange","momentDate","dateValue","AntDatePicker","BooleanComponent","Checkbox","Many2OneComponent","TextComponent","DateComponent","DateTimeComponent","One2ManyComponent","length","ProgressBarComponent","FloatTimeComponent","NumberComponent","ImageComponent","TagComponent","SelectionComponent","selectionKey","ReferenceComponent","AvatarComponent","TagsComponent","setValues","loadValues","optionsRead","v","tags","COLUMN_COMPONENTS","UnmemoizedTree","page","onRequestPageChange","onRowClicked","showPagination","selectedRowKeys","onRowSelectionChange","scrollY","colorsForResults","statusForResults","onChangeSort","onFetchChildrenForRecord","childField","rootTree","readonly","tableRef","setItems","errorInParseColors","setTreeOoui","internalLimit","summary","pagination","AntPagination","sums","sumFields","it","sumItems","sumField","dataTable","adjustedHeight","GisceTable","record","Badge","PlusSquareOutlined","MinusSquareOutlined","useSearch","nameSearch","searchNameGetDoneRef","setActionViewTotalItems","setResultsActionView","resultsActionView","clearSelection","tableRefreshing","setTableRefreshing","searchFilterLoading","setSearchFilterLoading","setSearchError","setPage","setOffset","resultsInternal","setResultsInternal","setColorsForResults","setStatusForResults","originalResults","getResults","searchByNameSearch","searchResults","resultsIds","status","attrs","resultsWithData","resultsData","newResultIds","resultsSorted","newOffset","mergedParams","attrsEvaluated","newCurrentItemIndex","totalItemsValue","fetchResults","changeSort","newSorter","sortedResults","submit","newLimit","requestPageChange","clear","fetchChildrenForRecord","child_id","getAllIds","SearchTree","treeViewProps","treeScrollY","onChangeSelectedRowKeys","initialFetchDone","setInitialFetchDone","setCurrentModel","setTreeView","initialError","setInitialError","searchFilterHeight","expandableClickActionData","changeSelectedRowKeys","newSelectedRowKeys","limitUsedInSearch","fetchModelData","_formView","_treeView","onSearchTreeLimitChange","treeButOpen","onRowClickedHandler","selectAllRecords","allIds","calculatedTableHeight","SearchTree$1","showErrorExceptionDialog","SearchModal","onCloseModalProps","onSelectValuesProps","showCreateModal","setShowCreateModal","modalHeight","setSelectedRowKeys","setOperationInProgress","onSelectValues","keys","FileAddOutlined","Many2oneInput","widgetDomain","showSearchModal","setShowSearchModal","searching","setSearching","searchText","setSearchText","searchButtonTappedRef","inputText","setInputText","inputTextRef","transformedDomain","searchDomain","setSearchDomain","fetchNameAndUpdate","onElementLostFocus","tryFetchFirstResultOrShowSearch","parseDomain","transformDomainForChildWidget","onKeyDown","RequiredInput","One2manyContext","One2manyProvider","itemIndex","setItemIndex","manualTriggerChange","setManualTriggerChange","AsyncConfirmModal","centered","confirmLoading","setConfirmLoading","setVisible","handleOk","closeModal","handleCancel","createRoot","asyncConfirm","config","root","showRemoveItemDialog","showUnlinkItemDialog","One2manyTopBar","titleString","onCreateItem","onToggleViewMode","onDelete","onPreviousItem","onNextItem","isMany2Many","onSearchItem","showCreateButton","showToggleButton","separator","deleteButton","ApiOutlined","DeleteOutlined","itemToShow","itemBrowser","LeftOutlined","RightOutlined","AlignLeftOutlined","ViewObjects","One2manyInput","fetchParentFormValues","continuousEntryMode","setContinuousEntryMode","originalSortItemIds","isMany2many","previousCurrentView","fetchDataIfNeeded","fetchOriginalItemsFromApi","_c","toggleViewMode","nextView","showFormChangesDialogIfNeeded","previousItem","nextItem","reloadOriginalValuesForFormItem","updatedFormObject","updatedTreeObject","updatedItems","callback","showRemoveConfirm","removeCurrentItem","removeSelectedItems","createItem","inv_field","itemsToRemove","idsToRemove","onFormModalSubmitSucceed","mustRefreshParent","nextId","onTreeRowClicked","itemsToLoadFrom","onSearchModalSelectValue","filteredIds","getTitle","ViewType","currentItemId","resultsToShow","_d","useOne2ManyDomain","formDomain","useOne2manyTree","firstVisibleRowIndex","selectedRowKeysRef","allRowSelectedMode","onChangeAllRowSelectedMode","onChangeFirstVisibleRowIndex","onGetFirstVisibileRowIndex","onGetSelectedRowKeys","useDeepCompareCallback","fetchedData","useOne2manyForm","currentItem","getOriginalItemsWithRestoredItemId","onFormChanges","newUpdatedItems","reloadOriginalValuesForCurrentItem","originalItems","useOne2manyItems","one2manyItems","useDeepCompareMemo","One2manyForm","useOne2manyRemove","getItemsToRemove","idCount","useOne2manyFormModal","onCancelFormModal","openItemInFormModal","useOne2manySearchModal","onCloseSearchModal","onSelectSearchValues","useOne2manyColumnStorage","dataForHash","getColumnState","columnState","getKey","updateColumnState","state","DEFAULT_HEIGHT","One2manyTree","onRowDoubleClick","onFetchRecords","gridRef","onGetFirstVisibleRowIndex","onAllRowSelectedModeChange","internalGridRef","prevItemsValue","itemsRef","totalRows","onRequestData","startRow","endRow","itemsToFetch","idsToFetchSliced","realIdsToFetch","otherItems","preparedResults","resultsMapped","onRowStyle","InfiniteTable","SUPPORTED_VIEWS","widgetContext","onTreeFetchRows","parentViewId","m","One2manyInputInfinite","FloatTimeInput","FieldSet","TabPane","Tabs","getPageIcon","TranslatableText","useExport","selectedRegistersToExport","exportModelFields","onExport","exportDomain","addIdToRelationFields","onGetFields","convertToExportFields","onGetFieldChilds","optsForField","getFieldDefinition","getChildKey","onGetPredefinedExports","predefinedExports","listPredefinedExports","keysWithChilds","retrieveKeyFieldsForPredefinedExports","pExport","childKey","onRemovePredefinedExport","getModelFields","fieldsForModel","onSavePredefinedExport","fieldsForExport","fieldsForExportLine","exportId","exportFields","valuesForField","relationField","isRelationField","compoundId","fieldDefinition","getParentKey","parentTitle","pExports","exportLinesIds","exp","exportLinesObjects","getKeysWithoutChildsInFields","splitAndSortKeys","allPredefinedExportKeys","keysWithoutChildsInFields","childs","keysMap","subKeys","subKey","currentKey","aLevels","bLevels","ExportModal","totalRegisters","visibleRegisters","ExportModalFmg","TimeInput","time","timestring","ReferenceInput","splittedValue","many2oneValue","setMany2oneValue","selectionValue","setSelectionValue","m2oValue","referenceValue","Many2oneOoui","BinaryInput","filenameField","filesize","fileName","openFile","EyeOutlined","iconsForViewTypes","TableOutlined","FormOutlined","AreaChartOutlined","CalendarOutlined","getIconForView","ChangeViewButton","onChangeView","disabled","dropdownData","idx","fallbackTitle","tryNavigate","selectedView","ActionButton","NewButton","onNewClickedProps","showLogInfo","translateFn","logInfo","create_date","create_uid","write_date","write_uid","AttachmentsButtonWrapper","numberOfAttachments","onAddNewAttachment","onOpenAttachmentLink","onOpenAttachmentDetail","onListAllAttachments","dropdownRef","LinkOutlined","attachment","right","AttachmentsButton","onViewAttachmentDetails","preloading","setPreloading","preloadedAttachments","setPreloadedAttachments","downloading","setDownloading","preloadAttachments","openAttachmentLink","retrievedAttachment","openAttachmentDetail","FormActionBar","onFormSave","tryRefresh","refreshChangesDialog","onNextClick","onPreviousClick","tryDelete","remove","filteredResults","newIndex","duplicate","mustDisableButtons","SaveOutlined","CopyOutlined","InfoCircleOutlined","ReloadOutlined","DropdownButton","saveDocument","report","relate","getAttachmentActionPayload","LinkInput","valueValidator","linkPrefix","editMode","setEditMode","showInput","setShowInput","EditOutlined","isURL","isEmail","GoToResourceModal","onIdSubmitted","inputRef","openInSameTab","handleSubmit","PlusOutlined","ButtonWithBadge","badgeNumber","GraphActionBar","refreshGraph","FilterOutlined","newView","TitleHeader","getSummary","reg","GraphActionView","graphRef","applyLimit","setApplyLimit","FormActionView","SearchBar","onSearch","mustShowClearSuffix","setMustShowClearSuffix","CloseCircleFilled","TreeActionBar","advancedExportEnabled","exportModalVisible","setExportModalVisible","hasNameSearch","searchString","itemClicked","idsToExport","TreeActionView","DashboardActionContext","DashboardActionProvider","moveItemsEnabled","setMoveItemsEnabled","dashboardRef","DashboardActionBar","BorderOuterOutlined","SettingOutlined","DashboardActionView","dashboardData","Dashboard","resolveViewInfoPromises","viewsToRetrieve","ActionView","setCanWeClose","tabKey","formDefaultValues","formForcedValues","setCurrentViewInternal","setAvailableViews","res_id_parsed","setCurrentIdInternal","gtResourceModalVisible","setGtResourceModalVisible","searchingForResourceId","setSearchingForResourceId","setCurrentViewTabContext","setCurrentIdTabContext","useHotkeys","handleGoToRecordShortcut","extra","canWeClose","viewDataRetrieved","getViewsPromises","viewsRetrieved","viewInfo","configAction","currentViewToAssign","initialViewWithData","resource","viewForm","ActionView$1","ResponsiveReactGridLayout","WidthProvider","Responsive","DashboardGrid","onPositionItemsChanged","child","DashboardTree","limitRef","paramsRef","totalItemsResult","fetchActionData","DashboardTree$1","DashboardForm","firstId","setFirstId","itemsField","dashboardItems","setDashboardItems","setActionBarLoading","itemsFields","boardFields","update","openConfigDashboard","fetchView","fetchDashboardItems","itemsWithActions","getItemsWithActions","fetchPromises","dashboardItem","promise","itemPositions","itemPosition","remotePosition","itemsToUpdateWithUpdatedPos","diff","diffItem","valueToUpdate","position","parmsParsed","childContent","formattedInitialView","Dashboard$1","MultiCheckboxInput","checkAll","uncheckAll","MarkdownInput","ReactMarkdown","remarkGfm","direction","RadioAnt","SwitchInput","AntdSwitch","StepsInput","errorField","AntdSteps","Editor","editor","Meta","Gravatar","email","size","gravatarUrl","md5","TextWithNewlines","textParts","part","Comment","CommentsTimeline","HTMLPreviewInput","alertType","getIcon","AntdAlert","Content","Layout","Welcome","RootView","setActiveKey","setTabs","tabViewsCloseFunctions","contentRootProvider","retrieveAndOpenAction","currentIndex","tab","registerViewCloseFn","forced_values","initialViewType","action_id_string","addNewTab","newTabs","relateData","shortcut","overrideUnsettedLimit","actionString","canWeCloseFn","RootView$1","Tab","isActive","onSelected","bgColor","TabSelector","TabContent","hiddenStyle","TabContent$1","CurrentTabContent","tabsToRender","FavouriteButton","onRetrieveShortcuts","onCheckIsFavourite","onAddFavourite","onRemoveFavourite","onDropdownClosed","favouriteButtonRef","favouriteQuery","favouriteQueryString","editFavourites","getShortcuts","shortcuts","currentTab","FavouriteButtonUi"],"mappings":"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"}