From 39db4053ae9ac0509f3354efc21a06f259c6546a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Wed, 11 Dec 2024 09:04:31 +0100 Subject: [PATCH 01/43] fix: wait for active_id in form indicators (#748) * fix: adjust form indicators to not to fetch data until active id is set https://github.com/gisce/webclient/issues/1483 * fix: adjust dependencies https://github.com/gisce/webclient/issues/1483 * fix: adjust graphcard content * fix: improve indicators with title --- src/context/FormContext.tsx | 26 +++++++++++- src/hooks/useFormGraphData.ts | 8 +++- src/locales/ca_ES.ts | 1 + src/locales/en_US.ts | 1 + src/locales/es_ES.ts | 1 + src/widgets/custom/Indicator.tsx | 42 ++++++++++++++----- .../views/Dashboard/dashboardHelper.ts | 20 +++++---- 7 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/context/FormContext.tsx b/src/context/FormContext.tsx index 09eb5c7ea..91b693d29 100644 --- a/src/context/FormContext.tsx +++ b/src/context/FormContext.tsx @@ -1,4 +1,4 @@ -import React, { useRef, useState } from "react"; +import React, { useContext, useRef, useState } from "react"; import { FormView } from ".."; export type FormContextType = { @@ -80,4 +80,28 @@ const FormProvider = (props: FormProviderProps): any => { ); }; +export const useFormContext = () => { + const context = useContext(FormContext) as FormContextType; + if (!context) { + return { + activeId: undefined, + activeModel: "", + setFieldValue: () => {}, + getFieldValue: () => "", + executeButtonAction: async () => {}, + getContext: async () => ({}), + getValues: async () => ({}), + getPlainValues: () => ({}), + getFields: async () => ({}), + domain: [], + submitForm: async () => ({ succeed: false, id: 0 }), + fetchValues: () => {}, + formHasChanges: () => false, + elementHasLostFocus: () => {}, + formView: undefined, + } as FormContextType; + } + return context; +}; + export default FormProvider; diff --git a/src/hooks/useFormGraphData.ts b/src/hooks/useFormGraphData.ts index 485f130e7..199727eaf 100644 --- a/src/hooks/useFormGraphData.ts +++ b/src/hooks/useFormGraphData.ts @@ -12,7 +12,7 @@ export const useFormGraphData = (actionId: number) => { const formContext = useContext(FormContext) as FormContextType; const { getContext, getPlainValues, activeId } = formContext || {}; const { globalValues, rootContext } = useConfigContext(); - const context = useMemo(() => { + const context: any = useMemo(() => { return { ...getContext?.(), ...rootContext }; }, [getContext, rootContext]); @@ -28,6 +28,12 @@ export const useFormGraphData = (actionId: number) => { ...getPlainValues(), }, }); + + if (!context.active_id) { + setActionData(result); + throw new Error("active_id_not_found"); + } + const { views } = result as any; const treeView = views.find((view: any[]) => { diff --git a/src/locales/ca_ES.ts b/src/locales/ca_ES.ts index 17a55e751..983500578 100644 --- a/src/locales/ca_ES.ts +++ b/src/locales/ca_ES.ts @@ -108,4 +108,5 @@ export default { resetTableView: "Restablir vista de taula", not: "No", loading: "Carregant...", + pendingToCalculate: "Pendent de calcular", }; diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 84e25139c..8726291b1 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -104,4 +104,5 @@ export default { resetTableView: "Reset table view", not: "Not", loading: "Loading...", + pendingToCalculate: "Pending to calculate", }; diff --git a/src/locales/es_ES.ts b/src/locales/es_ES.ts index 7f1dfe1dd..951cd0209 100644 --- a/src/locales/es_ES.ts +++ b/src/locales/es_ES.ts @@ -110,4 +110,5 @@ export default { resetTableView: "Restablecer vista de tabla", not: "No", loading: "Cargando...", + pendingToCalculate: "Pendiente de calcular", }; diff --git a/src/widgets/custom/Indicator.tsx b/src/widgets/custom/Indicator.tsx index 15475c222..eb9c52207 100644 --- a/src/widgets/custom/Indicator.tsx +++ b/src/widgets/custom/Indicator.tsx @@ -1,5 +1,5 @@ import React, { useContext, useEffect } from "react"; -import { Tooltip, theme, Statistic, Card } from "antd"; +import { Tooltip, theme, Statistic, Card, Empty } from "antd"; import { Indicator as IndicatorOoui } from "@gisce/ooui"; import { WidgetProps } from "@/types"; import Field from "@/common/Field"; @@ -18,6 +18,9 @@ import { TabManagerContextType, } from "@/context/TabManagerContext"; import { GraphCard } from "../views/Graph"; +import { useFormContext } from "@/context/FormContext"; +import { useLocale } from "@gisce/react-formiga-components"; +import styled from "styled-components"; const { useToken } = theme; type IndicatorProps = WidgetProps & { @@ -90,6 +93,7 @@ const GraphIndicatorInput = (props: IndicatorInputProps) => { const { ooui } = props; const { actionId, height } = ooui; + const { activeId } = useFormContext(); const { actionData, treeShortcut, loading, error, fetchData } = useFormGraphData(actionId!); @@ -107,9 +111,9 @@ const GraphIndicatorInput = (props: IndicatorInputProps) => { } fetchData(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ooui]); + }, [ooui, activeId]); - if (error) { + if (error && error.message !== "active_id_not_found") { return ; } @@ -127,15 +131,31 @@ const GraphIndicatorInput = (props: IndicatorInputProps) => { > {loading && } {!loading && ( - + <> + {!activeId ? ( + + ) : ( + + )} + )} ); }; + +const StyledEmpty = styled(Empty)` + &.ant-empty.ant-empty-normal { + margin: 0; + margin-top: 5px; + } +`; diff --git a/src/widgets/views/Dashboard/dashboardHelper.ts b/src/widgets/views/Dashboard/dashboardHelper.ts index fbf360475..6b2cc8259 100644 --- a/src/widgets/views/Dashboard/dashboardHelper.ts +++ b/src/widgets/views/Dashboard/dashboardHelper.ts @@ -25,13 +25,7 @@ export async function fetchAction({ fields: {}, }); - const parsedDomain = dataForAction.domain - ? await ConnectionProvider.getHandler().evalDomain({ - domain: dataForAction.domain, - values: globalValues, - context: { ...rootContext, ...parsedContext }, - }) - : []; + const finalContext = { ...rootContext, ...parsedContext }; const { res_model: model, @@ -42,6 +36,18 @@ export async function fetchAction({ } = dataForAction; const treeExpandable = view_type === "tree"; + if (!finalContext.active_id) { + return { title }; + } + + const parsedDomain = dataForAction.domain + ? await ConnectionProvider.getHandler().evalDomain({ + domain: dataForAction.domain, + values: globalValues, + context: finalContext, + }) + : []; + const finalViews = []; for (const viewArray of views) { From ae5f25a6ad7e73163ff7fca0ea56d2d63b2def26 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 11 Dec 2024 08:06:02 +0000 Subject: [PATCH 02/43] chore(release): 2.46.1 [skip ci] ## [2.46.1](https://github.com/gisce/react-ooui/compare/v2.46.0...v2.46.1) (2024-12-11) ### Bug Fixes * wait for active_id in form indicators ([#748](https://github.com/gisce/react-ooui/issues/748)) ([39db405](https://github.com/gisce/react-ooui/commit/39db4053ae9ac0509f3354efc21a06f259c6546a)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 872f5b36a..b00e0da26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.46.0", + "version": "2.46.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.46.0", + "version": "2.46.1", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index 44c03b549..a0719c765 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.46.0", + "version": "2.46.1", "engines": { "node": "20.5.0" }, From 3473685e8c0e74532b358933532b0a06ee2cc9a7 Mon Sep 17 00:00:00 2001 From: Gisce Date: Thu, 12 Dec 2024 14:58:45 +0100 Subject: [PATCH 03/43] feat: update gisce/ooui to v2.24.0 (#765) [skip ci] https://github.com/gisce/ooui/releases/tag/v2.24.0 Co-authored-by: mguellsegarra <5711443+mguellsegarra@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index b00e0da26..dc87e6f27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.22.0", + "@gisce/ooui": "2.24.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.8.5", "@monaco-editor/react": "^4.4.5", @@ -3370,9 +3370,9 @@ } }, "node_modules/@gisce/ooui": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.22.0.tgz", - "integrity": "sha512-q7ZUY7hMBQtTo+E+SJ3blVnsSdYKf7oMPn+ppwWXLLXoZBZEWI52qkNXO6ukGl3l6YjftujmE0AFN3U4sICpgg==", + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.24.0.tgz", + "integrity": "sha512-2a3lzDqi5dbTn1rsEF+XZy/OkKlxdG6V7glK3dSCgblx+lxcUKKm02GQ7y5wUvK1H/m5BS7h53lAXAlvZlt0KQ==", "dependencies": { "@gisce/conscheck": "1.0.9", "html-entities": "^2.3.3", diff --git a/package.json b/package.json index a0719c765..ee0ede954 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.22.0", + "@gisce/ooui": "2.24.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.8.5", "@monaco-editor/react": "^4.4.5", From 64a48bda769544822f343c1c9962faa127ca4d3d Mon Sep 17 00:00:00 2001 From: Eduard Carreras Date: Thu, 12 Dec 2024 15:04:07 +0100 Subject: [PATCH 04/43] feat(Field): allow suffix and prefix (#756) [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(Field): allow suffix and prefix * fix: use styled components * fix: adjust styled component for char and addons * fix: improve char component * fix: apply new behaviour to floats * fix: implement in integers * fix: reuse addon element --------- Co-authored-by: Marc Güell Segarra --- src/common/AddonElement.tsx | 9 + src/widgets/base/Char.tsx | 380 +++++++++++++++++++++-------------- src/widgets/base/Float.tsx | 57 ++++-- src/widgets/base/Integer.tsx | 85 +++++--- 4 files changed, 340 insertions(+), 191 deletions(-) create mode 100644 src/common/AddonElement.tsx diff --git a/src/common/AddonElement.tsx b/src/common/AddonElement.tsx new file mode 100644 index 000000000..a62a4f298 --- /dev/null +++ b/src/common/AddonElement.tsx @@ -0,0 +1,9 @@ +import { memo } from "react"; +import { theme } from "antd"; +const { useToken } = theme; + +export const AddonElement = memo(({ content }: { content: string }) => { + const { token } = useToken(); + return
{content}
; +}); +AddonElement.displayName = "AddonElement"; diff --git a/src/widgets/base/Char.tsx b/src/widgets/base/Char.tsx index 9b13eab55..00b740b7a 100644 --- a/src/widgets/base/Char.tsx +++ b/src/widgets/base/Char.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useContext, useState } from "react"; +import { useContext, useState, memo, useCallback, useMemo } from "react"; import { Col, Input, Row, theme } from "antd"; import Field from "@/common/Field"; import { Char as CharOoui } from "@gisce/ooui"; @@ -9,32 +9,66 @@ import ButtonWithTooltip from "@/common/ButtonWithTooltip"; import { TranslationOutlined } from "@ant-design/icons"; import { useLocale } from "@gisce/react-formiga-components"; import showInfo from "@/ui/InfoDialog"; -const { useToken } = theme; +import styled from "styled-components"; +import { AddonElement } from "@/common/AddonElement"; + +const { defaultAlgorithm, defaultSeed } = theme; + +const mapToken = defaultAlgorithm(defaultSeed); type CharProps = WidgetProps & { ooui: CharOoui; isSearchField?: boolean; }; +interface BaseInputProps { + component: React.ComponentType; + ooui: CharOoui; + value: string | undefined; + onChange?: (event: React.ChangeEvent) => void; + onBlur?: () => void; + disabled?: boolean; + [key: string]: any; +} + +const BaseInput = memo( + ({ + component: Component, + ooui, + value, + onChange, + onBlur, + disabled, + ...props + }: BaseInputProps) => { + const renderAddonElement = useCallback((content?: string) => { + return content ? : null; + }, []); + + return ( + + ); + }, +); +BaseInput.displayName = "BaseInput"; + export const Char = (props: CharProps) => { const { ooui, isSearchField = false } = props; const { id, readOnly, required, translatable } = ooui as CharOoui; - const { token } = useToken(); - const requiredStyle = - required && !readOnly - ? { backgroundColor: token.colorPrimaryBg } - : undefined; - - let input = ( - - ); + + let input = ; if (translatable && !readOnly && !isSearchField) { - input = ; + input = ; } return ( @@ -44,102 +78,149 @@ export const Char = (props: CharProps) => { ); }; -const CharInput = ({ - value, - ooui, - requiredStyle, - isSearchField, - onChange, -}: { - value?: any; - ooui: CharOoui; - requiredStyle: CSSProperties | undefined; - isSearchField: boolean; - onChange?: (value: string) => void; -}) => { - const forceDisabled = - Array.isArray(value) || Boolean(ooui.selectionValues.size); - const formContext = useContext(FormContext) as FormContextType; - const { elementHasLostFocus } = formContext || {}; - const { id, readOnly, isPassword, translatable } = ooui; - const showCount = ooui.size !== undefined && ooui.showCount; - - if (ooui.selectionValues.size) { - value = ooui.selectionValues.get(value); - } else if (Array.isArray(value)) { - value = value[1]; - } +const CharInput = memo( + ({ + value, + ooui, + isSearchField, + onChange, + }: { + value?: any; + ooui: CharOoui; + isSearchField: boolean; + onChange?: (value: string) => void; + }) => { + const formContext = useContext(FormContext) as FormContextType; + const { elementHasLostFocus } = formContext || {}; + const { readOnly, isPassword, translatable, required } = ooui; - let input = ( - { + const computedValue = useMemo(() => { + if (!value) return value; + if (ooui.selectionValues.size) { + return ooui.selectionValues.get(value); + } + return Array.isArray(value) ? value[1] : value; + }, [ooui.selectionValues, value]); + + const isRequired = useMemo( + () => required && !readOnly, + [required, readOnly], + ); + if (ooui._id === "name") { + console.log({ value }); + } + console.log({ isRequired }); + + const forceDisabled = useMemo( + () => Array.isArray(value) || Boolean(ooui.selectionValues.size), + [value, ooui.selectionValues], + ); + + const handleChange = useCallback( + (event: React.ChangeEvent) => { onChange?.(event.target.value); - }} - /> - ); + }, + [onChange], + ); - if (isPassword) { - input = ( - + ); + } + + const Component = isRequired ? RequiredChar : Input; + return ( + { - onChange?.(event.target.value); - }} + onChange={handleChange} /> ); - } + }, +); +CharInput.displayName = "CharInput"; - if (forceDisabled) { - input = ; - } +const TranslatableCharComp = memo( + ({ + ooui, + value, + field, + onChange, + }: { + ooui: CharOoui; + value?: string; + field: string; + onChange?: (value: string) => void; + }) => { + const formContext = useContext(FormContext) as FormContextType; + const { + activeId, + activeModel, + fetchValues, + formHasChanges, + elementHasLostFocus, + } = formContext || {}; + const [translationModalVisible, setTranslationModalVisible] = + useState(false); + const { t } = useLocale(); + const { required, readOnly } = ooui; - return input; -}; + const isRequired = useMemo( + () => required && !readOnly, + [required, readOnly], + ); -const TranslatableChar = ({ - value, - field, - requiredStyle, - onChange, -}: { - value?: string; - field: string; - requiredStyle: CSSProperties | undefined; - onChange?: (value: string) => void; -}) => { - const formContext = useContext(FormContext) as FormContextType; - const { - activeId, - activeModel, - fetchValues, - formHasChanges, - elementHasLostFocus, - } = formContext || {}; - const [translationModalVisible, setTranslationModalVisible] = useState(false); - const { t } = useLocale(); - - if (!activeId) { - return ( - <> + const handleChange = useCallback( + (event: React.ChangeEvent) => { + onChange?.(event.target.value); + }, + [onChange], + ); + + const handleTranslationClick = useCallback(() => { + if (formHasChanges?.()) { + showInfo(t("saveBeforeTranslate")); + return; + } + setTranslationModalVisible(true); + }, [formHasChanges, t]); + + const handleModalClose = useCallback(() => { + setTranslationModalVisible(false); + }, []); + + const handleModalSubmit = useCallback(() => { + setTranslationModalVisible(false); + fetchValues?.(); + }, [fetchValues]); + + const Component = isRequired ? RequiredTranslatableChar : TranslatableChar; + + if (!activeId) { + const NonActiveComponent = isRequired ? RequiredChar : Input; + return ( - { - onChange?.(event.target.value); - }} + onChange={handleChange} onBlur={elementHasLostFocus} /> @@ -147,60 +228,65 @@ const TranslatableChar = ({ } - onClick={async () => { - if (formHasChanges?.()) { - showInfo(t("saveBeforeTranslate")); - } else { - showInfo(t("enterTextBeforeTranslate")); - } - }} + onClick={handleTranslationClick} > {t("translate")} + ); + } + + return ( + <> +
+ +
+ ); + }, +); +TranslatableCharComp.displayName = "TranslatableCharComp"; + +const TranslatableChar = styled(Input)<{ disabled?: boolean }>` + &.ant-input { + cursor: ${(props) => (props.disabled ? "pointer" : "text")}; + pointer-events: ${(props) => (props.disabled ? "none" : "auto")}; } +`; - return ( - <> -
{ - if (formHasChanges?.()) { - showInfo(t("saveBeforeTranslate")); - return; - } - - if (!translationModalVisible) { - setTranslationModalVisible(true); - } - }} - > - { - onChange?.(event.target.value); - }} - onBlur={elementHasLostFocus} - style={{ cursor: "pointer", pointerEvents: "none", ...requiredStyle }} - /> -
- { - setTranslationModalVisible(false); - }} - onSubmitSucceed={() => { - setTranslationModalVisible(false); - fetchValues?.(); - }} - /> - - ); -}; +const RequiredTranslatableChar = styled(Input)` + &.ant-input { + background-color: ${mapToken.colorPrimaryBg}; + cursor: pointer; + pointer-events: none; + } +`; + +const RequiredChar = styled(Input)` + &.ant-input { + background-color: ${mapToken.colorPrimaryBg}; + } +`; + +const RequiredPassword = styled(Input.Password)` + &.ant-input-affix-wrapper { + background-color: ${mapToken.colorPrimaryBg}; + } +`; diff --git a/src/widgets/base/Float.tsx b/src/widgets/base/Float.tsx index 5ca84aec6..33d92d061 100644 --- a/src/widgets/base/Float.tsx +++ b/src/widgets/base/Float.tsx @@ -1,39 +1,60 @@ -import React, { useContext } from "react"; -import { InputNumber, theme } from "antd"; +import { memo, useCallback, useContext, useMemo } from "react"; +import { InputNumber, InputNumberProps, theme } from "antd"; import Field from "@/common/Field"; import { Float as FloatOoui } from "@gisce/ooui"; import { WidgetProps } from "@/types"; import { FormContext, FormContextType } from "@/context/FormContext"; -const { useToken } = theme; +import styled from "styled-components"; +import { AddonElement } from "@/common/AddonElement"; -export const Float = (props: WidgetProps) => { +const { defaultAlgorithm, defaultSeed } = theme; + +const mapToken = defaultAlgorithm(defaultSeed); + +export const Float = memo((props: WidgetProps) => { const { ooui } = props; const { id, decimalDigits, readOnly, required } = ooui as FloatOoui; - const { token } = useToken(); - const requiredStyle = - required && !readOnly - ? { backgroundColor: token.colorPrimaryBg } - : undefined; const formContext = useContext(FormContext) as FormContextType; + const { elementHasLostFocus } = formContext || {}; + const isRequired = useMemo(() => required && !readOnly, [required, readOnly]); + + const Component: React.ComponentType = useMemo( + () => (isRequired ? RequiredFloat : InputNumber), + [isRequired], + ); + + const renderAddonElement = useCallback((content?: string) => { + return content ? : null; + }, []); + + const formatter = useCallback((value: any) => { + return `${value}`.replace(/[^0-9.-]+/g, ""); + }, []); return ( - - + { - return `${value}`.replace(/[^0-9.-]+/g, ""); - }} - decimalSeparator={"."} + formatter={formatter} + decimalSeparator="." onBlur={elementHasLostFocus} wheel={false} /> ); -}; +}); +Float.displayName = "Float"; + +const RequiredFloat = styled(InputNumber)` + &.ant-input-number { + background-color: ${mapToken.colorPrimaryBg}; + } +`; diff --git a/src/widgets/base/Integer.tsx b/src/widgets/base/Integer.tsx index 5ae8942df..7f41eb6f5 100644 --- a/src/widgets/base/Integer.tsx +++ b/src/widgets/base/Integer.tsx @@ -1,15 +1,21 @@ -import React, { useContext } from "react"; -import { InputNumber, theme } from "antd"; +import { memo, useCallback, useContext, useMemo } from "react"; +import { InputNumber, InputNumberProps, theme } from "antd"; import Field from "@/common/Field"; import { WidgetProps } from "@/types"; import { FormContext, FormContextType } from "@/context/FormContext"; +import styled from "styled-components"; +import { AddonElement } from "@/common/AddonElement"; const { useToken } = theme; +const { defaultAlgorithm, defaultSeed } = theme; + +const mapToken = defaultAlgorithm(defaultSeed); + type IntegerProps = WidgetProps & { onChange?: (newValue: number) => void; }; -export const Integer = (props: IntegerProps) => { +export const Integer = memo((props: IntegerProps) => { const { ooui, onChange } = props; const { id, readOnly, required } = ooui; const { token } = useToken(); @@ -18,34 +24,54 @@ export const Integer = (props: IntegerProps) => { ? { backgroundColor: token.colorPrimaryBg } : undefined; const formContext = useContext(FormContext) as FormContextType; + const { elementHasLostFocus } = formContext || {}; + const isRequired = useMemo(() => required && !readOnly, [required, readOnly]); + + const Component: React.ComponentType = useMemo( + () => (isRequired ? RequiredInteger : InputNumber), + [isRequired], + ); + + const renderAddonElement = useCallback((content?: string) => { + return content ? : null; + }, []); + + const formatter = useCallback((value: any) => { + // Check if value is not undefined and is a valid number + if (value === undefined) { + return ""; + } + + if (typeof value === "string" && !isNaN(parseFloat(value))) { + const truncatedValue = Math.trunc(parseFloat(value)); + return `${truncatedValue}`.replace(/[^0-9\-]+/g, ""); + } else if (typeof value === "number") { + const truncatedValue = Math.trunc(value); + return `${truncatedValue}`.replace(/[^0-9\-]+/g, ""); + } + + return ""; + }, []); + + const handleChange = useCallback( + (newValue: any) => { + const newNumber = newValue as number; + onChange?.(newNumber); + }, + [onChange], + ); return ( - - + { - // Check if value is not undefined and is a valid number - if (value === undefined) { - return ""; - } - - if (typeof value === "string" && !isNaN(parseFloat(value))) { - const truncatedValue = Math.trunc(parseFloat(value)); - return `${truncatedValue}`.replace(/[^0-9\-]+/g, ""); - } else if (typeof value === "number") { - const truncatedValue = Math.trunc(value); - return `${truncatedValue}`.replace(/[^0-9\-]+/g, ""); - } - - return ""; - }} - onChange={(newValue: any) => { - const newNumber = newValue as number; - onChange?.(newNumber); - }} + formatter={formatter} + onChange={handleChange} onBlur={elementHasLostFocus} precision={0} style={requiredStyle} @@ -53,4 +79,11 @@ export const Integer = (props: IntegerProps) => { /> ); -}; +}); +Integer.displayName = "Integer"; + +const RequiredInteger = styled(InputNumber)` + &.ant-input-number { + background-color: ${mapToken.colorPrimaryBg}; + } +`; From 89cba68cd17b38c7bc37c6b56ee283ee20c9b97b Mon Sep 17 00:00:00 2001 From: Gisce Date: Thu, 12 Dec 2024 15:09:03 +0100 Subject: [PATCH 05/43] feat: update gisce/react-formiga-table to v1.9.0 (#766) [skip ci] https://github.com/gisce/react-formiga-table/releases/tag/v1.9.0 Co-authored-by: mguellsegarra <5711443+mguellsegarra@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc87e6f27..c8731e8e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.24.0", "@gisce/react-formiga-components": "1.8.0", - "@gisce/react-formiga-table": "1.8.5", + "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", "@types/deep-equal": "^1.0.4", @@ -3409,9 +3409,9 @@ } }, "node_modules/@gisce/react-formiga-table": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@gisce/react-formiga-table/-/react-formiga-table-1.8.5.tgz", - "integrity": "sha512-uvL0cVn12WdhsMZsPM5yQziieOXBOoYP28NPXqiNDuHb1hiXHCwjNoamJEGGYoc8ddXOodK6SCHlT/Z/7rAP/A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@gisce/react-formiga-table/-/react-formiga-table-1.9.0.tgz", + "integrity": "sha512-jKMW2i3rbYThoHQpSIAyaQORsRI6opcLDHMMQAPr33fm/6WoYHTsCkccH7RTZQONC/hGfQQoS7hlSUCKu2Oweg==", "dependencies": { "ag-grid-community": "^31.2.1", "ag-grid-react": "^31.2.1", diff --git a/package.json b/package.json index ee0ede954..9e3b26528 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.24.0", "@gisce/react-formiga-components": "1.8.0", - "@gisce/react-formiga-table": "1.8.5", + "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", "@types/deep-equal": "^1.0.4", From a880c0fb1e72d832e41be124150c65db8fe457bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Thu, 12 Dec 2024 15:13:26 +0100 Subject: [PATCH 06/43] feat: autorefresh fields (#738) * feat: autorefresh fields in form https://github.com/gisce/webclient/issues/1415 * fix: adjust seconds * fix: mantain values touched when autorefreshing https://github.com/gisce/webclient/issues/1415 * chore: remove comment * fix: adjust id retrieval for autoRefresh https://github.com/gisce/webclient/issues/1415 * feat: improve hooks and tree autorefreshable fields https://github.com/gisce/webclient/issues/1415 --- src/context/ActionViewContext.tsx | 2 +- src/hooks/useAutorefreshableFormFields.ts | 122 ++++++++++++ src/hooks/useAutorefreshableTreeFields.ts | 123 ++++++++++++ src/hooks/useBrowserVisibility.ts | 19 ++ src/hooks/useSearchTreeState.ts | 3 + src/views/CurrentTabContent.tsx | 2 +- src/widgets/views/Form.tsx | 218 ++++++++++++++-------- src/widgets/views/SearchTreeInfinite.tsx | 16 +- 8 files changed, 421 insertions(+), 84 deletions(-) create mode 100644 src/hooks/useAutorefreshableFormFields.ts create mode 100644 src/hooks/useAutorefreshableTreeFields.ts create mode 100644 src/hooks/useBrowserVisibility.ts diff --git a/src/context/ActionViewContext.tsx b/src/context/ActionViewContext.tsx index fe22c6a7a..134ec5beb 100644 --- a/src/context/ActionViewContext.tsx +++ b/src/context/ActionViewContext.tsx @@ -276,7 +276,7 @@ export const useActionViewContext = () => { searchTreeNameSearch: undefined, goToResourceId: async () => {}, limit: DEFAULT_SEARCH_LIMIT, - isActive: false, + isActive: undefined, formIsSaving: false, setFormIsSaving: () => {}, formHasChanges: false, diff --git a/src/hooks/useAutorefreshableFormFields.ts b/src/hooks/useAutorefreshableFormFields.ts new file mode 100644 index 000000000..625340372 --- /dev/null +++ b/src/hooks/useAutorefreshableFormFields.ts @@ -0,0 +1,122 @@ +import { ConnectionProvider } from ".."; +import { useNetworkRequest } from "./useNetworkRequest"; +import { useDeepCompareEffect } from "use-deep-compare"; +import { useRef, useState, useCallback, useEffect } from "react"; +import { useBrowserVisibility } from "./useBrowserVisibility"; + +const AUTOREFRESH_INTERVAL_SECONDS = 3 * 1000; + +export type UseAutorefreshableFormFieldsOpts = { + model: string; + id?: number; + context: any; + autorefreshableFields?: string[]; + fieldDefs: any; + onAutorefreshableFieldsChange: (newValues: any) => void; + isActive?: boolean; +}; + +export const useAutorefreshableFormFields = ( + opts: UseAutorefreshableFormFieldsOpts, +) => { + const { + model, + id, + context, + autorefreshableFields, + fieldDefs, + onAutorefreshableFieldsChange, + isActive, + } = opts; + + const intervalRef = useRef(null); + const [internalIsActive, setInternalIsActive] = useState(true); + + const [fetchRequest, cancelRequest] = useNetworkRequest( + ConnectionProvider.getHandler().readObjects, + ); + + const tabOrWindowIsVisible = useBrowserVisibility(); + + useEffect(() => { + if (isActive === false) { + pause(); + } + if ( + (isActive === undefined || isActive === true) && + !tabOrWindowIsVisible + ) { + pause(); + } + if ((isActive === undefined || isActive === true) && tabOrWindowIsVisible) { + resume(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isActive, tabOrWindowIsVisible]); + + const refresh = useCallback(async () => { + if (!id || !autorefreshableFields?.length || !internalIsActive) return; + + try { + const [result] = await fetchRequest({ + model, + ids: [id], + fields: fieldDefs, + fieldsToRetrieve: autorefreshableFields, + context, + }); + onAutorefreshableFieldsChange(result); + } catch (err) { + console.error(err); + } + }, [ + id, + autorefreshableFields, + internalIsActive, + fetchRequest, + model, + fieldDefs, + context, + onAutorefreshableFieldsChange, + ]); + + useDeepCompareEffect(() => { + const shouldStart = id && autorefreshableFields?.length && internalIsActive; + + if (shouldStart) { + refresh(); + intervalRef.current = setInterval(refresh, AUTOREFRESH_INTERVAL_SECONDS); + } + + return () => { + cancelRequest(); + if (intervalRef.current) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } + }; + }, [ + autorefreshableFields, + fetchRequest, + fieldDefs, + model, + id, + context, + internalIsActive, + ]); + + const pause = useCallback(() => { + setInternalIsActive(false); + if (intervalRef.current) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } + cancelRequest(); + }, [cancelRequest]); + + const resume = useCallback(() => { + setInternalIsActive(true); + }, []); + + return { pause, resume }; +}; diff --git a/src/hooks/useAutorefreshableTreeFields.ts b/src/hooks/useAutorefreshableTreeFields.ts new file mode 100644 index 000000000..68267daea --- /dev/null +++ b/src/hooks/useAutorefreshableTreeFields.ts @@ -0,0 +1,123 @@ +import { ConnectionProvider } from ".."; +import { useNetworkRequest } from "./useNetworkRequest"; +import { useDeepCompareEffect } from "use-deep-compare"; +import { useRef, useState, useCallback, useEffect } from "react"; +import { InfiniteTableRef } from "@gisce/react-formiga-table"; +import { useBrowserVisibility } from "./useBrowserVisibility"; + +const AUTOREFRESH_INTERVAL_SECONDS = 3 * 1000; + +export type UseAutorefreshableTreeFieldsOpts = { + tableRef: React.RefObject; + model: string; + context: any; + autorefreshableFields?: string[]; + fieldDefs: any; + isActive?: boolean; +}; + +export const useAutorefreshableTreeFields = ( + opts: UseAutorefreshableTreeFieldsOpts, +) => { + const { + tableRef, + model, + context, + autorefreshableFields, + fieldDefs, + isActive, + } = opts; + + const intervalRef = useRef(null); + const [internalIsActive, setInternalIsActive] = useState(true); + + const [fetchRequest, cancelRequest] = useNetworkRequest( + ConnectionProvider.getHandler().readObjects, + ); + + const tabOrWindowIsVisible = useBrowserVisibility(); + + useEffect(() => { + if (isActive === false) { + pause(); + } + if ( + (isActive === undefined || isActive === true) && + !tabOrWindowIsVisible + ) { + pause(); + } + if ((isActive === undefined || isActive === true) && tabOrWindowIsVisible) { + resume(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isActive, tabOrWindowIsVisible]); + + const refresh = useCallback(async () => { + if (!autorefreshableFields?.length || !internalIsActive) return; + + const ids = tableRef.current?.getVisibleRowIds(); + + if (!ids) return; + + try { + const results = await fetchRequest({ + model, + ids, + fields: fieldDefs, + fieldsToRetrieve: autorefreshableFields, + context, + }); + tableRef.current?.updateRows(results); + } catch (err) { + console.error(err); + } + }, [ + autorefreshableFields, + internalIsActive, + tableRef, + fetchRequest, + model, + fieldDefs, + context, + ]); + + useDeepCompareEffect(() => { + const shouldStart = autorefreshableFields?.length && internalIsActive; + + if (shouldStart) { + refresh(); + intervalRef.current = setInterval(refresh, AUTOREFRESH_INTERVAL_SECONDS); + } + + return () => { + cancelRequest(); + if (intervalRef.current) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } + }; + }, [ + autorefreshableFields, + fetchRequest, + fieldDefs, + model, + context, + internalIsActive, + ]); + + const pause = useCallback(() => { + setInternalIsActive(false); + if (intervalRef.current) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } + cancelRequest(); + }, [cancelRequest]); + + const resume = useCallback(() => { + setInternalIsActive(true); + }, []); + + return { pause, resume }; +}; diff --git a/src/hooks/useBrowserVisibility.ts b/src/hooks/useBrowserVisibility.ts new file mode 100644 index 000000000..bf53d3d9a --- /dev/null +++ b/src/hooks/useBrowserVisibility.ts @@ -0,0 +1,19 @@ +import { useState, useEffect } from "react"; + +export const useBrowserVisibility = (): boolean => { + const [isVisible, setIsVisible] = useState(!document.hidden); + + useEffect(() => { + const handleVisibilityChange = (): void => { + setIsVisible(!document.hidden); + }; + + document.addEventListener("visibilitychange", handleVisibilityChange); + + return (): void => { + document.removeEventListener("visibilitychange", handleVisibilityChange); + }; + }, []); + + return isVisible; +}; diff --git a/src/hooks/useSearchTreeState.ts b/src/hooks/useSearchTreeState.ts index f42d949f0..afbd69278 100644 --- a/src/hooks/useSearchTreeState.ts +++ b/src/hooks/useSearchTreeState.ts @@ -26,6 +26,7 @@ export type SearchTreeState = { setSearchQuery: (value: SearchQueryParams) => void; totalItems: number; setTotalItems: (value: number) => void; + isActive?: boolean; }; export function useSearchTreeState({ @@ -76,6 +77,7 @@ export function useSearchTreeState({ setSearchQuery: actionViewContext.setSearchQuery ?? (() => {}), totalItems: actionViewContext.totalItems ?? 0, setTotalItems: actionViewContext.setTotalItems ?? (() => {}), + isActive: actionViewContext.isActive, } : { treeIsLoading: localTreeIsLoading, @@ -98,5 +100,6 @@ export function useSearchTreeState({ setSearchQuery: setLocalSearchQuery, totalItems: localTotalItems, setTotalItems: setLocalTotalItems, + isActive: undefined, }; } diff --git a/src/views/CurrentTabContent.tsx b/src/views/CurrentTabContent.tsx index 090a7c065..1f5ce4d83 100644 --- a/src/views/CurrentTabContent.tsx +++ b/src/views/CurrentTabContent.tsx @@ -1,4 +1,4 @@ -import React, { useContext } from "react"; +import { useContext } from "react"; import { TabManagerContext, diff --git a/src/widgets/views/Form.tsx b/src/widgets/views/Form.tsx index a0d05320e..b569038b8 100644 --- a/src/widgets/views/Form.tsx +++ b/src/widgets/views/Form.tsx @@ -1,10 +1,12 @@ -import React, { +import { useState, forwardRef, useImperativeHandle, useEffect, useRef, useContext, + useCallback, + useMemo, } from "react"; import { Form as FormOoui, parseContext } from "@gisce/ooui"; import { @@ -60,6 +62,7 @@ import { } from "@/helpers/one2manyHelper"; import { ErrorAlert } from "@/ui/ErrorAlert"; import { mergeFieldsContext } from "@/helpers/fieldsHelper"; +import { useAutorefreshableFormFields } from "@/hooks/useAutorefreshableFormFields"; export type FormProps = { model: string; @@ -161,6 +164,7 @@ function Form(props: FormProps, ref: any) { setAttachments = undefined, title = undefined, setTitle = undefined, + isActive = undefined, } = (rootForm ? actionViewContext : {}) || {}; const contentRootContext = useContext( @@ -247,9 +251,21 @@ function Form(props: FormProps, ref: any) { propsOnSubmitError?.(error); }; - function getCurrentId() { + const getCurrentId = useCallback(() => { return id || createdId.current; - } + }, [id]); + const [refId, setRefId] = useState(() => createdId.current); + + useEffect(() => { + if (createdId.current !== refId) { + setRefId(createdId.current); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [createdId.current]); + + const currentId = useMemo(() => { + return id || refId; + }, [id, refId]); function getFields() { return fields; @@ -330,7 +346,7 @@ function Form(props: FormProps, ref: any) { return { active_id: getCurrentId()!, active_ids: [getCurrentId()!] }; } - function getAdditionalValues() { + const getAdditionalValues = useCallback(() => { return { id: getCurrentId()!, active_id: getCurrentId()!, @@ -338,7 +354,7 @@ function Form(props: FormProps, ref: any) { parent_id: parentId, ...globalValues, }; - } + }, [getCurrentId, parentId, globalValues]); const getDefaultValues = async (fields: any) => { const formContext = getCurrentId() ? formOoui?.context : {}; @@ -514,38 +530,38 @@ function Form(props: FormProps, ref: any) { })) as FormView; }; - const assignNewValuesToForm = ({ - values: newValues, - fields, - reset, - isDefaultGet = false, - }: { - values: any; - fields: any; - reset: boolean; - isDefaultGet?: boolean; - }) => { - const currentValues = reset ? {} : antForm.getFieldsValue(true); - const mergedValues = { ...currentValues, ...newValues }; - const valuesProcessed = processValues(mergedValues, fields); - const fieldsToUpdate = Object.keys(fields).map((fieldName) => { - const fieldValue = - valuesProcessed[fieldName] !== undefined - ? valuesProcessed[fieldName] - : undefined; - return { + const assignNewValuesToForm = useCallback( + ({ + values: newValues, + fields, + reset, + isDefaultGet = false, + }: { + values: any; + fields: any; + reset: boolean; + isDefaultGet?: boolean; + }) => { + const currentValues = reset ? {} : antForm.getFieldsValue(true); + const mergedValues = { ...currentValues, ...newValues }; + const valuesProcessed = processValues(mergedValues, fields); + const fieldsToUpdate = Object.keys(fields).map((fieldName) => ({ name: fieldName, touched: false, - value: fieldValue, - }; - }); - - if (!isDefaultGet) { - lastAssignedValues.current = valuesProcessed; - } + value: + valuesProcessed[fieldName] !== undefined + ? valuesProcessed[fieldName] + : undefined, + })); + + if (!isDefaultGet) { + lastAssignedValues.current = valuesProcessed; + } - antForm.setFields(fieldsToUpdate); - }; + antForm.setFields(fieldsToUpdate); + }, + [antForm], + ); const fetchValuesFromApi = async ({ fields, @@ -729,59 +745,66 @@ function Form(props: FormProps, ref: any) { return { succeed: submitSucceed, id: getCurrentId()! }; }; - const getFormOoui = ({ - fields, - arch, - values, - operationInProgress = false, - }: { - arch: string; - fields: any; - values: any; - operationInProgress?: boolean; - }) => { - const ooui = new FormOoui(fields); - // Here we must inject `values` to the ooui parser in order to evaluate arch+values and get the new form container - ooui.parse(arch, { - readOnly: readOnly || operationInProgress, - values: convertToPlain2ManyValues( - { - ...values, - ...getAdditionalValues(), - }, - fields, - ), - }); - return ooui; - }; - - const parseForm = ({ - fields, - arch, - values, - operationInProgress = false, - }: { - arch: string; - fields: any; - values: any; - operationInProgress?: boolean; - }) => { - const ooui = getFormOoui({ + const getFormOoui = useCallback( + ({ + fields, arch, + values, + operationInProgress = false, + }: { + arch: string; + fields: any; + values: any; + operationInProgress?: boolean; + }) => { + const ooui = new FormOoui(fields); + // Here we must inject `values` to the ooui parser in order to evaluate arch+values and get the new form container + ooui.parse(arch, { + readOnly: readOnly || operationInProgress, + values: convertToPlain2ManyValues( + { + ...values, + ...getAdditionalValues(), + }, + fields, + ), + }); + return ooui; + }, + [getAdditionalValues, readOnly], + ); + + const parseForm = useCallback( + ({ fields, + arch, values, - operationInProgress, - }); + operationInProgress = false, + }: { + arch: string; + fields: any; + values: any; + operationInProgress?: boolean; + }) => { + const ooui = getFormOoui({ + arch, + fields, + values, + operationInProgress, + }); - setFormOoui(ooui); + setFormOoui(ooui); - if (ooui.string && ooui.string !== title) { - setTitle?.(ooui.string); - } + if (ooui.string && ooui.string !== title) { + setTitle?.(ooui.string); + } - if (formModalContext && ooui.string) - formModalContext.setTitle?.(ooui.string); - }; + if (formModalContext && ooui.string) { + formModalContext.setTitle?.(ooui.string); + } + }, + [formModalContext, getFormOoui, setTitle, title], + ); const checkFieldsChanges = async ({ elementHasLostFocus = false, @@ -1052,6 +1075,39 @@ function Form(props: FormProps, ref: any) { }); } + const onAutorefreshableFieldsChange = useCallback( + (newValues: any) => { + if (!arch) { + return; + } + + const values = { ...getCurrentValues(fields), ...newValues }; + + originalFormValues.current = { + ...originalFormValues.current, + ...newValues, + }; + + parseForm({ fields, arch, values }); + assignNewValuesToForm({ + values, + fields, + reset: false, + }); + }, + [arch, assignNewValuesToForm, fields, getCurrentValues, parseForm], + ); + + useAutorefreshableFormFields({ + model, + id: currentId, + context: parentContext, + autorefreshableFields: formOoui?.autorefreshableFields, + fieldDefs: fields, + onAutorefreshableFieldsChange, + isActive, + }); + async function executeButtonAction({ type, action, diff --git a/src/widgets/views/SearchTreeInfinite.tsx b/src/widgets/views/SearchTreeInfinite.tsx index a8321e4bc..4cf798bb2 100644 --- a/src/widgets/views/SearchTreeInfinite.tsx +++ b/src/widgets/views/SearchTreeInfinite.tsx @@ -45,6 +45,8 @@ import deepEqual from "deep-equal"; import { useShowErrorDialog } from "@/ui/GenericErrorDialog"; import SearchFilter from "./searchFilter/SearchFilter"; import { useSearchTreeState } from "@/hooks/useSearchTreeState"; +import { Tree as TreeOoui } from "@gisce/ooui"; +import { useAutorefreshableTreeFields } from "@/hooks/useAutorefreshableTreeFields"; export const HEIGHT_OFFSET = 10; export const MAX_ROWS_TO_SELECT = 200; @@ -127,6 +129,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { results: actionViewResults, setSearchQuery, setTotalItems: setTotalItemsActionView, + isActive, } = useSearchTreeState({ useLocalState: !rootTree }); const nameSearch = nameSearchProps || searchTreeNameSearch; @@ -153,13 +156,24 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { // eslint-disable-next-line react-hooks/exhaustive-deps }, [nameSearch]); - const treeOoui = useMemo(() => { + const treeOoui: TreeOoui | undefined = useMemo(() => { if (!treeView) { return; } return getTree(treeView); }, [treeView]); + useAutorefreshableTreeFields({ + model, + tableRef, + autorefreshableFields: treeOoui?.autorefreshableFields, + fieldDefs: treeView?.field_parent + ? { ...treeView?.fields, [treeView?.field_parent]: {} } + : treeView?.fields, + context: parentContext, + isActive, + }); + const columns = useDeepCompareMemo(() => { if (!treeOoui) { return; From 2c43c3dc57e7af68931179dfbe0cb6b84f7aa333 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 12 Dec 2024 14:15:02 +0000 Subject: [PATCH 07/43] chore(release): 2.47.0 [skip ci] # [2.47.0](https://github.com/gisce/react-ooui/compare/v2.46.1...v2.47.0) (2024-12-12) ### Features * autorefresh fields ([#738](https://github.com/gisce/react-ooui/issues/738)) ([a880c0f](https://github.com/gisce/react-ooui/commit/a880c0fb1e72d832e41be124150c65db8fe457bc)) * **Field:** allow suffix and prefix ([#756](https://github.com/gisce/react-ooui/issues/756)) [skip ci] ([64a48bd](https://github.com/gisce/react-ooui/commit/64a48bda769544822f343c1c9962faa127ca4d3d)) * update gisce/ooui to v2.24.0 ([#765](https://github.com/gisce/react-ooui/issues/765)) [skip ci] ([3473685](https://github.com/gisce/react-ooui/commit/3473685e8c0e74532b358933532b0a06ee2cc9a7)) * update gisce/react-formiga-table to v1.9.0 ([#766](https://github.com/gisce/react-ooui/issues/766)) [skip ci] ([89cba68](https://github.com/gisce/react-ooui/commit/89cba68cd17b38c7bc37c6b56ee283ee20c9b97b)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c8731e8e6..2347227d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.46.1", + "version": "2.47.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.46.1", + "version": "2.47.0", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index 9e3b26528..edcf9d686 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.46.1", + "version": "2.47.0", "engines": { "node": "20.5.0" }, From 2bc38efe3b5ad4f0c842862b10542c3897bd3951 Mon Sep 17 00:00:00 2001 From: Gisce Date: Fri, 13 Dec 2024 08:59:44 +0100 Subject: [PATCH 08/43] feat: update gisce/ooui to v2.25.0 (#769) https://github.com/gisce/ooui/releases/tag/v2.25.0 Co-authored-by: ecarreras <294235+ecarreras@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2347227d1..3b5a97d78 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.24.0", + "@gisce/ooui": "2.25.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", @@ -3370,9 +3370,9 @@ } }, "node_modules/@gisce/ooui": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.24.0.tgz", - "integrity": "sha512-2a3lzDqi5dbTn1rsEF+XZy/OkKlxdG6V7glK3dSCgblx+lxcUKKm02GQ7y5wUvK1H/m5BS7h53lAXAlvZlt0KQ==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.25.0.tgz", + "integrity": "sha512-rAtNF0Zml+6WIOiwztjFEvgGROD/sWPie8WedDwe+kl+pFW9EknNi/SJBRAo/HFKNq8YbfWt7QBfzrNj+LeSZg==", "dependencies": { "@gisce/conscheck": "1.0.9", "html-entities": "^2.3.3", diff --git a/package.json b/package.json index edcf9d686..f38d046df 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.24.0", + "@gisce/ooui": "2.25.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", From 62e4f5de5734236c9ccbb4434ee2f9bf215ea7ef Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 13 Dec 2024 08:01:13 +0000 Subject: [PATCH 09/43] chore(release): 2.48.0 [skip ci] # [2.48.0](https://github.com/gisce/react-ooui/compare/v2.47.0...v2.48.0) (2024-12-13) ### Features * update gisce/ooui to v2.25.0 ([#769](https://github.com/gisce/react-ooui/issues/769)) ([2bc38ef](https://github.com/gisce/react-ooui/commit/2bc38efe3b5ad4f0c842862b10542c3897bd3951)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b5a97d78..4d0c7e7a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.47.0", + "version": "2.48.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.47.0", + "version": "2.48.0", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index f38d046df..ff4158243 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.47.0", + "version": "2.48.0", "engines": { "node": "20.5.0" }, From 14fb225343ea03a3992090a43c329433bbb8987e Mon Sep 17 00:00:00 2001 From: Eduard Carreras Date: Fri, 13 Dec 2024 09:22:22 +0100 Subject: [PATCH 10/43] feat(carousel): add carousel widget (#762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Güell Segarra --- src/index.ts | 2 ++ src/widgets/WidgetFactory.tsx | 3 +++ src/widgets/custom/Carousel.tsx | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 src/widgets/custom/Carousel.tsx diff --git a/src/index.ts b/src/index.ts index 73a04642b..6b6974870 100644 --- a/src/index.ts +++ b/src/index.ts @@ -52,6 +52,7 @@ import { Alert } from "@/widgets/custom/Alert"; import { DashboardGrid } from "@/widgets/views/DashboardGrid"; import { GraphIndicator } from "@/widgets/views/Graph/GraphIndicator"; import { Spinner } from "@/widgets/custom/Spinner"; +import { Carousel } from "@/widgets/custom/Carousel"; import type { TreeView, @@ -179,4 +180,5 @@ export { Alert, dayjs, Spinner, + Carousel, }; diff --git a/src/widgets/WidgetFactory.tsx b/src/widgets/WidgetFactory.tsx index ccb9564b9..ebd273f6a 100644 --- a/src/widgets/WidgetFactory.tsx +++ b/src/widgets/WidgetFactory.tsx @@ -36,6 +36,7 @@ import { HTMLPreview, Alert, Spinner, + Carousel, } from "@/index"; import { Image } from "./base/Image"; import { FiberGrid } from "./custom/FiberGrid"; @@ -133,6 +134,8 @@ const getWidgetType = (type: string) => { return Alert; case "spinner": return Spinner; + case "carousel": + return Carousel; default: return undefined; } diff --git a/src/widgets/custom/Carousel.tsx b/src/widgets/custom/Carousel.tsx new file mode 100644 index 000000000..0077a565b --- /dev/null +++ b/src/widgets/custom/Carousel.tsx @@ -0,0 +1,42 @@ +import { WidgetProps } from "@/types"; +import { Carousel as CarouselOoui, Group as GroupOoui } from "@gisce/ooui"; +import { Carousel as AntCarousel, theme } from "antd"; +import Container from "@/widgets/containers/Container"; +import styled from "styled-components"; + +const { defaultAlgorithm, defaultSeed } = theme; + +const mapToken = defaultAlgorithm(defaultSeed); + +type CarouselProps = Omit & { + ooui: CarouselOoui; + responsiveBehaviour?: boolean; +}; + +export const Carousel = (props: CarouselProps) => { + const { ooui, responsiveBehaviour = false } = props; + + return ( + + {ooui.items.map((group: GroupOoui, index: number) => ( + + ))} + + ); +}; + +const CustomCarousel = styled(AntCarousel)` + .slick-dots li button { + background-color: ${mapToken.colorPrimary}; + } + .slick-dots li.slick-active button { + background-color: ${mapToken.colorPrimary}; + } + .slick-dots-bottom { + bottom: -15px; + } +`; From d28f309de222cd84821492bf18550b79e11849a2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 13 Dec 2024 08:23:52 +0000 Subject: [PATCH 11/43] chore(release): 2.49.0 [skip ci] # [2.49.0](https://github.com/gisce/react-ooui/compare/v2.48.0...v2.49.0) (2024-12-13) ### Features * **carousel:** add carousel widget ([#762](https://github.com/gisce/react-ooui/issues/762)) ([14fb225](https://github.com/gisce/react-ooui/commit/14fb225343ea03a3992090a43c329433bbb8987e)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d0c7e7a3..d6feffc7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.48.0", + "version": "2.49.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.48.0", + "version": "2.49.0", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index ff4158243..a1768f689 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.48.0", + "version": "2.49.0", "engines": { "node": "20.5.0" }, From 68625cd4e34e05ac60800145d0e03686ae44d416 Mon Sep 17 00:00:00 2001 From: Eduard Carreras Date: Fri, 13 Dec 2024 14:01:04 +0100 Subject: [PATCH 12/43] feat(group): add height and scroll if overflow (#774) [skip ci] --- src/widgets/containers/Group.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/widgets/containers/Group.tsx b/src/widgets/containers/Group.tsx index 6639d04bd..c95636ecd 100644 --- a/src/widgets/containers/Group.tsx +++ b/src/widgets/containers/Group.tsx @@ -1,7 +1,7 @@ import React from "react"; import { Group as GroupOoui } from "@gisce/ooui"; import { Spinner } from "@/widgets/custom/Spinner"; -import { FieldSet , useLocale } from "@gisce/react-formiga-components"; +import { FieldSet, useLocale } from "@gisce/react-formiga-components"; import iconMapper from "@/helpers/iconMapper"; type Props = { @@ -15,7 +15,13 @@ function Group(props: Props): React.ReactElement { const icon: React.ElementType | undefined = iconMapper(ooui.icon || ""); const { t } = useLocale(); return ( - <> +
{(ooui.label || icon) && showLabel ? (
)} - +
); } From c47c110c4a4a5007c1b9c4009a0d949ae51fead9 Mon Sep 17 00:00:00 2001 From: Gisce Date: Fri, 13 Dec 2024 14:18:10 +0100 Subject: [PATCH 13/43] feat: update gisce/ooui to v2.26.0 (#776) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6feffc7c..ba7ab6511 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.25.0", + "@gisce/ooui": "2.26.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", @@ -3370,9 +3370,9 @@ } }, "node_modules/@gisce/ooui": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.25.0.tgz", - "integrity": "sha512-rAtNF0Zml+6WIOiwztjFEvgGROD/sWPie8WedDwe+kl+pFW9EknNi/SJBRAo/HFKNq8YbfWt7QBfzrNj+LeSZg==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.26.0.tgz", + "integrity": "sha512-NtQ2BcAvHqxGu4hfJr/CtNjwvJceCV44nv7Fphchr3GNEHINX1EkwgSQtqThVS2HeMCc8Ni00NITwrWaH57OMw==", "dependencies": { "@gisce/conscheck": "1.0.9", "html-entities": "^2.3.3", diff --git a/package.json b/package.json index a1768f689..ee6469a1f 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.25.0", + "@gisce/ooui": "2.26.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", From 3b0e510f9935ef7daf9415d55ece1b9afc274928 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 13 Dec 2024 13:19:40 +0000 Subject: [PATCH 14/43] chore(release): 2.50.0 [skip ci] # [2.50.0](https://github.com/gisce/react-ooui/compare/v2.49.0...v2.50.0) (2024-12-13) ### Features * **group:** add height and scroll if overflow ([#774](https://github.com/gisce/react-ooui/issues/774)) [skip ci] ([68625cd](https://github.com/gisce/react-ooui/commit/68625cd4e34e05ac60800145d0e03686ae44d416)) * update gisce/ooui to v2.26.0 ([#776](https://github.com/gisce/react-ooui/issues/776)) ([c47c110](https://github.com/gisce/react-ooui/commit/c47c110c4a4a5007c1b9c4009a0d949ae51fead9)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba7ab6511..da7a7515a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.49.0", + "version": "2.50.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.49.0", + "version": "2.50.0", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index ee6469a1f..9e58eb48b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.49.0", + "version": "2.50.0", "engines": { "node": "20.5.0" }, From 05f929353a5772f4c52f2d6d726c6b42744b39fd Mon Sep 17 00:00:00 2001 From: Eduard Carrerars Date: Mon, 16 Dec 2024 18:46:08 +0100 Subject: [PATCH 15/43] feat(dashboards): show info tooltip to indicator --- src/widgets/views/Dashboard/Dashboard.tsx | 17 ++++++++++++++--- src/widgets/views/Dashboard/dashboardHelper.ts | 2 ++ src/widgets/views/Graph/GraphCard.types.ts | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/widgets/views/Dashboard/Dashboard.tsx b/src/widgets/views/Dashboard/Dashboard.tsx index 423bc053a..2b7869cf7 100644 --- a/src/widgets/views/Dashboard/Dashboard.tsx +++ b/src/widgets/views/Dashboard/Dashboard.tsx @@ -16,8 +16,8 @@ import ConnectionProvider from "@/ConnectionProvider"; import { DashboardProps, FormView } from "@/types"; import { ErpFeatureKeys, GraphCard, One2manyItem } from "@/index"; import { readObjectValues } from "@/helpers/one2manyHelper"; -import { LoadingOutlined } from "@ant-design/icons"; -import { Alert } from "antd"; +import { LoadingOutlined, InfoCircleOutlined } from "@ant-design/icons"; +import { Alert, Tooltip } from "antd"; import { DashboardActionContext, DashboardActionContextType, @@ -256,6 +256,7 @@ function Dashboard(props: DashboardProps, ref: any) { actionType, key, title, + description, views, model, context, @@ -386,11 +387,21 @@ function Dashboard(props: DashboardProps, ref: any) { }; } + const titleWithTooltip = description ? ( + <> + + + + {title} + + ) : ( + {title} + ); return ( Date: Tue, 17 Dec 2024 15:36:58 +0100 Subject: [PATCH 16/43] feat(indicator): add info from action's description --- src/widgets/custom/Indicator.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/widgets/custom/Indicator.tsx b/src/widgets/custom/Indicator.tsx index eb9c52207..c73117e19 100644 --- a/src/widgets/custom/Indicator.tsx +++ b/src/widgets/custom/Indicator.tsx @@ -3,7 +3,7 @@ import { Tooltip, theme, Statistic, Card, Empty } from "antd"; import { Indicator as IndicatorOoui } from "@gisce/ooui"; import { WidgetProps } from "@/types"; import Field from "@/common/Field"; -import { QuestionCircleOutlined } from "@ant-design/icons"; +import { InfoCircleOutlined, QuestionCircleOutlined } from "@ant-design/icons"; import iconMapper from "@/helpers/iconMapper"; import { useFormGraphData } from "@/hooks/useFormGraphData"; import { CenteredSpinner } from "@/ui/CenteredSpinner"; @@ -117,15 +117,27 @@ const GraphIndicatorInput = (props: IndicatorInputProps) => { return ; } - const { id, model, limit, domain, context, initialView } = actionData || {}; + const { id, model, limit, domain, context, initialView, description } = + actionData || {}; const GraphComponent = readForViewEnabled ? GraphServer : Graph; + const titleWithTooltip = description ? ( + <> + + + + {actionData?.title || ""} + + ) : ( + {actionData?.title || ""} + ); + return ( From dcf83562928f14111f39c36a7d58ac002bdf7e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Gu=CC=88ell=20Segarra?= Date: Wed, 18 Dec 2024 15:15:37 +0100 Subject: [PATCH 17/43] fix: reuse tooltip in graphcard --- src/widgets/custom/Indicator.tsx | 17 +++-------------- src/widgets/views/Dashboard/Dashboard.tsx | 19 +++++-------------- src/widgets/views/Graph/GraphCard.tsx | 17 +++++++++++++---- src/widgets/views/Graph/GraphCard.types.ts | 1 + 4 files changed, 22 insertions(+), 32 deletions(-) diff --git a/src/widgets/custom/Indicator.tsx b/src/widgets/custom/Indicator.tsx index c73117e19..ba6526b9b 100644 --- a/src/widgets/custom/Indicator.tsx +++ b/src/widgets/custom/Indicator.tsx @@ -3,7 +3,7 @@ import { Tooltip, theme, Statistic, Card, Empty } from "antd"; import { Indicator as IndicatorOoui } from "@gisce/ooui"; import { WidgetProps } from "@/types"; import Field from "@/common/Field"; -import { InfoCircleOutlined, QuestionCircleOutlined } from "@ant-design/icons"; +import { QuestionCircleOutlined } from "@ant-design/icons"; import iconMapper from "@/helpers/iconMapper"; import { useFormGraphData } from "@/hooks/useFormGraphData"; import { CenteredSpinner } from "@/ui/CenteredSpinner"; @@ -19,7 +19,6 @@ import { } from "@/context/TabManagerContext"; import { GraphCard } from "../views/Graph"; import { useFormContext } from "@/context/FormContext"; -import { useLocale } from "@gisce/react-formiga-components"; import styled from "styled-components"; const { useToken } = theme; @@ -122,24 +121,14 @@ const GraphIndicatorInput = (props: IndicatorInputProps) => { const GraphComponent = readForViewEnabled ? GraphServer : Graph; - const titleWithTooltip = description ? ( - <> - - - - {actionData?.title || ""} - - ) : ( - {actionData?.title || ""} - ); - return ( {loading && } {!loading && ( diff --git a/src/widgets/views/Dashboard/Dashboard.tsx b/src/widgets/views/Dashboard/Dashboard.tsx index 2b7869cf7..4456eb855 100644 --- a/src/widgets/views/Dashboard/Dashboard.tsx +++ b/src/widgets/views/Dashboard/Dashboard.tsx @@ -1,4 +1,4 @@ -import React, { +import { forwardRef, useContext, useEffect, @@ -16,8 +16,8 @@ import ConnectionProvider from "@/ConnectionProvider"; import { DashboardProps, FormView } from "@/types"; import { ErpFeatureKeys, GraphCard, One2manyItem } from "@/index"; import { readObjectValues } from "@/helpers/one2manyHelper"; -import { LoadingOutlined, InfoCircleOutlined } from "@ant-design/icons"; -import { Alert, Tooltip } from "antd"; +import { LoadingOutlined } from "@ant-design/icons"; +import { Alert } from "antd"; import { DashboardActionContext, DashboardActionContextType, @@ -387,24 +387,15 @@ function Dashboard(props: DashboardProps, ref: any) { }; } - const titleWithTooltip = description ? ( - <> - - - - {title} - - ) : ( - {title} - ); return ( {childContent} diff --git a/src/widgets/views/Graph/GraphCard.tsx b/src/widgets/views/Graph/GraphCard.tsx index 08db45656..0781d0793 100644 --- a/src/widgets/views/Graph/GraphCard.tsx +++ b/src/widgets/views/Graph/GraphCard.tsx @@ -1,5 +1,5 @@ -import { ExportOutlined } from "@ant-design/icons"; -import { Row, Col, Typography, theme } from "antd"; +import { ExportOutlined, InfoCircleOutlined } from "@ant-design/icons"; +import { Row, Col, Typography, theme, Tooltip } from "antd"; import ErrorBoundary from "antd/es/alert/ErrorBoundary"; import { GraphCardProps } from "./GraphCard.types"; const { useToken } = theme; @@ -7,7 +7,7 @@ const { useToken } = theme; const { Text } = Typography; export const GraphCard = (props: GraphCardProps) => { - const { title, children, action, openAction, parms } = props; + const { title, children, action, openAction, parms, tooltip } = props; const { token } = useToken(); const hasDragAndDrop = Object.keys(parms).length > 0; @@ -43,7 +43,16 @@ export const GraphCard = (props: GraphCardProps) => { overflow: "hidden", }} > - {title} + {tooltip ? ( + <> + + + + {title} + + ) : ( + {title} + )} {action && ( diff --git a/src/widgets/views/Graph/GraphCard.types.ts b/src/widgets/views/Graph/GraphCard.types.ts index bf658bc53..c90d78967 100644 --- a/src/widgets/views/Graph/GraphCard.types.ts +++ b/src/widgets/views/Graph/GraphCard.types.ts @@ -7,4 +7,5 @@ export type GraphCardProps = { parms: any; action?: ShortcutApi; openAction?: (shortcutApi?: ShortcutApi) => void; + tooltip?: string; }; From ee71fec39080471fd370bf6cfe762ac57cac08b6 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 18 Dec 2024 16:19:04 +0000 Subject: [PATCH 18/43] chore(release): 2.51.0 [skip ci] # [2.51.0](https://github.com/gisce/react-ooui/compare/v2.50.0...v2.51.0) (2024-12-18) ### Bug Fixes * reuse tooltip in graphcard ([dcf8356](https://github.com/gisce/react-ooui/commit/dcf83562928f14111f39c36a7d58ac002bdf7e17)) ### Features * **dashboards:** show info tooltip to indicator ([05f9293](https://github.com/gisce/react-ooui/commit/05f929353a5772f4c52f2d6d726c6b42744b39fd)) * **indicator:** add info from action's description ([3daf985](https://github.com/gisce/react-ooui/commit/3daf98579db976594101ec1b4dfaf61cc54035b8)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index da7a7515a..3efbba451 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.50.0", + "version": "2.51.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.50.0", + "version": "2.51.0", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index 9e58eb48b..37c09fe43 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.50.0", + "version": "2.51.0", "engines": { "node": "20.5.0" }, From eb1eb2199ad2849bee034fdac935a9e28089a2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Fri, 20 Dec 2024 13:18:10 +0100 Subject: [PATCH 19/43] Fix form indicators refreshing when id is created (#779) * chore: remove console.log * fix: handle initial view id in form indicators https://github.com/gisce/webclient/issues/1520 --- src/widgets/base/Char.tsx | 4 ---- src/widgets/custom/Indicator.tsx | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/widgets/base/Char.tsx b/src/widgets/base/Char.tsx index 00b740b7a..7b7eb2ae2 100644 --- a/src/widgets/base/Char.tsx +++ b/src/widgets/base/Char.tsx @@ -106,10 +106,6 @@ const CharInput = memo( () => required && !readOnly, [required, readOnly], ); - if (ooui._id === "name") { - console.log({ value }); - } - console.log({ isRequired }); const forceDisabled = useMemo( () => Array.isArray(value) || Boolean(ooui.selectionValues.size), diff --git a/src/widgets/custom/Indicator.tsx b/src/widgets/custom/Indicator.tsx index ba6526b9b..c39196fa8 100644 --- a/src/widgets/custom/Indicator.tsx +++ b/src/widgets/custom/Indicator.tsx @@ -139,14 +139,16 @@ const GraphIndicatorInput = (props: IndicatorInputProps) => { imageStyle={{ height: 15 }} /> ) : ( - + initialView?.id && ( + + ) )} )} From 8a11f7b1c53166db1ea564b6a0278820e902df55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Gu=CC=88ell=20Segarra?= Date: Fri, 20 Dec 2024 13:28:15 +0100 Subject: [PATCH 20/43] fix: handle initial view id in form indicators --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a6eaf2d4d..73c96b54c 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ const getOouiComponents = () => { }; ``` + You have an example app inside this repo. In order to run it you should follow these steps: - `cd example` From 3bf141816b233410eedc8867e5e057bcdc7f6e51 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 20 Dec 2024 12:30:00 +0000 Subject: [PATCH 21/43] chore(release): 2.51.1 [skip ci] ## [2.51.1](https://github.com/gisce/react-ooui/compare/v2.51.0...v2.51.1) (2024-12-20) ### Bug Fixes * handle initial view id in form indicators ([8a11f7b](https://github.com/gisce/react-ooui/commit/8a11f7b1c53166db1ea564b6a0278820e902df55)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3efbba451..ea792608e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.51.0", + "version": "2.51.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.51.0", + "version": "2.51.1", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index 37c09fe43..6da52b73e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.51.0", + "version": "2.51.1", "engines": { "node": "20.5.0" }, From 171eb0ad6864f38684100afce3785e39ebf563f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Fri, 20 Dec 2024 13:39:02 +0100 Subject: [PATCH 22/43] fix: tabler icons alignment in iconmapper (#781) https://github.com/gisce/webclient/issues/1534 --- src/helpers/iconMapper.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/helpers/iconMapper.ts b/src/helpers/iconMapper.ts index 35bd04882..614be1e51 100644 --- a/src/helpers/iconMapper.ts +++ b/src/helpers/iconMapper.ts @@ -109,6 +109,7 @@ export default ( key = `STOCK_${rootIcon.toUpperCase()}`; } + // eslint-disable-next-line no-prototype-builtins if (iconMapping.hasOwnProperty(key)) { return getIconForKey(iconMapping[key], props); } @@ -132,13 +133,14 @@ function getIconForKey( key: string, props?: { className?: any; style: CSSProperties }, ) { - let IconCamelCase = key.charAt(0).toUpperCase() + key.slice(1); // Capitalize first letter + let IconCamelCase = key.charAt(0).toUpperCase() + key.slice(1); if (IconCamelCase.indexOf("-") !== -1) { IconCamelCase = toCamelCase(IconCamelCase); } const antKey: AntKey = `${IconCamelCase}Outlined` as any; if (AntIcons[antKey]) { + // eslint-disable-next-line react/display-name return () => React.createElement(AntIcons[antKey] as any, { ...props, @@ -150,12 +152,22 @@ function getIconForKey( const TablerIcon = () => React.createElement(TablerIcons[tablerKey] as any, { fill: "transparent", + // eslint-disable-next-line react/prop-types size: props?.style?.fontSize || 17, }); const CustomIcon = () => - React.createElement(Icon, { - component: TablerIcon, - ...props, + // eslint-disable-next-line react/no-children-prop + React.createElement("span", { + style: { + display: "inline-flex", + alignItems: "center", + lineHeight: "1", + verticalAlign: "middle", + }, + children: React.createElement(Icon, { + component: TablerIcon, + ...props, + }), }); return CustomIcon; } From 3dfbd2e803b2270e3d7a81a2a913ffd074db47f8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 20 Dec 2024 12:40:34 +0000 Subject: [PATCH 23/43] chore(release): 2.51.2 [skip ci] ## [2.51.2](https://github.com/gisce/react-ooui/compare/v2.51.1...v2.51.2) (2024-12-20) ### Bug Fixes * tabler icons alignment in iconmapper ([#781](https://github.com/gisce/react-ooui/issues/781)) ([171eb0a](https://github.com/gisce/react-ooui/commit/171eb0ad6864f38684100afce3785e39ebf563f5)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea792608e..cd281cbbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.51.1", + "version": "2.51.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.51.1", + "version": "2.51.2", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index 6da52b73e..b733db600 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.51.1", + "version": "2.51.2", "engines": { "node": "20.5.0" }, From 07bac0ddb3f45234bf2affb31faede510e5aea8e Mon Sep 17 00:00:00 2001 From: Eduard Carrerars Date: Tue, 24 Dec 2024 11:13:57 +0100 Subject: [PATCH 24/43] feat(colorPicker): add new component colorPicker --- src/index.ts | 2 + src/widgets/WidgetFactory.tsx | 3 ++ src/widgets/custom/ColorPicker.tsx | 45 +++++++++++++++++++++++ src/widgets/views/Tree/treeComponents.tsx | 20 +++++++++- 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/widgets/custom/ColorPicker.tsx diff --git a/src/index.ts b/src/index.ts index 6b6974870..4b2071491 100644 --- a/src/index.ts +++ b/src/index.ts @@ -53,6 +53,7 @@ import { DashboardGrid } from "@/widgets/views/DashboardGrid"; import { GraphIndicator } from "@/widgets/views/Graph/GraphIndicator"; import { Spinner } from "@/widgets/custom/Spinner"; import { Carousel } from "@/widgets/custom/Carousel"; +import { ColorPicker } from "@/widgets/custom/ColorPicker"; import type { TreeView, @@ -181,4 +182,5 @@ export { dayjs, Spinner, Carousel, + ColorPicker, }; diff --git a/src/widgets/WidgetFactory.tsx b/src/widgets/WidgetFactory.tsx index ebd273f6a..036055d76 100644 --- a/src/widgets/WidgetFactory.tsx +++ b/src/widgets/WidgetFactory.tsx @@ -37,6 +37,7 @@ import { Alert, Spinner, Carousel, + ColorPicker, } from "@/index"; import { Image } from "./base/Image"; import { FiberGrid } from "./custom/FiberGrid"; @@ -136,6 +137,8 @@ const getWidgetType = (type: string) => { return Spinner; case "carousel": return Carousel; + case "colorPicker": + return ColorPicker; default: return undefined; } diff --git a/src/widgets/custom/ColorPicker.tsx b/src/widgets/custom/ColorPicker.tsx new file mode 100644 index 000000000..765187188 --- /dev/null +++ b/src/widgets/custom/ColorPicker.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { + ColorPicker as AntdColorPicker, + ColorPickerProps as AntColorPickerProps, + GetProp, +} from "antd"; +import { ColorPicker as ColorPickerOoui } from "@gisce/ooui"; + +import Field from "@/common/Field"; +import { WidgetProps } from "@/types"; + +type ColorPickerProps = Omit & { + ooui: ColorPickerOoui; + onChange?: (value: string) => void; +}; + +export const ColorPicker = (props: ColorPickerProps) => { + const { ooui } = props; + + return ( + + + + ); +}; + +export const ColorPickerInput = ( + props: ColorPickerProps & { value?: any; onChange?: (value: any) => void }, +) => { + const { ooui, value, onChange } = props; + + return ( + { + if (onChange) { + onChange(value.toHex()); + } + }} + format="hex" + value={value} + /> + ); +}; diff --git a/src/widgets/views/Tree/treeComponents.tsx b/src/widgets/views/Tree/treeComponents.tsx index 13bc27acd..967727652 100644 --- a/src/widgets/views/Tree/treeComponents.tsx +++ b/src/widgets/views/Tree/treeComponents.tsx @@ -1,5 +1,5 @@ import { ReactElement, useCallback, useEffect, useMemo, useState } from "react"; -import { Checkbox, Spin } from "antd"; +import { Checkbox, Spin , ColorPicker } from "antd"; import { parseFloatToString } from "@/helpers/timeHelper"; import { ProgressBarInput } from "../../base/ProgressBar"; import { One2manyValue } from "../../base/one2many/One2manyInput"; @@ -120,6 +120,23 @@ export const ImageComponent = ({ value }: { value: string }): ReactElement => { ); }; +export const ColorPickerComponent = ({ + value, + key, + ooui, + context, +}: { + value: any; + key: string; + ooui: any; + context: any; +}): ReactElement => { + return useMemo( + () => , + [ooui, value], + ); +}; + export const TagComponent = ({ value, key, @@ -286,4 +303,5 @@ export const COLUMN_COMPONENTS = { avatar: AvatarComponent, tags: TagsComponent, email: EmailTagsComponent, + colorPicker: ColorPickerComponent, }; From c5fab83b4263e6db674c423a723b6d39c04b4209 Mon Sep 17 00:00:00 2001 From: ecarreras <294235+ecarreras@users.noreply.github.com> Date: Tue, 24 Dec 2024 14:43:06 +0000 Subject: [PATCH 25/43] feat: update gisce/ooui to v2.27.0 https://github.com/gisce/ooui/releases/tag/v2.27.0 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd281cbbe..977d52bde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.26.0", + "@gisce/ooui": "2.27.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", @@ -3370,9 +3370,9 @@ } }, "node_modules/@gisce/ooui": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.26.0.tgz", - "integrity": "sha512-NtQ2BcAvHqxGu4hfJr/CtNjwvJceCV44nv7Fphchr3GNEHINX1EkwgSQtqThVS2HeMCc8Ni00NITwrWaH57OMw==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/@gisce/ooui/-/ooui-2.27.0.tgz", + "integrity": "sha512-XJ7wKjq/gr58/CP2b62Z+233pWiEHyWQccm9W0Is79Gmq4awyZU7XJv9T37bxls+N7AXFR6uKcT/UIJj3NyTwg==", "dependencies": { "@gisce/conscheck": "1.0.9", "html-entities": "^2.3.3", diff --git a/package.json b/package.json index b733db600..0706752b2 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", - "@gisce/ooui": "2.26.0", + "@gisce/ooui": "2.27.0", "@gisce/react-formiga-components": "1.8.0", "@gisce/react-formiga-table": "1.9.0", "@monaco-editor/react": "^4.4.5", From 25d98f70ee29eb89fbc159760e60d43fc933d8c3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 24 Dec 2024 14:51:10 +0000 Subject: [PATCH 26/43] chore(release): 2.52.0 [skip ci] # [2.52.0](https://github.com/gisce/react-ooui/compare/v2.51.2...v2.52.0) (2024-12-24) ### Features * **colorPicker:** add new component colorPicker ([07bac0d](https://github.com/gisce/react-ooui/commit/07bac0ddb3f45234bf2affb31faede510e5aea8e)) * update gisce/ooui to v2.27.0 ([c5fab83](https://github.com/gisce/react-ooui/commit/c5fab83b4263e6db674c423a723b6d39c04b4209)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 977d52bde..50b719e41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.51.2", + "version": "2.52.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.51.2", + "version": "2.52.0", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index 0706752b2..db00cab7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.51.2", + "version": "2.52.0", "engines": { "node": "20.5.0" }, From 73cbe55091df72737f8fea77ba6d49ee43abe169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Mon, 30 Dec 2024 11:21:48 +0100 Subject: [PATCH 27/43] fix: graph view issues in actions (#790) --- src/types/index.ts | 2 + src/views/ActionView.tsx | 40 +++++++++++---- src/views/actionViews/GraphActionView.tsx | 50 +++++++++++++++---- src/widgets/base/one2many/One2manyInput.tsx | 1 + .../base/one2many/One2manyInputInfinite.tsx | 1 + src/widgets/views/Graph/Graph.tsx | 31 ++++++++---- 6 files changed, 95 insertions(+), 30 deletions(-) diff --git a/src/types/index.ts b/src/types/index.ts index 5185fd461..1a6245be8 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -67,6 +67,8 @@ export type GraphView = { view_id: number; name: string; title?: string; + fields: any; + search_fields?: SearchFields; }; export type View = TreeView | FormView | DashboardView | GraphView; diff --git a/src/views/ActionView.tsx b/src/views/ActionView.tsx index 04cc03858..de2d378b0 100644 --- a/src/views/ActionView.tsx +++ b/src/views/ActionView.tsx @@ -5,6 +5,7 @@ import { forwardRef, useImperativeHandle, useContext, + useCallback, } from "react"; import { Spin } from "antd"; @@ -35,6 +36,7 @@ import { FormActionView } from "./actionViews/FormActionView"; import { TreeActionView } from "./actionViews/TreeActionView"; import { DashboardActionView } from "./actionViews/DashboardActionView"; import { resolveViewInfoPromises } from "@/helpers/viewHelper"; +import { useDeepCompareEffect } from "use-deep-compare"; type Props = { domain: any; @@ -126,17 +128,20 @@ function ActionView(props: Props, ref: any) { setCurrentIdTabContext?.(id); } - function setCurrentView(view?: View) { - setCurrentViewInternal(view); - const extra = { action_id, action_type }; - setCurrentViewTabContext?.({ ...view, extra } as any); - } + const setCurrentView = useCallback( + (view?: View) => { + setCurrentViewInternal(view); + const extra = { action_id, action_type }; + setCurrentViewTabContext?.({ ...view, extra } as any); + }, + [action_id, action_type, setCurrentViewTabContext], + ); useImperativeHandle(ref, () => ({ canWeClose, })); - const fetchData = async () => { + const fetchData = useCallback(async () => { setIsLoading(true); const viewDataRetrieved: View[] = []; @@ -262,11 +267,23 @@ function ActionView(props: Props, ref: any) { setCurrentView(currentViewToAssign); setAvailableViews(viewDataRetrieved); setIsLoading(false); - }; + }, [ + initialView, + setCurrentView, + views, + model, + context, + action_id, + action_type, + title, + treeExpandable, + onRemoveTab, + tabKey, + ]); setCanWeClose({ tabKey, canWeClose }); - useEffect(() => { + useDeepCompareEffect(() => { const treeView = availableViews.find((v) => v.type === "tree") as TreeView; const initialViewWithData: View = availableViews.find((v) => { if (!initialView.id) { @@ -286,7 +303,7 @@ function ActionView(props: Props, ref: any) { fetchData(); }, [model, views, res_id]); - useEffect(() => { + useDeepCompareEffect(() => { if (activeKey === tabKey) { setCurrentIdTabContext?.(currentId); const extra = { action_id, action_type }; @@ -454,6 +471,11 @@ function ActionView(props: Props, ref: any) { formView={ availableViews.find((v) => v.type === "form") as FormView } + graphView={ + availableViews.find( + (v) => v.view_id === view.view_id, + ) as GraphView + } /> ); } diff --git a/src/views/actionViews/GraphActionView.tsx b/src/views/actionViews/GraphActionView.tsx index aeb4d391f..bd73574ac 100644 --- a/src/views/actionViews/GraphActionView.tsx +++ b/src/views/actionViews/GraphActionView.tsx @@ -1,12 +1,12 @@ import GraphActionBar from "@/actionbar/GraphActionBar"; import TitleHeader from "@/ui/TitleHeader"; import { Graph } from "@/widgets/views/Graph/Graph"; -import React, { useContext, useEffect, useRef, useState } from "react"; +import React, { useContext, useEffect, useRef, useState, useMemo } from "react"; import { ActionViewContext, ActionViewContextType, } from "@/context/ActionViewContext"; -import { FormView, TreeView } from "@/types"; +import { FormView, GraphView, TreeView } from "@/types"; import { mergeSearchFields } from "@/helpers/formHelper"; import { useSearch } from "@/hooks/useSearch"; import SearchFilter from "@/widgets/views/searchFilter/SearchFilter"; @@ -14,18 +14,27 @@ import { Spin } from "antd"; import { mergeParams } from "@/helpers/searchHelper"; export type GraphActionViewProps = { - viewData: any; + viewData: GraphView; visible: boolean; model: string; context: any; domain: any; formView: FormView; treeView: TreeView; + graphView: GraphView; }; export const GraphActionView = (props: GraphActionViewProps) => { - const { viewData, visible, model, context, domain, formView, treeView } = - props; + const { + viewData, + visible, + model, + context, + domain, + formView, + treeView, + graphView, + } = props; const graphRef = useRef(); const actionViewContext = useContext( @@ -90,6 +99,20 @@ export const GraphActionView = (props: GraphActionViewProps) => { setLimit, }); + const searchFields = useMemo( + () => + mergeSearchFields([ + formView?.search_fields, + treeView?.search_fields, + graphView?.search_fields, + ]), + [ + formView?.search_fields, + treeView?.search_fields, + graphView?.search_fields, + ], + ); + if (!visible) { return null; } @@ -107,12 +130,14 @@ export const GraphActionView = (props: GraphActionViewProps) => { }} /> + { r.id) : undefined + applyLimit && resultsActionView && resultsActionView.length > 0 + ? resultsActionView.map((r) => r.id) + : undefined } /> )} diff --git a/src/widgets/base/one2many/One2manyInput.tsx b/src/widgets/base/one2many/One2manyInput.tsx index 3a263ac8b..b8493f3e9 100644 --- a/src/widgets/base/one2many/One2manyInput.tsx +++ b/src/widgets/base/one2many/One2manyInput.tsx @@ -650,6 +650,7 @@ const One2manyInput: React.FC = ( const domain = [[`${ooui.inv_field}`, "=", activeId]]; return ( = ( /> {currentView === "graph" && ( Date: Mon, 30 Dec 2024 10:23:20 +0000 Subject: [PATCH 28/43] chore(release): 2.52.1 [skip ci] ## [2.52.1](https://github.com/gisce/react-ooui/compare/v2.52.0...v2.52.1) (2024-12-30) ### Bug Fixes * graph view issues in actions ([#790](https://github.com/gisce/react-ooui/issues/790)) ([73cbe55](https://github.com/gisce/react-ooui/commit/73cbe55091df72737f8fea77ba6d49ee43abe169)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50b719e41..6f4b06a53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.52.0", + "version": "2.52.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.52.0", + "version": "2.52.1", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index db00cab7b..614000bea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.52.0", + "version": "2.52.1", "engines": { "node": "20.5.0" }, From 3a4152820572afc759a01b2960e2b49c25d3dca9 Mon Sep 17 00:00:00 2001 From: Gisce Date: Tue, 7 Jan 2025 11:31:08 +0100 Subject: [PATCH 29/43] fix: update gisce/react-formiga-table to v1.9.1 (#800) [skip ci] https://github.com/gisce/react-formiga-table/releases/tag/v1.9.1 Co-authored-by: mguellsegarra <5711443+mguellsegarra@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6f4b06a53..16cb70cd0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", "@gisce/react-formiga-components": "1.8.0", - "@gisce/react-formiga-table": "1.9.0", + "@gisce/react-formiga-table": "1.9.1", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", "@types/deep-equal": "^1.0.4", @@ -3409,9 +3409,9 @@ } }, "node_modules/@gisce/react-formiga-table": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@gisce/react-formiga-table/-/react-formiga-table-1.9.0.tgz", - "integrity": "sha512-jKMW2i3rbYThoHQpSIAyaQORsRI6opcLDHMMQAPr33fm/6WoYHTsCkccH7RTZQONC/hGfQQoS7hlSUCKu2Oweg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@gisce/react-formiga-table/-/react-formiga-table-1.9.1.tgz", + "integrity": "sha512-5f3Z+OoGV7lh7ed3TVhatO4Dwrr0nf7jgMnLT69ZZLEg9QUzePyGn4seUfVt8ZsLlt4Hn2jJRtbGm+P32gRnzg==", "dependencies": { "ag-grid-community": "^31.2.1", "ag-grid-react": "^31.2.1", diff --git a/package.json b/package.json index 614000bea..bb5bf512e 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", "@gisce/react-formiga-components": "1.8.0", - "@gisce/react-formiga-table": "1.9.0", + "@gisce/react-formiga-table": "1.9.1", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", "@types/deep-equal": "^1.0.4", From fbfe566701860e9ab9d606d1cae7f22a295500d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Tue, 7 Jan 2025 11:46:21 +0100 Subject: [PATCH 30/43] fix: adjust sort columns restoration (#796) * fix: add sort state in actionviewcontext in order to store them between view switches https://github.com/gisce/webclient/issues/1551 * fix: add get sorted fields from state method https://github.com/gisce/webclient/issues/1551 * fix: reset selection when view switching to tree https://github.com/gisce/webclient/issues/1551 * fix: migrate o2many's to new onRequestData signature https://github.com/gisce/webclient/issues/1551 * fix: restore initialSortState and adapt onRequestData in SearchTreeInfinite https://github.com/gisce/webclient/issues/1551 * fix: remove unused imports --- src/context/ActionViewContext.tsx | 8 +++ src/helpers/treeHelper.tsx | 30 ++++++++++- src/hooks/useSearchTreeState.ts | 10 ++++ src/views/actionViews/TreeActionView.tsx | 27 ++++++++-- src/widgets/base/one2many/One2manyTree.tsx | 15 ++++-- src/widgets/views/SearchTreeInfinite.tsx | 60 ++++++++++++++++++---- 6 files changed, 131 insertions(+), 19 deletions(-) diff --git a/src/context/ActionViewContext.tsx b/src/context/ActionViewContext.tsx index 134ec5beb..0eabae1fb 100644 --- a/src/context/ActionViewContext.tsx +++ b/src/context/ActionViewContext.tsx @@ -1,5 +1,6 @@ import { DEFAULT_SEARCH_LIMIT } from "@/models/constants"; import { View } from "@/types"; +import { ColumnState } from "@gisce/react-formiga-table"; import { createContext, useContext, useEffect, useState } from "react"; type ActionViewProviderProps = { @@ -68,6 +69,8 @@ export type ActionViewContextType = Omit< setSearchQuery?: (value: SearchQueryParams) => void; isInfiniteTree?: boolean; setIsInfiniteTree?: (value: boolean) => void; + sortState?: ColumnState[]; + setSortState?: (value: ColumnState[] | undefined) => void; }; export const ActionViewContext = createContext( @@ -127,6 +130,7 @@ const ActionViewProvider = (props: ActionViewProviderProps): any => { const [treeFirstVisibleRow, setTreeFirstVisibleRow] = useState(0); const [searchQuery, setSearchQuery] = useState(); const [isInfiniteTree, setIsInfiniteTree] = useState(false); + const [sortState, setSortState] = useState(); const [limit, setLimit] = useState( limitProps !== undefined ? limitProps : DEFAULT_SEARCH_LIMIT, @@ -234,6 +238,8 @@ const ActionViewProvider = (props: ActionViewProviderProps): any => { setSearchQuery, isInfiniteTree, setIsInfiniteTree, + sortState, + setSortState, }} > {children} @@ -310,6 +316,8 @@ export const useActionViewContext = () => { setSearchQuery: () => {}, isInfiniteTree: false, setIsInfiniteTree: () => {}, + sortState: undefined, + setSortState: () => {}, }; } diff --git a/src/helpers/treeHelper.tsx b/src/helpers/treeHelper.tsx index 9b71a56b2..d48faad53 100644 --- a/src/helpers/treeHelper.tsx +++ b/src/helpers/treeHelper.tsx @@ -6,7 +6,7 @@ import { Reference, } from "@gisce/ooui"; import { TreeView, Column } from "@/types"; -import { SortDirection } from "@gisce/react-formiga-table"; +import { SortDirection, ColumnState } from "@gisce/react-formiga-table"; const getTree = (treeView: TreeView): TreeOoui => { const xml = treeView.arch; @@ -219,6 +219,33 @@ function hasActualValues(obj: Record): boolean { return false; } +const getSortedFieldsFromState = ({ + state, +}: { + state?: ColumnState[]; +}): Record | undefined => { + if (!state) { + return undefined; + } + + const columnsWithSort = state + .filter((col) => col.sort) + .sort((a, b) => (a.sortIndex || 0) - (b.sortIndex || 0)); + + if (columnsWithSort.length === 0) { + return undefined; + } + const sortFields = columnsWithSort.reduce( + (acc, col) => ({ + ...acc, + [col.colId]: col.sort, + }), + {}, + ); + + return sortFields; +}; + const getOrderFromSortFields = (sortFields?: Record) => { if (!sortFields) { return undefined; @@ -260,4 +287,5 @@ export { hasActualValues, getOrderFromSortFields, extractTreeXmlAttribute, + getSortedFieldsFromState, }; diff --git a/src/hooks/useSearchTreeState.ts b/src/hooks/useSearchTreeState.ts index afbd69278..f02e4243a 100644 --- a/src/hooks/useSearchTreeState.ts +++ b/src/hooks/useSearchTreeState.ts @@ -4,6 +4,7 @@ import { SearchQueryParams, useIsUnderActionViewContext, } from "@/context/ActionViewContext"; +import { ColumnState } from "@gisce/react-formiga-table"; export type SearchTreeState = { treeIsLoading: boolean; @@ -27,6 +28,8 @@ export type SearchTreeState = { totalItems: number; setTotalItems: (value: number) => void; isActive?: boolean; + sortState?: ColumnState[]; + setSortState: (value: ColumnState[] | undefined) => void; }; export function useSearchTreeState({ @@ -50,6 +53,9 @@ export function useSearchTreeState({ const [localResults, setLocalResults] = useState([]); const [localSearchQuery, setLocalSearchQuery] = useState(); const [localTotalItems, setLocalTotalItems] = useState(0); + const [localSortState, setLocalSortState] = useState< + ColumnState[] | undefined + >(); // Return either context values or local state values based on isUnderActionViewContext return isUnderActionViewContext @@ -78,6 +84,8 @@ export function useSearchTreeState({ totalItems: actionViewContext.totalItems ?? 0, setTotalItems: actionViewContext.setTotalItems ?? (() => {}), isActive: actionViewContext.isActive, + sortState: actionViewContext.sortState, + setSortState: actionViewContext.setSortState ?? (() => {}), } : { treeIsLoading: localTreeIsLoading, @@ -101,5 +109,7 @@ export function useSearchTreeState({ totalItems: localTotalItems, setTotalItems: setLocalTotalItems, isActive: undefined, + sortState: localSortState, + setSortState: setLocalSortState, }; } diff --git a/src/views/actionViews/TreeActionView.tsx b/src/views/actionViews/TreeActionView.tsx index 7cd439bac..a9bde73ee 100644 --- a/src/views/actionViews/TreeActionView.tsx +++ b/src/views/actionViews/TreeActionView.tsx @@ -1,7 +1,14 @@ import TreeActionBar from "@/actionbar/TreeActionBar"; import { FormView, TreeView, View } from "@/types"; import TitleHeader from "@/ui/TitleHeader"; -import { Fragment, useCallback, useContext, useEffect, useMemo } from "react"; +import { + Fragment, + useCallback, + useContext, + useEffect, + useMemo, + useRef, +} from "react"; import { ActionViewContext, ActionViewContextType, @@ -43,6 +50,7 @@ export const TreeActionView = (props: TreeActionViewProps) => { availableViews, searchTreeNameSearch, } = props; + const previousVisibleRef = useRef(visible); const isInfiniteTree = useMemo(() => { if (!treeView?.arch || treeView.isExpandable) { @@ -57,9 +65,12 @@ export const TreeActionView = (props: TreeActionViewProps) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [isInfiniteTree]); - const { currentView, setPreviousView, setIsInfiniteTree } = useContext( - ActionViewContext, - ) as ActionViewContextType; + const { + currentView, + setPreviousView, + setIsInfiniteTree, + setSelectedRowItems, + } = useContext(ActionViewContext) as ActionViewContextType; const onRowClicked = useCallback( (event: any) => { @@ -86,6 +97,14 @@ export const TreeActionView = (props: TreeActionViewProps) => { ], ); + useEffect(() => { + if (previousVisibleRef.current && !visible && isInfiniteTree) { + setSelectedRowItems?.([]); + } + previousVisibleRef.current = visible; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [visible, isInfiniteTree]); + if (!visible) { return null; } diff --git a/src/widgets/base/one2many/One2manyTree.tsx b/src/widgets/base/one2many/One2manyTree.tsx index 6f1a6a2f4..6eda2a9f8 100644 --- a/src/widgets/base/one2many/One2manyTree.tsx +++ b/src/widgets/base/one2many/One2manyTree.tsx @@ -1,12 +1,16 @@ import { + ColumnState, InfiniteTable, InfiniteTableRef, SortDirection, } from "@gisce/react-formiga-table"; import { One2manyItem } from "./One2manyInput"; import { Tree as TreeOoui } from "@gisce/ooui"; -import { RefObject, useCallback, useMemo, useRef } from "react"; -import { getTableColumns, getTableItems } from "@/helpers/treeHelper"; +import { RefObject, useCallback, useRef } from "react"; +import { + getSortedFieldsFromState, + getTableColumns, +} from "@/helpers/treeHelper"; import { COLUMN_COMPONENTS } from "@/widgets/views/Tree/treeComponents"; import useDeepCompareEffect from "use-deep-compare-effect"; import { useDeepCompareMemo } from "use-deep-compare"; @@ -113,12 +117,15 @@ export const One2manyTree = ({ async ({ startRow, endRow, - sortFields, + state, }: { startRow: number; endRow: number; - sortFields?: Record; + state?: ColumnState[]; }) => { + const sortFields = getSortedFieldsFromState({ + state, + }); const { results, colors, status } = await onFetchRecords({ allItems: itemsRef.current, startRow, diff --git a/src/widgets/views/SearchTreeInfinite.tsx b/src/widgets/views/SearchTreeInfinite.tsx index 4cf798bb2..edda42708 100644 --- a/src/widgets/views/SearchTreeInfinite.tsx +++ b/src/widgets/views/SearchTreeInfinite.tsx @@ -17,17 +17,22 @@ import { Badge, Spin } from "antd"; import { getColorMap, getOrderFromSortFields, + getSortedFieldsFromState, getStatusMap, getTableColumns, getTableItems, getTree, } from "@/helpers/treeHelper"; import { COLUMN_COMPONENTS } from "./Tree/treeComponents"; -import { useDeepCompareEffect, useDeepCompareMemo } from "use-deep-compare"; import { + useDeepCompareCallback, + useDeepCompareEffect, + useDeepCompareMemo, +} from "use-deep-compare"; +import { + ColumnState, InfiniteTable, InfiniteTableRef, - SortDirection, } from "@gisce/react-formiga-table"; import ConnectionProvider from "@/ConnectionProvider"; import { useAvailableHeight } from "@/hooks/useAvailableHeight"; @@ -91,6 +96,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { const statusForResults = useRef<{ [key: number]: string }>(); const tableRef: RefObject = useRef(null); const lastAssignedResults = useRef([]); + const hasRestoredSortStateForFirstTime = useRef(false); const showErrorDialog = useShowErrorDialog(); const [totalRowsLoading, setTotalRowsLoading] = useState(true); @@ -130,6 +136,8 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { setSearchQuery, setTotalItems: setTotalItemsActionView, isActive, + sortState: actionViewSortState, + setSortState: setActionViewSortState, } = useSearchTreeState({ useLocalState: !rootTree }); const nameSearch = nameSearchProps || searchTreeNameSearch; @@ -188,11 +196,14 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { }, [treeOoui, parentContext]); const columnStateKey = useMemo(() => { + if (loading) { + return undefined; + } return getKey({ treeViewId: treeView?.view_id, model, }); - }, [model, treeView?.view_id]); + }, [model, treeView?.view_id, loading]); const { loading: getColumnStateInProgress, @@ -245,15 +256,15 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { showErrorDialog, ]); - const fetchResults = useCallback( + const fetchResults = useDeepCompareCallback( async ({ startRow, endRow, - sortFields, + state, }: { startRow: number; endRow: number; - sortFields?: Record; + state?: ColumnState[]; }) => { if (!treeOoui) { return []; @@ -267,8 +278,33 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { attrs.status = treeOoui.status; } + let order; + if (!hasRestoredSortStateForFirstTime.current && actionViewSortState) { + hasRestoredSortStateForFirstTime.current = true; + const sortFields = getSortedFieldsFromState({ + state: actionViewSortState, + }); + order = getOrderFromSortFields(sortFields); + } else { + const stateWithSortData = state + ?.filter((column) => column.sort || column.sortIndex) + .map((column) => ({ + sort: column.sort || undefined, + sortIndex: column.sortIndex || undefined, + colId: column.colId, + })); + const finalStateWithSortData = + stateWithSortData && stateWithSortData?.length > 0 + ? stateWithSortData + : undefined; + const sortFields = getSortedFieldsFromState({ + state: finalStateWithSortData, + }); + setActionViewSortState?.(finalStateWithSortData); + order = getOrderFromSortFields(sortFields); + } + const params = nameSearch ? domain : mergedParams; - const order = getOrderFromSortFields(sortFields); const { results, attrsEvaluated } = await ConnectionProvider.getHandler().searchForTree({ @@ -337,6 +373,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { }, [ actionViewResults, + actionViewSortState, domain, mergedParams, model, @@ -344,6 +381,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { nameSearch, parentContext, setActionViewResults, + setActionViewSortState, setSearchQuery, setTotalItemsActionView, treeOoui, @@ -363,18 +401,18 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { async ({ startRow, endRow, - sortFields, + state, }: { startRow: number; endRow: number; - sortFields?: Record; + state?: ColumnState[]; }) => { try { setTreeIsLoading?.(true); const results = await fetchResults({ startRow, endRow, - sortFields, + state, }); return results; } catch (error) { @@ -525,9 +563,11 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { statusComponent={statusComp} onRowStatus={onRowStatus} strings={strings} + initialSortState={actionViewSortState} /> ); }, [ + actionViewSortState, availableHeight, changeSelectedRowKeys, columns, From b09f61e80b0fbfc82e38228b0c5f805e6d31f7e6 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 7 Jan 2025 10:47:51 +0000 Subject: [PATCH 31/43] chore(release): 2.52.2 [skip ci] ## [2.52.2](https://github.com/gisce/react-ooui/compare/v2.52.1...v2.52.2) (2025-01-07) ### Bug Fixes * adjust sort columns restoration ([#796](https://github.com/gisce/react-ooui/issues/796)) ([fbfe566](https://github.com/gisce/react-ooui/commit/fbfe566701860e9ab9d606d1cae7f22a295500d0)) * update gisce/react-formiga-table to v1.9.1 ([#800](https://github.com/gisce/react-ooui/issues/800)) [skip ci] ([3a41528](https://github.com/gisce/react-ooui/commit/3a4152820572afc759a01b2960e2b49c25d3dca9)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16cb70cd0..cd7f77454 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.52.1", + "version": "2.52.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.52.1", + "version": "2.52.2", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index bb5bf512e..5bbe63a52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.52.1", + "version": "2.52.2", "engines": { "node": "20.5.0" }, From 2bdb211221fafd449c2845191d58a127db48cb74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Gu=CC=88ell=20Segarra?= Date: Wed, 8 Jan 2025 10:32:27 +0100 Subject: [PATCH 32/43] chore: update create-sync-pr action to v0.0.9 in release workflow [skip ci] --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 94c6a613a..3d7ad6934 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -103,7 +103,7 @@ jobs: target: ['alpha', 'v2-develop'] steps: - name: Call create sync pr - uses: gisce/create-sync-pr@v0.0.6 + uses: gisce/create-sync-pr@v0.0.9 with: repository: ${{ env.LIBRARY_NAME }} targetBranch: ${{ matrix.target }} From e0b68e3cb7996b385e2347392621f985f2b5c30c Mon Sep 17 00:00:00 2001 From: Eduard Carrerars Date: Wed, 8 Jan 2025 11:52:42 +0100 Subject: [PATCH 33/43] fix(tags): better color for visualitzation --- package-lock.json | 26 +++++++++++++++++++------- package.json | 1 + src/helpers/formHelper.ts | 12 ++++++++++++ src/widgets/custom/Tag.tsx | 13 +++++++++---- src/widgets/custom/Tags.tsx | 9 +++++++-- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd7f77454..ce7531b68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "@gisce/react-ooui", "version": "2.52.2", "dependencies": { + "@ant-design/colors": "^7.2.0", "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", @@ -116,11 +117,11 @@ } }, "node_modules/@ant-design/colors": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.2.tgz", - "integrity": "sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.0.tgz", + "integrity": "sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==", "dependencies": { - "@ctrl/tinycolor": "^3.6.1" + "@ant-design/fast-color": "^2.0.6" } }, "node_modules/@ant-design/cssinjs": { @@ -141,6 +142,17 @@ "react-dom": ">=16.0.0" } }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, "node_modules/@ant-design/icons": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.2.6.tgz", @@ -2387,9 +2399,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, diff --git a/package.json b/package.json index 5bbe63a52..725bdb2ed 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "analyze": "vite-bundle-visualizer" }, "dependencies": { + "@ant-design/colors": "^7.2.0", "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", diff --git a/src/helpers/formHelper.ts b/src/helpers/formHelper.ts index 2dd737894..d1c819e22 100644 --- a/src/helpers/formHelper.ts +++ b/src/helpers/formHelper.ts @@ -1,5 +1,6 @@ import { One2manyItem } from "@/widgets/base/one2many/One2manyInput"; import { Form as FormOoui } from "@gisce/ooui"; +import { generate } from "@ant-design/colors"; const filteredValues = (values: any, fields: any) => { if (!fields) { @@ -269,6 +270,17 @@ export const colorFromString = (text: string): string => { return hexColour; }; +export const getTextAndBackgroundColors = ( + color: string, + intensity: number = 7, +) => { + const colors = generate(color); + return { + text: colors[intensity], + background: `${color}40`, + }; +}; + export const colorTextFromBackground = (color: string) => { function getRGB(c: string): number { return parseInt(c, 16) || parseInt(c); diff --git a/src/widgets/custom/Tag.tsx b/src/widgets/custom/Tag.tsx index 65f60d614..6e01e4e4d 100644 --- a/src/widgets/custom/Tag.tsx +++ b/src/widgets/custom/Tag.tsx @@ -3,7 +3,11 @@ import Field from "@/common/Field"; import { WidgetProps } from "@/types"; import { Tag as AntdTag, TagProps } from "antd"; import { isPresetStatusColor, isPresetColor } from "antd/lib/_util/colors"; -import { colorFromString, colorFromBoolean } from "@/helpers/formHelper"; +import { + colorFromString, + colorFromBoolean, + getTextAndBackgroundColors, +} from "@/helpers/formHelper"; import { useLocale } from "@gisce/react-formiga-components"; function capitalizeFirstLetter(text: string): string { @@ -51,13 +55,14 @@ export const CustomTag = (props: TagProps) => { let { color } = props; let style = {}; if (!isPresetStatusColor(props.color) && !isPresetColor(props.color)) { + const colors = getTextAndBackgroundColors(color as string); style = { - color, - borderColor: color, + color: colors.text, + borderColor: colors.text, borderStyle: "solid", borderWidth: "1px", }; - color = `${color}20`; + color = colors.background; } return ( diff --git a/src/widgets/custom/Tags.tsx b/src/widgets/custom/Tags.tsx index 4a46cd534..01335bd45 100644 --- a/src/widgets/custom/Tags.tsx +++ b/src/widgets/custom/Tags.tsx @@ -6,7 +6,11 @@ import { One2manyItem, One2manyValue } from "../base/one2many/One2manyInput"; import useDeepCompareEffect from "use-deep-compare-effect"; import { FormContext, FormContextType } from "@/context/FormContext"; import { Alert, Select } from "antd"; -import { colorFromString, transformPlainMany2Ones } from "@/helpers/formHelper"; +import { + colorFromString, + transformPlainMany2Ones, + getTextAndBackgroundColors, +} from "@/helpers/formHelper"; import ConnectionProvider from "@/ConnectionProvider"; import { CustomTag } from "@/widgets/custom/Tag"; @@ -128,13 +132,14 @@ export const TagsInput = (props: TagsInputProps) => { event.stopPropagation(); }; const color = colorFromString(label); + const colors = getTextAndBackgroundColors(color); return ( X} + closeIcon={X} > {label} From 4ec3b1c204d16c1fde842b023c79acf07115d718 Mon Sep 17 00:00:00 2001 From: Gisce Date: Wed, 8 Jan 2025 11:53:29 +0100 Subject: [PATCH 34/43] feat: update gisce/react-formiga-components to v1.9.0 (#805) [skip ci] https://github.com/gisce/react-formiga-components/releases/tag/v1.9.0 Co-authored-by: mguellsegarra <5711443+mguellsegarra@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd7f77454..29fd1044c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", - "@gisce/react-formiga-components": "1.8.0", + "@gisce/react-formiga-components": "1.9.0", "@gisce/react-formiga-table": "1.9.1", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", @@ -3384,9 +3384,9 @@ } }, "node_modules/@gisce/react-formiga-components": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@gisce/react-formiga-components/-/react-formiga-components-1.8.0.tgz", - "integrity": "sha512-bsLp9sa4WEGgHsb/jhog5JRDDgKwgtkouw11ZQD86SdRS5hhO4Ri1gVmmPUO8dM4wLZdOBst1S//4o4jYb9pHw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@gisce/react-formiga-components/-/react-formiga-components-1.9.0.tgz", + "integrity": "sha512-khyUsa+VAgMYSbgnEGyZmi2rx0dgkrBpjLOk+SUSnbJCzRzbc4X8yfjPVbve3Au+LCsxvVE76sxFYKnbGTPTKQ==", "dependencies": { "antd": "5.13.1", "classnames": "^2.5.1", diff --git a/package.json b/package.json index 5bbe63a52..34593d369 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", - "@gisce/react-formiga-components": "1.8.0", + "@gisce/react-formiga-components": "1.9.0", "@gisce/react-formiga-table": "1.9.1", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", From 2b80ea40497809516a861c9d26c358df9f416c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Wed, 8 Jan 2025 11:55:12 +0100 Subject: [PATCH 35/43] feat: enhance Notebook component with styled elements (#804) --- src/widgets/containers/Notebook.tsx | 33 ++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/widgets/containers/Notebook.tsx b/src/widgets/containers/Notebook.tsx index 8b8d54ab3..f6c00769a 100644 --- a/src/widgets/containers/Notebook.tsx +++ b/src/widgets/containers/Notebook.tsx @@ -1,11 +1,33 @@ import React from "react"; -import { Tabs } from "antd"; +import { Tabs, theme } from "antd"; +import styled from "styled-components"; import iconMapper from "@/helpers/iconMapper"; import { Notebook as NotebookOoui, Group as GroupOoui } from "@gisce/ooui"; import { Group } from "@/index"; const { TabPane } = Tabs; +const StyledTabs = styled(Tabs)<{ borderRadius?: string }>` + .ant-tabs-content-holder { + border-left: 1px solid rgba(228, 228, 231, var(--tw-border-opacity)); + border-right: 1px solid rgba(228, 228, 231, var(--tw-border-opacity)); + border-bottom: 1px solid rgba(228, 228, 231, var(--tw-border-opacity)); + padding: 15px; + border-bottom-left-radius: ${(props) => props.borderRadius || "5px"}; + border-bottom-right-radius: ${(props) => props.borderRadius || "5px"}; + margin-top: -1px; + } + + .ant-tabs > .ant-tabs-nav { + /* So that there is no gap between the content and tabs */ + margin-bottom: 0; + } + + .ant-tabs-nav { + margin-bottom: 0 !important; + } +`; + type Props = { ooui: NotebookOoui; responsiveBehaviour: boolean; @@ -14,6 +36,7 @@ type Props = { function Notebook(props: Props): React.ReactElement { const { ooui, responsiveBehaviour } = props; const tabs = ooui.pages; + const { token } = theme.useToken(); function getPageIcon(icon: string) { if (icon) { @@ -24,7 +47,11 @@ function Notebook(props: Props): React.ReactElement { } return ( - + {tabs .filter((page: any) => !page.invisible) .map((page: any) => { @@ -45,7 +72,7 @@ function Notebook(props: Props): React.ReactElement { ); })} - + ); } From 073e2560fd31449da4504d315edb35affcb5864a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 8 Jan 2025 10:56:43 +0000 Subject: [PATCH 36/43] chore(release): 2.53.0 [skip ci] # [2.53.0](https://github.com/gisce/react-ooui/compare/v2.52.2...v2.53.0) (2025-01-08) ### Features * enhance Notebook component with styled elements ([#804](https://github.com/gisce/react-ooui/issues/804)) ([2b80ea4](https://github.com/gisce/react-ooui/commit/2b80ea40497809516a861c9d26c358df9f416c52)) * update gisce/react-formiga-components to v1.9.0 ([#805](https://github.com/gisce/react-ooui/issues/805)) [skip ci] ([4ec3b1c](https://github.com/gisce/react-ooui/commit/4ec3b1c204d16c1fde842b023c79acf07115d718)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29fd1044c..aaadfed7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.52.2", + "version": "2.53.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.52.2", + "version": "2.53.0", "dependencies": { "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", diff --git a/package.json b/package.json index 34593d369..22b71292c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.52.2", + "version": "2.53.0", "engines": { "node": "20.5.0" }, From 79d42c8825cb1249fd026dc73e0fbcafa36443c1 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 8 Jan 2025 11:26:38 +0000 Subject: [PATCH 37/43] chore(release): 2.53.1 [skip ci] ## [2.53.1](https://github.com/gisce/react-ooui/compare/v2.53.0...v2.53.1) (2025-01-08) ### Bug Fixes * **tags:** better color for visualitzation ([e0b68e3](https://github.com/gisce/react-ooui/commit/e0b68e3cb7996b385e2347392621f985f2b5c30c)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 17e4343ce..1b607f82f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.53.0", + "version": "2.53.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.53.0", + "version": "2.53.1", "dependencies": { "@ant-design/colors": "^7.2.0", "@ant-design/plots": "^1.0.9", diff --git a/package.json b/package.json index c8db1bb4a..819e0d12c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.53.0", + "version": "2.53.1", "engines": { "node": "20.5.0" }, From 4abff99efb6230d32be39f85a149654c3978e7f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Gu=CC=88ell=20Segarra?= Date: Wed, 8 Jan 2025 12:32:44 +0100 Subject: [PATCH 38/43] chore: improve release workflow [skip ci] --- .github/workflows/release.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3d7ad6934..595f9c541 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -33,7 +33,12 @@ jobs: - name: Checkout Repository uses: actions/checkout@v2 with: - fetch-depth: 1 + fetch-depth: 0 + + - name: Sync with Remote Branch + run: | + git fetch origin + git reset --hard origin/${{ github.ref_name }} - name: Install Dependencies run: npm ci From 3a27515acd3b34bbd801617a7fe8c58102e449d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Wed, 8 Jan 2025 13:33:54 +0100 Subject: [PATCH 39/43] fix: border dom warning (#814) [skip ci] --- src/widgets/containers/Notebook.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/widgets/containers/Notebook.tsx b/src/widgets/containers/Notebook.tsx index f6c00769a..75f936a70 100644 --- a/src/widgets/containers/Notebook.tsx +++ b/src/widgets/containers/Notebook.tsx @@ -7,14 +7,14 @@ import { Notebook as NotebookOoui, Group as GroupOoui } from "@gisce/ooui"; import { Group } from "@/index"; const { TabPane } = Tabs; -const StyledTabs = styled(Tabs)<{ borderRadius?: string }>` +const StyledTabs = styled(Tabs)<{ $borderRadius?: string }>` .ant-tabs-content-holder { border-left: 1px solid rgba(228, 228, 231, var(--tw-border-opacity)); border-right: 1px solid rgba(228, 228, 231, var(--tw-border-opacity)); border-bottom: 1px solid rgba(228, 228, 231, var(--tw-border-opacity)); padding: 15px; - border-bottom-left-radius: ${(props) => props.borderRadius || "5px"}; - border-bottom-right-radius: ${(props) => props.borderRadius || "5px"}; + border-bottom-left-radius: ${(props) => props.$borderRadius || "5px"}; + border-bottom-right-radius: ${(props) => props.$borderRadius || "5px"}; margin-top: -1px; } @@ -50,7 +50,7 @@ function Notebook(props: Props): React.ReactElement { {tabs .filter((page: any) => !page.invisible) From 844c83db73bb6d33796d782729f83664e712a9ba Mon Sep 17 00:00:00 2001 From: Gisce Date: Wed, 8 Jan 2025 14:13:00 +0100 Subject: [PATCH 40/43] fix: update gisce/react-formiga-components to v1.9.1 (#815) --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b607f82f..1004d1874 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", - "@gisce/react-formiga-components": "1.9.0", + "@gisce/react-formiga-components": "1.9.1", "@gisce/react-formiga-table": "1.9.1", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", @@ -3396,9 +3396,9 @@ } }, "node_modules/@gisce/react-formiga-components": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@gisce/react-formiga-components/-/react-formiga-components-1.9.0.tgz", - "integrity": "sha512-khyUsa+VAgMYSbgnEGyZmi2rx0dgkrBpjLOk+SUSnbJCzRzbc4X8yfjPVbve3Au+LCsxvVE76sxFYKnbGTPTKQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@gisce/react-formiga-components/-/react-formiga-components-1.9.1.tgz", + "integrity": "sha512-7VLIdmnm0gRn5rfHC0zfnZmZv81qAFmDwRNZaLfepQrBxTgULTOW+boCuzxqyAO1G5xN4eXrx55yRyOao7rv+g==", "dependencies": { "antd": "5.13.1", "classnames": "^2.5.1", diff --git a/package.json b/package.json index 819e0d12c..fed047653 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@ant-design/plots": "^1.0.9", "@gisce/fiber-diagram": "2.1.1", "@gisce/ooui": "2.27.0", - "@gisce/react-formiga-components": "1.9.0", + "@gisce/react-formiga-components": "1.9.1", "@gisce/react-formiga-table": "1.9.1", "@monaco-editor/react": "^4.4.5", "@tabler/icons-react": "^2.11.0", From 1fa6a70ff92575c8f92425598a45627be20c060a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 8 Jan 2025 13:14:32 +0000 Subject: [PATCH 41/43] chore(release): 2.53.2 [skip ci] ## [2.53.2](https://github.com/gisce/react-ooui/compare/v2.53.1...v2.53.2) (2025-01-08) ### Bug Fixes * border dom warning ([#814](https://github.com/gisce/react-ooui/issues/814)) [skip ci] ([3a27515](https://github.com/gisce/react-ooui/commit/3a27515acd3b34bbd801617a7fe8c58102e449d3)) * update gisce/react-formiga-components to v1.9.1 ([#815](https://github.com/gisce/react-ooui/issues/815)) ([844c83d](https://github.com/gisce/react-ooui/commit/844c83db73bb6d33796d782729f83664e712a9ba)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1004d1874..78461b80b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.53.1", + "version": "2.53.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.53.1", + "version": "2.53.2", "dependencies": { "@ant-design/colors": "^7.2.0", "@ant-design/plots": "^1.0.9", diff --git a/package.json b/package.json index fed047653..1d8b5bd93 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.53.1", + "version": "2.53.2", "engines": { "node": "20.5.0" }, From b71e39bc453481532d9c1beae1fcebcb453fe385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20G=C3=BCell=20Segarra?= Date: Thu, 9 Jan 2025 11:36:56 +0100 Subject: [PATCH 42/43] fix(SearchTreeInfinite): adjust selected row item management (#820) https://github.com/gisce/webclient/issues/1595 - Introduced a new `changeSelectedRowItems` function to centralize the logic for updating selected row items and their keys. - Replaced direct calls to `setSelectedRowItems` with `changeSelectedRowItems` in multiple locations to improve code consistency and maintainability. - Updated dependencies in the `useCallback` hooks to include the new function for better performance and clarity. --- src/widgets/views/SearchTreeInfinite.tsx | 33 +++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/widgets/views/SearchTreeInfinite.tsx b/src/widgets/views/SearchTreeInfinite.tsx index edda42708..e91ed2d69 100644 --- a/src/widgets/views/SearchTreeInfinite.tsx +++ b/src/widgets/views/SearchTreeInfinite.tsx @@ -389,8 +389,16 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { ], ); + const changeSelectedRowItems = useCallback( + (newSelectedRowItems: any[]) => { + setSelectedRowItems?.(newSelectedRowItems); + onChangeSelectedRowKeys?.(newSelectedRowItems.map((item) => item.id)); + }, + [onChangeSelectedRowKeys, setSelectedRowItems], + ); + const changeSelectedRowKeys = useCallback( - (newSelectedRowKeys: any[]) => { + (newSelectedRowKeys: number[]) => { setSelectedRowItems?.(newSelectedRowKeys.map((id: number) => ({ id }))); onChangeSelectedRowKeys?.(newSelectedRowKeys); }, @@ -460,7 +468,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { const selectAllPromise = async () => { if (nameSearch) { - setSelectedRowItems?.(lastAssignedResults.current); + changeSelectedRowItems(lastAssignedResults.current); return; } @@ -476,7 +484,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { totalItems: totalRows, }, ); - setSelectedRowItems?.(allRowsResults.map((id: number) => ({ id }))); + changeSelectedRowItems(allRowsResults.map((id: number) => ({ id }))); }; if (mustSelectAll) { @@ -493,9 +501,10 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { selectAllPromise(); } } else { - setSelectedRowItems?.([]); + setSelectedRowItems([]); } }, [ + changeSelectedRowItems, domain, mergedParams, model, @@ -613,11 +622,11 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { }, [searchParams, searchVisible]); const refresh = useCallback(async () => { - setSelectedRowItems?.([]); + changeSelectedRowItems([]); currentSearchParamsString.current = undefined; await updateTotalRows(); tableRef?.current?.refresh(); - }, [setSelectedRowItems, updateTotalRows]); + }, [changeSelectedRowItems, updateTotalRows]); useImperativeHandle(ref, () => ({ refreshResults: refresh, @@ -658,13 +667,13 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { ); const onSearchFilterClear = useCallback(() => { - setSelectedRowItems?.([]); + changeSelectedRowItems([]); tableRef.current?.unselectAll(); setSearchTreeNameSearch?.(undefined); setSearchParams?.([]); setSearchValues?.(undefined); }, [ - setSelectedRowItems, + changeSelectedRowItems, setSearchTreeNameSearch, setSearchParams, setSearchValues, @@ -672,14 +681,14 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { const onSearchFilterSubmit = useCallback( ({ params, searchValues }: any) => { - setSelectedRowItems?.([]); + changeSelectedRowItems([]); tableRef.current?.unselectAll(); setSearchTreeNameSearch?.(undefined); setSearchParams?.(params); setSearchValues?.(searchValues); }, [ - setSelectedRowItems, + changeSelectedRowItems, setSearchTreeNameSearch, setSearchParams, setSearchValues, @@ -713,7 +722,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { const onSideSearchFilterSubmit = useCallback( ({ params, values }: any) => { - setSelectedRowItems?.([]); + changeSelectedRowItems([]); tableRef.current?.unselectAll(); setSearchTreeNameSearch?.(undefined); setSearchParams?.(params); @@ -721,7 +730,7 @@ function SearchTreeInfiniteComp(props: SearchTreeInfiniteProps, ref: any) { setSearchVisible?.(false); }, [ - setSelectedRowItems, + changeSelectedRowItems, setSearchTreeNameSearch, setSearchParams, setSearchValues, From abb75c42b0e95981dc74c8529960e58446663c5f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 9 Jan 2025 10:38:24 +0000 Subject: [PATCH 43/43] chore(release): 2.53.3 [skip ci] ## [2.53.3](https://github.com/gisce/react-ooui/compare/v2.53.2...v2.53.3) (2025-01-09) ### Bug Fixes * **SearchTreeInfinite:** adjust selected row item management ([#820](https://github.com/gisce/react-ooui/issues/820)) ([b71e39b](https://github.com/gisce/react-ooui/commit/b71e39bc453481532d9c1beae1fcebcb453fe385)) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78461b80b..80444f943 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@gisce/react-ooui", - "version": "2.53.2", + "version": "2.53.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@gisce/react-ooui", - "version": "2.53.2", + "version": "2.53.3", "dependencies": { "@ant-design/colors": "^7.2.0", "@ant-design/plots": "^1.0.9", diff --git a/package.json b/package.json index 1d8b5bd93..3ec4b6b8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gisce/react-ooui", - "version": "2.53.2", + "version": "2.53.3", "engines": { "node": "20.5.0" },