
META-INF.resources.js.components.ViewObjectDefinitions.objectDefinitionUtil.ts Maven / Gradle / Ivy
The newest version!
/**
* 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 {API} from '@liferay/object-js-components-web';
import {openModal} from 'frontend-js-components-web';
import {createResourceURL, sub} from 'frontend-js-web';
import {SetStateAction} from 'react';
import {exportObjectEntity} from '../../utils/exportObjectEntity';
import {formatActionURL} from '../../utils/fds';
import {TYPES} from '../ModelBuilder/ModelBuilderContext/typesEnum';
import {DropDownItems, TAction} from '../ModelBuilder/types';
import {ModalImportProperties} from './ViewObjectDefinitions';
type DeleteObjectDefinitionProps = {
baseResourceURL: string;
handleDeleteObjectDefinition?: (value: DeletedObjectDefinition) => void;
handleShowDeleteObjectDefinitionModal?: () => void;
objectDefinitionId: number;
objectDefinitionName: string;
onAfterDeleteObjectDefinition?: () => void;
};
type ObjectDefinitionNodeActionsProps = {
baseResourceURL: string;
dispatch: React.Dispatch;
hasObjectDefinitionDeleteResourcePermission: boolean;
hasObjectDefinitionManagePermissionsResourcePermission: boolean;
hasObjectDefinitionUpdateResourcePermission: boolean;
isTreeStructure: boolean;
objectDefinitionId: number;
objectDefinitionName: string;
objectDefinitionPermissionsURL: string;
objectFoldersLenght: number;
status: {
code: number;
label: string;
label_i18n: string;
};
};
export async function deleteObjectFolder(id: number, objectFolderName: string) {
await API.deleteObjectFolder(Number(id)).then(() => {
Liferay.Util.openToast({
message: sub(
Liferay.Language.get('x-was-deleted-successfully'),
`${Liferay.Util.escapeHTML(objectFolderName)}`
),
});
});
}
export async function deleteObjectDefinitionToast(
id: number,
objectDefinitionName: string
) {
await API.deleteObjectDefinition(Number(id)).then(() => {
Liferay.Util.openToast({
message: sub(
Liferay.Language.get('x-was-deleted-successfully'),
`${Liferay.Util.escapeHTML(
objectDefinitionName
)}`
),
});
});
}
export async function deleteObjectDefinition({
baseResourceURL,
handleDeleteObjectDefinition,
handleShowDeleteObjectDefinitionModal,
objectDefinitionId,
objectDefinitionName,
onAfterDeleteObjectDefinition,
}: DeleteObjectDefinitionProps) {
const url = createResourceURL(baseResourceURL, {
objectDefinitionId,
p_p_resource_id:
'/object_definitions/get_object_definition_delete_info',
}).href;
const {hasObjectRelationship, objectEntriesCount, status} =
await API.fetchJSON<{
hasObjectRelationship: boolean;
objectEntriesCount: number;
status: number;
}>(url);
if (status !== 0) {
await deleteObjectDefinitionToast(
objectDefinitionId,
objectDefinitionName
);
if (onAfterDeleteObjectDefinition) {
onAfterDeleteObjectDefinition();
}
else {
setTimeout(() => window.location.reload(), 1000);
}
return;
}
const deletedObjectDefinition = {
hasObjectRelationship,
id: objectDefinitionId,
name: objectDefinitionName,
objectEntriesCount,
};
if (handleDeleteObjectDefinition) {
handleDeleteObjectDefinition(deletedObjectDefinition);
}
if (handleShowDeleteObjectDefinitionModal) {
handleShowDeleteObjectDefinitionModal();
}
return deletedObjectDefinition;
}
export async function deleteRelationship(
id: number,
reloadAfterDeletion?: boolean
) {
try {
await API.deleteObjectRelationship(id);
Liferay.Util.openToast({
message: Liferay.Language.get(
'relationship-was-deleted-successfully'
),
});
if (reloadAfterDeletion) {
setTimeout(() => window.location.reload(), 1500);
}
}
catch (error) {
const errorMessage = (error as Error).message;
openModal({
bodyHTML: `${errorMessage}
`,
buttons: [
{
displayType: 'warning',
label: Liferay.Language.get('done'),
type: 'cancel',
},
],
center: true,
id: 'deleteRelationship',
size: 'md',
status: 'warning',
title: Liferay.Language.get('deletion-not-allowed'),
});
}
}
export async function getDbTableName({
baseResourceURL,
objectDefinitionId,
}: {
baseResourceURL: string;
objectDefinitionId: number;
}) {
const objectDefinitionInfoURL = createResourceURL(baseResourceURL, {
objectDefinitionId,
p_p_resource_id: '/object_definitions/get_object_definition_info',
}).href;
const objectDefinitionInfoResponse = await API.fetchJSON<{
tableName: string;
}>(objectDefinitionInfoURL);
return objectDefinitionInfoResponse.tableName;
}
export function getObjectDefinitionNodeActions({
baseResourceURL,
dispatch,
hasObjectDefinitionDeleteResourcePermission,
hasObjectDefinitionManagePermissionsResourcePermission,
hasObjectDefinitionUpdateResourcePermission,
isTreeStructure,
objectDefinitionId,
objectDefinitionName,
objectDefinitionPermissionsURL,
objectFoldersLenght,
}: ObjectDefinitionNodeActionsProps) {
const PermissionUrl = formatActionURL(
objectDefinitionPermissionsURL,
objectDefinitionId
);
const kebabOptions = [
{
label: sub(
Liferay.Language.get('edit-in-x'),
Liferay.Language.get('page view')
),
onClick: () => {
dispatch({
payload: {
updatedModelBuilderModals: {
redirectToEditObjectDefinitionDetails: true,
},
},
type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
});
},
symbolRight: 'shortcut',
},
{
label: sub(
Liferay.Language.get('edit-x'),
Liferay.Language.get('erc')
),
onClick: () => {
dispatch({
payload: {
updatedModelBuilderModals: {
editObjectDefinitionExternalReferenceCode: true,
},
},
type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
});
},
symbolLeft: 'info-circle',
},
{type: 'divider'},
{
label: Liferay.Language.get('export-as-json'),
onClick: () => {
const exportObjectDefinitionURL = createResourceURL(
baseResourceURL,
{
objectDefinitionId,
p_p_resource_id:
'/object_definitions/export_object_definition',
}
).href;
exportObjectEntity({
exportObjectEntityURL: exportObjectDefinitionURL,
objectEntityId: objectDefinitionId,
});
},
symbolLeft: 'export',
},
] as DropDownItems[];
if (
objectFoldersLenght > 1 &&
hasObjectDefinitionUpdateResourcePermission
) {
kebabOptions.push(
{
label: Liferay.Language.get('move'),
onClick: () => {
dispatch({
payload: {
movedObjectDefinitionId: objectDefinitionId,
},
type: TYPES.SET_MOVED_OBJECT_DEFINITION,
});
dispatch({
payload: {
updatedModelBuilderModals: {
moveObjectDefinition: true,
},
},
type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
});
},
symbolLeft: 'move-folder',
},
{type: 'divider'}
);
}
if (hasObjectDefinitionManagePermissionsResourcePermission) {
kebabOptions.push({
label: sub(
Liferay.Language.get('manage-x'),
Liferay.Language.get('permissions')
),
onClick: (event: React.MouseEvent) => {
event.stopPropagation();
openModal({
title: Liferay.Language.get('permissions'),
url: PermissionUrl,
});
},
symbolLeft: 'users',
});
}
if (hasObjectDefinitionDeleteResourcePermission) {
kebabOptions.push({type: 'divider'});
kebabOptions.push({
label: sub(
Liferay.Language.get('delete-x'),
Liferay.Language.get('object')
),
onClick: async () => {
if (isTreeStructure) {
dispatch({
payload: {
updatedModelBuilderModals: {
objectDefinitionOnRootModelDeletionNotAllowed:
true,
},
},
type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
});
}
else {
const deletedObjectDefinition =
await deleteObjectDefinition({
baseResourceURL,
objectDefinitionId,
objectDefinitionName,
});
if (deletedObjectDefinition) {
dispatch({
payload: {
deletedObjectDefinition,
},
type: TYPES.SET_DELETE_OBJECT_DEFINITION,
});
dispatch({
payload: {
updatedModelBuilderModals: {
deleteObjectDefinition: true,
},
},
type: TYPES.UPDATE_VISIBILITY_MODEL_BUILDER_MODALS,
});
}
}
},
symbolLeft: 'trash',
});
}
return kebabOptions;
}
interface GetObjectFolderActionsProps {
actions?: {
objectDefinitionActions: Actions;
objectFolderActions: Actions;
};
baseResourceURL: string;
importObjectDefinitionURL: string;
objectFolderExternalReferenceCode: string;
objectFolderId: number;
objectFolderPermissionsURL: string;
portletNamespace: string;
setModalImportProperties: (
value: SetStateAction
) => void;
setShowModal: (value: SetStateAction) => void;
}
export function getObjectFolderActions({
actions,
baseResourceURL,
importObjectDefinitionURL,
objectFolderExternalReferenceCode,
objectFolderId,
objectFolderPermissionsURL,
portletNamespace,
setModalImportProperties,
setShowModal,
}: GetObjectFolderActionsProps) {
const url = formatActionURL(objectFolderPermissionsURL, objectFolderId);
const kebabOptions = [];
if (actions?.objectFolderActions?.update) {
kebabOptions.unshift({
label: Liferay.Language.get('edit-label-and-erc'),
onClick: () =>
setShowModal((previousState: ShowObjectDefinitionsModals) => ({
...previousState,
editObjectFolder: true,
})),
symbolLeft: 'pencil',
value: 'editObjectFolder',
});
kebabOptions.push({type: 'divider'});
}
kebabOptions.push({
label: Liferay.Language.get('export-object-folder'),
onClick: () => {
const exportObjectFolderURL = createResourceURL(baseResourceURL, {
objectFolderId,
p_p_resource_id: '/object_definitions/export_object_folder',
}).href;
exportObjectEntity({
exportObjectEntityURL: exportObjectFolderURL,
objectEntityId: objectFolderId,
});
},
symbolLeft: 'export',
value: 'exportObjectFolder',
});
if (actions?.objectDefinitionActions?.create) {
kebabOptions.push({
label: Liferay.Language.get('import-object-definition'),
onClick: () => {
setModalImportProperties({
JSONInputId: 'objectDefinitionJSON',
apiURL: '/o/object-admin/v1.0/object-definitions/by-external-reference-code/',
importExtendedInfo: {
key: `${portletNamespace}objectFolderExternalReferenceCode`,
value: objectFolderExternalReferenceCode,
},
importURL: importObjectDefinitionURL,
modalImportKey: 'objectDefinition',
});
setShowModal((previousState: ShowObjectDefinitionsModals) => ({
...previousState,
importModal: true,
}));
},
symbolLeft: 'import',
value: 'importObjectDefinition',
});
kebabOptions.push({type: 'divider'});
}
if (actions?.objectFolderActions.permissions) {
kebabOptions.push({
label: Liferay.Language.get('object-folder-permissions'),
onClick: () => {
openModal({
title: Liferay.Language.get('permissions'),
url,
});
},
symbolLeft: 'password-policies',
value: 'objectFolderPermissions',
});
}
if (actions?.objectFolderActions.delete) {
kebabOptions.push({type: 'divider'});
kebabOptions.push({
label: Liferay.Language.get('delete-object-folder'),
onClick: () =>
setShowModal((previousState: ShowObjectDefinitionsModals) => ({
...previousState,
deleteObjectFolder: true,
})),
symbolLeft: 'trash',
value: 'deleteObjectFolder',
});
}
return kebabOptions;
}
export async function getUpdatedModelBuilderStructurePayload(
baseResourceURL: string,
currentObjectFolderName: string
) {
const allObjectFolders = await API.getAllObjectFolders();
if (allObjectFolders) {
const {items: objectFolders} = allObjectFolders;
const currentObjectFolder = objectFolders.find(
(objectFolder) => objectFolder.name === currentObjectFolderName
) as ObjectFolder;
const objectFoldersWithObjectDefinitions: ObjectFolder[] =
await Promise.all(
objectFolders.map(async (objectFolder) => {
const objectFolderWithObjectDefinitions: ObjectDefinitionNodeData[] =
[];
const objectDefinitionsFilteredByObjectFolder =
await API.getObjectDefinitions(
`filter=objectFolderExternalReferenceCode eq '${objectFolder.externalReferenceCode}'`
);
const linkedObjectDefinitions: ObjectDefinition[] = [];
await Promise.all(
objectFolder.objectFolderItems
.filter(
(objectFolderItem) =>
objectFolderItem.linkedObjectDefinition
)
.map(async (objectFolderItem) => {
linkedObjectDefinitions.push(
await API.getObjectDefinitionByExternalReferenceCode(
objectFolderItem.objectDefinitionExternalReferenceCode
)
);
})
);
const updateObjectFolderObjectDefinitions = async ({
linkedObjectDefinition,
objectDefinitions,
}: {
linkedObjectDefinition: boolean;
objectDefinitions: ObjectDefinition[];
}) => {
for await (const objectDefinition of objectDefinitions) {
const objectFolderItem =
objectFolder.objectFolderItems.find(
(objectFolderItem) =>
objectFolderItem.objectDefinitionExternalReferenceCode ===
objectDefinition.externalReferenceCode
);
const dbTableName = await getDbTableName({
baseResourceURL,
objectDefinitionId: objectDefinition.id,
});
if (objectFolderItem) {
objectFolderWithObjectDefinitions.push({
...objectDefinition,
dbTableName,
hasObjectDefinitionDeleteResourcePermission:
!!objectDefinition.actions.delete,
hasObjectDefinitionManagePermissionsResourcePermission:
!!objectDefinition.actions.permissions,
hasObjectDefinitionUpdateResourcePermission:
!!objectDefinition.actions.update,
hasObjectDefinitionViewResourcePermission:
!!objectDefinition.actions.get,
linkedObjectDefinition,
objectFields:
objectDefinition.objectFields.map(
({
businessType,
externalReferenceCode,
id,
label,
name,
required,
}) =>
({
businessType,
externalReferenceCode,
id,
label,
name,
primaryKey: name === 'id',
required,
selected: false,
}) as ObjectFieldNodeRow
),
selected: false,
showAllObjectFields: false,
});
}
}
};
await updateObjectFolderObjectDefinitions({
linkedObjectDefinition: false,
objectDefinitions:
objectDefinitionsFilteredByObjectFolder,
});
await updateObjectFolderObjectDefinitions({
linkedObjectDefinition: true,
objectDefinitions: linkedObjectDefinitions,
});
return {
...objectFolder,
objectDefinitions: objectFolderWithObjectDefinitions,
};
})
);
return {
objectFolders: objectFoldersWithObjectDefinitions,
selectedObjectFolderName: currentObjectFolder.name,
};
}
return {
objectFolders: [],
selectedObjectFolderName: '',
};
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy