From 3ebb4135708f972c16f82f371cb38085f59ee6ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20J=C3=A9z=C3=A9gou?= Date: Tue, 9 Jan 2024 16:04:49 +0100 Subject: [PATCH] Translations + Keys + update freshly closed referral display and permissions --- .../core/api/referral_report_version.py | 2 + src/backend/partaj/core/serializers.py | 5 +- .../FileUploader/DropzoneFileUploader.tsx | 4 +- .../ReferralReport/Conversation/Message.tsx | 2 +- .../js/components/ReferralReport/Version.tsx | 178 +++++++++--------- .../ReferralReport/VersionEventIndicator.tsx | 70 +++++-- .../js/components/ReferralReport/index.tsx | 69 +++---- .../ReferralTable/UserReferralTableRow.tsx | 12 +- src/frontend/js/translations/en-US.json | 6 +- src/frontend/js/translations/en-US.po | 42 ++--- src/frontend/js/translations/fr-FR.json | 6 +- src/frontend/js/translations/fr-FR.po | 42 ++--- src/frontend/js/types/index.ts | 8 + src/frontend/js/utils/referral.ts | 12 ++ 14 files changed, 263 insertions(+), 195 deletions(-) diff --git a/src/backend/partaj/core/api/referral_report_version.py b/src/backend/partaj/core/api/referral_report_version.py index d58d27af8e..18289cdee5 100644 --- a/src/backend/partaj/core/api/referral_report_version.py +++ b/src/backend/partaj/core/api/referral_report_version.py @@ -58,6 +58,7 @@ class CanCreateVersion(BasePermission): - User is authenticated - User is referral's topic unit member - Referral is not published yet + - Referral is not closed yet """ def has_permission(self, request, view): @@ -67,6 +68,7 @@ def has_permission(self, request, view): request.user.is_authenticated and report.referral.units.filter(members__id=request.user.id).exists() and report.referral.state != models.ReferralState.ANSWERED + and report.referral.state != models.ReferralState.CLOSED ) diff --git a/src/backend/partaj/core/serializers.py b/src/backend/partaj/core/serializers.py index ff763155f9..bd276f95ab 100644 --- a/src/backend/partaj/core/serializers.py +++ b/src/backend/partaj/core/serializers.py @@ -290,9 +290,7 @@ class NotificationSerializer(serializers.ModelSerializer): class Meta: model = models.Notification - fields = [ - "notified", - ] + fields = ["notified", "id"] class EventMetadataSerializer(serializers.ModelSerializer): @@ -338,6 +336,7 @@ class Meta: "content", "created_at", "report", + "state", "verb", "user", "metadata", diff --git a/src/frontend/js/components/FileUploader/DropzoneFileUploader.tsx b/src/frontend/js/components/FileUploader/DropzoneFileUploader.tsx index 5877ecbdbd..6b081de98f 100644 --- a/src/frontend/js/components/FileUploader/DropzoneFileUploader.tsx +++ b/src/frontend/js/components/FileUploader/DropzoneFileUploader.tsx @@ -104,12 +104,12 @@ export const DropzoneFileUploader = ({

{withButton && ( - + )} )} diff --git a/src/frontend/js/components/ReferralReport/Conversation/Message.tsx b/src/frontend/js/components/ReferralReport/Conversation/Message.tsx index 7fe6858906..9f90e19d27 100644 --- a/src/frontend/js/components/ReferralReport/Conversation/Message.tsx +++ b/src/frontend/js/components/ReferralReport/Conversation/Message.tsx @@ -205,7 +205,7 @@ export const Message = ({ {notifications.map((notification: MessageNotification) => { return ( @{notification.notified.display_name} diff --git a/src/frontend/js/components/ReferralReport/Version.tsx b/src/frontend/js/components/ReferralReport/Version.tsx index 04f8c208e1..12e8cdbed6 100644 --- a/src/frontend/js/components/ReferralReport/Version.tsx +++ b/src/frontend/js/components/ReferralReport/Version.tsx @@ -18,7 +18,7 @@ import { useCurrentUser } from '../../data/useCurrentUser'; import { isAuthor } from '../../utils/version'; import { SendVersionModal } from './SendVersionModal'; import { ReferralContext } from '../../data/providers/ReferralProvider'; -import { referralIsPublished } from '../../utils/referral'; +import { referralIsClosed, referralIsPublished } from '../../utils/referral'; import { EditFileIcon, SendIcon } from '../Icons'; import { VersionUpdateButton } from '../FileUploader/VersionUpdateButton'; import { IconTextButton } from '../buttons/IconTextButton'; @@ -261,7 +261,6 @@ export const Version: React.FC = ({ {version.created_by.first_name} {version.created_by.last_name} -
= ({ ), }} /> -
-

{version.created_by.unit_name}

-
+

{version.created_by.unit_name}

{version.events.length > 0 && referral.validation_state === 1 && (
@@ -294,93 +291,98 @@ export const Version: React.FC = ({
- {isLastVersion(index) && !referralIsPublished(referral) && ( -
-
- {isAuthor(currentUser, version) && ( -
- +
+ {isAuthor(currentUser, version) && ( +
+ + } + cssClass="btn-gray" + onSuccess={(result) => { + setVersion(result); + }} + onError={(error) => { + if ( + error.code === ErrorCodes.FILE_FORMAT_FORBIDDEN + ) { + setErrorModalOpen(true); } + Sentry.captureException(error.errors[0]); + }} + action={'PUT'} + url={urls.versions + version.id + '/'} + > + + +
+ )} +
+
+ {isLastVersion(index) && + !referralIsPublished(referral) && + !referralIsClosed(referral) && + referral.validation_state === 1 && ( + <> + + + + + + )} + } + onClick={() => { + if (isChangeRequested(version)) { + return setWarningModalOpen(true); } - cssClass="btn-gray" - onSuccess={(result) => { - setVersion(result); - }} - onError={(error) => { - if (error.code === ErrorCodes.FILE_FORMAT_FORBIDDEN) { - setErrorModalOpen(true); - } - Sentry.captureException(error.errors[0]); - }} - action={'PUT'} - url={urls.versions + version.id + '/'} - > - - -
- )} -
-
- {isLastVersion(index) && - !referralIsPublished(referral) && - referral.validation_state === 1 && ( - <> - - - - - - )} - } - onClick={() => { - if (isChangeRequested(version)) { - return setWarningModalOpen(true); - } - setModalOpen(true); - setActiveVersion(versionsLength - index); - }} - > - - - setWarningModalOpen(false)} - onContinue={() => { - setWarningModalOpen(false); - setModalOpen(true); - }} - /> + setModalOpen(true); + setActiveVersion(versionsLength - index); + }} + > + + + setWarningModalOpen(false)} + onContinue={() => { + setWarningModalOpen(false); + setModalOpen(true); + }} + /> +
-
- )} + )} { let message: React.ReactNode; const intl = useIntl(); + const { referral } = useContext(ReferralContext); - const getStyle = (verb: string) => { - return eventStyle.hasOwnProperty(verb) && isActive - ? eventStyle[verb as VersionEventVerb].style + const getStyle = (event: ReportEvent, referral: Nullable) => { + return eventStyle.hasOwnProperty(event.verb) && + isActive && + referral && + referralIsOpen(referral) && + event.state === ReportEventState.ACTIVE + ? eventStyle[event.verb as VersionEventVerb].style : eventStyle[ReportEventVerb.NEUTRAL].style; }; @@ -82,6 +97,15 @@ export const VersionEventIndicator = ({ commonMessages[event.metadata.receiver_role], ), unitName: event.metadata.receiver_unit_name, + date: ( + + ), + time: , }} /> ); @@ -96,6 +120,15 @@ export const VersionEventIndicator = ({ roleName: intl.formatMessage( commonMessages[event.metadata.sender_role], ), + date: ( + + ), + time: , }} /> ); @@ -104,18 +137,17 @@ export const VersionEventIndicator = ({ return (
-
- +
+ {' '} +
+ {message} - {' le '} - - {' à '} -
); diff --git a/src/frontend/js/components/ReferralReport/index.tsx b/src/frontend/js/components/ReferralReport/index.tsx index 4555fe1d6d..a5584184b1 100644 --- a/src/frontend/js/components/ReferralReport/index.tsx +++ b/src/frontend/js/components/ReferralReport/index.tsx @@ -15,7 +15,7 @@ import { useReferralReport } from '../../data'; import { Version } from './Version'; import { urls } from '../../const'; import * as Sentry from '@sentry/react'; -import { referralIsPublished } from '../../utils/referral'; +import { referralIsClosed, referralIsPublished } from '../../utils/referral'; import { AddIcon, DraftIcon } from '../Icons'; import { IconTextButton } from '../buttons/IconTextButton'; import { VersionProvider } from '../../data/providers/VersionProvider'; @@ -130,38 +130,43 @@ export const ReferralReport: React.FC = () => {
{versionsAreLoaded && ( <> - {!referralIsPublished(referral) && reportVersions.length > 0 && ( - <> - {isAddingVersion ? ( - onSuccess(result)} - onError={(error) => onError(error)} - withButton - action={'POST'} - url={urls.versions} - keyValues={[ - ['report', referral!.report!.id], - [ - 'version_number', - (reportVersions.length + 1).toString(), - ], - ]} - message={messages.dropVersion} - /> - ) : ( -
- setAddingVersion(true)} - testId="add-version-button" - otherClasses="border border-primary-500 text-primary-500" - icon={} + {!referralIsPublished(referral) && + !referralIsClosed(referral) && + reportVersions.length > 0 && ( + <> + {isAddingVersion ? ( + onSuccess(result)} + onError={(error) => onError(error)} + withButton + action={'POST'} + url={urls.versions} + keyValues={[ + ['report', referral!.report!.id], + [ + 'version_number', + (reportVersions.length + 1).toString(), + ], + ]} + message={messages.dropVersion} + /> + ) : ( +
- - -
- )} - - )} + setAddingVersion(true)} + testId="add-version-button" + otherClasses="border border-primary-500 text-primary-500" + icon={} + > + + +
+ )} + + )} <> {reportVersions.length > 0 ? ( diff --git a/src/frontend/js/components/ReferralTable/UserReferralTableRow.tsx b/src/frontend/js/components/ReferralTable/UserReferralTableRow.tsx index 8c199a2849..068b6c0092 100644 --- a/src/frontend/js/components/ReferralTable/UserReferralTableRow.tsx +++ b/src/frontend/js/components/ReferralTable/UserReferralTableRow.tsx @@ -66,12 +66,20 @@ export const UserReferralTableRow: React.FC = ({ - {referral.users.map((user) =>

{user.unit_name}

).sort()} + {referral.users + .map((user) => ( +

{user.unit_name}

+ )) + .sort()} {task != TaskParams.MY_DRAFTS ? ( {referral.assignees - .map((assignee) =>

{getUserShortname(assignee)}

) + .map((assignee) => ( +

+ {getUserShortname(assignee)} +

+ )) .sort()} ) : null} diff --git a/src/frontend/js/translations/en-US.json b/src/frontend/js/translations/en-US.json index a3daf1c535..58e605b885 100644 --- a/src/frontend/js/translations/en-US.json +++ b/src/frontend/js/translations/en-US.json @@ -388,9 +388,9 @@ "components.Version.validateDescription": "Validates the version with comments", "components.Version.validationRequested": "Validation requested", "components.Version.updateButtonDisabledText": "File replacement is not allowed when a revision is requested, please publish a new version", - "components.VersionEventIndicator.requestChange": "Change requested by { userName } ({ roleName })", - "components.VersionEventIndicator.requestValidation": "{ userName } request validation to { roleName } of { unitName }", - "components.VersionEventIndicator.versionValidated": "Validated by { userName } ({ roleName })", + "components.VersionEventIndicator.requestChange": "Change requested by { userName } ({ roleName }) - { date } { time }", + "components.VersionEventIndicator.requestValidation": "{ userName } request validation to { roleName } of { unitName } ({ date } - { time })", + "components.VersionEventIndicator.versionValidated": "Validated by { userName } ({ roleName }) - { date } { time }", "components.ReferralReport.loadingReport": "Loading referral report...", "components.TabPublishedReport.loadingReport": "Loading referral report...", "components.ReferralReport.dropVersion": "Drag and drop the version file here, or click to select it.\nOnce imported, only your unit will have access to this version", diff --git a/src/frontend/js/translations/en-US.po b/src/frontend/js/translations/en-US.po index 735f69465c..69b53b0d5c 100755 --- a/src/frontend/js/translations/en-US.po +++ b/src/frontend/js/translations/en-US.po @@ -12,6 +12,27 @@ msgstr "" "X-Generator: Poedit 2.3.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ./js/translations/sources/frontend.json +#. [components.VersionEventIndicator.requestChange] - Version request change event indicator message. +#. defaultMessage is: +#. Change requested by { userName } ({ roleName }) - { date }} { time } +msgid "Change requested by { userName } ({ roleName }) - { date } { time }" +msgstr "Change requested by { userName } ({ roleName }) - { date } { time }" + +#: ./js/translations/sources/frontend.json +#. [components.VersionEventIndicator.versionValidated] - Version validated event indicator message. +#. defaultMessage is: +#. Validated by { userName } ({ roleName }) - { date } { time } +msgid "Validated by { userName } ({ roleName }) - { date } { time }" +msgstr "Validated by { userName } ({ roleName }) - { date } { time }" + +#: ./js/translations/sources/frontend.json +#. [components.VersionEventIndicator.requestValidation] - Version request validation event indicator message. +#. defaultMessage is: +#. { userName } request validation to { roleName } of { unitName } - { date } { time } +msgid "{ userName } request validation to { roleName } of { unitName } - { date } { time }" +msgstr "{ userName } request validation to { roleName } of { unitName } ({ date } - { time })" + #: ./js/translations/sources/frontend.json #. [components.RequestChangeModal.addCommentDescription] - Add comment description #. defaultMessage is: @@ -356,20 +377,6 @@ msgstr "Version request change" msgid "Validate version" msgstr "Validate version" -#: ./js/translations/sources/frontend.json -#. [components.VersionEventIndicator.requestValidation] - Version request validation event indicator message. -#. defaultMessage is: -#. { userName } request validation to { roleName } of { unitName } -msgid "{ userName } request validation to { roleName } of { unitName }" -msgstr "{ userName } request validation to { roleName } of { unitName }" - -#: ./js/translations/sources/frontend.json -#. [components.VersionEventIndicator.requestChange] - Version request change event indicator message. -#. defaultMessage is: -#. Change requested by { userName } ({ roleName }) -msgid "Change requested by { userName } ({ roleName })" -msgstr "Change requested by { userName } ({ roleName })" - #: ./js/translations/sources/frontend.json #. [components.Version.validationRequested] - Validation requested button text #. defaultMessage is: @@ -465,13 +472,6 @@ msgstr "member" msgid "owner" msgstr "owner" -#: ./js/translations/sources/frontend.json -#. [components.VersionEventIndicator.versionValidated] - Version validated event indicator message. -#. defaultMessage is: -#. Validated by { userName } ({ roleName }) -msgid "Validated by { userName } ({ roleName })" -msgstr "Validated by { userName } ({ roleName })" - #: ./js/translations/sources/frontend.json #. [components.Message.versionAdded] - version added event text #. defaultMessage is: diff --git a/src/frontend/js/translations/fr-FR.json b/src/frontend/js/translations/fr-FR.json index 45b9b97a1b..60fa58bd87 100644 --- a/src/frontend/js/translations/fr-FR.json +++ b/src/frontend/js/translations/fr-FR.json @@ -388,9 +388,9 @@ "components.Version.validateDescription": "Valide cette version avec commentaire", "components.Version.validationRequested": "Validation demandée", "components.Version.updateButtonDisabledText": "Le remplacement de fichier n'est pas autorisé lorsqu'une révision est demandée, merci de publier une nouvelle version", - "components.VersionEventIndicator.requestChange": "Modifications demandées par { userName } ({ roleName })", - "components.VersionEventIndicator.requestValidation": "Validation demandée par { userName } au niveau { roleName } - { unitName }", - "components.VersionEventIndicator.versionValidated": "Validée par { userName } ({ roleName })", + "components.VersionEventIndicator.requestChange": "Modifications demandées par { userName } ({ roleName }) - ({ date } - { time })", + "components.VersionEventIndicator.requestValidation": "Validation demandée par { userName } au niveau { roleName } - { unitName } ({ date } - { time })", + "components.VersionEventIndicator.versionValidated": "Validée par { userName } ({ roleName }) - ({ date } - { time })", "components.ReferralReport.loadingReport": "Chargement de la réponse ...", "components.TabPublishedReport.loadingReport": "Chargement de la réponse ...", "components.ReferralReport.dropVersion": "Glisser-déposer le fichier de la version, ou cliquer pour le sélectionner.\nUne fois importée seule votre unité aura accès à cette version", diff --git a/src/frontend/js/translations/fr-FR.po b/src/frontend/js/translations/fr-FR.po index 81d5297fd1..d209254fca 100755 --- a/src/frontend/js/translations/fr-FR.po +++ b/src/frontend/js/translations/fr-FR.po @@ -12,6 +12,27 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.0.1\n" +#: ./js/translations/sources/frontend.json +#. [components.VersionEventIndicator.requestChange] - Version request change event indicator message. +#. defaultMessage is: +#. Change requested by { userName } ({ roleName }) - { date } { time } +msgid "Change requested by { userName } ({ roleName }) - { date } { time }" +msgstr "Modifications demandées par { userName } ({ roleName }) - ({ date } - { time })" + +#: ./js/translations/sources/frontend.json +#. [components.VersionEventIndicator.versionValidated] - Version validated event indicator message. +#. defaultMessage is: +#. Validated by { userName } ({ roleName }) - { date } { time } +msgid "Validated by { userName } ({ roleName }) - { date } { time }" +msgstr "Validée par { userName } ({ roleName }) - ({ date } - { time })" + +#: ./js/translations/sources/frontend.json +#. [components.VersionEventIndicator.requestValidation] - Version request validation event indicator message. +#. defaultMessage is: +#. { userName } request validation to { roleName } of { unitName } - { date } { time } +msgid "{ userName } request validation to { roleName } of { unitName } - { date } { time }" +msgstr "Validation demandée par { userName } au niveau { roleName } - { unitName } ({ date } - { time })" + #: ./js/translations/sources/frontend.json #. [components.RequestChangeModal.addCommentDescription] - Add comment description #. defaultMessage is: @@ -349,20 +370,6 @@ msgstr "Valider" msgid "Version request change" msgstr "Demande de modification" -#: ./js/translations/sources/frontend.json -#. [components.VersionEventIndicator.requestValidation] - Version request validation event indicator message. -#. defaultMessage is: -#. { userName } request validation to { roleName } of { unitName } -msgid "{ userName } request validation to { roleName } of { unitName }" -msgstr "Validation demandée par { userName } au niveau { roleName } - { unitName }" - -#: ./js/translations/sources/frontend.json -#. [components.VersionEventIndicator.requestChange] - Version request change event indicator message. -#. defaultMessage is: -#. Change requested by { userName } ({ roleName }) -msgid "Change requested by { userName } ({ roleName })" -msgstr "Modifications demandées par { userName } ({ roleName })" - #: ./js/translations/sources/frontend.json #. [components.Version.validationRequested] - Validation requested button text #. defaultMessage is: @@ -458,13 +465,6 @@ msgstr "Juriste" msgid "owner" msgstr "Chef de bureau" -#: ./js/translations/sources/frontend.json -#. [components.VersionEventIndicator.versionValidated] - Version validated event indicator message. -#. defaultMessage is: -#. Validated by { userName } ({ roleName }) -msgid "Validated by { userName } ({ roleName })" -msgstr "Validée par { userName } ({ roleName })" - #: ./js/translations/sources/frontend.json #. [components.ReferralDetail.ErrorModal.requesterUnitContactError] - Requester unit contact error #. defaultMessage is: diff --git a/src/frontend/js/types/index.ts b/src/frontend/js/types/index.ts index 4b4fd6f59b..b3230ed676 100755 --- a/src/frontend/js/types/index.ts +++ b/src/frontend/js/types/index.ts @@ -189,6 +189,7 @@ export interface NotifiedUser { } export interface MessageNotification { + id: string; notified: NotifiedUser; } @@ -202,6 +203,12 @@ export enum ReportEventVerb { REQUEST_CHANGE = 'request_change', } +export enum ReportEventState { + ACTIVE = 'active', + INACTIVE = 'inactive', + OBSOLETE = 'obsolete', +} + export interface ReportEvent { verb: ReportEventVerb; timestamp: number; @@ -209,6 +216,7 @@ export interface ReportEvent { created_at: string; id: string; report: string; + state: ReportEventState; version: { version_number: number | null; }; diff --git a/src/frontend/js/utils/referral.ts b/src/frontend/js/utils/referral.ts index 0b89ed5952..b46530da17 100644 --- a/src/frontend/js/utils/referral.ts +++ b/src/frontend/js/utils/referral.ts @@ -29,6 +29,18 @@ export const userIsUnitMember = (user: Nullable, referral: Referral) => export const referralIsPublished = (referral: Nullable) => referral && referral.state === ReferralState.ANSWERED; +/** + * Check if the referral is closed + */ +export const referralIsClosed = (referral: Nullable) => + referral && referral.state === ReferralState.CLOSED; + +/** + * Check if the referral is open + */ +export const referralIsOpen = (referral: Nullable) => + referral && !referralIsClosed(referral) && !referralIsPublished(referral); + /** * Get the user role type (observer / requester) */