Skip to content

feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi - #1098

Merged
damienromito merged 1 commit into
feat-IMPULS-6109-absence-messagefrom
feat-IMPULS-6147-fuseau-envoi
Aug 4, 2026
Merged

feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi#1098
damienromito merged 1 commit into
feat-IMPULS-6109-absence-messagefrom
feat-IMPULS-6147-fuseau-envoi

Conversation

@damienromito

@damienromito damienromito commented Aug 4, 2026

Copy link
Copy Markdown
Member

Description

Ajoute le fuseau horaire du navigateur de l'expéditeur (Intl.DateTimeFormat().resolvedOptions().timeZone) à la charge utile de l'appel d'envoi de message (POST /conversation/send), dans messageService.send(). Ce champ sert de référentiel au garde-fou back « une réponse par jour et par expéditeur » du message d'absence (US-2, IMPULS-6109) : sans lui, la journée de référence est celle du serveur.

  • Champ optionnel côté back, avec repli sur le fuseau serveur — aucune rupture pour les clients mobiles qui ne l'envoient pas.
  • Calculé automatiquement dans le service d'envoi ; aucun changement requis dans les appelants (useSendDraft).
  • Handler MSW send inchangé : il échoue déjà le payload reçu tel quel, donc reflète automatiquement le nouveau champ.

Fixes

IMPULS-6147

Type of change

Please check options that are relevant.

  • Chore (PATCH)
  • Doc (PATCH)
  • Bug fix (PATCH)
  • New feature (MINOR)

Which packages changed?

Please check the name of the package you changed

  • admin
  • app-registry
  • archive
  • auth
  • cas
  • common
  • communication
  • conversation
  • directory
  • feeder
  • infra
  • portal
  • session
  • test
  • tests
  • timeline
  • workspace

Tests

  1. cd conversation/frontend && pnpm test src/services — couvre messageService.send, dont le nouveau test vérifiant l'inclusion du fuseau dans le payload POST.
  2. pnpm typecheck et pnpm lint — aucune nouvelle erreur (l'unique erreur lint restante, sur moveToFolder, est préexistante et sans lien avec ce changement).

Reminder

  • Security flaws

  • Performance impacts (think bulk !)

  • Unit tests were replayed

  • Unit tests were added and/or changed

  • I have updated the reminder for the version including my modifications

  • All done ! 😃

@sonarqubecloud

sonarqubecloud Bot commented Aug 4, 2026

Copy link
Copy Markdown

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Cette PR (module conversation/front React) ajoute le fuseau horaire du navigateur de l’expéditeur à la charge utile de l’appel d’envoi de message (POST /conversation/send), afin que le back puisse appliquer correctement le garde-fou “une réponse d’absence par jour et par expéditeur” selon le jour de l’expéditeur plutôt que celui du serveur.

Changes:

  • Ajout du champ timezone (via Intl.DateTimeFormat().resolvedOptions().timeZone) dans le payload envoyé par messageService.send().
  • Ajout d’un test Vitest vérifiant que le champ timezone est bien transmis dans le payload du POST /send.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
conversation/frontend/src/services/api/messageService.ts Ajoute timezone au payload envoyé lors de send()
conversation/frontend/src/services/api/messageService.test.ts Ajoute un test pour vérifier la présence de timezone dans le payload

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread conversation/frontend/src/services/api/messageService.ts
Comment on lines +74 to +87
test('includes the sender timezone in the send payload', async () => {
const postMock = vi.spyOn(odeServices.http(), 'post');

await messageService.send('message_draft', { body: 'New content' });

expect(postMock).toHaveBeenCalledWith(
expect.stringContaining('/send?id=message_draft'),
expect.objectContaining({
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
}),
);

postMock.mockRestore();
});

@jcbe-ode jcbe-ode left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je n'ai pas suivi ce dev, mais la PR semble OK

@damienromito

Copy link
Copy Markdown
Member Author

Je n'ai pas suivi ce dev, mais la PR semble OK

Oui je comprend ton etonnement. En faite le seul moyen pour le backend de savoir si un message d'absence a déjà été renvoyé dans les 24h de l'utilisateur (pour evité le spam), c'est d'avoir la timezone. Donc on a fait le choix de l'envoyer avec le message tant qu'on a pas de timezone enregistré par utilisateur

@damienromito
damienromito merged commit a899722 into feat-IMPULS-6109-absence-message Aug 4, 2026
2 checks passed
@damienromito
damienromito deleted the feat-IMPULS-6147-fuseau-envoi branch August 4, 2026 14:47
damienromito added a commit that referenced this pull request Aug 4, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>
jenkinsEdificePublic pushed a commit that referenced this pull request Aug 6, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>
jcbe-ode pushed a commit that referenced this pull request Aug 6, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
jenkinsEdificePublic pushed a commit that referenced this pull request Aug 6, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
jenkinsEdificePublic pushed a commit that referenced this pull request Aug 6, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
jenkinsEdificePublic pushed a commit that referenced this pull request Aug 10, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
jenkinsEdificePublic pushed a commit that referenced this pull request Aug 10, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
pb-jo pushed a commit that referenced this pull request Aug 10, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
pb-jo pushed a commit that referenced this pull request Aug 14, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
vbillard91 pushed a commit that referenced this pull request Aug 26, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
jenkinsEdificePublic pushed a commit that referenced this pull request Sep 1, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
jenkinsEdificePublic pushed a commit that referenced this pull request Sep 1, 2026
* docs(conversation): #IMPULS-6109 ajout de la Feature Spec FS-IMPULS-6109

* docs(conversation):#IMPULS-6158 cadrage technique

add gherkin on US4

* docs(conversation):#IMPULS-6135 docs api

modif cadrage bandeau

* adjust cadrage tech

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence (#1093)

* add i18n mock

* feat(conversation): #IMPULS-6138 ajoute la modale de paramétrage du message d'absence

Modale + hook (react-hook-form) pour paramétrer/activer/modifier un
message d'absence : DatePicker avec minDate réactif sur la date de fin
et décalage automatique à début + 1 jour quand elle devient invalide,
champs désactivés quand le message est désactivé, texte requis
uniquement si activé.

Écart assumé par rapport à la FS (US-1) : pas de message d'erreur
inline, le bouton "Enregistrer" est simplement désactivé tant que le
formulaire n'est pas valide — jugé plus simple pour le code et
l'expérience. Jira IMPULS-6130, FS et cadrage mis à jour en
conséquence.

Autres changements :
- CSS dédié au composant (AbsenceModal.css), opacité ciblée sur
  l'éditeur uniquement.
- Clés i18n propres au module, préfixées `conversation.` (plus de
  common_t).
- data-testid sur les boutons, format module-composant-élément-nom.
- Tests hook (validation/UTC/toasts) et composant (rendu/câblage)
  séparés.
- Doc de bonnes pratiques frontend issue du pairing
  (conversation/specs/IMPULS-6109/BONNES-PRATIQUES-FRONTEND.md).

Contient un câblage QA temporaire dans routes/root/index.tsx
(ouverture automatique de la modale au lancement) en attendant le
vrai point d'entrée porté par IMPULS-6140.

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1096)

* feat(conversation): #IMPULS-6139 ajoute le service API et les hooks TanStack Query du message d'absence (#1095)

- absenceService (GET/PUT /conversation/absence) + absenceQueryKeys/useAbsenceSettings/useSaveAbsenceSettings avec setQueryData optimiste au succès
- AbsenceModalContainer + useAbsenceModalContainer pour brancher AbsenceModal sur l'API, sans dépendre du store openedModal
- déplace AbsenceModal/AbsenceModalContainer/hooks dans features/absence/ (regroupement par feature)
- mocks MSW (mocks/datas/absences.ts + handlers/absence-handlers.ts) pour dev:mock et les tests
- documente les retours de pairing dans BONNES-PRATIQUES-FRONTEND.md

* add skeleton + refacto

* bonne pratique skeleton

* Feat impuls 6109 back (#1094)

* IMPULS-6136

* IMPULS-6141

* IMPULS-6137

* IMPULS-6137

* IMPULS-6142

* IMPULS-6143 IMPULS-6144

* IMPULS-6144

* IMPULS-6148

* IMPULS-6150

* IMPULS-6150

* maj des claude.md

* PR review

* feat(conversation):#IMPULS-6140-display modal via dropdown (#1097)

* feat(conversation): #IMPULS-6147 transmet le fuseau de l'expéditeur dans la charge utile d'envoi (#1098)

* fix(conversation):#IMPULS-6130-disabled-submit-when-not-dirty

* fix(conversation):#IMPULS-6130-close-modal-on-save

* feat(conversation):#IMPULS-6133-add-absence-banner (#1099)

---------

Co-authored-by: Vincent Billard <vincent.billard@edifice.io>

* fix(conversation): #IMPULS-6109 fix cron expression

* fix(conversation): ne charge les settings d'absence que pour les profils autorisés

AbsenceReminderBanner appelait useAbsenceSettings pour tous les
utilisateurs, alors que seuls ENSEIGNANT et PERSEDUCNAT peuvent avoir
un message d'absence (cf. AppActionHeader). Le check de profil est
centralisé dans useRights (canManageAbsence) et useAbsenceSettings
accepte désormais un flag enabled pour ne déclencher la requête que
pour ces profils.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(conversation): #IMPULS-6109 fix rights on conversation schema
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants