diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/components/TableRows/index.js b/packages/core/admin/admin/src/content-manager/pages/ListView/components/TableRows/index.js index 6408ad7c42..f4b79a09aa 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/components/TableRows/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/components/TableRows/index.js @@ -52,14 +52,15 @@ export const TableRows = ({ const pluginsQueryParams = usePluginsQueryParams(); const [{ query }] = useQueryParams(); const { formatAPIError } = useAPIErrorHandler(getTrad); - const ReviewWorkflowsStage = useEnterprise( + const ReviewWorkflowsColumns = useEnterprise( REVIEW_WORKFLOW_COLUMNS_CE, - async () => - ( - await import( - '../../../../../../../ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn' - ) - ).ReviewWorkflowsStageEE, + async () => { + const { ReviewWorkflowsStageEE, ReviewWorkflowsAssigneeEE } = await import( + '../../../../../../../ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn' + ); + + return { ReviewWorkflowsStageEE, ReviewWorkflowsAssigneeEE }; + }, { enabled: hasReviewWorkflows, } @@ -108,7 +109,7 @@ export const TableRows = ({ }; // block rendering until the review stage component is fully loaded in EE - if (!ReviewWorkflowsStage) { + if (!ReviewWorkflowsColumns) { return null; } @@ -178,19 +179,36 @@ export const TableRows = ({ ); } - if (hasReviewWorkflows && name === 'strapi_reviewWorkflows_stage') { - return ( - - {data.strapi_reviewWorkflows_stage ? ( - - ) : ( - - - )} - - ); + if (hasReviewWorkflows) { + if (name === 'strapi_reviewWorkflows_stage') { + return ( + + {data.strapi_reviewWorkflows_stage ? ( + + ) : ( + - + )} + + ); + } + if (name === 'strapi_assignee') { + return ( + + {data.strapi_assignee ? ( + + ) : ( + - + )} + + ); + } } return ( diff --git a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js index 1130a618e9..98a306f750 100644 --- a/packages/core/admin/admin/src/content-manager/pages/ListView/index.js +++ b/packages/core/admin/admin/src/content-manager/pages/ListView/index.js @@ -422,13 +422,15 @@ function ListView({ if (reviewWorkflowColumns) { // Make sure the column header label is translated - if (typeof reviewWorkflowColumns.metadatas.label !== 'string') { - reviewWorkflowColumns.metadatas.label = formatMessage( - reviewWorkflowColumns.metadatas.label - ); - } + reviewWorkflowColumns.map((column) => { + if (typeof column.metadatas.label !== 'string') { + column.metadatas.label = formatMessage(column.metadatas.label); + } - formattedHeaders.push(reviewWorkflowColumns); + return column; + }); + + formattedHeaders.push(...reviewWorkflowColumns); } return formattedHeaders; diff --git a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/ReviewWorkflowsAssigneeEE.js b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/ReviewWorkflowsAssigneeEE.js new file mode 100644 index 0000000000..6422c0c211 --- /dev/null +++ b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/ReviewWorkflowsAssigneeEE.js @@ -0,0 +1,51 @@ +import React from 'react'; + +import { Typography } from '@strapi/design-system'; +import PropTypes from 'prop-types'; +import { useIntl } from 'react-intl'; + +import getTrad from '../../../../../../admin/src/content-manager/utils/getTrad'; + +export function ReviewWorkflowsAssigneeEE({ firstname, lastname, displayname }) { + const { formatMessage } = useIntl(); + + // TODO align with changes from this PR, using the getDisplayName util + // https://github.com/strapi/strapi/pull/17043/ + if (displayname) { + return ( + + {formatMessage( + { + id: getTrad(`containers.ListPage.reviewWorkflows.assignee`), + defaultMessage: '{displayname}', + }, + { displayname } + )} + + ); + } + + return ( + + {formatMessage( + { + id: getTrad(`containers.ListPage.reviewWorkflows.assignee`), + defaultMessage: '{firstname} {lastname}', + }, + { firstname, lastname } + )} + + ); +} + +ReviewWorkflowsAssigneeEE.defaultProps = { + firstname: '', + lastname: '', + displayname: '', +}; + +ReviewWorkflowsAssigneeEE.propTypes = { + firstname: PropTypes.string, + lastname: PropTypes.string, + displayname: PropTypes.string, +}; diff --git a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/constants.js b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/constants.js index 1ec56488b0..325cedfe98 100644 --- a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/constants.js +++ b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/constants.js @@ -1,24 +1,45 @@ import getTrad from '../../../../../../admin/src/content-manager/utils/getTrad'; +import { + ASSIGNEE_ATTRIBUTE_NAME, + STAGE_ATTRIBUTE_NAME, +} from '../../EditView/InformationBox/constants'; -export const REVIEW_WORKFLOW_COLUMNS_EE = { - key: '__strapi_reviewWorkflows_stage_temp_key__', - name: 'strapi_reviewWorkflows_stage', - fieldSchema: { - type: 'relation', - }, - metadatas: { - // formatMessage() will be applied when the column is rendered - label: { - id: getTrad(`containers.ListPage.table-headers.reviewWorkflows.stage`), - defaultMessage: 'Review stage', +export const REVIEW_WORKFLOW_COLUMNS_EE = [ + { + key: `__${STAGE_ATTRIBUTE_NAME}_temp_key__`, + name: STAGE_ATTRIBUTE_NAME, + fieldSchema: { + type: 'relation', }, - searchable: false, - sortable: true, - mainField: { - name: 'name', - schema: { - type: 'string', + metadatas: { + // formatMessage() will be applied when the column is rendered + label: { + id: getTrad(`containers.ListPage.table-headers.reviewWorkflows.stage`), + defaultMessage: 'Review stage', + }, + searchable: false, + sortable: true, + mainField: { + name: 'name', + schema: { + type: 'string', + }, }, }, }, -}; + { + key: `__${ASSIGNEE_ATTRIBUTE_NAME}_temp_key__`, + name: ASSIGNEE_ATTRIBUTE_NAME, + fieldSchema: { + type: 'relation', + }, + metadatas: { + label: { + id: getTrad(`containers.ListPage.table-headers.reviewWorkflows.assignee`), + defaultMessage: 'Assignee', + }, + searchable: false, + sortable: false, + }, + }, +]; diff --git a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/getTableColumns.js b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/getTableColumns.js deleted file mode 100644 index 18746ab3cd..0000000000 --- a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/getTableColumns.js +++ /dev/null @@ -1,95 +0,0 @@ -import React from 'react'; - -import { Typography } from '@strapi/design-system'; -import { useIntl } from 'react-intl'; - -import getTrad from '../../../../../../admin/src/content-manager/utils/getTrad'; -import { STAGE_COLOR_DEFAULT } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/constants'; - -import { ReviewWorkflowsStageEE } from '.'; - -export default (layout) => { - const { formatMessage } = useIntl(); - - // TODO: As soon as the feature was enabled in EE mode, the BE currently does not have a way to send - // `false` once a user is in CE mode again. We shouldn't have to perform the window.strapi.isEE check here - // and it is meant to be in interim solution until we find a better one. - const hasReviewWorkflows = - (window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS) && - layout.contentType.options?.reviewWorkflows) ?? - false; - - if (!hasReviewWorkflows) { - return []; - } - - return [ - { - key: '__strapi_reviewWorkflows_stage_temp_key__', - name: 'strapi_reviewWorkflows_stage', - fieldSchema: { - type: 'relation', - }, - metadatas: { - label: formatMessage({ - id: getTrad(`containers.ListPage.table-headers.reviewWorkflows.stage`), - defaultMessage: 'Review stage', - }), - searchable: false, - sortable: true, - mainField: { - name: 'name', - schema: { - type: 'string', - }, - }, - }, - cellFormatter({ strapi_reviewWorkflows_stage }) { - // if entities are created e.g. through lifecycle methods - // they may not have a stage assigned - if (!strapi_reviewWorkflows_stage) { - return -; - } - - const { color, name } = strapi_reviewWorkflows_stage; - - return ; - }, - }, - - { - key: '__strapi_reviewWorkflows_assignee_temp_key__', - name: 'strapi_reviewWorkflows_assignee', - fieldSchema: { - type: 'relation', - }, - metadatas: { - label: formatMessage({ - id: getTrad(`containers.ListPage.table-headers.reviewWorkflows.assignee`), - defaultMessage: 'Assignee', - }), - searchable: false, - sortable: false, - }, - cellFormatter({ strapi_assignee }) { - if (!strapi_assignee) { - return -; - } - - const { firstname, lastname } = strapi_assignee; - - return ( - - {formatMessage( - { - id: getTrad(`containers.ListPage.reviewWorkflows.assignee`), - defaultMessage: '{firstname} {lastname}', - }, - { firstname, lastname } - )} - - ); - }, - }, - ]; -}; diff --git a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/index.js b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/index.js index 354bfb6848..57a8fa4cf3 100644 --- a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/index.js +++ b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/index.js @@ -1 +1,2 @@ export * from './ReviewWorkflowsStageEE'; +export * from './ReviewWorkflowsAssigneeEE'; diff --git a/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/tests/ReviewWorkflowsAssignee.test.js b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/tests/ReviewWorkflowsAssignee.test.js new file mode 100644 index 0000000000..4e3d45a171 --- /dev/null +++ b/packages/core/admin/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/tests/ReviewWorkflowsAssignee.test.js @@ -0,0 +1,31 @@ +import React from 'react'; + +import { lightTheme, ThemeProvider } from '@strapi/design-system'; +import { render } from '@testing-library/react'; +import { IntlProvider } from 'react-intl'; + +import { ReviewWorkflowsAssigneeEE } from '..'; + +const ComponentFixture = (props) => ( + + + + + +); + +const setup = (props) => render(); + +describe('DynamicTable | ReviewWorkflowsAssignee', () => { + test('will use displayname over first and last name', () => { + const displayname = 'Display Name'; + const { getByText } = setup({ displayname }); + + expect(getByText(displayname)).toBeInTheDocument(); + }); + test('render assignee name', () => { + const { getByText } = setup({ firstname: 'Kai', lastname: 'Doe' }); + + expect(getByText('Kai Doe')).toBeInTheDocument(); + }); +}); diff --git a/packages/core/admin/ee/server/services/__tests__/assignees.test.js b/packages/core/admin/ee/server/services/__tests__/assignees.test.js index c854024dc8..7e03e19e3a 100644 --- a/packages/core/admin/ee/server/services/__tests__/assignees.test.js +++ b/packages/core/admin/ee/server/services/__tests__/assignees.test.js @@ -67,7 +67,7 @@ describe('Review workflows - Stages service', () => { toId ); expect(entityServiceMock.update).toBeCalledWith(uid, id, { - data: { strapi_assignee: toId }, + data: { [ENTITY_ASSIGNEE_ATTRIBUTE]: toId }, fields: [], populate: [ENTITY_ASSIGNEE_ATTRIBUTE], });