diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/java/com/liferay/frontend/data/set/views/web/internal/portlet/FDSViewsPortlet.java b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/java/com/liferay/frontend/data/set/views/web/internal/portlet/FDSViewsPortlet.java index 83383a4a43a2de..3490126bcf7ead 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/java/com/liferay/frontend/data/set/views/web/internal/portlet/FDSViewsPortlet.java +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/java/com/liferay/frontend/data/set/views/web/internal/portlet/FDSViewsPortlet.java @@ -104,6 +104,46 @@ protected void doDispatch( super.doDispatch(renderRequest, renderResponse); } + private void _addLocalizedCustomObjectField( + String label, String name, ObjectDefinition objectDefinition, + long userId) + throws Exception { + + ObjectField objectField = ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_TEXT, + ObjectFieldConstants.DB_TYPE_STRING, true, false, null, label, name, + false); + + if (FeatureFlagManagerUtil.isEnabled("LPS-172017")) { + objectField.setLocalized(true); + } + + _objectFieldLocalService.addCustomObjectField( + objectField.getExternalReferenceCode(), userId, + objectField.getListTypeDefinitionId(), + objectDefinition.getObjectDefinitionId(), + objectField.getBusinessType(), objectField.getDBType(), + objectField.isIndexed(), objectField.isIndexedAsKeyword(), + objectField.getIndexedLanguageId(), objectField.getLabelMap(), + objectField.isLocalized(), objectField.getName(), + objectField.getReadOnly(), + objectField.getReadOnlyConditionExpression(), + objectField.isRequired(), objectField.isState(), + objectField.getObjectFieldSettings()); + } + + private void _enableObjectDefinitionLocalization( + ObjectDefinition objectDefinition) { + + if (FeatureFlagManagerUtil.isEnabled("LPS-172017")) { + objectDefinition.setEnableLocalization(true); + + objectDefinition = + _objectDefinitionLocalService.updateObjectDefinition( + objectDefinition); + } + } + private synchronized void _generate( long companyId, Locale locale, long userId) throws Exception { @@ -180,6 +220,11 @@ private synchronized void _generate( ObjectFieldConstants.DB_TYPE_INTEGER, true, false, null, _language.get(locale, "default-items-per-page"), "defaultItemsPerPage", true), + ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_LONG_TEXT, + ObjectFieldConstants.DB_TYPE_CLOB, true, false, null, + _language.get(locale, "actions-order"), + "fdsActionsOrder", false), ObjectFieldUtil.createObjectField( ObjectFieldConstants.BUSINESS_TYPE_LONG_TEXT, ObjectFieldConstants.DB_TYPE_CLOB, true, false, null, @@ -245,39 +290,11 @@ private synchronized void _generate( ObjectFieldConstants.DB_TYPE_BOOLEAN, true, false, null, _language.get(locale, "sortable"), "sortable", false))); - if (FeatureFlagManagerUtil.isEnabled("LPS-172017")) { - fdsFieldObjectDefinition.setEnableLocalization(true); + _enableObjectDefinitionLocalization(fdsFieldObjectDefinition); - fdsFieldObjectDefinition = - _objectDefinitionLocalService.updateObjectDefinition( - fdsFieldObjectDefinition); - } - - ObjectField fieldLabelObjectField = ObjectFieldUtil.createObjectField( - ObjectFieldConstants.BUSINESS_TYPE_TEXT, - ObjectFieldConstants.DB_TYPE_STRING, true, false, null, - _language.get(locale, "column-label"), "label", false); - - if (FeatureFlagManagerUtil.isEnabled("LPS-172017")) { - fieldLabelObjectField.setLocalized(true); - } - - _objectFieldLocalService.addCustomObjectField( - fieldLabelObjectField.getExternalReferenceCode(), userId, - fieldLabelObjectField.getListTypeDefinitionId(), - fdsFieldObjectDefinition.getObjectDefinitionId(), - fieldLabelObjectField.getBusinessType(), - fieldLabelObjectField.getDBType(), - fieldLabelObjectField.isIndexed(), - fieldLabelObjectField.isIndexedAsKeyword(), - fieldLabelObjectField.getIndexedLanguageId(), - fieldLabelObjectField.getLabelMap(), - fieldLabelObjectField.isLocalized(), - fieldLabelObjectField.getName(), - fieldLabelObjectField.getReadOnly(), - fieldLabelObjectField.getReadOnlyConditionExpression(), - fieldLabelObjectField.isRequired(), fieldLabelObjectField.isState(), - fieldLabelObjectField.getObjectFieldSettings()); + _addLocalizedCustomObjectField( + _language.get(locale, "column-label"), "label", + fdsFieldObjectDefinition, userId); _objectDefinitionLocalService.publishSystemObjectDefinition( userId, fdsFieldObjectDefinition.getObjectDefinitionId()); @@ -410,6 +427,71 @@ private synchronized void _generate( LocalizedMapUtil.getLocalizedMap("FDSView FDSSort Relationship"), "fdsViewFDSSortRelationship", ObjectRelationshipConstants.TYPE_ONE_TO_MANY); + + ObjectDefinition fdsActionObjectDefinition = + _objectDefinitionLocalService.addSystemObjectDefinition( + "FDSAction", userId, 0, "FDSAction", "FDSAction", false, + LocalizedMapUtil.getLocalizedMap("FDS Action"), true, + "FDSAction", null, null, null, null, + LocalizedMapUtil.getLocalizedMap("FDS Actions"), + ObjectDefinitionConstants.SCOPE_COMPANY, null, 1, + WorkflowConstants.STATUS_DRAFT, + Arrays.asList( + ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_TEXT, + ObjectFieldConstants.DB_TYPE_STRING, true, false, null, + _language.get(locale, "type"), "type", true), + ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_TEXT, + ObjectFieldConstants.DB_TYPE_STRING, true, false, null, + _language.get(locale, "icon"), "icon", false), + ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_TEXT, + ObjectFieldConstants.DB_TYPE_STRING, true, false, null, + _language.get(locale, "confirmation-message-type"), + "confirmationMessageType", false), + ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_TEXT, + ObjectFieldConstants.DB_TYPE_STRING, true, false, null, + _language.get(locale, "method"), "method", false), + ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_TEXT, + ObjectFieldConstants.DB_TYPE_STRING, true, false, null, + _language.get(locale, "permission-key"), + "permissionKey", false), + ObjectFieldUtil.createObjectField( + ObjectFieldConstants.BUSINESS_TYPE_TEXT, + ObjectFieldConstants.DB_TYPE_STRING, true, false, null, + _language.get(locale, "url"), "url", false))); + + _enableObjectDefinitionLocalization(fdsActionObjectDefinition); + + _addLocalizedCustomObjectField( + _language.get(locale, "confirmation-message"), + "confirmationMessage", fdsActionObjectDefinition, userId); + _addLocalizedCustomObjectField( + _language.get(locale, "label"), "label", fdsActionObjectDefinition, + userId); + _addLocalizedCustomObjectField( + _language.get(locale, "success-message"), "successMessage", + fdsActionObjectDefinition, userId); + _addLocalizedCustomObjectField( + _language.get(locale, "error-message"), "errorMessage", + fdsActionObjectDefinition, userId); + _addLocalizedCustomObjectField( + _language.get(locale, "title"), "title", fdsActionObjectDefinition, + userId); + + _objectDefinitionLocalService.publishSystemObjectDefinition( + userId, fdsActionObjectDefinition.getObjectDefinitionId()); + + _objectRelationshipLocalService.addObjectRelationship( + userId, fdsViewObjectDefinition.getObjectDefinitionId(), + fdsActionObjectDefinition.getObjectDefinitionId(), 0, + ObjectRelationshipConstants.DELETION_TYPE_CASCADE, + LocalizedMapUtil.getLocalizedMap("FDSView FDSAction Relationship"), + "fdsViewFDSActionRelationship", + ObjectRelationshipConstants.TYPE_ONE_TO_MANY); } private static final Log _log = LogFactoryUtil.getLog( diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/css/OrderableTable.scss b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/css/OrderableTable.scss index 7f064d92165ac2..9d860f47215acf 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/css/OrderableTable.scss +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/css/OrderableTable.scss @@ -1,6 +1,8 @@ @import 'atlas-variables'; .orderable-table-sheet { + margin-top: 1rem; + .c-empty-state { text-align: center; } @@ -30,3 +32,9 @@ margin-bottom: 0; } } + +.tab-pane .orderable-table-sheet { + border-width: 0; + margin-top: 0; + padding: 0; +} diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/Constants.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/Constants.tsx index b18466dd7e5590..4729ad0600ec3c 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/Constants.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/Constants.tsx @@ -4,6 +4,7 @@ */ const API_URL = { + FDS_ACTIONS: '/o/data-set-manager/actions', FDS_DATE_FILTERS: '/o/data-set-manager/date-filters', FDS_DYNAMIC_FILTERS: '/o/data-set-manager/dynamic-filters', FDS_ENTRIES: '/o/data-set-manager/entries', @@ -20,6 +21,8 @@ const FUZZY_OPTIONS = { const OBJECT_RELATIONSHIP = { FDS_ENTRY_FDS_VIEW: 'fdsEntryFDSViewRelationship', FDS_ENTRY_FDS_VIEW_ID: 'r_fdsEntryFDSViewRelationship_c_fdsEntryId', + FDS_VIEW_FDS_ACTION: 'fdsViewFDSActionRelationship', + FDS_VIEW_FDS_ACTION_ID: 'r_fdsViewFDSActionRelationship_c_fdsViewId', FDS_VIEW_FDS_DATE_FILTER: 'fdsViewFDSDateFilterRelationship', FDS_VIEW_FDS_DATE_FILTER_ID: 'r_fdsViewFDSDateFilterRelationship_c_fdsViewId', diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSEntries.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSEntries.tsx index d3eb6ac8dcc50c..20492fbd85abf5 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSEntries.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSEntries.tsx @@ -11,7 +11,7 @@ import ClayLayout from '@clayui/layout'; import ClayModal from '@clayui/modal'; import {FrontendDataSet} from '@liferay/frontend-data-set-web'; import classNames from 'classnames'; -import {fetch, navigate, openModal, openToast} from 'frontend-js-web'; +import {fetch, navigate, openModal} from 'frontend-js-web'; import fuzzy from 'fuzzy'; import React, {useState} from 'react'; @@ -26,6 +26,8 @@ import { import {FDSViewType} from './FDSViews'; import RequiredMark from './components/RequiredMark'; import ValidationFeedback from './components/ValidationFeedback'; +import openDefaultFailureToast from './utils/openDefaultFailureToast'; +import openDefaultSuccessToast from './utils/openDefaultSuccessToast'; const VIEWS_COUNT_TABLE_CELL_RENDERER_NAME = 'viewsCountTableCellRenderer'; @@ -358,28 +360,25 @@ const AddFDSEntryModalContent = ({ method: 'POST', }); + if (!response.ok) { + openDefaultFailureToast(); + + return; + } + const fdsEntry = await response.json(); - if (response.ok && fdsEntry?.id) { + if (fdsEntry?.id) { closeModal(); - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); loadData(); } else { setSaveButtonDisabled(false); - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + + openDefaultFailureToast(); } }; @@ -406,78 +405,70 @@ const AddFDSEntryModalContent = ({ const response = await fetch(`/o${restApplication}/openapi.json`); + if (!response.ok) { + openDefaultFailureToast(); + + return; + } + const responseJson = await response.json(); - if (response.ok) { - const paths = Object.keys(responseJson.paths ?? []); - const schemaNames = Object.keys( - responseJson.components?.schemas ?? [] - ); + const paths = Object.keys(responseJson.paths ?? []); + const schemaNames = Object.keys(responseJson.components?.schemas ?? []); - const schemaEndpoints: Map> = new Map(); + const schemaEndpoints: Map> = new Map(); - schemaNames.forEach((schemaName) => { - paths.forEach((path: string) => { - if (!isPathValid(path, ALLOWED_ENDPOINTS_PARAMETERS)) { - return; - } + schemaNames.forEach((schemaName) => { + paths.forEach((path: string) => { + if (!isPathValid(path, ALLOWED_ENDPOINTS_PARAMETERS)) { + return; + } - if ( - responseJson.paths[ - path - ]?.get?.responses.default.content[ - 'application/json' - ]?.schema?.$ref?.endsWith(`/Page${schemaName}`) - ) { - const endpoints = schemaEndpoints.get(schemaName) ?? []; + if ( + responseJson.paths[path]?.get?.responses.default.content[ + 'application/json' + ]?.schema?.$ref?.endsWith(`/Page${schemaName}`) + ) { + const endpoints = schemaEndpoints.get(schemaName) ?? []; - endpoints.push(path); + endpoints.push(path); - if (endpoints.length === 1) { - schemaEndpoints.set(schemaName, endpoints); - } + if (endpoints.length === 1) { + schemaEndpoints.set(schemaName, endpoints); } - }); + } }); + }); - if (schemaEndpoints.size === 0) { - setSelectedRESTSchema(null); - - setSelectedRESTEndpoint(null); - - setNoEnpointsRESTApplicationValidationError(true); - } - else if (schemaEndpoints.size === 1) { - const schema = schemaEndpoints.keys().next().value; - - setSelectedRESTSchema(schema); + if (schemaEndpoints.size === 0) { + setSelectedRESTSchema(null); - const paths = schemaEndpoints.get(schema); + setSelectedRESTEndpoint(null); - if (paths?.length === 1) { - setSelectedRESTEndpoint(paths[0]); - } + setNoEnpointsRESTApplicationValidationError(true); + } + else if (schemaEndpoints.size === 1) { + const schema = schemaEndpoints.keys().next().value; - setNoEnpointsRESTApplicationValidationError(false); - } - else { - setSelectedRESTSchema(null); + setSelectedRESTSchema(schema); - setSelectedRESTEndpoint(null); + const paths = schemaEndpoints.get(schema); - setNoEnpointsRESTApplicationValidationError(false); + if (paths?.length === 1) { + setSelectedRESTEndpoint(paths[0]); } - setRESTSchemaEndpoints(schemaEndpoints); + setNoEnpointsRESTApplicationValidationError(false); } else { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + setSelectedRESTSchema(null); + + setSelectedRESTEndpoint(null); + + setNoEnpointsRESTApplicationValidationError(false); } + + setRESTSchemaEndpoints(schemaEndpoints); }; const validate = () => { @@ -771,23 +762,11 @@ const RenameFDSEntryModalContent = ({ .then(() => { closeModal(); - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); loadData(); }) - .catch(() => - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }) - ); + .catch(openDefaultFailureToast); } return ( @@ -906,23 +885,11 @@ const FDSEntries = ({ method: itemData.actions.delete.method, }) .then(() => { - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); loadData(); }) - .catch(() => - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }) - ); + .catch(openDefaultFailureToast); }, }, ], diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSView.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSView.tsx index 72949c8edb78b4..eb8431b73f14f3 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSView.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSView.tsx @@ -6,7 +6,7 @@ import ClayButton from '@clayui/button'; import ClayLoadingIndicator from '@clayui/loading-indicator'; import ClayNavigationBar from '@clayui/navigation-bar'; -import {IClientExtensionRenderer, fetch, openToast} from 'frontend-js-web'; +import {IClientExtensionRenderer, fetch} from 'frontend-js-web'; import React, {useEffect, useState} from 'react'; import {API_URL, OBJECT_RELATIONSHIP} from './Constants'; @@ -17,6 +17,7 @@ import Fields from './fds_view/Fields'; import Filters from './fds_view/Filters'; import Pagination from './fds_view/Pagination'; import Sorting from './fds_view/Sorting'; +import openDefaultFailureToast from './utils/openDefaultFailureToast'; let NAVIGATION_BAR_ITEMS = [ { @@ -111,12 +112,7 @@ const FDSView = ({ setLoading(false); } else { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); } }; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSViews.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSViews.tsx index 663c4445b34c50..83a1761d643e1c 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSViews.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/FDSViews.tsx @@ -9,18 +9,14 @@ import ClayLink from '@clayui/link'; import ClayModal from '@clayui/modal'; import {FrontendDataSet} from '@liferay/frontend-data-set-web'; import classNames from 'classnames'; -import { - IInternalRenderer, - fetch, - navigate, - openModal, - openToast, -} from 'frontend-js-web'; +import {IInternalRenderer, fetch, navigate, openModal} from 'frontend-js-web'; import React, {useRef, useState} from 'react'; import {API_URL, FDS_DEFAULT_PROPS, OBJECT_RELATIONSHIP} from './Constants'; import {FDSEntryType} from './FDSEntries'; import RequiredMark from './components/RequiredMark'; +import openDefaultFailureToast from './utils/openDefaultFailureToast'; +import openDefaultSuccessToast from './utils/openDefaultSuccessToast'; const LIST_OF_ITEMS_PER_PAGE = '4, 8, 20, 40, 60'; const DEFAULT_ITEMS_PER_PAGE = 20; @@ -75,28 +71,25 @@ const AddFDSViewModalContent = ({ method: 'POST', }); + if (!response.ok) { + openDefaultFailureToast(); + + return; + } + const fdsView = await response.json(); if (fdsView?.id) { closeModal(); - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); loadData(); } else { setSaveButtonDisabled(false); - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + + openDefaultFailureToast(); } }; @@ -250,23 +243,11 @@ const FDSViews = ({ method: 'DELETE', }) .then(() => { - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); loadData(); }) - .catch(() => - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }) - ); + .catch(openDefaultFailureToast); }, }, ], diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/api.ts b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/api.ts index 423fd6fa438641..2bb8485592a644 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/api.ts +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/api.ts @@ -3,10 +3,11 @@ * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 */ -import {fetch, openToast} from 'frontend-js-web'; +import {fetch} from 'frontend-js-web'; import {OBJECT_RELATIONSHIP} from './Constants'; import {FDSViewType} from './FDSViews'; +import openDefaultFailureToast from './utils/openDefaultFailureToast'; const LOCALIZABLE_PROPERTY_SUFFIX = '_i18n'; @@ -67,10 +68,7 @@ export async function getFields(fdsView: FDSViewType) { const response = await fetch(`/o${restApplication}/openapi.json`); if (!response.ok) { - openToast({ - message: Liferay.Language.get('your-request-failed-to-complete'), - type: 'danger', - }); + openDefaultFailureToast(); return []; } @@ -81,10 +79,7 @@ export async function getFields(fdsView: FDSViewType) { responseJSON?.components?.schemas[restSchema]?.properties; if (!properties) { - openToast({ - message: Liferay.Language.get('your-request-failed-to-complete'), - type: 'danger', - }); + openDefaultFailureToast(); return []; } @@ -123,10 +118,7 @@ export async function getAllPicklists( ); if (!response.ok) { - openToast({ - message: Liferay.Language.get('your-request-failed-to-complete'), - type: 'danger', - }); + openDefaultFailureToast(); return []; } diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/OrderableTable.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/OrderableTable.tsx index b9234007f693a9..81a862ea7f189c 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/OrderableTable.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/OrderableTable.tsx @@ -301,7 +301,7 @@ const OrderableTable = ({ return ( {title && ( diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/RequiredMark.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/RequiredMark.tsx index 1e903179827f26..3286e28facb0f8 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/RequiredMark.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/components/RequiredMark.tsx @@ -8,7 +8,7 @@ import React from 'react'; const RequiredMark = () => ( <> - + diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Actions.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Actions.tsx index d54219a99879fe..8f1d2792796e41 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Actions.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Actions.tsx @@ -8,14 +8,19 @@ import ClayButton from '@clayui/button'; import ClayForm, {ClayInput, ClaySelectWithOption} from '@clayui/form'; import ClayIcon from '@clayui/icon'; import ClayLayout from '@clayui/layout'; +import ClayLoadingIndicator from '@clayui/loading-indicator'; import ClayPanel from '@clayui/panel'; import ClayTabs from '@clayui/tabs'; import {InputLocalized} from 'frontend-js-components-web'; import {fetch} from 'frontend-js-web'; import React, {useEffect, useState} from 'react'; +import {API_URL, OBJECT_RELATIONSHIP} from '../Constants'; +import {IFDSViewSectionInterface} from '../FDSView'; import OrderableTable from '../components/OrderableTable'; import RequiredMark from '../components/RequiredMark'; +import openDefaultFailureToast from '../utils/openDefaultFailureToast'; +import openDefaultSuccessToast from '../utils/openDefaultSuccessToast'; const MESSAGE_TYPES = [ { @@ -68,20 +73,172 @@ const TYPES = [ }, ]; +interface IFDSAction { + [OBJECT_RELATIONSHIP.FDS_VIEW_FDS_ACTION]: any; + icon: string; + id: number; + type: string; + url: string; +} + const noop = () => {}; -const Actions = ({spritemap}: {spritemap: string}) => { +const Actions = ({fdsView, namespace, spritemap}: IFDSViewSectionInterface) => { const [activeSection, setActiveSection] = useState(SECTIONS.ACTIONS); const [activeTab, setActiveTab] = useState(0); const [availableIconSymbols, setAvailableIconSymbols] = useState< Array<{label: string; value: string}> >([]); + const [confirmationMessage, setConfirmationMessage] = useState(''); const [ confirmationMessageTranslations, setConfirmationMessageTranslations, ] = useState({}); + const [fdsActions, setFDSActions] = useState>([]); const [iconSymbol, setIconSymbol] = useState('bolt'); + const [label, setLabel] = useState(''); const [labelTranslations, setLabelTranslations] = useState({}); + const [loading, setLoading] = useState(true); + const [newActionsOrder, setNewActionsOrder] = useState(''); + const [type, setType] = useState('link'); + const [saveButtonDisabled, setSaveButtonDisabled] = useState(false); + const [url, setURL] = useState(''); + + const getFDSActions = async () => { + setLoading(true); + + const response = await fetch( + `${API_URL.FDS_ACTIONS}?filter=(${OBJECT_RELATIONSHIP.FDS_VIEW_FDS_ACTION_ID} eq '${fdsView.id}')&nestedFields=${OBJECT_RELATIONSHIP.FDS_VIEW_FDS_ACTION}&sort=dateCreated:desc` + ); + + if (!response.ok) { + setLoading(false); + + openDefaultFailureToast(); + + return; + } + + const responseJSON = await response.json(); + + const storedFDSActions: IFDSAction[] = responseJSON.items; + + let ordered = storedFDSActions; + let notOrdered: IFDSAction[] = []; + + const fdsActionsOrder = + storedFDSActions?.[0]?.[OBJECT_RELATIONSHIP.FDS_VIEW_FDS_ACTION] + ?.fdsActionsOrder; + + if (fdsActionsOrder) { + const fdsActionsOrderArray = fdsActionsOrder.split(',') as string[]; + + ordered = fdsActionsOrderArray + .map((fdsActionId) => + storedFDSActions.find( + (fdsAction) => fdsAction.id === Number(fdsActionId) + ) + ) + .filter(Boolean) as IFDSAction[]; + + notOrdered = storedFDSActions.filter( + (fdsAction) => + !fdsActionsOrderArray.includes(String(fdsAction.id)) + ); + } + + setFDSActions([...notOrdered, ...ordered]); + + setLoading(false); + }; + + const saveFDSAction = async () => { + setSaveButtonDisabled(true); + + const body = { + [OBJECT_RELATIONSHIP.FDS_VIEW_FDS_ACTION_ID]: fdsView.id, + icon: iconSymbol, + type, + url, + } as any; + + if (Liferay.FeatureFlags['LPS-172017']) { + body.confirmationMessage_i18n = confirmationMessageTranslations; + body.label_i18n = labelTranslations; + } + else { + body.confirmationMessage = confirmationMessage; + body.label = labelTranslations; + } + + const response = await fetch(API_URL.FDS_ACTIONS, { + body: JSON.stringify(body), + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + method: 'POST', + }); + + if (!response.ok) { + setSaveButtonDisabled(false); + + openDefaultFailureToast(); + + return; + } + + await response.json(); + + setSaveButtonDisabled(false); + + openDefaultSuccessToast(); + + setActiveSection(SECTIONS.ACTIONS); + + getFDSActions(); + }; + + const updateFDSActionsOrder = async () => { + const response = await fetch( + `${API_URL.FDS_VIEWS}/by-external-reference-code/${fdsView.externalReferenceCode}`, + { + body: JSON.stringify({ + fdsActionsOrder: newActionsOrder, + }), + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + method: 'PATCH', + } + ); + + if (!response.ok) { + openDefaultFailureToast(); + + return; + } + + const responseJSON = await response.json(); + + const fdsFiltersOrder = responseJSON?.fdsActionsOrder; + + if (fdsFiltersOrder && fdsFiltersOrder === newActionsOrder) { + openDefaultSuccessToast(); + + setNewActionsOrder(''); + } + else { + openDefaultFailureToast(); + } + }; + + useEffect(() => { + getFDSActions(); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); useEffect(() => { const getIcons = async () => { @@ -113,6 +270,65 @@ const Actions = ({spritemap}: {spritemap: string}) => { getIcons(); }, [spritemap]); + const labelFormElementId = `${namespace}Label`; + const iconFormElementId = `${namespace}Icon`; + const typeFormElementId = `${namespace}Type`; + const urlFormElementId = `${namespace}URL`; + const confirmationMessageFormElementId = `${namespace}ConfirmationMessage`; + const confirmationMessageTypeFormElementId = `${namespace}ConfirmationMessageType`; + + const ConfirmationMessageRow = () => ( + + + + {Liferay.FeatureFlags['LPS-172017'] ? ( + + ) : ( + + + + + setConfirmationMessage(event.target.value) + } + type="text" + value={label} + /> + + )} + + + + + + + + + + + + ); + + if (loading) { + return ; + } + return ( { )} > { name: 'type', }, ]} - items={[]} + items={fdsActions} noItemsButtonLabel={Liferay.Language.get( 'create-item-action' )} @@ -198,8 +413,18 @@ const Actions = ({spritemap}: {spritemap: string}) => { 'no-actions-were-created' )} onCancelButtonClick={noop} - onOrderChange={noop} - onSaveButtonClick={noop} + onOrderChange={({ + orderedItems, + }: { + orderedItems: IFDSAction[]; + }) => { + setNewActionsOrder( + orderedItems + .map((filter) => filter.id) + .join(',') + ); + }} + onSaveButtonClick={updateFDSActionsOrder} /> @@ -231,17 +456,40 @@ const Actions = ({spritemap}: {spritemap: string}) => { - + {Liferay.FeatureFlags['LPS-172017'] ? ( + + ) : ( + + + + + setLabel( + event.target.value + ) + } + type="text" + value={label} + /> + + )} { /> - @@ -285,19 +533,22 @@ const Actions = ({spritemap}: {spritemap: string}) => { - @@ -306,7 +557,7 @@ const Actions = ({spritemap}: {spritemap: string}) => { - - - - - - - - - - - - - - - - - - - - - - + - + {Liferay.Language.get('save')} - + + setActiveSection(SECTIONS.ACTIONS) + } + > {Liferay.Language.get('cancel')} diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Details.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Details.tsx index 6091cd893769e8..a549b148618902 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Details.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Details.tsx @@ -9,12 +9,14 @@ import ClayIcon from '@clayui/icon'; import ClayLayout from '@clayui/layout'; import ClayList from '@clayui/list'; import classNames from 'classnames'; -import {fetch, navigate, openToast} from 'frontend-js-web'; +import {fetch, navigate} from 'frontend-js-web'; import React, {useRef, useState} from 'react'; import {API_URL} from '../Constants'; import {IFDSViewSectionInterface} from '../FDSView'; import RequiredMark from '../components/RequiredMark'; +import openDefaultFailureToast from '../utils/openDefaultFailureToast'; +import openDefaultSuccessToast from '../utils/openDefaultSuccessToast'; const Details = ({ fdsView, @@ -45,15 +47,16 @@ const Details = ({ } ); + if (!response.ok) { + openDefaultFailureToast(); + + return; + } + const responseJSON = await response.json(); if (responseJSON?.id) { - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); const controlMenuHeaderTitles = document.getElementsByClassName( 'control-menu-level-1-heading' @@ -67,12 +70,7 @@ const Details = ({ onFDSViewUpdate(responseJSON); } else { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); } }; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Fields.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Fields.tsx index 0e4531969d5c74..ef40a4e3ed6c11 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Fields.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Fields.tsx @@ -18,7 +18,6 @@ import { fetch, navigate, openModal, - openToast, } from 'frontend-js-web'; import fuzzy from 'fuzzy'; import React, {useEffect, useRef, useState} from 'react'; @@ -28,6 +27,8 @@ import {IFDSViewSectionInterface} from '../FDSView'; import {FDSViewType} from '../FDSViews'; import {getFields} from '../api'; import OrderableTable from '../components/OrderableTable'; +import openDefaultFailureToast from '../utils/openDefaultFailureToast'; +import openDefaultSuccessToast from '../utils/openDefaultSuccessToast'; import '../../css/FDSEntries.scss'; @@ -190,12 +191,7 @@ const SaveFDSFieldsModalContent = ({ }); if (!response.ok) { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); return; } @@ -204,12 +200,7 @@ const SaveFDSFieldsModalContent = ({ closeModal(); - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); onSave({ createdFDSFields: createdFDSFields.map((fdsField) => ({ @@ -460,24 +451,16 @@ const EditFDSFieldModalContent = ({ ); if (!response.ok) { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); + + return; } const editedFDSField = await response.json(); closeModal(); - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); onSave({editedFDSField}); }; @@ -673,12 +656,7 @@ const Fields = ({ ); if (!response.ok) { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); return null; } @@ -694,12 +672,7 @@ const Fields = ({ }); if (!storedFDSFields) { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); return null; } @@ -773,22 +746,12 @@ const Fields = ({ const response = await fetch(url, {method: 'DELETE'}); if (!response.ok) { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); return; } - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); setFDSFields( fdsFields?.filter( @@ -821,12 +784,7 @@ const Fields = ({ ); if (!response.ok) { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); return null; } @@ -836,20 +794,10 @@ const Fields = ({ const fdsFieldsOrder = responseJSON?.fdsFieldsOrder; if (fdsFieldsOrder && fdsFieldsOrder === fdsFieldsOrderRef.current) { - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); } else { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); } }; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Filters.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Filters.tsx index 0ef86a150fb193..f85c19cb98fe76 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Filters.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Filters.tsx @@ -16,7 +16,7 @@ import ClayLayout from '@clayui/layout'; import ClayModal from '@clayui/modal'; import classNames from 'classnames'; import {format, getYear, isBefore, isEqual} from 'date-fns'; -import {fetch, navigate, openModal, openToast, sub} from 'frontend-js-web'; +import {fetch, navigate, openModal, sub} from 'frontend-js-web'; import fuzzy from 'fuzzy'; import React, {useEffect, useState} from 'react'; @@ -25,6 +25,8 @@ import {FDSViewType} from '../FDSViews'; import {IPickList, getAllPicklists, getFields} from '../api'; import CheckboxMultiSelect from '../components/CheckboxMultiSelect'; import OrderableTable from '../components/OrderableTable'; +import openDefaultFailureToast from '../utils/openDefaultFailureToast'; +import openDefaultSuccessToast from '../utils/openDefaultSuccessToast'; interface IField { format: string; @@ -55,20 +57,6 @@ interface IDynamicFilter extends IFilter { type FilterCollection = Array; -function alertFailed() { - openToast({ - message: Liferay.Language.get('your-request-failed-to-complete'), - type: 'danger', - }); -} - -function alertSuccess() { - openToast({ - message: Liferay.Language.get('your-request-completed-successfully'), - type: 'success', - }); -} - interface IPropsAddFDSFilterModalContent { closeModal: Function; fdsView: FDSViewType; @@ -154,7 +142,7 @@ function AddFDSFilterModalContent({ setSaveButtonDisabled(true); if (!selectedField) { - alertFailed(); + openDefaultFailureToast(); return null; } @@ -217,14 +205,15 @@ function AddFDSFilterModalContent({ if (!response.ok) { setSaveButtonDisabled(false); - alertFailed(); + + openDefaultFailureToast(); return null; } const responseJSON = await response.json(); - alertSuccess(); + openDefaultSuccessToast(); onSave({...responseJSON, displayType}); @@ -652,11 +641,9 @@ function Filters({fdsView, fdsViewsURL, namespace}: IProps) { let notOrdered: FilterCollection = []; - if (filtersOrdered.length > order.length) { - notOrdered = filtersOrdered.filter( - (filter) => !order.includes(String(filter.id)) - ); - } + notOrdered = filtersOrdered.filter( + (filter) => !order.includes(String(filter.id)) + ); filtersOrdered = fdsView.fdsFiltersOrder .split(',') @@ -667,7 +654,7 @@ function Filters({fdsView, fdsViewsURL, namespace}: IProps) { ) .filter(Boolean) as FilterCollection; - filtersOrdered = [...filtersOrdered, ...notOrdered]; + filtersOrdered = [...notOrdered, ...filtersOrdered]; } setFilters(filtersOrdered); @@ -698,7 +685,7 @@ function Filters({fdsView, fdsViewsURL, namespace}: IProps) { ); if (!response.ok) { - alertFailed(); + openDefaultFailureToast(); return null; } @@ -708,12 +695,12 @@ function Filters({fdsView, fdsViewsURL, namespace}: IProps) { const fdsFiltersOrder = responseJSON?.fdsFiltersOrder; if (fdsFiltersOrder && fdsFiltersOrder === newFiltersOrder) { - alertSuccess(); + openDefaultSuccessToast(); setNewFiltersOrder(''); } else { - alertFailed(); + openDefaultFailureToast(); } }; @@ -786,7 +773,7 @@ function Filters({fdsView, fdsViewsURL, namespace}: IProps) { method: 'DELETE', }) .then(() => { - alertSuccess(); + openDefaultSuccessToast(); setFilters( filters.filter( @@ -795,9 +782,7 @@ function Filters({fdsView, fdsViewsURL, namespace}: IProps) { ) ); }) - .catch(() => { - alertFailed(); - }); + .catch(openDefaultFailureToast); }, }, ], diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Pagination.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Pagination.tsx index bf7cdcf7d7aa6a..ae1535383db502 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Pagination.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Pagination.tsx @@ -7,12 +7,14 @@ import ClayButton from '@clayui/button'; import ClayForm, {ClayInput} from '@clayui/form'; import ClayLayout from '@clayui/layout'; import classnames from 'classnames'; -import {fetch, navigate, openToast} from 'frontend-js-web'; +import {fetch, navigate} from 'frontend-js-web'; import React, {useRef, useState} from 'react'; import {API_URL} from '../Constants'; import {IFDSViewSectionInterface} from '../FDSView'; import RequiredMark from '../components/RequiredMark'; +import openDefaultFailureToast from '../utils/openDefaultFailureToast'; +import openDefaultSuccessToast from '../utils/openDefaultSuccessToast'; function Pagination({ fdsView, @@ -114,25 +116,21 @@ function Pagination({ } ); + if (!response.ok) { + openDefaultFailureToast(); + + return; + } + const responseJSON = await response.json(); - if (response.ok && responseJSON?.id) { - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + if (responseJSON?.id) { + openDefaultSuccessToast(); onFDSViewUpdate(responseJSON); } else { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); } }; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Sorting.tsx b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Sorting.tsx index 820ce1f05724c6..8ea8c2d151421d 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Sorting.tsx +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/fds_view/Sorting.tsx @@ -9,7 +9,7 @@ import ClayForm, {ClayInput, ClaySelectWithOption} from '@clayui/form'; import ClayLayout from '@clayui/layout'; import ClayLoadingIndicator from '@clayui/loading-indicator'; import ClayModal from '@clayui/modal'; -import {fetch, navigate, openModal, openToast} from 'frontend-js-web'; +import {fetch, navigate, openModal} from 'frontend-js-web'; import fuzzy from 'fuzzy'; import React, {useEffect, useState} from 'react'; @@ -19,6 +19,8 @@ import {FDSViewType} from '../FDSViews'; import {getFields} from '../api'; import OrderableTable from '../components/OrderableTable'; import RequiredMark from '../components/RequiredMark'; +import openDefaultFailureToast from '../utils/openDefaultFailureToast'; +import openDefaultSuccessToast from '../utils/openDefaultSuccessToast'; interface IAddFDSSortModalContentInterface { closeModal: Function; @@ -62,20 +64,6 @@ const SORTING_OPTIONS = [ SORTING_DIRECTION.DESCENDING, ]; -function alertFailed() { - openToast({ - message: Liferay.Language.get('your-request-failed-to-complete'), - type: 'danger', - }); -} - -function alertSuccess() { - openToast({ - message: Liferay.Language.get('your-request-completed-successfully'), - type: 'success', - }); -} - const sortingDirectionTextMatch = (item: IFDSSort) => { return item.sortingDirection === SORTING_DIRECTION.ASCENDING.value ? SORTING_DIRECTION.ASCENDING.label @@ -125,7 +113,7 @@ const AddFDSSortModalContent = ({ ); if (!field) { - alertFailed(); + openDefaultFailureToast(); return; } @@ -146,14 +134,14 @@ const AddFDSSortModalContent = ({ if (!response.ok) { setSaveButtonDisabled(false); - alertFailed(); + openDefaultFailureToast(); return; } const responseJSON = await response.json(); - alertSuccess(); + openDefaultSuccessToast(); onSave(responseJSON); @@ -277,7 +265,7 @@ const EditFDSSortModalContent = ({ if (!response.ok) { setSaveButtonDisabled(false); - alertFailed(); + openDefaultFailureToast(); return; } @@ -286,7 +274,7 @@ const EditFDSSortModalContent = ({ closeModal(); - alertSuccess(); + openDefaultSuccessToast(); onSave({editedFDSSort}); }; @@ -376,14 +364,12 @@ const Sorting = ({ useEffect(() => { const getFDSSort = async () => { const response = await fetch( - `${API_URL.FDS_VIEWS}/${fdsView.id}?nestedFields=${OBJECT_RELATIONSHIP.FDS_VIEW_FDS_SORT}` + `${API_URL.FDS_SORTS}?filter=(${OBJECT_RELATIONSHIP.FDS_VIEW_FDS_SORT_ID} eq '${fdsView.id}')&nestedFields=${OBJECT_RELATIONSHIP.FDS_VIEW_FDS_SORT}&sort=dateCreated:desc` ); const responseJSON = await response.json(); - const storedFDSSorts = responseJSON[ - OBJECT_RELATIONSHIP.FDS_VIEW_FDS_SORT - ] as IFDSSort[]; + const storedFDSSorts: IFDSSort[] = responseJSON.items; let ordered = storedFDSSorts; let notOrdered: IFDSSort[] = []; @@ -401,15 +387,12 @@ const Sorting = ({ ) .filter(Boolean) as IFDSSort[]; - if (storedFDSSorts.length > fdsSortsOrderArray.length) { - notOrdered = storedFDSSorts.filter( - (filter) => - !fdsSortsOrderArray.includes(String(filter.id)) - ); - } + notOrdered = storedFDSSorts.filter( + (filter) => !fdsSortsOrderArray.includes(String(filter.id)) + ); } - setFDSSorts([...ordered, ...notOrdered]); + setFDSSorts([...notOrdered, ...ordered]); setLoading(false); }; @@ -464,22 +447,12 @@ const Sorting = ({ }); if (!response.ok) { - openToast({ - message: Liferay.Language.get( - 'your-request-failed-to-complete' - ), - type: 'danger', - }); + openDefaultFailureToast(); return; } - openToast({ - message: Liferay.Language.get( - 'your-request-completed-successfully' - ), - type: 'success', - }); + openDefaultSuccessToast(); setFDSSorts( fdsSorts?.filter( @@ -534,9 +507,9 @@ const Sorting = ({ ); if (!response.ok) { - alertFailed(); + openDefaultFailureToast(); - return null; + return; } const responseJSON = await response.json(); @@ -544,12 +517,12 @@ const Sorting = ({ const fdsSortsOrder = responseJSON?.fdsSortsOrder; if (fdsSortsOrder && fdsSortsOrder === newFDSSortsOrder) { - alertSuccess(); + openDefaultSuccessToast(); setNewFDSSortsOrder(''); } else { - alertFailed(); + openDefaultFailureToast(); } }; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/utils/openDefaultFailureToast.ts b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/utils/openDefaultFailureToast.ts new file mode 100644 index 00000000000000..ef5b7aac4f15a0 --- /dev/null +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/utils/openDefaultFailureToast.ts @@ -0,0 +1,13 @@ +/** + * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import {openToast} from 'frontend-js-web'; + +export default function openDefaultFailureToast() { + openToast({ + message: Liferay.Language.get('your-request-failed-to-complete'), + type: 'danger', + }); +} diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/utils/openDefaultSuccessToast.ts b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/utils/openDefaultSuccessToast.ts new file mode 100644 index 00000000000000..ad15f73b23d01c --- /dev/null +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/src/main/resources/META-INF/resources/js/utils/openDefaultSuccessToast.ts @@ -0,0 +1,13 @@ +/** + * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import {openToast} from 'frontend-js-web'; + +export default function openDefaultFailureToast() { + openToast({ + message: Liferay.Language.get('your-request-completed-successfully'), + type: 'success', + }); +} diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/Constants.d.ts b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/Constants.d.ts index d05afcfd3f94ee..483aa9defcfc9a 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/Constants.d.ts +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/Constants.d.ts @@ -4,6 +4,7 @@ */ declare const API_URL: { + FDS_ACTIONS: string; FDS_DATE_FILTERS: string; FDS_DYNAMIC_FILTERS: string; FDS_ENTRIES: string; @@ -18,6 +19,8 @@ declare const FUZZY_OPTIONS: { declare const OBJECT_RELATIONSHIP: { readonly FDS_ENTRY_FDS_VIEW: 'fdsEntryFDSViewRelationship'; readonly FDS_ENTRY_FDS_VIEW_ID: 'r_fdsEntryFDSViewRelationship_c_fdsEntryId'; + readonly FDS_VIEW_FDS_ACTION: 'fdsViewFDSActionRelationship'; + readonly FDS_VIEW_FDS_ACTION_ID: 'r_fdsViewFDSActionRelationship_c_fdsViewId'; readonly FDS_VIEW_FDS_DATE_FILTER: 'fdsViewFDSDateFilterRelationship'; readonly FDS_VIEW_FDS_DATE_FILTER_ID: 'r_fdsViewFDSDateFilterRelationship_c_fdsViewId'; readonly FDS_VIEW_FDS_DYNAMIC_FILTER: 'fdsViewFDSDynamicFilterRelationship'; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/fds_view/Actions.d.ts b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/fds_view/Actions.d.ts index 5527c91b3fea80..ac65e59094cc01 100644 --- a/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/fds_view/Actions.d.ts +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/fds_view/Actions.d.ts @@ -5,5 +5,10 @@ /// -declare const Actions: ({spritemap}: {spritemap: string}) => JSX.Element; +import {IFDSViewSectionInterface} from '../FDSView'; +declare const Actions: ({ + fdsView, + namespace, + spritemap, +}: IFDSViewSectionInterface) => JSX.Element; export default Actions; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/utils/openDefaultFailureToast.d.ts b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/utils/openDefaultFailureToast.d.ts new file mode 100644 index 00000000000000..ddd96687be8bdb --- /dev/null +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/utils/openDefaultFailureToast.d.ts @@ -0,0 +1,6 @@ +/** + * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +export default function openDefaultFailureToast(): void; diff --git a/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/utils/openDefaultSuccessToast.d.ts b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/utils/openDefaultSuccessToast.d.ts new file mode 100644 index 00000000000000..ddd96687be8bdb --- /dev/null +++ b/modules/apps/frontend-data-set/frontend-data-set-views-web/types/src/main/resources/META-INF/resources/js/utils/openDefaultSuccessToast.d.ts @@ -0,0 +1,6 @@ +/** + * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +export default function openDefaultFailureToast(): void; diff --git a/modules/apps/object/object-service/src/main/java/com/liferay/object/internal/definition/util/ObjectDefinitionUtil.java b/modules/apps/object/object-service/src/main/java/com/liferay/object/internal/definition/util/ObjectDefinitionUtil.java index ca44fefa3df910..ece995ea28e81e 100644 --- a/modules/apps/object/object-service/src/main/java/com/liferay/object/internal/definition/util/ObjectDefinitionUtil.java +++ b/modules/apps/object/object-service/src/main/java/com/liferay/object/internal/definition/util/ObjectDefinitionUtil.java @@ -65,6 +65,8 @@ public static boolean isAllowedModifiableSystemObjectDefinitionName( "APISort", "/headless-builder/sorts" ).put( "Bookmark", "/bookmarks" + ).put( + "FDSAction", "/data-set-manager/actions" ).put( "FDSDateFilter", "/data-set-manager/date-filters" ).put(