From cd4e9e8e5ffaabc7bcce090eb891fd80e0a4db81 Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Mon, 9 Jun 2025 18:04:02 +0200 Subject: [PATCH 1/9] LPD-55983 Add Entity Field Type for filter and serialize the URL with this value in case exist --- .../selection_filter/SelectionFilter.tsx | 1 + .../internal/serializer/CustomFDSSerializer.java | 4 ++++ .../01-object-definition.batch-engine-data.json | 16 ++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx index 17d493a114814f..400f3e5dfa32c9 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx @@ -214,6 +214,7 @@ function Body({ if (success) { let formData: any = { + entityFieldType: selectedField?.type, fieldName: selectedField?.name, include: includeMode === 'include', label_i18n: i18nFilterLabels, diff --git a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java index c2d8844eed454b..0c44b0f2872a4d 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java +++ b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java @@ -987,6 +987,10 @@ private JSONObject _serializeFilterSelection( ).put( "entityFieldType", () -> { + if (Validator.isNotNull(properties.get("entityFieldType"))) { + return properties.get("entityFieldType"); + } + if (_isCollection( String.valueOf(properties.get("fieldName")), sourceType)) { diff --git a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json index d28e29a9dfbc32..aaabfc7814b2d2 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json +++ b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json @@ -1004,6 +1004,22 @@ "system": true, "type": "Boolean" }, + { + "DBType": "String", + "businessType": "Text", + "externalReferenceCode": "ENTITY_FIELD_TYPE", + "indexed": true, + "indexedAsKeyword": false, + "label": { + "en_US": "Entity Field Type" + }, + "localized": false, + "name": "entityFieldType", + "required": false, + "state": false, + "system": true, + "type": "String" + }, { "DBType": "String", "businessType": "Text", From 673d311c217e569c52e655fc2d8d05368452eb83 Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Fri, 13 Jun 2025 12:24:19 +0200 Subject: [PATCH 2/9] LPD-55983 Add the compatibility for old filters and consider inter for preselected value --- .../resources/js/data_set/filters/Filters.tsx | 12 +++++ .../selection_filter/SelectionFilter.tsx | 21 ++++++-- .../source_type/ApiRestApplication.tsx | 4 +- .../META-INF/resources/js/utils/getFields.ts | 2 + .../META-INF/resources/js/utils/types.ts | 2 + .../set/constants/FDSEntityFieldTypes.java | 2 + .../serializer/CustomFDSSerializer.java | 51 ++++++++++++------- ...1-object-definition.batch-engine-data.json | 16 ++++++ .../implementation/SelectionFilter.tsx | 7 ++- .../controls/filters/utils/types.ts | 1 + 10 files changed, 89 insertions(+), 29 deletions(-) diff --git a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/Filters.tsx b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/Filters.tsx index cb2285bee716e5..6416977b428105 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/Filters.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/Filters.tsx @@ -255,6 +255,17 @@ function Filters({ getFilters(); }, [dataSet]); + const updateEntityFieldType = ({item}: {item: IFilter}): string => { + let entityFieldType = ''; + visit(fields, (field: IFieldTreeItem) => { + if (field.name === item.fieldName && field.entityFieldType) { + entityFieldType = field.entityFieldType; + } + }); + + return entityFieldType; + }; + const updateFiltersOrder = async ({ filtersOrder, }: { @@ -426,6 +437,7 @@ function Filters({ noFilterClientExtensionsAvailableModal(); } else { + item.entityFieldType = updateEntityFieldType({item}); setActiveMode(FILTER_MODE.EDITION); setActiveFilter(item); } diff --git a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx index 400f3e5dfa32c9..78374be98a7965 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/SelectionFilter.tsx @@ -17,6 +17,7 @@ import React, {useState} from 'react'; import CheckboxMultiSelect from '../../../../components/CheckboxMultiSelect'; import RequiredMark from '../../../../components/RequiredMark'; import { + EFieldType, ESelectionFilterSourceType, IField, IFilter, @@ -81,12 +82,20 @@ function Body({ const [multiple, setMultiple] = useState(filter?.multiple ?? true); const [picklists, setPicklists] = useState(); - const [preselectedValueInput, setPreselectedValueInput] = useState(''); + const [preselectedValueInput, setPreselectedValueInput] = useState< + string | number + >(''); const [preselectedValues, setPreselectedValues] = useState( JSON.parse(filter?.preselectedValues || '[]') ); const [selectedField, setSelectedField] = useState( - filter ? {label: filter.fieldName, name: filter.fieldName} : undefined + filter + ? { + entityFieldType: filter.entityFieldType, + label: filter.fieldName, + name: filter.fieldName, + } + : undefined ); const [source, setSource] = useState(filter?.source); const [sourceType, setSourceType] = useState(filter?.sourceType); @@ -214,7 +223,7 @@ function Body({ if (success) { let formData: any = { - entityFieldType: selectedField?.type, + entityFieldType: selectedField?.entityFieldType, fieldName: selectedField?.name, include: includeMode === 'include', label_i18n: i18nFilterLabels, @@ -222,7 +231,11 @@ function Body({ preselectedValues: JSON.stringify( preselectedValues.map((item: any) => ({ label: item.label, - value: item.value, + value: + selectedField?.entityFieldType === + EFieldType.INTEGER + ? Number(item.value) + : item.value, })) ), source, diff --git a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/source_type/ApiRestApplication.tsx b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/source_type/ApiRestApplication.tsx index 4deed8fd4d890c..c369766dd7cad9 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/source_type/ApiRestApplication.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/data_set/filters/components/selection_filter/source_type/ApiRestApplication.tsx @@ -50,7 +50,7 @@ interface IApiRestApplicationModalContentProps { selectedRESTSchema: string | null; sourceItems: TItem[]; }) => void; - preselectedValueInput: string; + preselectedValueInput: string | number; requiredRESTApplicationValidationError: boolean; resolvedRESTSchemas: string[]; restApplications: string[]; @@ -119,7 +119,7 @@ function ApiRestApplication({ selectedItemLabel, source, }: { - preselectedValueInput: string; + preselectedValueInput: string | number; selectedItemKey: string; selectedItemLabel: string; source: string | null; diff --git a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/getFields.ts b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/getFields.ts index 9fd3130c2fddd9..cd36566d57954b 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/getFields.ts +++ b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/getFields.ts @@ -128,6 +128,8 @@ function getValidFields({ }); } + field.entityFieldType = type; + fields.push(field); }); diff --git a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/types.ts b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/types.ts index 531142ae612711..cad99a1c9d2e2f 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/types.ts +++ b/modules/apps/frontend-data-set/frontend-data-set-admin-web/src/main/resources/META-INF/resources/js/utils/types.ts @@ -93,6 +93,7 @@ export interface IDateFilter extends IFilter { export interface IField { children?: Array; + entityFieldType?: string; format?: EFieldFormat; id?: string; label?: string; @@ -113,6 +114,7 @@ export interface IFieldTreeItem extends IField { } export interface IFilter extends IOrderable { + entityFieldType?: string; fieldName: string; filterType?: EFilterType; include?: boolean; diff --git a/modules/apps/frontend-data-set/frontend-data-set-api/src/main/java/com/liferay/frontend/data/set/constants/FDSEntityFieldTypes.java b/modules/apps/frontend-data-set/frontend-data-set-api/src/main/java/com/liferay/frontend/data/set/constants/FDSEntityFieldTypes.java index 7f1d9c805e3783..bbe56f9e79f9c4 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-api/src/main/java/com/liferay/frontend/data/set/constants/FDSEntityFieldTypes.java +++ b/modules/apps/frontend-data-set/frontend-data-set-api/src/main/java/com/liferay/frontend/data/set/constants/FDSEntityFieldTypes.java @@ -16,6 +16,8 @@ public class FDSEntityFieldTypes { public static final String DATE_TIME = "date-time"; + public static final String INTEGER = "integer"; + public static final String STRING = "string"; } \ No newline at end of file diff --git a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java index 0c44b0f2872a4d..6e3d0e17ba7ab3 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java +++ b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java @@ -895,7 +895,7 @@ private JSONObject _serializeFilterClientExtension( return JSONUtil.put( "clientExtensionFilterURL", fdsFilterCET.getURL() ).put( - "entityFieldType", FDSEntityFieldTypes.STRING + "entityFieldType", properties.get("entityFieldType") ).put( "id", fieldName ).put( @@ -964,6 +964,10 @@ private JSONObject _serializeFilterSelection( Map properties, String sourceType) throws Exception { + String entityFieldType = properties.get( + "entityFieldType" + ).toString(); + if (Objects.equals( sourceType, FDSEntryItemImportPolicy.ITEM_PROXY.toString())) { @@ -987,8 +991,8 @@ private JSONObject _serializeFilterSelection( ).put( "entityFieldType", () -> { - if (Validator.isNotNull(properties.get("entityFieldType"))) { - return properties.get("entityFieldType"); + if (Validator.isNotNull(entityFieldType)) { + return entityFieldType; } if (_isCollection( @@ -1001,20 +1005,7 @@ private JSONObject _serializeFilterSelection( return FDSEntityFieldTypes.STRING; } ).put( - "id", - () -> { - if (!Objects.equals(sourceType, "OBJECT_PICKLIST")) { - return fieldName; - } - - int index = fieldName.lastIndexOf(StringPool.FORWARD_SLASH); - - if (index <= 0) { - return fieldName; - } - - return fieldName.substring(0, index); - } + "id", fieldName ).put( "label", MapUtil.getWithFallbackKey(properties, "label", "fieldName") @@ -1079,7 +1070,17 @@ private JSONObject _serializeFilterSelection( listTypeEntry.getName( PortalUtil.getLocale(httpServletRequest)) ).put( - "value", listTypeEntry.getKey() + "value", + () -> { + if (Validator.isNotNull(entityFieldType) && + StringUtil.equalsIgnoreCase( + entityFieldType, FDSEntityFieldTypes.INTEGER)) { + + return Integer.valueOf(listTypeEntry.getKey()); + } + + return listTypeEntry.getKey(); + } )) ).put( "preloadedData", @@ -1110,7 +1111,19 @@ private JSONObject _serializeFilterSelection( listTypeEntry.getName( PortalUtil.getLocale(httpServletRequest)) ).put( - "value", listTypeEntry.getKey() + "value", + () -> { + if (Validator.isNotNull(entityFieldType) && + StringUtil.equalsIgnoreCase( + entityFieldType, + FDSEntityFieldTypes.INTEGER)) { + + return Integer.valueOf( + listTypeEntry.getKey()); + } + + return listTypeEntry.getKey(); + } )); } } diff --git a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json index aaabfc7814b2d2..032f04fe26e9b4 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json +++ b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json @@ -1105,6 +1105,22 @@ "system": true, "type": "Boolean" }, + { + "DBType": "String", + "businessType": "Text", + "externalReferenceCode": "ENTITY_FIELD_TYPE", + "indexed": true, + "indexedAsKeyword": false, + "label": { + "en_US": "Entity Field Type" + }, + "localized": false, + "name": "entityFieldType", + "required": false, + "state": false, + "system": true, + "type": "String" + }, { "DBType": "String", "businessType": "Text", diff --git a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx index b6acf1612c6719..ab2aef0d07c6bb 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx @@ -114,10 +114,9 @@ function getOdataString({ } const quotedSelectedItems = selectedItems.map((item) => - typeof item.value === 'string' || - entityFieldType === EEntityFieldType.STRING - ? `'${item.value}'` - : item.value + entityFieldType === EEntityFieldType.INTEGER + ? Number(item.value) + : `'${item.value}'` ); if (entityFieldType === EEntityFieldType.COLLECTION) { diff --git a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts index a9d98d24341066..c397ef6626facf 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts +++ b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts @@ -7,5 +7,6 @@ export enum EEntityFieldType { COLLECTION = 'collection', DATE = 'date', DATE_TIME = 'date-time', + INTEGER = 'integer', STRING = 'string', } From 3117fcbd19fb47e0e25d53738d6db0d7eadecb65 Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Fri, 13 Jun 2025 12:54:19 +0200 Subject: [PATCH 3/9] LPD-55983 Eliminate duplicity for new Entity Field Type --- .../01-object-definition.batch-engine-data.json | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json index 032f04fe26e9b4..1047abca815b6a 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json +++ b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/resources/com/liferay/frontend/data/set/internal/batch/01-object-definition.batch-engine-data.json @@ -1004,22 +1004,6 @@ "system": true, "type": "Boolean" }, - { - "DBType": "String", - "businessType": "Text", - "externalReferenceCode": "ENTITY_FIELD_TYPE", - "indexed": true, - "indexedAsKeyword": false, - "label": { - "en_US": "Entity Field Type" - }, - "localized": false, - "name": "entityFieldType", - "required": false, - "state": false, - "system": true, - "type": "String" - }, { "DBType": "String", "businessType": "Text", From aea719b99017768ac28aed463862360dff42d6f6 Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Fri, 13 Jun 2025 13:36:02 +0200 Subject: [PATCH 4/9] LPD-55983 Apply formatSource frontend-data-set-sample-web --- .../controls/filters/implementation/SelectionFilter.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx index ab2aef0d07c6bb..d84327ec339cd3 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx @@ -115,7 +115,7 @@ function getOdataString({ const quotedSelectedItems = selectedItems.map((item) => entityFieldType === EEntityFieldType.INTEGER - ? Number(item.value) + ? Number(item.value) : `'${item.value}'` ); From 92de8d1f1d50050f7a186bb83d7a3b0fe03ad75e Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Mon, 16 Jun 2025 09:18:33 +0200 Subject: [PATCH 5/9] LPD-55983 Add validation to avoid breaking change for CX FDS created before this extension. --- .../set/internal/serializer/CustomFDSSerializer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java index 6e3d0e17ba7ab3..bf7b6d6eda0e49 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java +++ b/modules/apps/frontend-data-set/frontend-data-set-impl/src/main/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializer.java @@ -895,7 +895,14 @@ private JSONObject _serializeFilterClientExtension( return JSONUtil.put( "clientExtensionFilterURL", fdsFilterCET.getURL() ).put( - "entityFieldType", properties.get("entityFieldType") + "entityFieldType", + () -> { + if (Validator.isNotNull(properties.get("entityFieldType"))) { + return properties.get("entityFieldType"); + } + + return FDSEntityFieldTypes.STRING; + } ).put( "id", fieldName ).put( From 3fa46590f69bd4f0dc255e9df22fa8b228cc2530 Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Mon, 16 Jun 2025 09:19:40 +0200 Subject: [PATCH 6/9] LPD-55983 Add compatibility for Array and Object as collection to avoid breaking change for CX FDS created before this extension. --- .../controls/filters/implementation/SelectionFilter.tsx | 5 ++++- .../resources/management_bar/controls/filters/utils/types.ts | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx index d84327ec339cd3..8f75fb44050b4b 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/implementation/SelectionFilter.tsx @@ -119,7 +119,10 @@ function getOdataString({ : `'${item.value}'` ); - if (entityFieldType === EEntityFieldType.COLLECTION) { + if ( + entityFieldType === EEntityFieldType.COLLECTION || + entityFieldType === EEntityFieldType.ARRAY + ) { return `${id}/any(x:${quotedSelectedItems .map((value) => `(x ${exclude ? 'ne' : 'eq'} ${value})`) .join(exclude ? ' and ' : ' or ')})`; diff --git a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts index c397ef6626facf..bf14daf1e4366b 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts +++ b/modules/apps/frontend-data-set/frontend-data-set-web/src/main/resources/META-INF/resources/management_bar/controls/filters/utils/types.ts @@ -4,6 +4,7 @@ */ export enum EEntityFieldType { + ARRAY = 'array', COLLECTION = 'collection', DATE = 'date', DATE_TIME = 'date-time', From 4948d60d4c2e6bed9fe1ebe96d3a3915a66a2350 Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Tue, 24 Jun 2025 12:31:39 +0200 Subject: [PATCH 7/9] LPD-55983 Add CustomFDSSerializerTest for EntityFieldType --- .../data/set/internal/serializer/CustomFDSSerializerTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/apps/frontend-data-set/frontend-data-set-impl/src/test/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializerTest.java b/modules/apps/frontend-data-set/frontend-data-set-impl/src/test/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializerTest.java index de5f3aea1ba53c..4c2b45f3b8b529 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-impl/src/test/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializerTest.java +++ b/modules/apps/frontend-data-set/frontend-data-set-impl/src/test/java/com/liferay/frontend/data/set/internal/serializer/CustomFDSSerializerTest.java @@ -563,6 +563,8 @@ public boolean isReadOnly() { _mockSerializeFilters( FDS_NAMES[0], HashMapBuilder.put( + "entityFieldType", FDSEntityFieldTypes.INTEGER + ).put( "fieldName", FIELD_NAMES[0] ).put( "include", true @@ -602,7 +604,7 @@ public boolean isReadOnly() { ).put( "autocompleteEnabled", true ).put( - "entityFieldType", "string" + "entityFieldType", FDSEntityFieldTypes.INTEGER ).put( "id", FIELD_NAMES[0] ).put( From f02267f351c1086404c5d6076e75a17375ebe147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Tard=C3=ADn?= Date: Tue, 24 Jun 2025 11:39:56 +0200 Subject: [PATCH 8/9] LPD-55983 Adding new {picklist}Key field modeled as string --- .../converter/ObjectEntryDTOConverter.java | 2 + .../entity/v1_0/ObjectEntryEntityModel.java | 57 ++++++++++++------- .../v1_0/ObjectEntryOpenAPIResourceImpl.java | 15 ++++- 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java index cec73a59454157..9d6d57985202a1 100644 --- a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java +++ b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java @@ -1044,6 +1044,8 @@ else if (objectField.compareBusinessType( return null; } + // TODO Fill also the {picklist}Key field + return _getListEntry( dtoConverterContext, (String)serializable, objectField.getListTypeDefinitionId()); diff --git a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java index 5885b7560b7860..5cb5771be53d6c 100644 --- a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java +++ b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java @@ -19,6 +19,7 @@ import com.liferay.petra.string.StringPool; import com.liferay.portal.kernel.search.Field; import com.liferay.portal.kernel.util.HashMapBuilder; +import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.odata.entity.BooleanEntityField; import com.liferay.portal.odata.entity.CollectionEntityField; @@ -89,7 +90,7 @@ private ComplexEntityField _getComplexEntityField( relatedObjectDefinition.getName()); } - private EntityField _getEntityField(ObjectField objectField) { + private List _getEntityField(ObjectField objectField) { if (_unsupportedBusinessTypes.contains(objectField.getBusinessType())) { return null; } @@ -98,17 +99,25 @@ private EntityField _getEntityField(ObjectField objectField) { objectField.getBusinessType(), ObjectFieldConstants.BUSINESS_TYPE_DATE_TIME)) { - return new DateTimeEntityField( - objectField.getName(), locale -> objectField.getName(), - locale -> objectField.getName()); + return ListUtil.fromArray( + new DateTimeEntityField( + objectField.getName(), locale -> objectField.getName(), + locale -> objectField.getName())); } else if (Objects.equals( objectField.getBusinessType(), ObjectFieldConstants.BUSINESS_TYPE_MULTISELECT_PICKLIST)) { - return new CollectionEntityField( + // TODO Do this also for single select picklist? + + return ListUtil.fromArray( + new CollectionEntityField( + new StringEntityField( + objectField.getName(), + locale -> objectField.getName())), new StringEntityField( - objectField.getName(), locale -> objectField.getName())); + objectField.getName() + "Key", + locale -> objectField.getName())); } if (Objects.equals( @@ -117,15 +126,17 @@ else if (Objects.equals( Objects.equals( objectField.getDBType(), ObjectFieldConstants.DB_TYPE_DOUBLE)) { - return new DoubleEntityField( - objectField.getName(), locale -> objectField.getName()); + return ListUtil.fromArray( + new DoubleEntityField( + objectField.getName(), locale -> objectField.getName())); } else if (Objects.equals( objectField.getDBType(), ObjectFieldConstants.DB_TYPE_BOOLEAN)) { - return new BooleanEntityField( - objectField.getName(), locale -> objectField.getName()); + return ListUtil.fromArray( + new BooleanEntityField( + objectField.getName(), locale -> objectField.getName())); } else if (Objects.equals( objectField.getDBType(), @@ -134,16 +145,18 @@ else if (Objects.equals( objectField.getDBType(), ObjectFieldConstants.DB_TYPE_STRING)) { - return new StringEntityField( - objectField.getName(), locale -> objectField.getName()); + return ListUtil.fromArray( + new StringEntityField( + objectField.getName(), locale -> objectField.getName())); } else if (Objects.equals( objectField.getDBType(), ObjectFieldConstants.DB_TYPE_DATE)) { - return new DateEntityField( - objectField.getName(), locale -> objectField.getName(), - locale -> objectField.getName()); + return ListUtil.fromArray( + new DateEntityField( + objectField.getName(), locale -> objectField.getName(), + locale -> objectField.getName())); } else if (Objects.equals( objectField.getDBType(), @@ -152,8 +165,9 @@ else if (Objects.equals( objectField.getDBType(), ObjectFieldConstants.DB_TYPE_LONG)) { - return new IntegerEntityField( - objectField.getName(), locale -> objectField.getName()); + return ListUtil.fromArray( + new IntegerEntityField( + objectField.getName(), locale -> objectField.getName())); } throw new BadRequestException( @@ -261,11 +275,12 @@ private Map _getStringEntityFieldsMap( objectField.getRelationshipType(), ObjectRelationshipConstants.TYPE_ONE_TO_MANY)) { - EntityField entityField = _getEntityField(objectField); + List entityFields = _getEntityField(objectField); - if (entityField != null) { - entityFieldsMap.putIfAbsent( - objectField.getName(), entityField); + if (entityFields != null) { + entityFields.forEach( + entityField -> entityFieldsMap.putIfAbsent( + entityField.getName(), entityField)); } continue; diff --git a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/openapi/v1_0/ObjectEntryOpenAPIResourceImpl.java b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/openapi/v1_0/ObjectEntryOpenAPIResourceImpl.java index d48306091fac9d..86b09a348e4091 100644 --- a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/openapi/v1_0/ObjectEntryOpenAPIResourceImpl.java +++ b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/openapi/v1_0/ObjectEntryOpenAPIResourceImpl.java @@ -286,7 +286,20 @@ else if (Objects.equals( "name", String.class.getSimpleName()))); dtoProperty.setRequired(objectField.isRequired()); - return ListUtil.fromArray(dtoProperty); + return ListUtil.fromArray( + dtoProperty, + new DTOProperty( + HashMapBuilder.put( + "x-parent-map", "properties" + ).build(), + objectField.getName() + "Key", + String.class.getSimpleName()) { + + { + setReadOnly(true); + setRequired(objectField.isRequired()); + } + }); } else if (Objects.equals( objectField.getBusinessType(), From d2a15769d4c97bc3830fd3eb91f92ce490a629ad Mon Sep 17 00:00:00 2001 From: Roselaine Marques Date: Wed, 25 Jun 2025 18:04:09 +0200 Subject: [PATCH 9/9] LPD-55983 Fill MultiSelectPickList and PickList to OpenAPI as string --- .../converter/ObjectEntryDTOConverter.java | 28 +++++++++++++++++-- .../entity/v1_0/ObjectEntryEntityModel.java | 18 ++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java index 9d6d57985202a1..57f316a5b89662 100644 --- a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java +++ b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/dto/v1_0/converter/ObjectEntryDTOConverter.java @@ -1044,8 +1044,6 @@ else if (objectField.compareBusinessType( return null; } - // TODO Fill also the {picklist}Key field - return _getListEntry( dtoConverterContext, (String)serializable, objectField.getListTypeDefinitionId()); @@ -1310,6 +1308,32 @@ else if (Objects.equals( () -> _getValue( dtoConverterContext, objectDefinition, objectEntry, objectField, finalSerializable)); + + if (objectField.compareBusinessType( + ObjectFieldConstants.BUSINESS_TYPE_PICKLIST)) { + + String keyFieldName = objectFieldName + "Key"; + + unsafeSuppliers.put(keyFieldName, () -> finalSerializable); + } + else if (objectField.compareBusinessType( + ObjectFieldConstants. + BUSINESS_TYPE_MULTISELECT_PICKLIST)) { + + String keyFieldName = objectFieldName + "Key"; + + unsafeSuppliers.put( + keyFieldName, + () -> { + if (Validator.isNull(finalSerializable)) { + return null; + } + + return StringUtil.split( + (String)finalSerializable, + StringPool.COMMA_AND_SPACE); + }); + } } } diff --git a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java index 5cb5771be53d6c..3a65b061acd487 100644 --- a/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java +++ b/modules/apps/object/object-rest-impl/src/main/java/com/liferay/object/rest/internal/odata/entity/v1_0/ObjectEntryEntityModel.java @@ -141,14 +141,28 @@ else if (Objects.equals( else if (Objects.equals( objectField.getDBType(), ObjectFieldConstants.DB_TYPE_CLOB) || - Objects.equals( + (Objects.equals( objectField.getDBType(), - ObjectFieldConstants.DB_TYPE_STRING)) { + ObjectFieldConstants.DB_TYPE_STRING) && + !Objects.equals( + objectField.getBusinessType(), + ObjectFieldConstants.BUSINESS_TYPE_PICKLIST))) { return ListUtil.fromArray( new StringEntityField( objectField.getName(), locale -> objectField.getName())); } + else if (Objects.equals( + objectField.getBusinessType(), + ObjectFieldConstants.BUSINESS_TYPE_PICKLIST)) { + + return ListUtil.fromArray( + new StringEntityField( + objectField.getName(), locale -> objectField.getName()), + new StringEntityField( + objectField.getName() + "Key", + locale -> objectField.getName())); + } else if (Objects.equals( objectField.getDBType(), ObjectFieldConstants.DB_TYPE_DATE)) {