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)
*/