From 9f86bb7dbb06ba74698ac98b94eaf656e20df524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maaria=20Wahlstr=C3=B6m?= Date: Fri, 14 Jun 2024 11:14:20 +0300 Subject: [PATCH 1/4] MSCD-491 Simplify permissions and implement MSCR copy --- mscr-ui/public/locales/en/common.json | 1 + mscr-ui/public/locales/fi/common.json | 1 + mscr-ui/public/locales/sv/common.json | 1 + .../schema-and-crosswalk-actionmenu/index.tsx | 46 ++++++ .../common/components/schema/schema.slice.tsx | 11 ++ .../src/common/interfaces/search.interface.ts | 1 + mscr-ui/src/common/utils/has-permission.tsx | 133 ++++++------------ .../src/modules/crosswalk-editor/index.tsx | 20 +-- .../tabs/metadata-and-files/index.tsx | 6 +- mscr-ui/src/modules/form/generate-payload.tsx | 3 +- mscr-ui/src/modules/form/index.tsx | 41 ++++-- .../src/modules/form/metadata-form/index.tsx | 38 +++-- mscr-ui/src/modules/schema-view/index.tsx | 31 +++- .../schema-view/metadata-and-files/index.tsx | 4 +- .../schema-visualization/index.tsx | 30 ++-- 15 files changed, 223 insertions(+), 144 deletions(-) diff --git a/mscr-ui/public/locales/en/common.json b/mscr-ui/public/locales/en/common.json index 6b9e42be9..15831027a 100644 --- a/mscr-ui/public/locales/en/common.json +++ b/mscr-ui/public/locales/en/common.json @@ -23,6 +23,7 @@ "finish-editing": "Finish editing", "invalidate-crosswalk": "Invalidate crosswalk", "invalidate-schema": "Invalidate schema", + "mscr-copy": "Make MSCR copy", "publish-crosswalk": "Publish crosswalk", "publish-schema": "Publish schema", "revision": "Add new revision" diff --git a/mscr-ui/public/locales/fi/common.json b/mscr-ui/public/locales/fi/common.json index 851fce5fa..434b5cbb8 100644 --- a/mscr-ui/public/locales/fi/common.json +++ b/mscr-ui/public/locales/fi/common.json @@ -23,6 +23,7 @@ "finish-editing": "", "invalidate-crosswalk": "", "invalidate-schema": "", + "mscr-copy": "", "publish-crosswalk": "", "publish-schema": "", "revision": "" diff --git a/mscr-ui/public/locales/sv/common.json b/mscr-ui/public/locales/sv/common.json index e6acbcbdb..fef1d1951 100644 --- a/mscr-ui/public/locales/sv/common.json +++ b/mscr-ui/public/locales/sv/common.json @@ -23,6 +23,7 @@ "finish-editing": "", "invalidate-crosswalk": "", "invalidate-schema": "", + "mscr-copy": "", "publish-crosswalk": "", "publish-schema": "", "revision": "" diff --git a/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx b/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx index ea83dd439..5aacf17d6 100644 --- a/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx +++ b/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx @@ -55,6 +55,7 @@ export default function SchemaAndCrosswalkActionMenu({ const [isDeleteConfirmModalOpen, setDeleteConfirmModalOpen] = useState(false); const [isRemoveConfirmModalOpen, setRemoveConfirmModalOpen] = useState(false); const [isRevisionModalOpen, setRevisionModalOpen] = useState(false); + const [isMscrCopyModalOpen, setMscrCopyModalOpen] = useState(false); const [isCrosswalkPublished, setCrosswalkPublished] = React.useState(false); const [isLatestVersion, setIsLatestVersion] = useState(false); @@ -202,6 +203,10 @@ export default function SchemaAndCrosswalkActionMenu({ } }, [metadata.revisions, metadata.pid]); + if (type == ActionMenuTypes.NoEditPermission) { + return renderStubMenu(); + } + return ( <> @@ -293,6 +298,17 @@ export default function SchemaAndCrosswalkActionMenu({ > {t('actionmenu.revision')} + setMscrCopyModalOpen(true)} + > + {t('actionmenu.mscr-copy')} + + ); + + function renderStubMenu() { + return ( + <> + + + setMscrCopyModalOpen(true)} + > + {t('actionmenu.mscr-copy')} + + + + + + ); + } } diff --git a/mscr-ui/src/common/components/schema/schema.slice.tsx b/mscr-ui/src/common/components/schema/schema.slice.tsx index 17e326f6b..e346d3ebd 100644 --- a/mscr-ui/src/common/components/schema/schema.slice.tsx +++ b/mscr-ui/src/common/components/schema/schema.slice.tsx @@ -56,6 +56,16 @@ export const schemaApi = createApi({ }, }) }), + putSchemaMscrCopy: builder.mutation }>({ + query: ({pid, data }) => ({ + url: `/schema?action=mscrCopyOf&target=${pid}`, + method: 'PUT', + data: data, + headers: { + 'content-Type': 'application/json;', + }, + }), + }), patchSchema: builder.mutation< Metadata, { @@ -141,6 +151,7 @@ export const { useGetSchemasQuery, usePutSchemaFullMutation, usePutSchemaRevisionMutation, + usePutSchemaMscrCopyMutation, usePatchSchemaMutation, util: { getRunningQueriesThunk }, } = schemaApi; diff --git a/mscr-ui/src/common/interfaces/search.interface.ts b/mscr-ui/src/common/interfaces/search.interface.ts index 784dc8bd8..b3c874565 100644 --- a/mscr-ui/src/common/interfaces/search.interface.ts +++ b/mscr-ui/src/common/interfaces/search.interface.ts @@ -24,6 +24,7 @@ export enum ActionMenuTypes { CrosswalkVersionInfo = 'CROSSWALK_VERSIONINFO', Schema = 'SCHEMA', SchemaMetadata = 'SCHEMA_METADATA', + NoEditPermission = 'NO_EDIT_PERMISSION', } export interface ResultInfo { diff --git a/mscr-ui/src/common/utils/has-permission.tsx b/mscr-ui/src/common/utils/has-permission.tsx index bcc254a74..72871cf2c 100644 --- a/mscr-ui/src/common/utils/has-permission.tsx +++ b/mscr-ui/src/common/utils/has-permission.tsx @@ -9,38 +9,37 @@ import { import { User } from 'yti-common-ui/interfaces/user.interface'; import { Roles } from '../interfaces/format.interface'; -// Need to specify the acctions permitted for each type of user +// Need to specify the actions permitted for each type of user const actions = [ - 'CREATE_SCHEMA', - 'EDIT_SCHEMA', - 'EDIT_SCHEMA_METADATA', - 'EDIT_SCHEMA_FILES', - 'DELETE_SCHEMA', - 'CREATE_CROSSWALK', - 'EDIT_CROSSWALK_MAPPINGS', - 'EDIT_CROSSWALK_METADATA', - 'EDIT_CROSSWALK_FILES', - 'DELETE_CROSSWALK', + // 'CREATE_SCHEMA', + // 'EDIT_SCHEMA', + // 'EDIT_SCHEMA_METADATA', + // 'EDIT_SCHEMA_FILES', + // 'DELETE_SCHEMA', + // 'CREATE_CROSSWALK', + // 'EDIT_CROSSWALK_MAPPINGS', + // 'EDIT_CROSSWALK_METADATA', + // 'EDIT_CROSSWALK_FILES', + // 'DELETE_CROSSWALK', + 'EDIT_CONTENT', + 'MAKE_MSCR_COPY' ] as const; -export type Actions = typeof actions[number]; +export type Action = typeof actions[number]; export interface hasPermissionProps { - actions: Actions | Actions[]; - targetOrganization?: string; + action: Action; owner?: string[]; } export interface checkPermissionProps { user: User; - actions: Actions[]; - targetOrganizations?: string[]; + action: Action; owner?: string[]; } export default function HasPermission({ - actions, - targetOrganization, + action, owner, }: hasPermissionProps) { const { data: authenticatedUser } = useGetAuthenticatedUserQuery(); @@ -66,99 +65,47 @@ export default function HasPermission({ return false; } - //No Target Organization - if (!targetOrganization) { - if (owner && owner.length) { - //Editing Step as already has owner - return checkEditPermission({ - user, - actions: Array.isArray(actions) ? actions : [actions], - owner, - }); - } + if (!owner || owner.length == 0) { return checkPermission({ user, - actions: Array.isArray(actions) ? actions : [actions], + action, }); } - //If there is target organization - if (owner && owner.length) { - //Editing Step as already has owner - return checkEditPermission({ - user, - actions: Array.isArray(actions) ? actions : [actions], - targetOrganizations: [targetOrganization], - owner, - }); - } return checkPermission({ - //Content Creation user, - actions: Array.isArray(actions) ? actions : [actions], - targetOrganizations: [targetOrganization], + action, + owner }); } export function checkPermission({ user, - actions, - targetOrganizations, -}: checkPermissionProps) { - - const rolesInOrganizations = Object.keys(user.organizationsInRole); - - const rolesInTargetOrganizations = - targetOrganizations && - targetOrganizations - ?.flatMap((org) => user.rolesInOrganizations[org]) - .filter((t) => t); - - // Return true if user is superuser - if (user.superuser) { - return true; - } - - // Return true if target organization is undefined and user has admin role - if (rolesInOrganizations.includes(Roles.admin) && !targetOrganizations) { - return true; - } - - // console.log(rolesInTargetOrganizations); - // Return true if user has data model editor role in target organization - if ( - rolesInTargetOrganizations?.includes(Roles.dataModelEditor)||rolesInTargetOrganizations?.includes(Roles.admin) - ) { - return true; - } - - - return false; -} - -export function checkEditPermission({ - user, + action, owner }: checkPermissionProps) { - if (owner?.includes(user.id)) { - //user is the owner, Check for personal Contents + if (action == 'MAKE_MSCR_COPY') { return true; - } else { - //Gruop Content - - if (owner && user.organizationsInRole[Roles.admin]&& user.organizationsInRole[Roles.admin].includes(owner[0])) { - // User has admin right for this group - return true; - } - - if ( - owner &&user.organizationsInRole[Roles.dataModelEditor]&& - user.organizationsInRole[Roles.dataModelEditor].includes(owner[0]) - ) { + } else if (action == 'EDIT_CONTENT') { + if (owner?.includes(user.id)) { + //user is the owner, Check for personal Contents return true; + } else { + //Group Content + if (owner && user.organizationsInRole[Roles.admin] && user.organizationsInRole[Roles.admin].includes(owner[0])) { + // User has admin right for this group + return true; + } + + if ( + owner && user.organizationsInRole[Roles.dataModelEditor] && + user.organizationsInRole[Roles.dataModelEditor].includes(owner[0]) + ) { + // User has data model editor right for this group + return true; + } } } - return false; } diff --git a/mscr-ui/src/modules/crosswalk-editor/index.tsx b/mscr-ui/src/modules/crosswalk-editor/index.tsx index b32911a12..d66d85eaa 100644 --- a/mscr-ui/src/modules/crosswalk-editor/index.tsx +++ b/mscr-ui/src/modules/crosswalk-editor/index.tsx @@ -150,7 +150,7 @@ export default function CrosswalkEditor({ } = useGetCrosswalkWithRevisionsQuery(crosswalkId); const hasEditRights = HasPermission({ - actions: ['EDIT_CROSSWALK_MAPPINGS'], + action: 'EDIT_CONTENT', owner: getCrosswalkData?.owner, }); @@ -723,13 +723,17 @@ export default function CrosswalkEditor({
- + {hasEditRights && + + }
diff --git a/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx b/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx index a5abd2dc4..74ab618da 100644 --- a/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx +++ b/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx @@ -9,8 +9,9 @@ export default function MetadataAndFiles(props: { crosswalkData: CrosswalkWithVersionInfo; refetch: () => void; }) { - const hasEditRights = HasPermission({ actions: ['EDIT_CROSSWALK_METADATA'],owner:props.crosswalkData.owner}); - const hasFileRights = HasPermission({ actions: ['EDIT_CROSSWALK_FILES'],owner:props.crosswalkData.owner }); + const hasEditRights = HasPermission({ action: 'EDIT_CONTENT',owner:props.crosswalkData.owner}); + const hasFileRights = HasPermission({ action: 'EDIT_CONTENT',owner:props.crosswalkData.owner }); + const hasCopyPermission = HasPermission({action: 'MAKE_MSCR_COPY'}); return ( <> @@ -19,6 +20,7 @@ export default function MetadataAndFiles(props: { metadata={props.crosswalkData} refetchMetadata={props.refetch} hasEditPermission={hasEditRights} + hasCopyPermission={hasCopyPermission} />
(false); const formDataFromInitialData = useCallback(() => { if (!initialData) return; const existingData: FormType = { - format: initialData.format, + format: modalType == ModalType.McsrCopy ? Format.Mscr : initialData.format, languages: [ { labelText: t('language-english-with-suffix'), @@ -141,7 +144,7 @@ export default function FormModal({ existingData.targetSchema = initialData.targetSchema ?? ''; } return existingData; - }, [contentType, initialData, lang, t]); + }, [contentType, initialData, lang, modalType, t]); useEffect(() => { if ( @@ -198,7 +201,6 @@ export default function FormModal({ ) { pid = resultCrosswalkRevision.data.pid; } - // TODO: Api slice for mscr schema revision, then the pid retrieval here break; case ModalType.RevisionFull: if ( @@ -216,7 +218,15 @@ export default function FormModal({ } break; case ModalType.McsrCopy: - // TODO: MscrCopy API slice and then pid retrieval for schema and crosswalk here + if ( + contentType == Type.Schema && + resultSchemaMscrCopy.isSuccess && + resultSchemaMscrCopy.data + ) { + pid = resultSchemaMscrCopy.data.pid; + } + break; + // TODO: MscrCopy API slice and then pid retrieval for crosswalk here } return pid; }, @@ -231,6 +241,8 @@ export default function FormModal({ resultCrosswalkRevision.isSuccess, resultSchemaFull.data, resultSchemaFull.isSuccess, + resultSchemaMscrCopy.data, + resultSchemaMscrCopy.isSuccess, resultSchemaRevision.data, resultSchemaRevision.isSuccess, ] @@ -246,7 +258,6 @@ export default function FormModal({ 'MscrSearch', ]) ); - //Get the pid from the result handleClose(); let notificationKey: NotificationKeys; if (contentType == Type.Schema) { @@ -314,7 +325,11 @@ export default function FormModal({ ); setErrors(formErrors); - if (formErrors && (Object.values(formErrors).includes(true) || formErrors.titleAmount.length > 0)) { + if ( + formErrors && + (Object.values(formErrors).includes(true) || + formErrors.titleAmount.length > 0) + ) { return; } @@ -361,8 +376,14 @@ export default function FormModal({ ]).then((_values) => { setSubmitAnimationVisible(false); }); - } else if (initialData) { - // Todo: Add mscrCopy option here + } else if (initialData && modalType == ModalType.McsrCopy && contentType == Type.Schema) { + Promise.all([ + spinnerDelay(), + putSchemaMscrCopy({ pid: initialData.pid, data: payload }), + ]).then((_values) => { + setSubmitAnimationVisible(false); + }); + } else if (initialData && modalType == ModalType.RevisionMscr && contentType == Type.Crosswalk) { Promise.all([ spinnerDelay(), putCrosswalkRevision({ pid: initialData.pid, data: payload }), @@ -370,6 +391,7 @@ export default function FormModal({ setSubmitAnimationVisible(false); }); } + // Missing scenarios: MSCR copy of a crosswalk, revision of an MSCR copy } }; @@ -406,8 +428,9 @@ export default function FormModal({ errorObject = getApiError(resultCrosswalkFull.error); } else if (resultSchemaFull.isError) { errorObject = getApiError(resultSchemaFull.error); + } else if (resultSchemaMscrCopy.isError) { + errorObject = getApiError(resultSchemaMscrCopy.error); } else { - // Todo: Add mscr copy error return undefined; } return errorObject; diff --git a/mscr-ui/src/modules/form/metadata-form/index.tsx b/mscr-ui/src/modules/form/metadata-form/index.tsx index b1b311cb1..d36fefc13 100644 --- a/mscr-ui/src/modules/form/metadata-form/index.tsx +++ b/mscr-ui/src/modules/form/metadata-form/index.tsx @@ -48,12 +48,14 @@ interface MetadataFormProps { metadata: SchemaWithVersionInfo | CrosswalkWithVersionInfo; refetchMetadata: () => void; hasEditPermission: boolean; + hasCopyPermission?: boolean; } export default function MetadataForm({ type, metadata, refetchMetadata, hasEditPermission, + hasCopyPermission, }: MetadataFormProps) { const { t } = useTranslation('common'); const router = useRouter(); @@ -171,20 +173,30 @@ export default function MetadataForm({
{hasEditPermission && ( - <> - - + )} + {!hasEditPermission && hasCopyPermission && type == Type.Schema && + + } diff --git a/mscr-ui/src/modules/schema-view/index.tsx b/mscr-ui/src/modules/schema-view/index.tsx index a7d45fbf9..b348abb81 100644 --- a/mscr-ui/src/modules/schema-view/index.tsx +++ b/mscr-ui/src/modules/schema-view/index.tsx @@ -17,6 +17,7 @@ import { SchemaVisualizationWrapper, VersionsHeading, } from '@app/modules/schema-view/schema-view-styles'; +import HasPermission from '@app/common/utils/has-permission'; export default function SchemaView({ schemaId }: { schemaId: string }) { const { t } = useTranslation('common'); @@ -30,6 +31,12 @@ export default function SchemaView({ schemaId }: { schemaId: string }) { error, } = useGetSchemaWithRevisionsQuery(schemaId); + const hasEditPermission = HasPermission({ + action: 'EDIT_CONTENT', + owner: schemaDetails?.owner, + }); + const hasCopyPermission = HasPermission({action: 'MAKE_MSCR_COPY'}); + const theme = createTheme({ typography: { fontFamily: [ @@ -114,6 +121,8 @@ export default function SchemaView({ schemaId }: { schemaId: string }) { format={schemaDetails.format} refetchMetadata={refetch} metadata={schemaDetails} + hasEditPermission={hasEditPermission} + hasCopyPermission={hasCopyPermission} /> @@ -127,12 +136,22 @@ export default function SchemaView({ schemaId }: { schemaId: string }) {
- + {hasEditPermission && + + } + {!hasEditPermission && hasCopyPermission && + + }
diff --git a/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx b/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx index 1a505ebd3..5bba5c5ee 100644 --- a/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx +++ b/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx @@ -12,9 +12,10 @@ export default function MetadataAndFiles({ refetch: () => void; }) { const hasEditPermission = HasPermission({ - actions: ['EDIT_SCHEMA_METADATA'], + action: 'EDIT_CONTENT', owner: schemaDetails?.owner }); + const hasCopyPermission = HasPermission({action: 'MAKE_MSCR_COPY'}); const schemaFiles = schemaDetails?.fileMetadata; return ( @@ -24,6 +25,7 @@ export default function MetadataAndFiles({ metadata={schemaDetails} refetchMetadata={refetch} hasEditPermission={hasEditPermission} + hasCopyPermission={hasCopyPermission} /> void; }) { @@ -34,16 +36,22 @@ export default function SchemaVisualization({
- {!hasEditRights && ( - <> - - + {hasEditPermission && ( + )} + {!hasEditPermission && hasCopyPermission && + + }
From d13d58b06c15b3893689f4ac7848a25a79a96dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maaria=20Wahlstr=C3=B6m?= Date: Fri, 14 Jun 2024 11:23:32 +0300 Subject: [PATCH 2/4] MSCR-491 Run Prettier --- .../schema-and-crosswalk-actionmenu/index.tsx | 4 +--- mscr-ui/src/common/utils/has-permission.tsx | 24 +++++++++---------- .../src/modules/crosswalk-editor/index.tsx | 4 ++-- .../tabs/metadata-and-files/index.tsx | 15 ++++++++---- mscr-ui/src/modules/form/index.tsx | 15 +++++++++--- .../src/modules/form/metadata-form/index.tsx | 4 ++-- mscr-ui/src/modules/schema-view/index.tsx | 10 ++++---- .../schema-view/metadata-and-files/index.tsx | 10 ++++---- .../schema-visualization/index.tsx | 10 +++++--- 9 files changed, 55 insertions(+), 41 deletions(-) diff --git a/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx b/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx index 5aacf17d6..d35d34264 100644 --- a/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx +++ b/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx @@ -437,9 +437,7 @@ export default function SchemaAndCrosswalkActionMenu({ <> - setMscrCopyModalOpen(true)} - > + setMscrCopyModalOpen(true)}> {t('actionmenu.mscr-copy')} diff --git a/mscr-ui/src/common/utils/has-permission.tsx b/mscr-ui/src/common/utils/has-permission.tsx index 72871cf2c..fd9bf5d12 100644 --- a/mscr-ui/src/common/utils/has-permission.tsx +++ b/mscr-ui/src/common/utils/has-permission.tsx @@ -22,7 +22,7 @@ const actions = [ // 'EDIT_CROSSWALK_FILES', // 'DELETE_CROSSWALK', 'EDIT_CONTENT', - 'MAKE_MSCR_COPY' + 'MAKE_MSCR_COPY', ] as const; export type Action = typeof actions[number]; @@ -38,10 +38,7 @@ export interface checkPermissionProps { owner?: string[]; } -export default function HasPermission({ - action, - owner, -}: hasPermissionProps) { +export default function HasPermission({ action, owner }: hasPermissionProps) { const { data: authenticatedUser } = useGetAuthenticatedUserQuery(); const dispatch = useStoreDispatch(); const user = useSelector(selectLogin()); @@ -75,15 +72,11 @@ export default function HasPermission({ return checkPermission({ user, action, - owner + owner, }); } -export function checkPermission({ - user, - action, - owner -}: checkPermissionProps) { +export function checkPermission({ user, action, owner }: checkPermissionProps) { if (action == 'MAKE_MSCR_COPY') { return true; } else if (action == 'EDIT_CONTENT') { @@ -92,13 +85,18 @@ export function checkPermission({ return true; } else { //Group Content - if (owner && user.organizationsInRole[Roles.admin] && user.organizationsInRole[Roles.admin].includes(owner[0])) { + if ( + owner && + user.organizationsInRole[Roles.admin] && + user.organizationsInRole[Roles.admin].includes(owner[0]) + ) { // User has admin right for this group return true; } if ( - owner && user.organizationsInRole[Roles.dataModelEditor] && + owner && + user.organizationsInRole[Roles.dataModelEditor] && user.organizationsInRole[Roles.dataModelEditor].includes(owner[0]) ) { // User has data model editor right for this group diff --git a/mscr-ui/src/modules/crosswalk-editor/index.tsx b/mscr-ui/src/modules/crosswalk-editor/index.tsx index d66d85eaa..eaf200ffc 100644 --- a/mscr-ui/src/modules/crosswalk-editor/index.tsx +++ b/mscr-ui/src/modules/crosswalk-editor/index.tsx @@ -723,7 +723,7 @@ export default function CrosswalkEditor({
- {hasEditRights && + {hasEditRights && ( - } + )}
diff --git a/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx b/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx index 74ab618da..ea161daec 100644 --- a/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx +++ b/mscr-ui/src/modules/crosswalk-editor/tabs/metadata-and-files/index.tsx @@ -4,14 +4,19 @@ import { Type } from '@app/common/interfaces/search.interface'; import { CrosswalkWithVersionInfo } from '@app/common/interfaces/crosswalk.interface'; import MetadataFilesTable from '@app/common/components/metadata-files-table'; - export default function MetadataAndFiles(props: { crosswalkData: CrosswalkWithVersionInfo; refetch: () => void; }) { - const hasEditRights = HasPermission({ action: 'EDIT_CONTENT',owner:props.crosswalkData.owner}); - const hasFileRights = HasPermission({ action: 'EDIT_CONTENT',owner:props.crosswalkData.owner }); - const hasCopyPermission = HasPermission({action: 'MAKE_MSCR_COPY'}); + const hasEditRights = HasPermission({ + action: 'EDIT_CONTENT', + owner: props.crosswalkData.owner, + }); + const hasFileRights = HasPermission({ + action: 'EDIT_CONTENT', + owner: props.crosswalkData.owner, + }); + const hasCopyPermission = HasPermission({ action: 'MAKE_MSCR_COPY' }); return ( <> @@ -22,7 +27,7 @@ export default function MetadataAndFiles(props: { hasEditPermission={hasEditRights} hasCopyPermission={hasCopyPermission} /> -
+
{ if (!initialData) return; const existingData: FormType = { - format: modalType == ModalType.McsrCopy ? Format.Mscr : initialData.format, + format: + modalType == ModalType.McsrCopy ? Format.Mscr : initialData.format, languages: [ { labelText: t('language-english-with-suffix'), @@ -376,14 +377,22 @@ export default function FormModal({ ]).then((_values) => { setSubmitAnimationVisible(false); }); - } else if (initialData && modalType == ModalType.McsrCopy && contentType == Type.Schema) { + } else if ( + initialData && + modalType == ModalType.McsrCopy && + contentType == Type.Schema + ) { Promise.all([ spinnerDelay(), putSchemaMscrCopy({ pid: initialData.pid, data: payload }), ]).then((_values) => { setSubmitAnimationVisible(false); }); - } else if (initialData && modalType == ModalType.RevisionMscr && contentType == Type.Crosswalk) { + } else if ( + initialData && + modalType == ModalType.RevisionMscr && + contentType == Type.Crosswalk + ) { Promise.all([ spinnerDelay(), putCrosswalkRevision({ pid: initialData.pid, data: payload }), diff --git a/mscr-ui/src/modules/form/metadata-form/index.tsx b/mscr-ui/src/modules/form/metadata-form/index.tsx index d36fefc13..3ea379f8b 100644 --- a/mscr-ui/src/modules/form/metadata-form/index.tsx +++ b/mscr-ui/src/modules/form/metadata-form/index.tsx @@ -185,7 +185,7 @@ export default function MetadataForm({ } /> )} - {!hasEditPermission && hasCopyPermission && type == Type.Schema && + {!hasEditPermission && hasCopyPermission && type == Type.Schema && ( - } + )}
diff --git a/mscr-ui/src/modules/schema-view/index.tsx b/mscr-ui/src/modules/schema-view/index.tsx index b348abb81..fbc1c8d73 100644 --- a/mscr-ui/src/modules/schema-view/index.tsx +++ b/mscr-ui/src/modules/schema-view/index.tsx @@ -35,7 +35,7 @@ export default function SchemaView({ schemaId }: { schemaId: string }) { action: 'EDIT_CONTENT', owner: schemaDetails?.owner, }); - const hasCopyPermission = HasPermission({action: 'MAKE_MSCR_COPY'}); + const hasCopyPermission = HasPermission({ action: 'MAKE_MSCR_COPY' }); const theme = createTheme({ typography: { @@ -136,22 +136,22 @@ export default function SchemaView({ schemaId }: { schemaId: string }) {
- {hasEditPermission && + {hasEditPermission && ( - } - {!hasEditPermission && hasCopyPermission && + )} + {!hasEditPermission && hasCopyPermission && ( - } + )}
diff --git a/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx b/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx index 5bba5c5ee..a95027709 100644 --- a/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx +++ b/mscr-ui/src/modules/schema-view/metadata-and-files/index.tsx @@ -5,17 +5,17 @@ import HasPermission from '@app/common/utils/has-permission'; import MetadataFilesTable from '@app/common/components/metadata-files-table'; export default function MetadataAndFiles({ - schemaDetails, - refetch, - }: { + schemaDetails, + refetch, +}: { schemaDetails: SchemaWithVersionInfo; refetch: () => void; }) { const hasEditPermission = HasPermission({ action: 'EDIT_CONTENT', - owner: schemaDetails?.owner + owner: schemaDetails?.owner, }); - const hasCopyPermission = HasPermission({action: 'MAKE_MSCR_COPY'}); + const hasCopyPermission = HasPermission({ action: 'MAKE_MSCR_COPY' }); const schemaFiles = schemaDetails?.fileMetadata; return ( diff --git a/mscr-ui/src/modules/schema-view/schema-visualization/index.tsx b/mscr-ui/src/modules/schema-view/schema-visualization/index.tsx index c48f6e07d..c43340f9f 100644 --- a/mscr-ui/src/modules/schema-view/schema-visualization/index.tsx +++ b/mscr-ui/src/modules/schema-view/schema-visualization/index.tsx @@ -33,7 +33,11 @@ export default function SchemaVisualization({ <>
- +
{hasEditPermission && ( @@ -44,14 +48,14 @@ export default function SchemaVisualization({ type={ActionMenuTypes.Schema} /> )} - {!hasEditPermission && hasCopyPermission && + {!hasEditPermission && hasCopyPermission && ( - } + )}
From 242e1f50032fa097a914871721d3cbb2afec431f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maaria=20Wahlstr=C3=B6m?= Date: Fri, 14 Jun 2024 13:56:11 +0300 Subject: [PATCH 3/4] MSCR-491 Show MSCR copy action only when compatible format --- .../schema-and-crosswalk-actionmenu/index.tsx | 7 ++++--- mscr-ui/src/common/interfaces/format.interface.ts | 8 ++++++++ .../tabs/metadata-and-files/index.tsx | 3 +-- mscr-ui/src/modules/form/metadata-form/index.tsx | 6 +++--- mscr-ui/src/modules/schema-view/index.tsx | 11 +++++++++-- .../schema-view/metadata-and-files/index.tsx | 13 ++++++------- .../schema-view/schema-visualization/index.tsx | 6 +++--- 7 files changed, 34 insertions(+), 20 deletions(-) diff --git a/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx b/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx index d35d34264..f70772e08 100644 --- a/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx +++ b/mscr-ui/src/common/components/schema-and-crosswalk-actionmenu/index.tsx @@ -20,7 +20,7 @@ import { CrosswalkWithVersionInfo } from '@app/common/interfaces/crosswalk.inter import { SchemaWithVersionInfo } from '@app/common/interfaces/schema.interface'; import { ActionMenuWrapper } from '@app/common/components/schema-and-crosswalk-actionmenu/schema-and-crosswalk-actionmenu.styles'; import FormModal, { ModalType } from '@app/modules/form'; -import { Format } from '@app/common/interfaces/format.interface'; +import { Format, formatsAvailableForMscrCopy } from '@app/common/interfaces/format.interface'; interface SchemaAndCrosswalkActionmenuProps { type: ActionMenuTypes; @@ -300,8 +300,9 @@ export default function SchemaAndCrosswalkActionMenu({ @@ -25,7 +24,7 @@ export default function MetadataAndFiles(props: { metadata={props.crosswalkData} refetchMetadata={props.refetch} hasEditPermission={hasEditRights} - hasCopyPermission={hasCopyPermission} + isMscrCopyAvailable={false} />
void; hasEditPermission: boolean; - hasCopyPermission?: boolean; + isMscrCopyAvailable?: boolean; } export default function MetadataForm({ type, metadata, refetchMetadata, hasEditPermission, - hasCopyPermission, + isMscrCopyAvailable, }: MetadataFormProps) { const { t } = useTranslation('common'); const router = useRouter(); @@ -185,7 +185,7 @@ export default function MetadataForm({ } /> )} - {!hasEditPermission && hasCopyPermission && type == Type.Schema && ( + {!hasEditPermission && isMscrCopyAvailable && ( )} {selectedTab === 1 && ( @@ -122,7 +129,7 @@ export default function SchemaView({ schemaId }: { schemaId: string }) { refetchMetadata={refetch} metadata={schemaDetails} hasEditPermission={hasEditPermission} - hasCopyPermission={hasCopyPermission} + isMscrCopyAvailable={isMscrCopyAvailable} /> @@ -144,7 +151,7 @@ export default function SchemaView({ schemaId }: { schemaId: string }) { type={ActionMenuTypes.Schema} /> )} - {!hasEditPermission && hasCopyPermission && ( + {!hasEditPermission && isMscrCopyAvailable && ( void; + hasEditPermission: boolean; + isMscrCopyAvailable?: boolean; }) { - const hasEditPermission = HasPermission({ - action: 'EDIT_CONTENT', - owner: schemaDetails?.owner, - }); - const hasCopyPermission = HasPermission({ action: 'MAKE_MSCR_COPY' }); + const schemaFiles = schemaDetails?.fileMetadata; return ( @@ -25,7 +24,7 @@ export default function MetadataAndFiles({ metadata={schemaDetails} refetchMetadata={refetch} hasEditPermission={hasEditPermission} - hasCopyPermission={hasCopyPermission} + isMscrCopyAvailable={isMscrCopyAvailable} /> void; }) { @@ -48,7 +48,7 @@ export default function SchemaVisualization({ type={ActionMenuTypes.Schema} /> )} - {!hasEditPermission && hasCopyPermission && ( + {!hasEditPermission && isMscrCopyAvailable && ( Date: Tue, 18 Jun 2024 12:48:00 +0300 Subject: [PATCH 4/4] MSCR-491 Fix metadata tab action menu permission logic --- mscr-ui/src/modules/form/metadata-form/index.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mscr-ui/src/modules/form/metadata-form/index.tsx b/mscr-ui/src/modules/form/metadata-form/index.tsx index b1bcf3a9f..bdaa518da 100644 --- a/mscr-ui/src/modules/form/metadata-form/index.tsx +++ b/mscr-ui/src/modules/form/metadata-form/index.tsx @@ -190,11 +190,7 @@ export default function MetadataForm({ metadata={metadata} isMappingsEditModeActive={isEditModeActive} refetchMetadata={refetchMetadata} - type={ - type === Type.Schema - ? ActionMenuTypes.SchemaMetadata - : ActionMenuTypes.CrosswalkMetadata - } + type={ActionMenuTypes.NoEditPermission} /> )}