From 5b83102a5933cb27638e5c70797b9c5a9cf6d01c Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Mon, 14 Sep 2026 12:52:22 +0200 Subject: [PATCH] =?UTF-8?q?feat(#152/#155):=20cleanup=20est=5Fmultiple=20+?= =?UTF-8?q?=20dashboard=20sans=20pr=C3=A9fixe=20Admin=20(squash=20develop)?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suppression complète grossesse multiple / est_multiple (BDD, API, front). Rename option C : widgets partagés et panels staff sous widgets/dashboard/, AdminManagementWidget seul restant dans widgets/admin/. --- backend/prisma/schema.prisma | 1 - backend/src/entities/children.entity.ts | 3 - backend/src/routes/auth/auth.service.ts | 4 - .../routes/auth/dto/enfant-inscription.dto.ts | 5 - .../routes/enfants/dto/create_enfants.dto.ts | 5 - .../enfants/dto/enfants_response.dto.ts | 3 - backend/src/routes/enfants/enfants.service.ts | 1 - .../dto/dossier-famille-complet.dto.ts | 3 - backend/src/routes/parents/parents.service.ts | 1 - database/BDD.sql | 3 +- database/bdd/data_test/enfants.csv | 20 +- .../2026_drop_enfants_est_multiple.sql | 2 + database/seed/02_seed.sql | 8 +- database/seed/03_seed_test_data.sql | 14 +- docs/10_DATABASE.md | 1 - docs/99_REGLES-CODAGE.md | 3 - docs/tmp/152-mini-spec-front-est-multiple.md | 65 ++++++ docs/tmp/155-mini-spec-rename-admin-prefix.md | 54 +++++ ...55-suite-move-admin-panels-to-dashboard.md | 203 ++++++++++++++++++ frontend/lib/models/dossier_unifie.dart | 4 - frontend/lib/models/enfant_admin_model.dart | 7 - .../models/parent_user_registration_data.dart | 2 - .../lib/models/user_registration_data.dart | 4 - .../admin_dashboardScreen.dart | 6 +- .../creation/admin_create.dart | 2 +- .../creation/gestionnaires_create.dart | 2 +- .../auth/parent_register_step3_screen.dart | 1 - .../gestionnaire_dashboard_screen.dart | 2 +- .../utils/parent_registration_payload.dart | 1 - frontend/lib/utils/reprise_mapper.dart | 1 - .../admin/admin_management_widget.dart | 8 +- .../lib/widgets/common/identity_block.dart | 2 +- .../am_children_capacity_grid.dart} | 4 +- .../am_dossier_create_modal.dart | 2 +- .../am_dossier_wizard.dart | 36 ++-- .../am_edit_modal.dart} | 34 +-- .../am_photo_frame.dart} | 4 +- ...sistante_maternelle_management_widget.dart | 12 +- .../child_detail_modal.dart} | 44 ++-- .../children_affiliation_panel.dart} | 8 +- .../common/suppression_confirm_dialog.dart | 0 .../common/user_list.dart | 4 +- .../common/validation_detail_section.dart | 4 +- .../detail_modal.dart} | 10 +- .../dossier_list_card.dart | 6 +- .../dossiers_management_widget.dart | 8 +- .../enfant_management_widget.dart | 12 +- .../enfant_user_card.dart} | 16 +- .../gestionnaire_management_widget.dart | 8 +- .../parametres_panel.dart | 2 +- .../parent_dossier_create_modal.dart | 2 +- .../parent_dossier_wizard.dart | 14 +- .../parent_edit_modal.dart} | 28 +-- .../parent_managmant_widget.dart | 12 +- .../pending_validation_widget.dart | 6 +- .../relais_management_panel.dart | 2 +- .../select_am_modal.dart} | 22 +- .../select_enfant_modal.dart} | 16 +- .../select_famille_modal.dart} | 24 +-- .../select_list_modal.dart} | 22 +- .../status_capsule.dart} | 4 +- .../user_card.dart} | 8 +- .../user_list_state.dart} | 4 +- .../user_management_panel.dart | 20 +- .../user_management_sub_bar.dart} | 0 .../validation_am_wizard.dart | 2 +- .../validation_dossier_modal.dart | 8 +- .../validation_family_wizard.dart | 2 +- .../validation_modal_theme.dart | 0 .../validation_refus_form.dart | 0 .../validation_valider_confirm_dialog.dart | 0 .../register-parent-durand-rousseau-test.mjs | 6 +- .../scripts/register-parent-lecomte-test.mjs | 3 +- tests/scripts/register-parent-martin-test.mjs | 9 +- 74 files changed, 565 insertions(+), 304 deletions(-) create mode 100644 database/migrations/2026_drop_enfants_est_multiple.sql create mode 100644 docs/tmp/152-mini-spec-front-est-multiple.md create mode 100644 docs/tmp/155-mini-spec-rename-admin-prefix.md create mode 100644 docs/tmp/155-suite-move-admin-panels-to-dashboard.md rename frontend/lib/widgets/{admin/common/admin_am_children_capacity_grid.dart => dashboard/am_children_capacity_grid.dart} (99%) rename frontend/lib/widgets/{admin => dashboard}/am_dossier_create_modal.dart (97%) rename frontend/lib/widgets/{admin => dashboard}/am_dossier_wizard.dart (97%) rename frontend/lib/widgets/{admin/common/admin_am_edit_modal.dart => dashboard/am_edit_modal.dart} (96%) rename frontend/lib/widgets/{admin/common/admin_am_photo_frame.dart => dashboard/am_photo_frame.dart} (98%) rename frontend/lib/widgets/{admin => dashboard}/assistante_maternelle_management_widget.dart (93%) rename frontend/lib/widgets/{admin/common/admin_child_detail_modal.dart => dashboard/child_detail_modal.dart} (97%) rename frontend/lib/widgets/{admin/common/admin_children_affiliation_panel.dart => dashboard/children_affiliation_panel.dart} (91%) rename frontend/lib/widgets/{admin => dashboard}/common/suppression_confirm_dialog.dart (100%) rename frontend/lib/widgets/{admin => dashboard}/common/user_list.dart (91%) rename frontend/lib/widgets/{admin => dashboard}/common/validation_detail_section.dart (99%) rename frontend/lib/widgets/{admin/common/admin_detail_modal.dart => dashboard/detail_modal.dart} (96%) rename frontend/lib/widgets/{admin => dashboard}/dossier_list_card.dart (93%) rename frontend/lib/widgets/{admin => dashboard}/dossiers_management_widget.dart (97%) rename frontend/lib/widgets/{admin => dashboard}/enfant_management_widget.dart (94%) rename frontend/lib/widgets/{admin/common/admin_enfant_user_card.dart => dashboard/enfant_user_card.dart} (91%) rename frontend/lib/widgets/{admin => dashboard}/gestionnaire_management_widget.dart (95%) rename frontend/lib/widgets/{admin => dashboard}/parametres_panel.dart (99%) rename frontend/lib/widgets/{admin => dashboard}/parent_dossier_create_modal.dart (97%) rename frontend/lib/widgets/{admin => dashboard}/parent_dossier_wizard.dart (99%) rename frontend/lib/widgets/{admin/common/admin_parent_edit_modal.dart => dashboard/parent_edit_modal.dart} (94%) rename frontend/lib/widgets/{admin => dashboard}/parent_managmant_widget.dart (93%) rename frontend/lib/widgets/{admin => dashboard}/pending_validation_widget.dart (98%) rename frontend/lib/widgets/{admin => dashboard}/relais_management_panel.dart (99%) rename frontend/lib/widgets/{admin/common/admin_select_am_modal.dart => dashboard/select_am_modal.dart} (91%) rename frontend/lib/widgets/{admin/common/admin_select_enfant_modal.dart => dashboard/select_enfant_modal.dart} (83%) rename frontend/lib/widgets/{admin/common/admin_select_famille_modal.dart => dashboard/select_famille_modal.dart} (88%) rename frontend/lib/widgets/{admin/common/admin_select_list_modal.dart => dashboard/select_list_modal.dart} (95%) rename frontend/lib/widgets/{admin/common/admin_status_capsule.dart => dashboard/status_capsule.dart} (95%) rename frontend/lib/widgets/{admin/common/admin_user_card.dart => dashboard/user_card.dart} (97%) rename frontend/lib/widgets/{admin/common/admin_list_state.dart => dashboard/user_list_state.dart} (92%) rename frontend/lib/widgets/{admin => dashboard}/user_management_panel.dart (94%) rename frontend/lib/widgets/{admin/dashboard_admin.dart => dashboard/user_management_sub_bar.dart} (100%) rename frontend/lib/widgets/{admin => dashboard}/validation_am_wizard.dart (91%) rename frontend/lib/widgets/{admin => dashboard}/validation_dossier_modal.dart (95%) rename frontend/lib/widgets/{admin => dashboard}/validation_family_wizard.dart (91%) rename frontend/lib/widgets/{admin => dashboard}/validation_modal_theme.dart (100%) rename frontend/lib/widgets/{admin => dashboard}/validation_refus_form.dart (100%) rename frontend/lib/widgets/{admin => dashboard}/validation_valider_confirm_dialog.dart (100%) diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index c462f65..82ba85c 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -33,7 +33,6 @@ model Child { dateOfBirth DateTime photoUrl String? photoConsent Boolean @default(false) - isMultiple Boolean @default(false) isUnborn Boolean @default(false) parentId String parent Parent @relation(fields: [parentId], references: [id]) diff --git a/backend/src/entities/children.entity.ts b/backend/src/entities/children.entity.ts index 3c1db67..074a383 100644 --- a/backend/src/entities/children.entity.ts +++ b/backend/src/entities/children.entity.ts @@ -63,9 +63,6 @@ export class Children { @Column({ type: 'timestamptz', nullable: true, name: 'date_consentement_photo' }) consent_photo_at?: Date; - @Column({ default: false, name: 'est_multiple', type: 'boolean' }) - is_multiple: boolean; - // Lien via table de jointure enfants_parents @OneToMany(() => ParentsChildren, pc => pc.child) parentLinks: ParentsChildren[]; diff --git a/backend/src/routes/auth/auth.service.ts b/backend/src/routes/auth/auth.service.ts index bfbd28e..2737fcb 100644 --- a/backend/src/routes/auth/auth.service.ts +++ b/backend/src/routes/auth/auth.service.ts @@ -564,7 +564,6 @@ export class AuthService { enfant.status = enfantDto.date_naissance ? StatutEnfantType.SANS_GARDE : StatutEnfantType.A_NAITRE; enfant.consent_photo = !!enfantDto.consent_photo; enfant.consent_photo_at = enfant.consent_photo ? new Date() : null!; - enfant.is_multiple = enfantDto.grossesse_multiple || false; const enfantEnregistre = await manager.save(Children, enfant); enfantsEnregistres.push(enfantEnregistre); @@ -1387,9 +1386,6 @@ export class AuthService { enfant.status = StatutEnfantType.A_NAITRE; } } - if (enfantDto.grossesse_multiple !== undefined) { - enfant.is_multiple = enfantDto.grossesse_multiple; - } if (enfantDto.consent_photo !== undefined) { enfant.consent_photo = !!enfantDto.consent_photo; enfant.consent_photo_at = enfant.consent_photo diff --git a/backend/src/routes/auth/dto/enfant-inscription.dto.ts b/backend/src/routes/auth/dto/enfant-inscription.dto.ts index dce0f51..78243b4 100644 --- a/backend/src/routes/auth/dto/enfant-inscription.dto.ts +++ b/backend/src/routes/auth/dto/enfant-inscription.dto.ts @@ -55,11 +55,6 @@ export class EnfantInscriptionDto { @IsString() photo_filename?: string; - @ApiProperty({ example: false, required: false, description: 'Grossesse multiple (jumeaux, triplés, etc.)' }) - @IsOptional() - @IsBoolean() - grossesse_multiple?: boolean; - @ApiProperty({ example: true, required: false, diff --git a/backend/src/routes/enfants/dto/create_enfants.dto.ts b/backend/src/routes/enfants/dto/create_enfants.dto.ts index 0d66d46..b779966 100644 --- a/backend/src/routes/enfants/dto/create_enfants.dto.ts +++ b/backend/src/routes/enfants/dto/create_enfants.dto.ts @@ -74,11 +74,6 @@ export class CreateEnfantsDto { @IsDateString() consent_photo_at?: string; - @ApiProperty({ default: false }) - @Transform(toBoolean) - @IsBoolean() - is_multiple: boolean; - /** * Parent pivot du foyer — obligatoire pour staff (gestionnaire/admin). * Ignoré / interdit en externe pour un PARENT (ticket #132). diff --git a/backend/src/routes/enfants/dto/enfants_response.dto.ts b/backend/src/routes/enfants/dto/enfants_response.dto.ts index 41f0b1e..3e9a5e9 100644 --- a/backend/src/routes/enfants/dto/enfants_response.dto.ts +++ b/backend/src/routes/enfants/dto/enfants_response.dto.ts @@ -29,9 +29,6 @@ export class EnfantResponseDto { @ApiProperty({ example: false }) consent_photo: boolean; - @ApiProperty({ example: false }) - is_multiple: boolean; - @ApiProperty({ example: 'UUID-parent' }) parent_id: string; } diff --git a/backend/src/routes/enfants/enfants.service.ts b/backend/src/routes/enfants/enfants.service.ts index 43a4861..204602d 100644 --- a/backend/src/routes/enfants/enfants.service.ts +++ b/backend/src/routes/enfants/enfants.service.ts @@ -92,7 +92,6 @@ export class EnfantsService { photo_url: photoUrl, consent_photo: !!dto.consent_photo, consent_photo_at: consentAt, - is_multiple: !!dto.is_multiple, }); await this.childrenRepository.save(child); diff --git a/backend/src/routes/parents/dto/dossier-famille-complet.dto.ts b/backend/src/routes/parents/dto/dossier-famille-complet.dto.ts index 64b565c..d051b0d 100644 --- a/backend/src/routes/parents/dto/dossier-famille-complet.dto.ts +++ b/backend/src/routes/parents/dto/dossier-famille-complet.dto.ts @@ -54,9 +54,6 @@ export class DossierFamilleEnfantDto { description: 'Consentement affichage photo (colonne consentement_photo)', }) consent_photo?: boolean; - - @ApiProperty({ required: false, description: 'Grossesse multiple (est_multiple)' }) - est_multiple?: boolean; } /** Réponse GET /parents/dossier-famille/:numeroDossier – dossier famille complet. Ticket #119 */ diff --git a/backend/src/routes/parents/parents.service.ts b/backend/src/routes/parents/parents.service.ts index 77dc3c6..8adf1ef 100644 --- a/backend/src/routes/parents/parents.service.ts +++ b/backend/src/routes/parents/parents.service.ts @@ -370,7 +370,6 @@ export class ParentsService { status: child.status, photo_url: child.photo_url ?? undefined, consent_photo: child.consent_photo, - est_multiple: child.is_multiple, }; } diff --git a/database/BDD.sql b/database/BDD.sql index 9cd9f5e..c4e63ab 100644 --- a/database/BDD.sql +++ b/database/BDD.sql @@ -174,8 +174,7 @@ CREATE TABLE enfants ( date_prevue_naissance DATE, photo_url TEXT, consentement_photo BOOLEAN DEFAULT false, - date_consentement_photo TIMESTAMPTZ, - est_multiple BOOLEAN DEFAULT false + date_consentement_photo TIMESTAMPTZ ); -- ========================================================== diff --git a/database/bdd/data_test/enfants.csv b/database/bdd/data_test/enfants.csv index 43a2275..db655e5 100644 --- a/database/bdd/data_test/enfants.csv +++ b/database/bdd/data_test/enfants.csv @@ -1,10 +1,10 @@ -"id","statut","prenom","nom","genre","date_naissance","date_prevue_naissance","photo_url","consentement_photo","date_consentement_photo","est_multiple" -"5e8574b7-63e6-4d48-9af3-8d3bf7a6a6cf","sans_garde","Emma","Dupont","F","2020-06-01",,,False,,False -"a5c3268e-07eb-41a4-9f6c-2f9f16f37c3d","sans_garde",,,,"2020-01-01","2025-01-01",,False,,False -"e1a2b3c4-d5e6-4f7a-8b9c-1d2e3f4a5b6c","sans_garde","Emma","Martin",,"2023-02-15",,,False,,False -"e2b3c4d5-e6f7-4a8b-9c1d-2e3f4a5b6c7d","sans_garde","Noah","Martin",,"2023-02-15",,,False,,False -"e3c4d5e6-f7a8-4b9c-1d2e-3f4a5b6c7d8e","sans_garde","Léa","Martin",,"2023-02-15",,,False,,False -"e4d5e6f7-a8b9-4c1d-2e3f-4a5b6c7d8e9f","sans_garde","Chloé","Rousseau",,"2022-04-20",,,False,,False -"e5e6f7a8-b9c1-4d2e-3f4a-5b6c7d8e9f1a","sans_garde","Hugo","Rousseau",,"2024-03-10",,,False,,False -"e6f7a8b9-c1d2-4e3f-5a6b-7c8d9e0f1a2b","sans_garde","Maxime","Lecomte",,"2023-04-15",,,False,,False -"edd19cd1-bb67-4f14-8a37-c66b75c94537","scolarise","Lucas","Durand","H","2018-09-15",,,False,,False +"id","statut","prenom","nom","genre","date_naissance","date_prevue_naissance","photo_url","consentement_photo","date_consentement_photo" +"5e8574b7-63e6-4d48-9af3-8d3bf7a6a6cf","sans_garde","Emma","Dupont","F","2020-06-01",,,False, +"a5c3268e-07eb-41a4-9f6c-2f9f16f37c3d","sans_garde",,,,"2020-01-01","2025-01-01",,False, +"e1a2b3c4-d5e6-4f7a-8b9c-1d2e3f4a5b6c","sans_garde","Emma","Martin",,"2023-02-15",,,False, +"e2b3c4d5-e6f7-4a8b-9c1d-2e3f4a5b6c7d","sans_garde","Noah","Martin",,"2023-02-15",,,False, +"e3c4d5e6-f7a8-4b9c-1d2e-3f4a5b6c7d8e","sans_garde","Léa","Martin",,"2023-02-15",,,False, +"e4d5e6f7-a8b9-4c1d-2e3f-4a5b6c7d8e9f","sans_garde","Chloé","Rousseau",,"2022-04-20",,,False, +"e5e6f7a8-b9c1-4d2e-3f4a-5b6c7d8e9f1a","sans_garde","Hugo","Rousseau",,"2024-03-10",,,False, +"e6f7a8b9-c1d2-4e3f-5a6b-7c8d9e0f1a2b","sans_garde","Maxime","Lecomte",,"2023-04-15",,,False, +"edd19cd1-bb67-4f14-8a37-c66b75c94537","scolarise","Lucas","Durand","H","2018-09-15",,,False, diff --git a/database/migrations/2026_drop_enfants_est_multiple.sql b/database/migrations/2026_drop_enfants_est_multiple.sql new file mode 100644 index 0000000..8375e2a --- /dev/null +++ b/database/migrations/2026_drop_enfants_est_multiple.sql @@ -0,0 +1,2 @@ +-- #152 — Suppression grossesse multiple / est_multiple +ALTER TABLE enfants DROP COLUMN IF EXISTS est_multiple; diff --git a/database/seed/02_seed.sql b/database/seed/02_seed.sql index bd95d05..7fd21c7 100644 --- a/database/seed/02_seed.sql +++ b/database/seed/02_seed.sql @@ -69,12 +69,12 @@ ON CONFLICT (id_utilisateur) DO NOTHING; -- - child B : à naître (statut = 'a_naitre' et date_prevue_naissance requise) -- ------------------------------------------------------------ -INSERT INTO enfants (id, prenom, nom, statut, date_naissance, jumeau_multiple) -VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Léo', 'Parent', 'sans_garde', '2022-04-12', false) +INSERT INTO enfants (id, prenom, nom, statut, date_naissance) +VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Léo', 'Parent', 'sans_garde', '2022-04-12') ON CONFLICT (id) DO NOTHING; -INSERT INTO enfants (id, prenom, nom, statut, date_prevue_naissance, jumeau_multiple) -VALUES ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'Mila', 'Parent', 'a_naitre', '2026-02-15', false) +INSERT INTO enfants (id, prenom, nom, statut, date_prevue_naissance) +VALUES ('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'Mila', 'Parent', 'a_naitre', '2026-02-15') ON CONFLICT (id) DO NOTHING; -- ------------------------------------------------------------ diff --git a/database/seed/03_seed_test_data.sql b/database/seed/03_seed_test_data.sql index 8a54c7f..f53342e 100644 --- a/database/seed/03_seed_test_data.sql +++ b/database/seed/03_seed_test_data.sql @@ -49,14 +49,14 @@ VALUES ON CONFLICT (id_utilisateur) DO NOTHING; -- ========== ENFANTS ========== -INSERT INTO enfants (id, prenom, nom, genre, date_naissance, statut, est_multiple) +INSERT INTO enfants (id, prenom, nom, genre, date_naissance, statut) VALUES - ('e0000001-0001-0001-0001-000000000001', 'Emma', 'MARTIN', 'F', '2023-02-15', 'sans_garde', true), - ('e0000002-0002-0002-0002-000000000002', 'Noah', 'MARTIN', 'H', '2023-02-15', 'sans_garde', true), - ('e0000003-0003-0003-0003-000000000003', 'Léa', 'MARTIN', 'F', '2023-02-15', 'sans_garde', true), - ('e0000004-0004-0004-0004-000000000004', 'Chloé', 'ROUSSEAU', 'F', '2022-04-20', 'sans_garde', false), - ('e0000005-0005-0005-0005-000000000005', 'Hugo', 'ROUSSEAU', 'H', '2024-03-10', 'sans_garde', false), - ('e0000006-0006-0006-0006-000000000006', 'Maxime', 'LECOMTE', 'H', '2023-04-15', 'sans_garde', false) + ('e0000001-0001-0001-0001-000000000001', 'Emma', 'MARTIN', 'F', '2023-02-15', 'sans_garde'), + ('e0000002-0002-0002-0002-000000000002', 'Noah', 'MARTIN', 'H', '2023-02-15', 'sans_garde'), + ('e0000003-0003-0003-0003-000000000003', 'Léa', 'MARTIN', 'F', '2023-02-15', 'sans_garde'), + ('e0000004-0004-0004-0004-000000000004', 'Chloé', 'ROUSSEAU', 'F', '2022-04-20', 'sans_garde'), + ('e0000005-0005-0005-0005-000000000005', 'Hugo', 'ROUSSEAU', 'H', '2024-03-10', 'sans_garde'), + ('e0000006-0006-0006-0006-000000000006', 'Maxime', 'LECOMTE', 'H', '2023-04-15', 'sans_garde') ON CONFLICT (id) DO NOTHING; -- ========== ENFANTS_PARENTS (liaison N:N) ========== diff --git a/docs/10_DATABASE.md b/docs/10_DATABASE.md index 1a95975..4a142ed 100644 --- a/docs/10_DATABASE.md +++ b/docs/10_DATABASE.md @@ -117,7 +117,6 @@ Table des enfants pris en charge. | `photo_url` | TEXT | | URL de la photo | | `consentement_photo` | BOOLEAN | DEFAULT false | Consentement photo | | `date_consentement_photo` | TIMESTAMPTZ | | Date du consentement | -| `est_multiple` | BOOLEAN | DEFAULT false | Indique si grossesse multiple | --- diff --git a/docs/99_REGLES-CODAGE.md b/docs/99_REGLES-CODAGE.md index 04e10af..fe90fac 100644 --- a/docs/99_REGLES-CODAGE.md +++ b/docs/99_REGLES-CODAGE.md @@ -276,9 +276,6 @@ export class Enfants { @Column({ name: 'consentement_photo', type: 'boolean', default: false }) consentementPhoto: boolean; - @Column({ name: 'est_multiple', type: 'boolean', default: false }) - estMultiple: boolean; - @Column({ type: 'enum', enum: StatutEnfantType, diff --git a/docs/tmp/152-mini-spec-front-est-multiple.md b/docs/tmp/152-mini-spec-front-est-multiple.md new file mode 100644 index 0000000..0576312 --- /dev/null +++ b/docs/tmp/152-mini-spec-front-est-multiple.md @@ -0,0 +1,65 @@ +# Mini-spec — Suppression complète grossesse multiple / `est_multiple` + +**Ticket** : **#152** — https://git.ptits-pas.fr/jmartin/petitspas/issues/152 +**Branche** : `feature/152-remove-est-multiple` (depuis `develop`) +**Périmètre** : **full stack** — BDD + back + front + scripts + docs. **Aucun fantôme.** + +--- + +## Décision + +On **supprime tout**. Pas de DTO « ignorés », pas de compat payload. + +`forbidNonWhitelisted: true` ⇒ back et front **partent ensemble** (même feature / même déploiement). + +--- + +## Alias retirés + +`est_multiple` · `is_multiple` · `grossesse_multiple` · `multipleBirth` · `estMultiple` · `isMultiple` · `jumeau_multiple` + +--- + +## Back / BDD (fait sur la branche) + +- [x] Migration `database/migrations/2026_drop_enfants_est_multiple.sql` +- [x] `BDD.sql`, seeds, CSV test +- [x] Entity `Children` sans colonne +- [x] DTO create/inscription/réponse/dossier famille **sans** le champ +- [x] Services auth / enfants / parents : plus de mapping +- [x] Prisma legacy `isMultiple` retiré + +## Front (fait sur la branche) + +- [x] Modèles admin / dossier / inscription +- [x] Payloads inscription + reprise +- [x] Modale enfant + wizard dossier famille +- [x] Step3 inscription parent + +## Scripts / docs + +- [x] `tests/scripts/register-parent-*.mjs` +- [x] `docs/10_DATABASE.md`, `docs/99_REGLES-CODAGE.md` +- Docs tmp/archive #112 : mentions historiques OK (archive) + +--- + +## Déploiement + +1. Appliquer la migration SQL sur la BDD vivante +2. Deploy back **et** front de cette branche +3. Smoke : création enfant staff, inscription parent, reprise, wizard famille + +## Vérif + +```bash +rg -n 'est_multiple|is_multiple|grossesse_multiple|multipleBirth|estMultiple|isMultiple|jumeau_multiple' \ + backend/src frontend/lib database tests/scripts docs/10_DATABASE.md docs/99_REGLES-CODAGE.md +``` +→ **0** hit (hors ce fichier mini-spec / archives). + +## Hors scope + +- Métier futur « fratrie / jumeaux » → nouveau ticket +- #155 rename Admin* +- Ticket modales staff diff --git a/docs/tmp/155-mini-spec-rename-admin-prefix.md b/docs/tmp/155-mini-spec-rename-admin-prefix.md new file mode 100644 index 0000000..afe3c4f --- /dev/null +++ b/docs/tmp/155-mini-spec-rename-admin-prefix.md @@ -0,0 +1,54 @@ +# Mini-spec — Rename préfixe `Admin*` dashboard partagé (#155) + +**Ticket** : **#155** +**Branche** : `feature/155-rename-admin-prefix-dashboard` (depuis `develop`) +**Décision naming** : **option C** — dossier neutre `widgets/dashboard/` + noms **sans** préfixe `Admin`. + +--- + +## Principe + +Les widgets partagés **admin + gestionnaire** ne doivent plus s’appeler `Admin*`. +On garde `Admin*` seulement là où c’est vraiment le rôle administrateur. + +## Gardé `Admin*` (hors rename) + +| Élément | Raison | +|---------|--------| +| `AdminManagementWidget` | Onglet **Administrateurs** | +| `screens/administrateurs/*` | `AdminDashboardScreen`, `AdminCreateDialog`, `AdminUserFormDialog` | +| `EnfantAdminModel` | Modèle API (pas un widget) — hors scope ticket | + +## Renames faits + +| Avant | Après | +|-------|--------| +| `widgets/admin/common/admin_child_detail_modal.dart` → `AdminChildDetailModal` | `widgets/dashboard/child_detail_modal.dart` → `ChildDetailModal` | +| `admin_am_edit_modal` → `AdminAmEditModal` | `am_edit_modal` → `AmEditModal` | +| `admin_parent_edit_modal` → `AdminParentEditModal` | `parent_edit_modal` → `ParentEditModal` | +| `admin_user_card` → `AdminUserCard` | `user_card` → `UserCard` | +| `admin_enfant_user_card` → `AdminEnfantUserCard` | `enfant_user_card` → `EnfantUserCard` | +| `admin_am_photo_frame` → `AdminAmPhotoFrame` | `am_photo_frame` → `AmPhotoFrame` | +| `admin_am_children_capacity_grid` | `am_children_capacity_grid` → `AmChildrenCapacityGrid` | +| `admin_children_affiliation_panel` | `children_affiliation_panel` → `ChildrenAffiliationPanel` | +| `admin_select_*` / `AdminSelect*` / `AdminFamilleFoyer` | `select_*` / `Select*` / `FamilleFoyer` | +| `admin_status_capsule` | `status_capsule` → `StatusCapsule` | +| `admin_list_state` → `AdminListState` | `user_list_state` → `UserListState` | +| `admin_detail_modal` → `AdminDetailModal` / `AdminDetailField` | `detail_modal` → `DetailModal` / `DetailField` | +| `dashboard_admin.dart` | `user_management_sub_bar.dart` (`DashboardUserManagementSubBar` inchangé) | + +Dossier `widgets/admin/` conserve encore les panels métier (`user_management_panel`, wizards, etc.) + `AdminManagementWidget`. + +**Phase 2** (même ticket #155) : déplacer ces panels → `widgets/dashboard/` — voir [155-suite-move-admin-panels-to-dashboard.md](./155-suite-move-admin-panels-to-dashboard.md). + +## Hors scope + +- Refonte UX modales (ticket dédié) +- Rename API / back +- Déplacer tout `widgets/admin/` → `widgets/dashboard/` (panels) — possible follow-up + +## Critères + +- [x] Plus de préfixe `Admin` sur les composants **partagés** listés +- [ ] Build Flutter / recette dashboard admin + gestionnaire OK +- [x] Pas de changement comportemental (rename mécanique) diff --git a/docs/tmp/155-suite-move-admin-panels-to-dashboard.md b/docs/tmp/155-suite-move-admin-panels-to-dashboard.md new file mode 100644 index 0000000..e5a86db --- /dev/null +++ b/docs/tmp/155-suite-move-admin-panels-to-dashboard.md @@ -0,0 +1,203 @@ +# Mini-spec — Déplacer les panels `widgets/admin/` → `widgets/dashboard/` + +**Ticket** : **#155** (phase 2 — même ticket que le rename `Admin*`) +**Phase 1** : widgets `Admin*` → `widgets/dashboard/` (déjà sur `feature/155-rename-admin-prefix-dashboard`) +**Branche** : poursuivre / rebaser `feature/155-rename-admin-prefix-dashboard` (ou nouvelle branche depuis `develop` après merge phase 1) +**Nature** : rename / move mécanique — **zéro** changement UX / métier + +--- + +## Contexte + +Après la phase 1 (#155), la situation est **hybride** : + +| Emplacement | Contenu | +|-------------|---------| +| `widgets/dashboard/` | Composants partagés sans préfixe `Admin*` (modales, cartes, selects, sub-bar…) | +| `widgets/admin/` | **Panels** du dashboard staff (listes, wizards, validation, shell `UserManagementPanel`…) + `AdminManagementWidget` | + +Le dossier `admin/` laisse encore croire « réservé administrateur », alors que **gestionnaire** consomme les mêmes panels (`GestionnaireDashboardScreen` → `UserManagementPanel`). + +Ce ticket **termine l’option C** au niveau dossier : tout le dashboard staff vit sous `widgets/dashboard/`, sauf ce qui est **vraiment** rôle admin. + +--- + +## Objectif + +``` +frontend/lib/widgets/admin/ + ↓ git mv + update imports +frontend/lib/widgets/dashboard/… +``` + +Critère : un nouveau dev ne doit plus ouvrir `widgets/admin/` pour du code partagé admin+gestionnaire. + +--- + +## Cible d’arborescence (proposée) + +``` +widgets/dashboard/ + ├── (déjà là #155) child_detail_modal.dart, am_edit_modal.dart, user_card.dart, … + ├── user_management_panel.dart ← shell onglets + ├── user_management_sub_bar.dart ← déjà déplacé #155 + ├── dossiers_management_widget.dart + ├── dossier_list_card.dart + ├── parent_management_widget.dart ← corriger le typo managmant au passage ? + ├── enfant_management_widget.dart + ├── assistante_maternelle_management_widget.dart + ├── gestionnaire_management_widget.dart + ├── pending_validation_widget.dart + ├── parent_dossier_create_modal.dart + ├── parent_dossier_wizard.dart + ├── am_dossier_create_modal.dart + ├── am_dossier_wizard.dart + ├── validation_*.dart ← family/am wizards, refus, theme, confirm + ├── parametres_panel.dart ← utilisé par écran admin (OK dans dashboard) + ├── relais_management_panel.dart + ├── common/ ← sous-dossier optionnel + │ ├── suppression_confirm_dialog.dart + │ ├── user_list.dart + │ └── validation_detail_section.dart + └── … + +widgets/admin/ ← mince, rôle admin seulement + └── admin_management_widget.dart ← onglet Administrateurs +``` + +### Variante B (plus stricte) + +`AdminManagementWidget` + éventuels helpers purement admin → +`screens/administrateurs/widgets/` +et **suppression** du dossier `widgets/admin/`. + +**Reco** : **variante A** (garder `widgets/admin/` minimal avec seulement `AdminManagementWidget`) — moins de churn screens, clair. + +--- + +## Inventaire à déplacer (état actuel) + +### Racine `widgets/admin/` → `widgets/dashboard/` + +| Fichier actuel | Notes | +|----------------|--------| +| `user_management_panel.dart` | Shell partagé admin + gestionnaire | +| `dossiers_management_widget.dart` | | +| `dossier_list_card.dart` | | +| `parent_managmant_widget.dart` | Typo historique `managmant` — **option** : renommer → `parent_management_widget.dart` dans le même ticket ou ticket typo séparé | +| `enfant_management_widget.dart` | | +| `assistante_maternelle_management_widget.dart` | | +| `gestionnaire_management_widget.dart` | | +| `pending_validation_widget.dart` | | +| `parent_dossier_create_modal.dart` | | +| `parent_dossier_wizard.dart` | | +| `am_dossier_create_modal.dart` | | +| `am_dossier_wizard.dart` | | +| `validation_am_wizard.dart` | | +| `validation_family_wizard.dart` | | +| `validation_dossier_modal.dart` | | +| `validation_modal_theme.dart` | | +| `validation_refus_form.dart` | | +| `validation_valider_confirm_dialog.dart` | | +| `parametres_panel.dart` | Écran admin seulement, mais pas préfixé Admin — OK dashboard | +| `relais_management_panel.dart` | | + +### `widgets/admin/common/` → `widgets/dashboard/common/` (ou plat) + +| Fichier | Notes | +|---------|--------| +| `suppression_confirm_dialog.dart` | Partagé (y compris `screens/administrateurs/creation/*`) | +| `user_list.dart` | | +| `validation_detail_section.dart` | | + +### **Ne pas** déplacer + +| Fichier | Destination | +|---------|-------------| +| `admin_management_widget.dart` | Reste `widgets/admin/` (ou variante B → screens) | + +### Déjà fait (#155) — ne pas retraiter + +Tout ce qui est déjà sous `widgets/dashboard/` (`child_detail_modal`, `am_edit_modal`, `user_card`, `select_*`, `user_management_sub_bar`, …). + +--- + +## Consommateurs d’imports (à mettre à jour) + +### Screens +- `screens/administrateurs/admin_dashboardScreen.dart` — `UserManagementPanel`, `ParametresPanel` +- `screens/gestionnaire/gestionnaire_dashboard_screen.dart` — `UserManagementPanel` +- `screens/administrateurs/creation/admin_create.dart` — `suppression_confirm_dialog` +- `screens/administrateurs/creation/gestionnaires_create.dart` — idem + +### Widgets déjà en `dashboard/` +- `am_edit_modal`, `child_detail_modal`, `parent_edit_modal`, `select_*` — imports vers `widgets/admin/common/*` ou panels + +### Divers +- `widgets/common/identity_block.dart` (si import admin) +- Tous les fichiers **déplacés** entre eux (imports relatifs / package) + +### Hors scope rename classes +Sauf décision explicite sur le typo `parent_managmant_widget` → pas de rename de **classes** métier dans ce ticket (seulement chemins de fichiers + imports). +`AdminManagementWidget` **conserve** son nom. + +--- + +## Plan d’exécution + +1. Partir de `feature/155-rename-admin-prefix-dashboard` (phase 1) **ou** `develop` si phase 1 déjà mergée +2. `git mv` fichiers selon inventaire +3. Remplacer globalement + `package:p_tits_pas/widgets/admin/` → `package:p_tits_pas/widgets/dashboard/` + **sauf** `…/widgets/admin/admin_management_widget.dart` +4. Corriger imports relatifs cassés +5. Grep de contrôle (ci-dessous) +6. Build Flutter web (Docker) + smoke dashboard admin **et** gestionnaire +7. Merge → squash master si flux habituel + +--- + +## Vérifs + +```bash +# Plus de panels partagés sous admin (seul AdminManagement attendu) +find frontend/lib/widgets/admin -name '*.dart' + +# Plus d’imports panels vers l’ancien chemin (sauf AdminManagement) +rg -n "widgets/admin/(user_management|dossiers_|parent_|enfant_|assistante|gestionnaire|pending|validation_|parametres|relais|am_dossier|parent_dossier|dossier_list|common/)" frontend/lib + +# Screens OK +rg -n "widgets/admin/" frontend/lib/screens +``` + +Attendu screens : **0** hit vers panels ; éventuellement plus aucun hit `widgets/admin/` sauf si import explicite `AdminManagementWidget` depuis `user_management_panel` (chemin `widgets/admin/admin_management_widget.dart`). + +--- + +## Hors scope + +- Refonte UX des modales / panels (ticket dédié annoncé) +- Rename `EnfantAdminModel` +- Rename `screens/administrateurs/` +- Rename `AdminUserFormDialog` / `AdminCreateDialog` +- Changement API / back +- #152 (`est_multiple`) — autre branche + +--- + +## Critères d’acceptation + +- [ ] Inventaire déplacé selon tableau +- [ ] `widgets/admin/` ne contient plus que `admin_management_widget.dart` (variante A) +- [ ] Imports screens + widgets à jour +- [ ] Build Flutter OK +- [ ] Recette : dashboard **administrateur** et **gestionnaire** (listes, ouverture fiches, validation, création dossier) sans régression +- [ ] Aucun changement comportemental volontaire + +--- + +## Risques / notes + +- **Conflits de merge** si d’autres features touchent les panels → faire ce ticket quand la surface dashboard est calme (fin 0.1.0 OK) +- Typo `parent_managmant_widget` : soit inclus (bonus), soit ticket cleanup 1-ligne séparé +- Docs d’archive citant `widgets/admin/…` : pas obligatoire de mettre à jour ; `docs/27_BRIEFING-FRONTEND.md` oui si encore listé diff --git a/frontend/lib/models/dossier_unifie.dart b/frontend/lib/models/dossier_unifie.dart index 0e364fd..d5b4d7b 100644 --- a/frontend/lib/models/dossier_unifie.dart +++ b/frontend/lib/models/dossier_unifie.dart @@ -185,7 +185,6 @@ class EnfantDossier { final String? dueDate; final String? photoUrl; final bool consentPhoto; - final bool estMultiple; EnfantDossier({ required this.id, @@ -197,7 +196,6 @@ class EnfantDossier { this.dueDate, this.photoUrl, this.consentPhoto = false, - this.estMultiple = false, }); String get fullName => '${firstName ?? ''} ${lastName ?? ''}'.trim(); @@ -231,8 +229,6 @@ class EnfantDossier { photoUrl: resolvedPhoto, consentPhoto: json['consent_photo'] == true || json['consentPhoto'] == true, - estMultiple: - json['est_multiple'] == true || json['estMultiple'] == true, ); } } diff --git a/frontend/lib/models/enfant_admin_model.dart b/frontend/lib/models/enfant_admin_model.dart index e835d26..0248534 100644 --- a/frontend/lib/models/enfant_admin_model.dart +++ b/frontend/lib/models/enfant_admin_model.dart @@ -12,7 +12,6 @@ class EnfantAdminModel { final String status; final String? photoUrl; final bool consentPhoto; - final bool isMultiple; final List parentLinks; /// Flag API #157 (sinon déduit de [parentLinks]). final bool? sansResponsable; @@ -27,7 +26,6 @@ class EnfantAdminModel { required this.status, this.photoUrl, this.consentPhoto = false, - this.isMultiple = false, this.parentLinks = const [], this.sansResponsable, }); @@ -56,7 +54,6 @@ class EnfantAdminModel { String? status, String? photoUrl, bool? consentPhoto, - bool? isMultiple, List? parentLinks, bool? sansResponsable, }) { @@ -70,7 +67,6 @@ class EnfantAdminModel { status: status ?? this.status, photoUrl: photoUrl ?? this.photoUrl, consentPhoto: consentPhoto ?? this.consentPhoto, - isMultiple: isMultiple ?? this.isMultiple, parentLinks: parentLinks ?? this.parentLinks, sansResponsable: sansResponsable ?? this.sansResponsable, ); @@ -111,8 +107,6 @@ class EnfantAdminModel { ), photoUrl: photoUrl, consentPhoto: consentPhoto, - isMultiple: _parseBool(json['is_multiple']) || - _parseBool(json['est_multiple']), parentLinks: links, sansResponsable: sansResponsable, ); @@ -127,7 +121,6 @@ class EnfantAdminModel { if (birthDate != null && birthDate!.isNotEmpty) 'birth_date': birthDate, if (dueDate != null && dueDate!.isNotEmpty) 'due_date': dueDate, 'consent_photo': consentPhoto, - 'is_multiple': isMultiple, }; } diff --git a/frontend/lib/models/parent_user_registration_data.dart b/frontend/lib/models/parent_user_registration_data.dart index d2c6954..645c5f6 100644 --- a/frontend/lib/models/parent_user_registration_data.dart +++ b/frontend/lib/models/parent_user_registration_data.dart @@ -30,7 +30,6 @@ class ChildData { String lastName; String dob; // Date de naissance ou prévisionnelle bool photoConsent; - bool multipleBirth; bool isUnbornChild; File? imageFile; CardColorVertical cardColor; // Nouveau champ pour la couleur de la carte @@ -40,7 +39,6 @@ class ChildData { this.lastName = '', this.dob = '', this.photoConsent = false, - this.multipleBirth = false, this.isUnbornChild = false, this.imageFile, required this.cardColor, // Rendre requis dans le constructeur diff --git a/frontend/lib/models/user_registration_data.dart b/frontend/lib/models/user_registration_data.dart index bedd247..d7b296c 100644 --- a/frontend/lib/models/user_registration_data.dart +++ b/frontend/lib/models/user_registration_data.dart @@ -38,7 +38,6 @@ class ChildData { /// Valeurs API : `H`, `F`, `Autre` (GenreType backend). Vide tant que non choisi. String genre; bool photoConsent; - bool multipleBirth; bool isUnbornChild; File? imageFile; /// Octets de la photo (fiable à l’envoi API ; [imageFile] peut être absent sur le web). @@ -55,7 +54,6 @@ class ChildData { this.dob = '', this.genre = '', this.photoConsent = false, - this.multipleBirth = false, this.isUnbornChild = false, this.imageFile, this.imageBytes, @@ -70,7 +68,6 @@ class ChildData { String? dob, String? genre, bool? photoConsent, - bool? multipleBirth, bool? isUnbornChild, Object? imageFile = _unsetImage, Object? imageBytes = _unsetImageBytes, @@ -84,7 +81,6 @@ class ChildData { dob: dob ?? this.dob, genre: genre ?? this.genre, photoConsent: photoConsent ?? this.photoConsent, - multipleBirth: multipleBirth ?? this.multipleBirth, isUnbornChild: isUnbornChild ?? this.isUnbornChild, imageFile: identical(imageFile, _unsetImage) ? this.imageFile : imageFile as File?, imageBytes: diff --git a/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart b/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart index 20a9678..9cad77d 100644 --- a/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart +++ b/frontend/lib/screens/administrateurs/admin_dashboardScreen.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/configuration_service.dart'; -import 'package:p_tits_pas/widgets/admin/dashboard_admin.dart'; -import 'package:p_tits_pas/widgets/admin/parametres_panel.dart'; -import 'package:p_tits_pas/widgets/admin/user_management_panel.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_management_sub_bar.dart'; +import 'package:p_tits_pas/widgets/dashboard/parametres_panel.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_management_panel.dart'; import 'package:p_tits_pas/widgets/app_footer.dart'; import 'package:p_tits_pas/widgets/dashboard/dashboard_bandeau.dart'; diff --git a/frontend/lib/screens/administrateurs/creation/admin_create.dart b/frontend/lib/screens/administrateurs/creation/admin_create.dart index 1334519..e18d202 100644 --- a/frontend/lib/screens/administrateurs/creation/admin_create.dart +++ b/frontend/lib/screens/administrateurs/creation/admin_create.dart @@ -3,7 +3,7 @@ import 'package:p_tits_pas/utils/phone_utils.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/email_utils.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; import 'package:p_tits_pas/widgets/email_text_field.dart'; import 'package:p_tits_pas/widgets/french_phone_field.dart'; diff --git a/frontend/lib/screens/administrateurs/creation/gestionnaires_create.dart b/frontend/lib/screens/administrateurs/creation/gestionnaires_create.dart index 38b67e2..89c1d55 100644 --- a/frontend/lib/screens/administrateurs/creation/gestionnaires_create.dart +++ b/frontend/lib/screens/administrateurs/creation/gestionnaires_create.dart @@ -9,7 +9,7 @@ import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/relais_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; class AdminUserFormDialog extends StatefulWidget { final AppUser? initialUser; diff --git a/frontend/lib/screens/auth/parent_register_step3_screen.dart b/frontend/lib/screens/auth/parent_register_step3_screen.dart index ec5ed5d..7e99b0d 100644 --- a/frontend/lib/screens/auth/parent_register_step3_screen.dart +++ b/frontend/lib/screens/auth/parent_register_step3_screen.dart @@ -121,7 +121,6 @@ class _ParentRegisterStep3ScreenState extends State { dob: '', isUnbornChild: false, photoConsent: false, - multipleBirth: false, cardColor: cardColor, ); registrationData.addChild(newChild); diff --git a/frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart b/frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart index 2b2ccf5..bcf5542 100644 --- a/frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart +++ b/frontend/lib/screens/gestionnaire/gestionnaire_dashboard_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/services/auth_service.dart'; -import 'package:p_tits_pas/widgets/admin/user_management_panel.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_management_panel.dart'; import 'package:p_tits_pas/widgets/app_footer.dart'; import 'package:p_tits_pas/widgets/dashboard/dashboard_bandeau.dart'; diff --git a/frontend/lib/utils/parent_registration_payload.dart b/frontend/lib/utils/parent_registration_payload.dart index 467cd35..f82d5df 100644 --- a/frontend/lib/utils/parent_registration_payload.dart +++ b/frontend/lib/utils/parent_registration_payload.dart @@ -166,7 +166,6 @@ class ParentRegistrationPayload { static Map _childToJson(ChildData c, int index, String parentNom) { final map = { 'genre': apiGenres.contains(c.genre) ? c.genre : 'Autre', - 'grossesse_multiple': c.multipleBirth, 'consent_photo': c.photoConsent, }; diff --git a/frontend/lib/utils/reprise_mapper.dart b/frontend/lib/utils/reprise_mapper.dart index f33b53d..7a9730e 100644 --- a/frontend/lib/utils/reprise_mapper.dart +++ b/frontend/lib/utils/reprise_mapper.dart @@ -44,7 +44,6 @@ class RepriseMapper { dob: dob, genre: e.gender ?? '', photoConsent: e.consentPhoto, - multipleBirth: e.estMultiple, isUnbornChild: isUnborn, cardColor: _childCardColors[index % _childCardColors.length], repriseChildId: e.id, diff --git a/frontend/lib/widgets/admin/admin_management_widget.dart b/frontend/lib/widgets/admin/admin_management_widget.dart index 08d40a3..facaa8b 100644 --- a/frontend/lib/widgets/admin/admin_management_widget.dart +++ b/frontend/lib/widgets/admin/admin_management_widget.dart @@ -5,9 +5,9 @@ import 'package:p_tits_pas/screens/administrateurs/creation/gestionnaires_create import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/common/user_list.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/user_list.dart'; class AdminManagementWidget extends StatefulWidget { final String searchQuery; @@ -183,7 +183,7 @@ class _AdminManagementWidgetState extends State { final isSuperAdmin = _isSuperAdmin(user); final canEdit = _canEditAdmin(user); final canDelete = _canDeleteAdmin(user); - return AdminUserCard( + return UserCard( title: user.fullName, fallbackIcon: isSuperAdmin ? Icons.verified_user_outlined diff --git a/frontend/lib/widgets/common/identity_block.dart b/frontend/lib/widgets/common/identity_block.dart index 2aee3e8..d0b7e68 100644 --- a/frontend/lib/widgets/common/identity_block.dart +++ b/frontend/lib/widgets/common/identity_block.dart @@ -3,7 +3,7 @@ import 'package:p_tits_pas/models/dossier_unifie.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/utils/name_format_utils.dart'; import 'package:p_tits_pas/utils/phone_utils.dart'; -import 'package:p_tits_pas/widgets/admin/common/validation_detail_section.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/validation_detail_section.dart'; /// Valeurs affichées dans un [IdentityBlock] en lecture seule. class IdentityValues { diff --git a/frontend/lib/widgets/admin/common/admin_am_children_capacity_grid.dart b/frontend/lib/widgets/dashboard/am_children_capacity_grid.dart similarity index 99% rename from frontend/lib/widgets/admin/common/admin_am_children_capacity_grid.dart rename to frontend/lib/widgets/dashboard/am_children_capacity_grid.dart index 5b28e3c..a475c06 100644 --- a/frontend/lib/widgets/admin/common/admin_am_children_capacity_grid.dart +++ b/frontend/lib/widgets/dashboard/am_children_capacity_grid.dart @@ -5,7 +5,7 @@ import 'package:p_tits_pas/utils/date_display_utils.dart'; import 'package:p_tits_pas/widgets/common/auth_network_image.dart'; /// Grille 2×2 des places d'accueil AM (max 4, limitée à [capacity]). -class AdminAmChildrenCapacityGrid extends StatelessWidget { +class AmChildrenCapacityGrid extends StatelessWidget { static const int _gridSlots = 4; static const double _slotHeight = 44; static const double _gridPadding = 10; @@ -23,7 +23,7 @@ class AdminAmChildrenCapacityGrid extends StatelessWidget { /// Clic sur une case libre → même flux que « Rattacher un enfant » (#149). final VoidCallback? onAttachEmpty; - const AdminAmChildrenCapacityGrid({ + const AmChildrenCapacityGrid({ super.key, required this.children, required this.capacity, diff --git a/frontend/lib/widgets/admin/am_dossier_create_modal.dart b/frontend/lib/widgets/dashboard/am_dossier_create_modal.dart similarity index 97% rename from frontend/lib/widgets/admin/am_dossier_create_modal.dart rename to frontend/lib/widgets/dashboard/am_dossier_create_modal.dart index f221d93..1f463e6 100644 --- a/frontend/lib/widgets/admin/am_dossier_create_modal.dart +++ b/frontend/lib/widgets/dashboard/am_dossier_create_modal.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:p_tits_pas/widgets/admin/am_dossier_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_dossier_wizard.dart'; /// Modale de création dossier AM (#156) — même shell que [ValidationDossierModal]. class AmDossierCreateModal extends StatefulWidget { diff --git a/frontend/lib/widgets/admin/am_dossier_wizard.dart b/frontend/lib/widgets/dashboard/am_dossier_wizard.dart similarity index 97% rename from frontend/lib/widgets/admin/am_dossier_wizard.dart rename to frontend/lib/widgets/dashboard/am_dossier_wizard.dart index dd6b0cb..0efd238 100644 --- a/frontend/lib/widgets/admin/am_dossier_wizard.dart +++ b/frontend/lib/widgets/dashboard/am_dossier_wizard.dart @@ -14,12 +14,12 @@ import 'package:p_tits_pas/utils/name_format_utils.dart'; import 'package:p_tits_pas/utils/nir_utils.dart'; import 'package:p_tits_pas/utils/phone_utils.dart'; import 'package:p_tits_pas/utils/postal_utils.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_photo_frame.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_detail_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/validation_detail_section.dart'; -import 'package:p_tits_pas/widgets/admin/validation_modal_theme.dart'; -import 'package:p_tits_pas/widgets/admin/validation_refus_form.dart'; -import 'package:p_tits_pas/widgets/admin/validation_valider_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_photo_frame.dart'; +import 'package:p_tits_pas/widgets/dashboard/detail_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/validation_detail_section.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_modal_theme.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_refus_form.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_valider_confirm_dialog.dart'; import 'package:p_tits_pas/widgets/common/auth_network_image.dart'; import 'package:p_tits_pas/widgets/common/identity_block.dart'; @@ -221,32 +221,32 @@ class _AmDossierWizardState extends State { void _emitStep() => widget.onStepChanged?.call(_step, _stepCount); - List _photoProFields(DossierAM d) { + List _photoProFields(DossierAM d) { final u = d.user; return [ - AdminDetailField(label: 'NIR', value: _formatNirForDisplay(d.nir)), - AdminDetailField( + DetailField(label: 'NIR', value: _formatNirForDisplay(d.nir)), + DetailField( label: 'Date de naissance', value: formatIsoDateFr(u.dateNaissance), ), - AdminDetailField( + DetailField( label: 'Ville de naissance', value: _v(u.lieuNaissanceVille), ), - AdminDetailField( + DetailField( label: 'Pays de naissance', value: _v(u.lieuNaissancePays), ), - AdminDetailField(label: 'N° Agrément', value: _v(d.numeroAgrement)), - AdminDetailField( + DetailField(label: 'N° Agrément', value: _v(d.numeroAgrement)), + DetailField( label: 'Date d’agrément', value: formatIsoDateFr(d.dateAgrement), ), - AdminDetailField( + DetailField( label: 'Capacité max (enfants)', value: d.nbMaxEnfants != null ? d.nbMaxEnfants.toString() : '–', ), - AdminDetailField( + DetailField( label: 'Places disponibles', value: d.placesDisponibles != null ? d.placesDisponibles.toString() @@ -741,14 +741,14 @@ class _AmDossierWizardState extends State { Widget _buildStep1() { // Modale calée sur les TF ; photo étirée sur toute la hauteur utile - // (largeur = [AdminAmPhotoFrame.columnWidthForHeight], cadre inclus). + // (largeur = [AmPhotoFrame.columnWidthForHeight], cadre inclus). return LayoutBuilder( builder: (context, c) { final maxRowW = c.maxWidth; final maxRowH = c.maxHeight.clamp(0.0, double.infinity); final maxPhotoW = (maxRowW - _photoProGap - _proColumnMinWidth) .clamp(0.0, double.infinity); - var photoW = AdminAmPhotoFrame.columnWidthForHeight(maxRowH) + var photoW = AmPhotoFrame.columnWidthForHeight(maxRowH) .clamp(_photoColumnMinWidth, 360.0); if (photoW > maxPhotoW) photoW = maxPhotoW; @@ -762,7 +762,7 @@ class _AmDossierWizardState extends State { final Widget photo; if (_isCreate) { - photo = AdminAmPhotoFrame( + photo = AmPhotoFrame( imageBytes: _photoBytes, onTap: _pickPhoto, onClear: _photoBytes != null ? _clearPhoto : null, diff --git a/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart b/frontend/lib/widgets/dashboard/am_edit_modal.dart similarity index 96% rename from frontend/lib/widgets/admin/common/admin_am_edit_modal.dart rename to frontend/lib/widgets/dashboard/am_edit_modal.dart index 5855e69..900df65 100644 --- a/frontend/lib/widgets/admin/common/admin_am_edit_modal.dart +++ b/frontend/lib/widgets/dashboard/am_edit_modal.dart @@ -7,31 +7,31 @@ import 'package:p_tits_pas/utils/date_display_utils.dart'; import 'package:p_tits_pas/utils/nir_utils.dart'; import 'package:p_tits_pas/utils/phone_utils.dart'; import 'package:p_tits_pas/services/user_service.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_children_capacity_grid.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_photo_frame.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_child_detail_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_select_enfant_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_status_capsule.dart'; -import 'package:p_tits_pas/widgets/admin/common/validation_detail_section.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_children_capacity_grid.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_photo_frame.dart'; +import 'package:p_tits_pas/widgets/dashboard/child_detail_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/select_enfant_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/status_capsule.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/validation_detail_section.dart'; import 'package:p_tits_pas/widgets/common/identity_block.dart'; -import 'package:p_tits_pas/widgets/admin/validation_modal_theme.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_modal_theme.dart'; /// Fiche AM éditable (ticket #131) — identité | fiche pro (photo) | enfants. -class AdminAmEditModal extends StatefulWidget { +class AmEditModal extends StatefulWidget { final AssistanteMaternelleModel assistante; final VoidCallback? onSaved; - const AdminAmEditModal({ + const AmEditModal({ super.key, required this.assistante, this.onSaved, }); @override - State createState() => _AdminAmEditModalState(); + State createState() => _AmEditModalState(); } -class _AdminAmEditModalState extends State +class _AmEditModalState extends State with SingleTickerProviderStateMixin { late final TabController _tabCtrl; late final TextEditingController _nomCtrl; @@ -404,7 +404,7 @@ class _AdminAmEditModalState extends State if (!mounted) return; await showDialog( context: context, - builder: (ctx) => AdminChildDetailModal( + builder: (ctx) => ChildDetailModal( enfant: enfant, onSaved: _refreshChildrenDetails, ), @@ -450,7 +450,7 @@ class _AdminAmEditModalState extends State Future _attachChild() async { if (_capacityFull || !mounted) return; - final selected = await AdminSelectEnfantModal.show( + final selected = await SelectEnfantModal.show( context, excludeIds: _children.map((c) => c.id).toSet(), title: 'Rattacher un enfant', @@ -589,7 +589,7 @@ class _AdminAmEditModalState extends State final maxRowH = c.maxHeight.isFinite ? c.maxHeight : _proTabHeight; final bodyH = maxRowH; - final idealPhotoW = bodyH * AdminAmPhotoFrame.idPhotoAspectRatio + 16; + final idealPhotoW = bodyH * AmPhotoFrame.idPhotoAspectRatio + 16; final maxPhotoW = (maxRowW - _photoProGap - _proColumnMinWidth) .clamp(0.0, double.infinity); var photoW = idealPhotoW.clamp(_photoColumnMinWidth, 220.0); @@ -600,7 +600,7 @@ class _AdminAmEditModalState extends State children: [ SizedBox( width: photoW, - child: AdminAmPhotoFrame( + child: AmPhotoFrame( photoUrl: widget.assistante.user.photoUrl, ), ), @@ -728,7 +728,7 @@ class _AdminAmEditModalState extends State ), ), const SizedBox(height: 8), - AdminAmChildrenCapacityGrid( + AmChildrenCapacityGrid( children: _children, capacity: capacity, onOpen: _openChild, @@ -820,7 +820,7 @@ class _AdminAmEditModalState extends State const SizedBox(width: 12), SizedBox( width: 160, - child: AdminStatusCapsule( + child: StatusCapsule( statut: _statut, onChanged: (v) => setState(() { _statut = v; diff --git a/frontend/lib/widgets/admin/common/admin_am_photo_frame.dart b/frontend/lib/widgets/dashboard/am_photo_frame.dart similarity index 98% rename from frontend/lib/widgets/admin/common/admin_am_photo_frame.dart rename to frontend/lib/widgets/dashboard/am_photo_frame.dart index 3da8051..dd990fd 100644 --- a/frontend/lib/widgets/admin/common/admin_am_photo_frame.dart +++ b/frontend/lib/widgets/dashboard/am_photo_frame.dart @@ -5,7 +5,7 @@ import 'package:p_tits_pas/services/api/api_config.dart'; import 'package:p_tits_pas/widgets/common/auth_network_image.dart'; /// Cadre photo identité AM / enfant (35×45 mm) — même logique que [ValidationAmWizard]. -class AdminAmPhotoFrame extends StatelessWidget { +class AmPhotoFrame extends StatelessWidget { final String? photoUrl; final Uint8List? imageBytes; final VoidCallback? onTap; @@ -14,7 +14,7 @@ class AdminAmPhotoFrame extends StatelessWidget { static const double idPhotoAspectRatio = 35 / 45; - const AdminAmPhotoFrame({ + const AmPhotoFrame({ super.key, this.photoUrl, this.imageBytes, diff --git a/frontend/lib/widgets/admin/assistante_maternelle_management_widget.dart b/frontend/lib/widgets/dashboard/assistante_maternelle_management_widget.dart similarity index 93% rename from frontend/lib/widgets/admin/assistante_maternelle_management_widget.dart rename to frontend/lib/widgets/dashboard/assistante_maternelle_management_widget.dart index b48212b..8d8958a 100644 --- a/frontend/lib/widgets/admin/assistante_maternelle_management_widget.dart +++ b/frontend/lib/widgets/dashboard/assistante_maternelle_management_widget.dart @@ -5,10 +5,10 @@ import 'package:p_tits_pas/utils/am_vigilance.dart'; import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_edit_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/common/user_list.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_edit_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/user_list.dart'; class AssistanteMaternelleManagementWidget extends StatefulWidget { final String searchQuery; @@ -130,7 +130,7 @@ class _AssistanteMaternelleManagementWidgetState itemBuilder: (context, index) { final assistante = filteredAssistantes[index]; final vigilance = amPlacesVigilanceMessage(assistante); - return AdminUserCard( + return UserCard( title: assistante.user.fullName, avatarUrl: assistante.user.photoUrl, fallbackIcon: Icons.face, @@ -161,7 +161,7 @@ class _AssistanteMaternelleManagementWidgetState void _openAssistanteDetails(AssistanteMaternelleModel assistante) { showDialog( context: context, - builder: (context) => AdminAmEditModal( + builder: (context) => AmEditModal( assistante: assistante, onSaved: _loadAssistantes, ), diff --git a/frontend/lib/widgets/admin/common/admin_child_detail_modal.dart b/frontend/lib/widgets/dashboard/child_detail_modal.dart similarity index 97% rename from frontend/lib/widgets/admin/common/admin_child_detail_modal.dart rename to frontend/lib/widgets/dashboard/child_detail_modal.dart index 28f3374..087c374 100644 --- a/frontend/lib/widgets/admin/common/admin_child_detail_modal.dart +++ b/frontend/lib/widgets/dashboard/child_detail_modal.dart @@ -11,24 +11,24 @@ import 'package:p_tits_pas/utils/date_display_utils.dart'; import 'package:p_tits_pas/utils/enfant_status_utils.dart'; import 'package:p_tits_pas/utils/name_format_utils.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_edit_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_photo_frame.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_parent_edit_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_select_am_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_select_famille_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/common/validation_detail_section.dart'; -import 'package:p_tits_pas/widgets/admin/validation_modal_theme.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_edit_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_photo_frame.dart'; +import 'package:p_tits_pas/widgets/dashboard/parent_edit_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/select_am_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/select_famille_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/validation_detail_section.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_modal_theme.dart'; import 'package:p_tits_pas/widgets/common/auth_network_image.dart'; /// Fiche enfant consultation / édition (#138) ou création (#132). -class AdminChildDetailModal extends StatefulWidget { +class ChildDetailModal extends StatefulWidget { final EnfantAdminModel? enfant; final VoidCallback? onSaved; final VoidCallback? onDeleted; final bool isCreating; - const AdminChildDetailModal({ + const ChildDetailModal({ super.key, required EnfantAdminModel this.enfant, this.onSaved, @@ -36,7 +36,7 @@ class AdminChildDetailModal extends StatefulWidget { }) : isCreating = false; /// Création depuis l'onglet Enfants (#132). - const AdminChildDetailModal.create({ + const ChildDetailModal.create({ super.key, this.onSaved, }) : enfant = null, @@ -44,10 +44,10 @@ class AdminChildDetailModal extends StatefulWidget { isCreating = true; @override - State createState() => _AdminChildDetailModalState(); + State createState() => _ChildDetailModalState(); } -class _AdminChildDetailModalState extends State { +class _ChildDetailModalState extends State { late final TextEditingController _prenomCtrl; late final TextEditingController _nomCtrl; late final TextEditingController _birthCtrl; @@ -55,7 +55,6 @@ class _AdminChildDetailModalState extends State { late String _status; late String? _gender; late bool _consentPhoto; - late bool _isMultiple; bool _dirty = false; bool _saving = false; bool _deleting = false; @@ -66,7 +65,7 @@ class _AdminChildDetailModalState extends State { String? _baselineAmUserId; /// Famille choisie en mode création (#132). - AdminFamilleFoyer? _selectedFamily; + FamilleFoyer? _selectedFamily; /// Liens parents locaux (édition) — mis à jour après rattachement foyer (#157). List? _localParentLinks; @@ -142,7 +141,6 @@ class _AdminChildDetailModalState extends State { _gender = _normalizeGender(e?.gender, allowUnknown: _isUnborn); } _consentPhoto = e?.consentPhoto ?? false; - _isMultiple = e?.isMultiple ?? false; for (final c in [_prenomCtrl, _nomCtrl]) { c.addListener(_onNameChanged); } @@ -285,7 +283,7 @@ class _AdminChildDetailModalState extends State { if (!mounted) return; await showDialog( context: context, - builder: (ctx) => AdminParentEditModal( + builder: (ctx) => ParentEditModal( parent: parent, onSaved: () => widget.onSaved?.call(), ), @@ -383,7 +381,6 @@ class _AdminChildDetailModalState extends State { else if (_dateToIso(_birthCtrl.text) != null) 'birth_date': _dateToIso(_birthCtrl.text), 'consent_photo': _consentPhoto, - 'is_multiple': _isMultiple, }, ); if (!mounted) return; @@ -460,7 +457,6 @@ class _AdminChildDetailModalState extends State { 'birth_date': _dateToIso(_birthCtrl.text), }, 'consent_photo': _consentPhoto, - 'is_multiple': _isMultiple, }, ); if (!mounted) return; @@ -628,7 +624,7 @@ class _AdminChildDetailModalState extends State { if (am == null) return; await showDialog( context: context, - builder: (ctx) => AdminAmEditModal( + builder: (ctx) => AmEditModal( assistante: am, onSaved: () async { await _reloadPlacementFromServer(); @@ -680,7 +676,7 @@ class _AdminChildDetailModalState extends State { } if (!mounted) return; - final selected = await AdminSelectAmModal.show( + final selected = await SelectAmModal.show( context, excludeIds: { if (_linkedAm != null) _linkedAm!.user.id, @@ -990,7 +986,7 @@ class _AdminChildDetailModalState extends State { final maxRowW = c.maxWidth; final maxRowH = c.maxHeight; final idealPhotoW = - maxRowH * AdminAmPhotoFrame.idPhotoAspectRatio + 16; + maxRowH * AmPhotoFrame.idPhotoAspectRatio + 16; final maxPhotoW = (maxRowW - _photoProGap - _proColumnMinWidth) .clamp(0.0, double.infinity); var photoW = idealPhotoW.clamp(_photoColumnMinWidth, _photoColumnMaxWidth); @@ -1005,7 +1001,7 @@ class _AdminChildDetailModalState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Expanded( - child: AdminAmPhotoFrame( + child: AmPhotoFrame( photoUrl: widget.isCreating ? null : widget.enfant?.photoUrl, @@ -1333,7 +1329,7 @@ class _AdminChildDetailModalState extends State { Future _pickFamily() async { if (_busy) return; - final selected = await AdminSelectFamilleModal.show( + final selected = await SelectFamilleModal.show( context, title: 'Choisir une famille', ); diff --git a/frontend/lib/widgets/admin/common/admin_children_affiliation_panel.dart b/frontend/lib/widgets/dashboard/children_affiliation_panel.dart similarity index 91% rename from frontend/lib/widgets/admin/common/admin_children_affiliation_panel.dart rename to frontend/lib/widgets/dashboard/children_affiliation_panel.dart index 526d7f8..2cacec5 100644 --- a/frontend/lib/widgets/admin/common/admin_children_affiliation_panel.dart +++ b/frontend/lib/widgets/dashboard/children_affiliation_panel.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/parent_child_summary.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_enfant_user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/enfant_user_card.dart'; /// Liste scrollable d'enfants rattachés (fiche parent / fiche AM). -class AdminChildrenAffiliationPanel extends StatelessWidget { +class ChildrenAffiliationPanel extends StatelessWidget { final List children; final ScrollController scrollController; final void Function(ParentChildSummary child) onOpen; @@ -14,7 +14,7 @@ class AdminChildrenAffiliationPanel extends StatelessWidget { static const double _itemHeight = 58; static const double defaultViewportHeight = _itemHeight * 2.5 + 8; - const AdminChildrenAffiliationPanel({ + const ChildrenAffiliationPanel({ super.key, required this.children, required this.scrollController, @@ -62,7 +62,7 @@ class AdminChildrenAffiliationPanel extends StatelessWidget { itemCount: children.length, itemBuilder: (_, i) { final c = children[i]; - return AdminEnfantUserCard.fromSummary( + return EnfantUserCard.fromSummary( c, onCardTap: () => onOpen(c), actions: [ diff --git a/frontend/lib/widgets/admin/common/suppression_confirm_dialog.dart b/frontend/lib/widgets/dashboard/common/suppression_confirm_dialog.dart similarity index 100% rename from frontend/lib/widgets/admin/common/suppression_confirm_dialog.dart rename to frontend/lib/widgets/dashboard/common/suppression_confirm_dialog.dart diff --git a/frontend/lib/widgets/admin/common/user_list.dart b/frontend/lib/widgets/dashboard/common/user_list.dart similarity index 91% rename from frontend/lib/widgets/admin/common/user_list.dart rename to frontend/lib/widgets/dashboard/common/user_list.dart index 1df400c..3b439d5 100644 --- a/frontend/lib/widgets/admin/common/user_list.dart +++ b/frontend/lib/widgets/dashboard/common/user_list.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_list_state.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_list_state.dart'; class UserList extends StatelessWidget { final bool isLoading; @@ -28,7 +28,7 @@ class UserList extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - AdminListState( + UserListState( isLoading: isLoading, error: error, isEmpty: isEmpty, diff --git a/frontend/lib/widgets/admin/common/validation_detail_section.dart b/frontend/lib/widgets/dashboard/common/validation_detail_section.dart similarity index 99% rename from frontend/lib/widgets/admin/common/validation_detail_section.dart rename to frontend/lib/widgets/dashboard/common/validation_detail_section.dart index 80f5a42..5683859 100644 --- a/frontend/lib/widgets/admin/common/validation_detail_section.dart +++ b/frontend/lib/widgets/dashboard/common/validation_detail_section.dart @@ -4,7 +4,7 @@ import 'package:p_tits_pas/utils/email_utils.dart'; import 'package:p_tits_pas/utils/nir_utils.dart'; import 'package:p_tits_pas/utils/phone_utils.dart'; import 'package:p_tits_pas/utils/postal_utils.dart'; -import 'admin_detail_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/detail_modal.dart'; /// Réglages des formulaires validation / wizard AM — **jouer sur ces 3 leviers**. class ValidationFormMetrics { @@ -60,7 +60,7 @@ class ValidationFormMetrics { class ValidationDetailSection extends StatelessWidget { /// Si null ou vide, pas de bandeau titre (gain de place vertical, ex. wizard AM). final String? title; - final List fields; + final List fields; /// Nombre de champs par ligne (1 = plein largeur, 2 = deux côte à côte). Ex. [2, 2, 1, 2] pour identité. final List? rowLayout; diff --git a/frontend/lib/widgets/admin/common/admin_detail_modal.dart b/frontend/lib/widgets/dashboard/detail_modal.dart similarity index 96% rename from frontend/lib/widgets/admin/common/admin_detail_modal.dart rename to frontend/lib/widgets/dashboard/detail_modal.dart index affc0d8..255d2bb 100644 --- a/frontend/lib/widgets/admin/common/admin_detail_modal.dart +++ b/frontend/lib/widgets/dashboard/detail_modal.dart @@ -1,23 +1,23 @@ import 'package:flutter/material.dart'; -class AdminDetailField { +class DetailField { final String label; final String value; - const AdminDetailField({ + const DetailField({ required this.label, required this.value, }); } -class AdminDetailModal extends StatelessWidget { +class DetailModal extends StatelessWidget { final String title; final String? subtitle; - final List fields; + final List fields; final VoidCallback onEdit; final VoidCallback onDelete; - const AdminDetailModal({ + const DetailModal({ super.key, required this.title, this.subtitle, diff --git a/frontend/lib/widgets/admin/dossier_list_card.dart b/frontend/lib/widgets/dashboard/dossier_list_card.dart similarity index 93% rename from frontend/lib/widgets/admin/dossier_list_card.dart rename to frontend/lib/widgets/dashboard/dossier_list_card.dart index 7608df2..149eec1 100644 --- a/frontend/lib/widgets/admin/dossier_list_card.dart +++ b/frontend/lib/widgets/dashboard/dossier_list_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; /// Carte dossier unifiée (#153) — fond neutre, accent couleur sur l’icône. class DossierListCard extends StatelessWidget { @@ -54,7 +54,7 @@ class DossierListCard extends StatelessWidget { if (!emptyKids && countLabel != null) countLabel, ]; - return AdminUserCard( + return UserCard( title: num, subtitleLines: subtitle, avatarUrl: !isFamille && avatar.isNotEmpty ? avatar : null, diff --git a/frontend/lib/widgets/admin/dossiers_management_widget.dart b/frontend/lib/widgets/dashboard/dossiers_management_widget.dart similarity index 97% rename from frontend/lib/widgets/admin/dossiers_management_widget.dart rename to frontend/lib/widgets/dashboard/dossiers_management_widget.dart index a616525..74e9475 100644 --- a/frontend/lib/widgets/admin/dossiers_management_widget.dart +++ b/frontend/lib/widgets/dashboard/dossiers_management_widget.dart @@ -3,10 +3,10 @@ import 'package:p_tits_pas/models/dossier_list_item.dart'; import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/dossier_list_card.dart'; -import 'package:p_tits_pas/widgets/admin/pending_validation_widget.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/validation_dossier_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/dossier_list_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/pending_validation_widget.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_dossier_modal.dart'; /// Onglet permanent « Dossiers » (#153) : pending en haut + liste unifiée en bas. class DossiersManagementWidget extends StatefulWidget { diff --git a/frontend/lib/widgets/admin/enfant_management_widget.dart b/frontend/lib/widgets/dashboard/enfant_management_widget.dart similarity index 94% rename from frontend/lib/widgets/admin/enfant_management_widget.dart rename to frontend/lib/widgets/dashboard/enfant_management_widget.dart index 6731ff7..0b5d957 100644 --- a/frontend/lib/widgets/admin/enfant_management_widget.dart +++ b/frontend/lib/widgets/dashboard/enfant_management_widget.dart @@ -5,10 +5,10 @@ import 'package:p_tits_pas/models/enfant_admin_model.dart'; import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_child_detail_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_enfant_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/common/user_list.dart'; +import 'package:p_tits_pas/widgets/dashboard/child_detail_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/enfant_user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/user_list.dart'; /// Onglet liste globale des enfants (doc 28 §6.2, ticket #137). class EnfantManagementWidget extends StatefulWidget { @@ -68,7 +68,7 @@ class _EnfantManagementWidgetState extends State { Future _openEnfant(EnfantAdminModel enfant) async { await showDialog( context: context, - builder: (ctx) => AdminChildDetailModal( + builder: (ctx) => ChildDetailModal( enfant: enfant, onSaved: _loadEnfants, onDeleted: _loadEnfants, @@ -224,7 +224,7 @@ class _EnfantManagementWidgetState extends State { itemCount: filtered.length, itemBuilder: (context, index) { final enfant = filtered[index]; - return AdminEnfantUserCard.fromEnfant( + return EnfantUserCard.fromEnfant( enfant, onCardTap: () => _openEnfant(enfant), actions: [ diff --git a/frontend/lib/widgets/admin/common/admin_enfant_user_card.dart b/frontend/lib/widgets/dashboard/enfant_user_card.dart similarity index 91% rename from frontend/lib/widgets/admin/common/admin_enfant_user_card.dart rename to frontend/lib/widgets/dashboard/enfant_user_card.dart index 04b22e5..347fccb 100644 --- a/frontend/lib/widgets/admin/common/admin_enfant_user_card.dart +++ b/frontend/lib/widgets/dashboard/enfant_user_card.dart @@ -4,7 +4,7 @@ import 'package:p_tits_pas/models/parent_child_summary.dart'; import 'package:p_tits_pas/utils/date_display_utils.dart'; import 'package:p_tits_pas/utils/enfant_status_utils.dart'; import 'package:p_tits_pas/utils/enfant_vigilance.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; List enfantAdminSubtitleLines({ required String status, @@ -29,7 +29,7 @@ List enfantAdminSubtitleLines({ } /// Carte enfant admin (photo, nom, âge) — même rendu onglet Enfants / fiche parent. -class AdminEnfantUserCard extends StatelessWidget { +class EnfantUserCard extends StatelessWidget { final String title; final String? photoUrl; final List subtitleLines; @@ -40,7 +40,7 @@ class AdminEnfantUserCard extends StatelessWidget { final Color? borderColor; final String? vigilanceTooltip; - const AdminEnfantUserCard({ + const EnfantUserCard({ super.key, required this.title, this.photoUrl, @@ -53,7 +53,7 @@ class AdminEnfantUserCard extends StatelessWidget { this.vigilanceTooltip, }); - factory AdminEnfantUserCard.fromEnfant( + factory EnfantUserCard.fromEnfant( EnfantAdminModel enfant, { List extraSubtitleLines = const [], List actions = const [], @@ -67,7 +67,7 @@ class AdminEnfantUserCard extends StatelessWidget { .map((l) => l.parentName ?? 'Parent') .join(', '); final orphan = enfantHasNoResponsable(enfant); - return AdminEnfantUserCard( + return EnfantUserCard( title: enfant.fullName, photoUrl: enfant.photoUrl, subtitleLines: enfantAdminSubtitleLines( @@ -92,7 +92,7 @@ class AdminEnfantUserCard extends StatelessWidget { ); } - factory AdminEnfantUserCard.fromSummary( + factory EnfantUserCard.fromSummary( ParentChildSummary child, { List extraSubtitleLines = const [], List actions = const [], @@ -100,7 +100,7 @@ class AdminEnfantUserCard extends StatelessWidget { EdgeInsetsGeometry? margin, EdgeInsetsGeometry? contentPadding, }) { - return AdminEnfantUserCard( + return EnfantUserCard( title: child.fullName, photoUrl: child.photoUrl, subtitleLines: enfantAdminSubtitleLines( @@ -118,7 +118,7 @@ class AdminEnfantUserCard extends StatelessWidget { @override Widget build(BuildContext context) { - return AdminUserCard( + return UserCard( title: title, fallbackIcon: Icons.child_care_outlined, avatarUrl: photoUrl, diff --git a/frontend/lib/widgets/admin/gestionnaire_management_widget.dart b/frontend/lib/widgets/dashboard/gestionnaire_management_widget.dart similarity index 95% rename from frontend/lib/widgets/admin/gestionnaire_management_widget.dart rename to frontend/lib/widgets/dashboard/gestionnaire_management_widget.dart index f5cda69..3e824e7 100644 --- a/frontend/lib/widgets/admin/gestionnaire_management_widget.dart +++ b/frontend/lib/widgets/dashboard/gestionnaire_management_widget.dart @@ -4,9 +4,9 @@ import 'package:p_tits_pas/screens/administrateurs/creation/gestionnaires_create import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/common/user_list.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/user_list.dart'; class GestionnaireManagementWidget extends StatefulWidget { final String searchQuery; @@ -141,7 +141,7 @@ class _GestionnaireManagementWidgetState final user = filteredGestionnaires[index]; final isSelf = _currentUserId != null && _currentUserId == user.id; - return AdminUserCard( + return UserCard( title: user.fullName, fallbackIcon: Icons.assignment_ind_outlined, avatarUrl: user.photoUrl, diff --git a/frontend/lib/widgets/admin/parametres_panel.dart b/frontend/lib/widgets/dashboard/parametres_panel.dart similarity index 99% rename from frontend/lib/widgets/admin/parametres_panel.dart rename to frontend/lib/widgets/dashboard/parametres_panel.dart index b99fd50..1f3612f 100644 --- a/frontend/lib/widgets/admin/parametres_panel.dart +++ b/frontend/lib/widgets/dashboard/parametres_panel.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:p_tits_pas/services/configuration_service.dart'; import 'package:p_tits_pas/utils/email_utils.dart'; -import 'package:p_tits_pas/widgets/admin/relais_management_panel.dart'; +import 'package:p_tits_pas/widgets/dashboard/relais_management_panel.dart'; /// Panneau Paramètres admin : Email (SMTP), Personnalisation, Avancé. class ParametresPanel extends StatefulWidget { diff --git a/frontend/lib/widgets/admin/parent_dossier_create_modal.dart b/frontend/lib/widgets/dashboard/parent_dossier_create_modal.dart similarity index 97% rename from frontend/lib/widgets/admin/parent_dossier_create_modal.dart rename to frontend/lib/widgets/dashboard/parent_dossier_create_modal.dart index 10f1126..55ba4bc 100644 --- a/frontend/lib/widgets/admin/parent_dossier_create_modal.dart +++ b/frontend/lib/widgets/dashboard/parent_dossier_create_modal.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:p_tits_pas/widgets/admin/parent_dossier_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/parent_dossier_wizard.dart'; /// Modale de création dossier famille (#129) — même shell que [AmDossierCreateModal]. class ParentDossierCreateModal extends StatefulWidget { diff --git a/frontend/lib/widgets/admin/parent_dossier_wizard.dart b/frontend/lib/widgets/dashboard/parent_dossier_wizard.dart similarity index 99% rename from frontend/lib/widgets/admin/parent_dossier_wizard.dart rename to frontend/lib/widgets/dashboard/parent_dossier_wizard.dart index b9c7bf1..fd2d289 100644 --- a/frontend/lib/widgets/admin/parent_dossier_wizard.dart +++ b/frontend/lib/widgets/dashboard/parent_dossier_wizard.dart @@ -14,11 +14,11 @@ import 'package:p_tits_pas/utils/enfant_status_utils.dart'; import 'package:p_tits_pas/utils/name_format_utils.dart'; import 'package:p_tits_pas/utils/phone_utils.dart'; import 'package:p_tits_pas/utils/postal_utils.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_photo_frame.dart'; -import 'package:p_tits_pas/widgets/admin/common/validation_detail_section.dart'; -import 'package:p_tits_pas/widgets/admin/validation_modal_theme.dart'; -import 'package:p_tits_pas/widgets/admin/validation_refus_form.dart'; -import 'package:p_tits_pas/widgets/admin/validation_valider_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_photo_frame.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/validation_detail_section.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_modal_theme.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_refus_form.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_valider_confirm_dialog.dart'; import 'package:p_tits_pas/widgets/common/auth_network_image.dart'; import 'package:p_tits_pas/widgets/common/identity_block.dart'; @@ -860,7 +860,7 @@ class _ParentDossierWizardState extends State { child: SizedBox( width: pw, height: ph, - child: AdminAmPhotoFrame( + child: AmPhotoFrame( photoUrl: child.photoBytes == null ? child.existingPhotoUrl : null, @@ -1466,7 +1466,6 @@ class _ParentDossierWizardState extends State { final map = { 'genre': c.genre, 'consent_photo': true, - 'grossesse_multiple': false, }; if (prenom.length >= 2) { @@ -1723,7 +1722,6 @@ class _ParentDossierWizardState extends State { 'status': status, 'gender': gender, 'consent_photo': true, - 'is_multiple': false, }; if (prenom.length >= 2) map['first_name'] = prenom; if (nom.length >= 2) map['last_name'] = nom; diff --git a/frontend/lib/widgets/admin/common/admin_parent_edit_modal.dart b/frontend/lib/widgets/dashboard/parent_edit_modal.dart similarity index 94% rename from frontend/lib/widgets/admin/common/admin_parent_edit_modal.dart rename to frontend/lib/widgets/dashboard/parent_edit_modal.dart index 101b6a5..75a6633 100644 --- a/frontend/lib/widgets/admin/common/admin_parent_edit_modal.dart +++ b/frontend/lib/widgets/dashboard/parent_edit_modal.dart @@ -4,30 +4,30 @@ import 'package:p_tits_pas/models/parent_child_summary.dart'; import 'package:p_tits_pas/models/parent_model.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/services/user_service.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_child_detail_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_children_affiliation_panel.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_select_enfant_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_status_capsule.dart'; +import 'package:p_tits_pas/widgets/dashboard/child_detail_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/children_affiliation_panel.dart'; +import 'package:p_tits_pas/widgets/dashboard/select_enfant_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/status_capsule.dart'; import 'package:p_tits_pas/widgets/common/identity_block.dart'; -import 'package:p_tits_pas/widgets/admin/validation_modal_theme.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_modal_theme.dart'; /// Fiche parent éditable (doc 28 §6.1, tickets #131 / #138). /// Shell et typo alignés sur [ValidationDossierModal] / wizards validation. -class AdminParentEditModal extends StatefulWidget { +class ParentEditModal extends StatefulWidget { final ParentModel parent; final VoidCallback? onSaved; - const AdminParentEditModal({ + const ParentEditModal({ super.key, required this.parent, this.onSaved, }); @override - State createState() => _AdminParentEditModalState(); + State createState() => _ParentEditModalState(); } -class _AdminParentEditModalState extends State { +class _ParentEditModalState extends State { late final TextEditingController _nomCtrl; late final TextEditingController _prenomCtrl; late final TextEditingController _emailCtrl; @@ -129,7 +129,7 @@ class _AdminParentEditModalState extends State { if (!mounted) return; await showDialog( context: context, - builder: (ctx) => AdminParentEditModal( + builder: (ctx) => ParentEditModal( parent: parent, onSaved: () async { try { @@ -244,7 +244,7 @@ class _AdminParentEditModalState extends State { if (!mounted) return; await showDialog( context: context, - builder: (ctx) => AdminChildDetailModal( + builder: (ctx) => ChildDetailModal( enfant: enfant, onSaved: _reloadChildren, ), @@ -322,7 +322,7 @@ class _AdminParentEditModalState extends State { Future _attachChild() async { if (!mounted) return; - final selected = await AdminSelectEnfantModal.show( + final selected = await SelectEnfantModal.show( context, excludeIds: _children.map((c) => c.id).toSet(), title: 'Rattacher un enfant', @@ -350,7 +350,7 @@ class _AdminParentEditModalState extends State { } Widget _childrenPanel() { - return AdminChildrenAffiliationPanel( + return ChildrenAffiliationPanel( children: _children, scrollController: _childrenScrollCtrl, onOpen: _openChild, @@ -437,7 +437,7 @@ class _AdminParentEditModalState extends State { const SizedBox(width: 12), SizedBox( width: 160, - child: AdminStatusCapsule( + child: StatusCapsule( statut: _statut, onChanged: (v) => setState(() { _statut = v; diff --git a/frontend/lib/widgets/admin/parent_managmant_widget.dart b/frontend/lib/widgets/dashboard/parent_managmant_widget.dart similarity index 93% rename from frontend/lib/widgets/admin/parent_managmant_widget.dart rename to frontend/lib/widgets/dashboard/parent_managmant_widget.dart index 69b2683..938b5fc 100644 --- a/frontend/lib/widgets/admin/parent_managmant_widget.dart +++ b/frontend/lib/widgets/dashboard/parent_managmant_widget.dart @@ -4,10 +4,10 @@ import 'package:p_tits_pas/models/parent_model.dart'; import 'package:p_tits_pas/services/auth_service.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/staff_deletion_rights.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_parent_edit_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/common/user_list.dart'; +import 'package:p_tits_pas/widgets/dashboard/parent_edit_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/user_list.dart'; class ParentManagementWidget extends StatefulWidget { final String searchQuery; @@ -146,7 +146,7 @@ class _ParentManagementWidgetState extends State { itemCount: filteredParents.length, itemBuilder: (context, index) { final parent = filteredParents[index]; - return AdminUserCard( + return UserCard( title: parent.user.fullName, fallbackIcon: Icons.supervisor_account_outlined, avatarUrl: parent.user.photoUrl, @@ -189,7 +189,7 @@ class _ParentManagementWidgetState extends State { void _openParentDetails(ParentModel parent) { showDialog( context: context, - builder: (context) => AdminParentEditModal( + builder: (context) => ParentEditModal( parent: parent, onSaved: _loadParents, ), diff --git a/frontend/lib/widgets/admin/pending_validation_widget.dart b/frontend/lib/widgets/dashboard/pending_validation_widget.dart similarity index 98% rename from frontend/lib/widgets/admin/pending_validation_widget.dart rename to frontend/lib/widgets/dashboard/pending_validation_widget.dart index 4a71085..1adbdcf 100644 --- a/frontend/lib/widgets/admin/pending_validation_widget.dart +++ b/frontend/lib/widgets/dashboard/pending_validation_widget.dart @@ -3,9 +3,9 @@ import 'package:p_tits_pas/models/dossier_list_item.dart'; import 'package:p_tits_pas/models/user.dart'; import 'package:p_tits_pas/models/pending_family.dart'; import 'package:p_tits_pas/services/user_service.dart'; -import 'package:p_tits_pas/widgets/admin/dossier_list_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; -import 'package:p_tits_pas/widgets/admin/validation_dossier_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/dossier_list_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_dossier_modal.dart'; /// Section « dossiers à valider » (liste unifiée AM + familles). Ticket #107 / #153. class PendingValidationWidget extends StatefulWidget { diff --git a/frontend/lib/widgets/admin/relais_management_panel.dart b/frontend/lib/widgets/dashboard/relais_management_panel.dart similarity index 99% rename from frontend/lib/widgets/admin/relais_management_panel.dart rename to frontend/lib/widgets/dashboard/relais_management_panel.dart index f63b5fe..17275f8 100644 --- a/frontend/lib/widgets/admin/relais_management_panel.dart +++ b/frontend/lib/widgets/dashboard/relais_management_panel.dart @@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; import 'package:p_tits_pas/models/relais_model.dart'; import 'package:p_tits_pas/utils/phone_utils.dart'; import 'package:p_tits_pas/services/relais_service.dart'; -import 'package:p_tits_pas/widgets/admin/common/suppression_confirm_dialog.dart'; +import 'package:p_tits_pas/widgets/dashboard/common/suppression_confirm_dialog.dart'; class RelaisManagementPanel extends StatefulWidget { const RelaisManagementPanel({super.key}); diff --git a/frontend/lib/widgets/admin/common/admin_select_am_modal.dart b/frontend/lib/widgets/dashboard/select_am_modal.dart similarity index 91% rename from frontend/lib/widgets/admin/common/admin_select_am_modal.dart rename to frontend/lib/widgets/dashboard/select_am_modal.dart index ab46601..c0bb7c3 100644 --- a/frontend/lib/widgets/admin/common/admin_select_am_modal.dart +++ b/frontend/lib/widgets/dashboard/select_am_modal.dart @@ -3,10 +3,10 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/assistante_maternelle_model.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/am_vigilance.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_am_edit_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_select_list_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/validation_modal_theme.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_edit_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/select_list_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_modal_theme.dart'; List _amSelectSubtitleLines(AssistanteMaternelleModel am) { final lines = []; @@ -28,22 +28,22 @@ List _amSelectSubtitleLines(AssistanteMaternelleModel am) { } /// Sélection d'une AM à rattacher (fiche enfant) — ticket #147. -/// S'appuie sur [AdminSelectListModal] (shell partagé avec #146). -class AdminSelectAmModal { - AdminSelectAmModal._(); +/// S'appuie sur [SelectListModal] (shell partagé avec #146). +class SelectAmModal { + SelectAmModal._(); static Future show( BuildContext context, { Set excludeIds = const {}, String title = 'Choisir une assistante maternelle', }) { - return AdminSelectListModal.show( + return SelectListModal.show( context, title: title, searchHint: 'Rechercher par nom, prénom ou zone…', emptyMessage: 'Aucune assistante maternelle disponible', noResultsMessage: 'Aucune AM avec place libre pour cette recherche', - toggleFilter: const AdminSelectToggleFilter( + toggleFilter: const SelectToggleFilter( label: 'Libre', initialValue: true, whenEnabled: amHasFreePlace, @@ -76,7 +76,7 @@ class AdminSelectAmModal { _resolveAmSelection(ctx, am, reload), itemBuilder: (context, am, onSelect) { final full = !amHasFreePlace(am); - return AdminUserCard( + return UserCard( title: am.user.fullName, avatarUrl: am.user.photoUrl, fallbackIcon: Icons.face, @@ -150,7 +150,7 @@ class _AmNoPlaceWarningDialogState extends State<_AmNoPlaceWarningDialog> { if (!mounted) return; await showDialog( context: context, - builder: (ctx) => AdminAmEditModal( + builder: (ctx) => AmEditModal( assistante: _am, onSaved: () async { try { diff --git a/frontend/lib/widgets/admin/common/admin_select_enfant_modal.dart b/frontend/lib/widgets/dashboard/select_enfant_modal.dart similarity index 83% rename from frontend/lib/widgets/admin/common/admin_select_enfant_modal.dart rename to frontend/lib/widgets/dashboard/select_enfant_modal.dart index dafe5d4..785c04e 100644 --- a/frontend/lib/widgets/admin/common/admin_select_enfant_modal.dart +++ b/frontend/lib/widgets/dashboard/select_enfant_modal.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/enfant_admin_model.dart'; import 'package:p_tits_pas/services/user_service.dart'; import 'package:p_tits_pas/utils/enfant_status_utils.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_enfant_user_card.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_select_list_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/enfant_user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/select_list_modal.dart'; /// Sélection d'un enfant à rattacher (fiche AM / fiche parent) — ticket #146. -/// S'appuie sur [AdminSelectListModal] (shell partagé avec #147). -class AdminSelectEnfantModal { - AdminSelectEnfantModal._(); +/// S'appuie sur [SelectListModal] (shell partagé avec #147). +class SelectEnfantModal { + SelectEnfantModal._(); static Future show( BuildContext context, { @@ -17,7 +17,7 @@ class AdminSelectEnfantModal { /// Affiché uniquement depuis la fiche AM : filtre les enfants déjà en garde. bool showSansGardeFilter = false, }) { - return AdminSelectListModal.show( + return SelectListModal.show( context, title: title, searchHint: 'Rechercher par nom ou prénom…', @@ -26,7 +26,7 @@ class AdminSelectEnfantModal { ? 'Aucun enfant sans garde pour cette recherche' : 'Aucun résultat pour cette recherche', toggleFilter: showSansGardeFilter - ? AdminSelectToggleFilter( + ? SelectToggleFilter( label: 'Sans garde', initialValue: true, whenEnabled: (e) => @@ -50,7 +50,7 @@ class AdminSelectEnfantModal { return name.contains(q) || fn.contains(q) || ln.contains(q); }, itemBuilder: (context, e, onSelect) { - return AdminEnfantUserCard.fromEnfant( + return EnfantUserCard.fromEnfant( e, onCardTap: onSelect, margin: const EdgeInsets.only(bottom: 4), diff --git a/frontend/lib/widgets/admin/common/admin_select_famille_modal.dart b/frontend/lib/widgets/dashboard/select_famille_modal.dart similarity index 88% rename from frontend/lib/widgets/admin/common/admin_select_famille_modal.dart rename to frontend/lib/widgets/dashboard/select_famille_modal.dart index 4fbd3a3..abddc2e 100644 --- a/frontend/lib/widgets/admin/common/admin_select_famille_modal.dart +++ b/frontend/lib/widgets/dashboard/select_famille_modal.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/parent_model.dart'; import 'package:p_tits_pas/services/user_service.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_select_list_modal.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart'; +import 'package:p_tits_pas/widgets/dashboard/select_list_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_card.dart'; /// Foyer / famille sélectionnable pour rattacher un nouvel enfant (#132 / #157). -class AdminFamilleFoyer { +class FamilleFoyer { /// Parent pivot pour `POST /enfants` (`parent_user_id`). final String pivotParentUserId; /// Co-parent éventuel (rattachement foyer #157). @@ -14,7 +14,7 @@ class AdminFamilleFoyer { final String displayTitle; final List parentNames; - const AdminFamilleFoyer({ + const FamilleFoyer({ required this.pivotParentUserId, required this.displayTitle, required this.parentNames, @@ -42,10 +42,10 @@ class AdminFamilleFoyer { } /// Construit la liste des foyers uniques à partir de `GET /parents`. -List buildFamilleFoyers(List parents) { +List buildFamilleFoyers(List parents) { final seenDossiers = {}; final seenUserIds = {}; - final foyers = []; + final foyers = []; for (final p in parents) { final dossier = (p.user.numeroDossier ?? '').trim(); @@ -70,7 +70,7 @@ List buildFamilleFoyers(List parents) { : (names.isNotEmpty ? names.first : 'Famille'); foyers.add( - AdminFamilleFoyer( + FamilleFoyer( pivotParentUserId: p.user.id, coParentUserId: co?.id, numeroDossier: dossier.isNotEmpty ? dossier : null, @@ -87,14 +87,14 @@ List buildFamilleFoyers(List parents) { } /// Sélection d'une famille / dossier pour créer un enfant — ticket #132. -class AdminSelectFamilleModal { - AdminSelectFamilleModal._(); +class SelectFamilleModal { + SelectFamilleModal._(); - static Future show( + static Future show( BuildContext context, { String title = 'Choisir une famille', }) { - return AdminSelectListModal.show( + return SelectListModal.show( context, title: title, searchHint: 'Rechercher par dossier, nom…', @@ -111,7 +111,7 @@ class AdminSelectFamilleModal { return dossier.contains(q) || title.contains(q) || names.contains(q); }, itemBuilder: (context, f, onSelect) { - return AdminUserCard( + return UserCard( title: f.displayTitle, fallbackIcon: Icons.family_restroom, subtitleLines: [ diff --git a/frontend/lib/widgets/admin/common/admin_select_list_modal.dart b/frontend/lib/widgets/dashboard/select_list_modal.dart similarity index 95% rename from frontend/lib/widgets/admin/common/admin_select_list_modal.dart rename to frontend/lib/widgets/dashboard/select_list_modal.dart index 4fdc70c..758859f 100644 --- a/frontend/lib/widgets/admin/common/admin_select_list_modal.dart +++ b/frontend/lib/widgets/dashboard/select_list_modal.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:p_tits_pas/widgets/admin/validation_modal_theme.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_modal_theme.dart'; /// Filtre optionnel (switch) sur la même ligne que la barre de recherche. -class AdminSelectToggleFilter { +class SelectToggleFilter { final String label; final bool initialValue; @@ -10,7 +10,7 @@ class AdminSelectToggleFilter { /// [whenEnabled] renvoie `true`. final bool Function(T item) whenEnabled; - const AdminSelectToggleFilter({ + const SelectToggleFilter({ required this.label, required this.whenEnabled, this.initialValue = true, @@ -19,7 +19,7 @@ class AdminSelectToggleFilter { /// Shell générique « rechercher + liste + sélection » pour les modales admin. /// Utilisé par la sélection d'enfant (#146) et la sélection d'AM (#147). -class AdminSelectListModal extends StatefulWidget { +class SelectListModal extends StatefulWidget { final String title; final String searchHint; final Future> Function() loadItems; @@ -40,7 +40,7 @@ class AdminSelectListModal extends StatefulWidget { final int minVisibleCards; /// Switch optionnel à droite du champ de recherche (ex. « Sans garde », « Libre »). - final AdminSelectToggleFilter? toggleFilter; + final SelectToggleFilter? toggleFilter; /// Si fourni, appelé avant de valider la sélection. /// Retourne l'élément à pop (éventuellement rafraîchi), ou `null` pour annuler. @@ -50,7 +50,7 @@ class AdminSelectListModal extends StatefulWidget { Future Function() reload, )? resolveSelect; - const AdminSelectListModal({ + const SelectListModal({ super.key, required this.title, required this.loadItems, @@ -82,7 +82,7 @@ class AdminSelectListModal extends StatefulWidget { double modalWidth = 930, double cardExtent = 52, int minVisibleCards = 8, - AdminSelectToggleFilter? toggleFilter, + SelectToggleFilter? toggleFilter, Future Function( BuildContext context, T item, @@ -91,7 +91,7 @@ class AdminSelectListModal extends StatefulWidget { }) { return showDialog( context: context, - builder: (ctx) => AdminSelectListModal( + builder: (ctx) => SelectListModal( title: title, loadItems: loadItems, matchesQuery: matchesQuery, @@ -109,11 +109,11 @@ class AdminSelectListModal extends StatefulWidget { } @override - State> createState() => - _AdminSelectListModalState(); + State> createState() => + _SelectListModalState(); } -class _AdminSelectListModalState extends State> { +class _SelectListModalState extends State> { final _searchCtrl = TextEditingController(); List _all = []; bool _loading = true; diff --git a/frontend/lib/widgets/admin/common/admin_status_capsule.dart b/frontend/lib/widgets/dashboard/status_capsule.dart similarity index 95% rename from frontend/lib/widgets/admin/common/admin_status_capsule.dart rename to frontend/lib/widgets/dashboard/status_capsule.dart index a42b015..e22b665 100644 --- a/frontend/lib/widgets/admin/common/admin_status_capsule.dart +++ b/frontend/lib/widgets/dashboard/status_capsule.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; /// Gélule de sélection du statut utilisateur (fiches admin parent / AM). -class AdminStatusCapsule extends StatelessWidget { +class StatusCapsule extends StatelessWidget { final String statut; final ValueChanged? onChanged; static const statuts = ['actif', 'en_attente', 'suspendu', 'refuse']; - const AdminStatusCapsule({ + const StatusCapsule({ super.key, required this.statut, this.onChanged, diff --git a/frontend/lib/widgets/admin/common/admin_user_card.dart b/frontend/lib/widgets/dashboard/user_card.dart similarity index 97% rename from frontend/lib/widgets/admin/common/admin_user_card.dart rename to frontend/lib/widgets/dashboard/user_card.dart index 640d293..07798dd 100644 --- a/frontend/lib/widgets/admin/common/admin_user_card.dart +++ b/frontend/lib/widgets/dashboard/user_card.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/services/api/api_config.dart'; import 'package:p_tits_pas/widgets/common/auth_network_image.dart'; -class AdminUserCard extends StatefulWidget { +class UserCard extends StatefulWidget { final String title; final List subtitleLines; final String? avatarUrl; @@ -21,7 +21,7 @@ class AdminUserCard extends StatefulWidget { final EdgeInsetsGeometry? margin; final EdgeInsetsGeometry? contentPadding; - const AdminUserCard({ + const UserCard({ super.key, required this.title, required this.subtitleLines, @@ -41,10 +41,10 @@ class AdminUserCard extends StatefulWidget { }); @override - State createState() => _AdminUserCardState(); + State createState() => _UserCardState(); } -class _AdminUserCardState extends State { +class _UserCardState extends State { bool _isHovered = false; @override diff --git a/frontend/lib/widgets/admin/common/admin_list_state.dart b/frontend/lib/widgets/dashboard/user_list_state.dart similarity index 92% rename from frontend/lib/widgets/admin/common/admin_list_state.dart rename to frontend/lib/widgets/dashboard/user_list_state.dart index 41b497c..d7b9526 100644 --- a/frontend/lib/widgets/admin/common/admin_list_state.dart +++ b/frontend/lib/widgets/dashboard/user_list_state.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; -class AdminListState extends StatelessWidget { +class UserListState extends StatelessWidget { final bool isLoading; final String? error; final bool isEmpty; final String emptyMessage; final Widget list; - const AdminListState({ + const UserListState({ super.key, required this.isLoading, required this.error, diff --git a/frontend/lib/widgets/admin/user_management_panel.dart b/frontend/lib/widgets/dashboard/user_management_panel.dart similarity index 94% rename from frontend/lib/widgets/admin/user_management_panel.dart rename to frontend/lib/widgets/dashboard/user_management_panel.dart index fb22c19..800435c 100644 --- a/frontend/lib/widgets/admin/user_management_panel.dart +++ b/frontend/lib/widgets/dashboard/user_management_panel.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/screens/administrateurs/creation/gestionnaires_create.dart'; import 'package:p_tits_pas/widgets/admin/admin_management_widget.dart'; -import 'package:p_tits_pas/widgets/admin/am_dossier_create_modal.dart'; -import 'package:p_tits_pas/widgets/admin/assistante_maternelle_management_widget.dart'; -import 'package:p_tits_pas/widgets/admin/common/admin_child_detail_modal.dart'; -import 'package:p_tits_pas/widgets/admin/dashboard_admin.dart'; -import 'package:p_tits_pas/widgets/admin/dossiers_management_widget.dart'; -import 'package:p_tits_pas/widgets/admin/enfant_management_widget.dart'; -import 'package:p_tits_pas/widgets/admin/gestionnaire_management_widget.dart'; -import 'package:p_tits_pas/widgets/admin/parent_dossier_create_modal.dart'; -import 'package:p_tits_pas/widgets/admin/parent_managmant_widget.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_dossier_create_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/assistante_maternelle_management_widget.dart'; +import 'package:p_tits_pas/widgets/dashboard/child_detail_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/user_management_sub_bar.dart'; +import 'package:p_tits_pas/widgets/dashboard/dossiers_management_widget.dart'; +import 'package:p_tits_pas/widgets/dashboard/enfant_management_widget.dart'; +import 'package:p_tits_pas/widgets/dashboard/gestionnaire_management_widget.dart'; +import 'package:p_tits_pas/widgets/dashboard/parent_dossier_create_modal.dart'; +import 'package:p_tits_pas/widgets/dashboard/parent_managmant_widget.dart'; class UserManagementPanel extends StatefulWidget { /// Afficher l'onglet Administrateurs (sinon sans Administrateurs). @@ -348,7 +348,7 @@ class _UserManagementPanelState extends State { context: context, barrierDismissible: false, builder: (dialogContext) { - return AdminChildDetailModal.create( + return ChildDetailModal.create( onSaved: () { if (!mounted) return; setState(() => _enfantRefreshTick++); diff --git a/frontend/lib/widgets/admin/dashboard_admin.dart b/frontend/lib/widgets/dashboard/user_management_sub_bar.dart similarity index 100% rename from frontend/lib/widgets/admin/dashboard_admin.dart rename to frontend/lib/widgets/dashboard/user_management_sub_bar.dart diff --git a/frontend/lib/widgets/admin/validation_am_wizard.dart b/frontend/lib/widgets/dashboard/validation_am_wizard.dart similarity index 91% rename from frontend/lib/widgets/admin/validation_am_wizard.dart rename to frontend/lib/widgets/dashboard/validation_am_wizard.dart index 0edc9ac..315fec4 100644 --- a/frontend/lib/widgets/admin/validation_am_wizard.dart +++ b/frontend/lib/widgets/dashboard/validation_am_wizard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/dossier_unifie.dart'; -import 'package:p_tits_pas/widgets/admin/am_dossier_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_dossier_wizard.dart'; /// Wrapper historique (#107) — délègue à [AmDossierWizard.review]. class ValidationAmWizard extends StatelessWidget { diff --git a/frontend/lib/widgets/admin/validation_dossier_modal.dart b/frontend/lib/widgets/dashboard/validation_dossier_modal.dart similarity index 95% rename from frontend/lib/widgets/admin/validation_dossier_modal.dart rename to frontend/lib/widgets/dashboard/validation_dossier_modal.dart index fefac12..d17b4b5 100644 --- a/frontend/lib/widgets/admin/validation_dossier_modal.dart +++ b/frontend/lib/widgets/dashboard/validation_dossier_modal.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/dossier_unifie.dart'; import 'package:p_tits_pas/services/user_service.dart'; -import 'package:p_tits_pas/widgets/admin/am_dossier_wizard.dart'; -import 'package:p_tits_pas/widgets/admin/parent_dossier_wizard.dart'; -import 'package:p_tits_pas/widgets/admin/validation_am_wizard.dart'; -import 'package:p_tits_pas/widgets/admin/validation_family_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/am_dossier_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/parent_dossier_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_am_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/validation_family_wizard.dart'; /// Modale (dialog) : charge le dossier par numéro puis affiche le wizard AM ou Famille. /// Ticket #107 / #119 (review), #135 (`openAsEdit`). diff --git a/frontend/lib/widgets/admin/validation_family_wizard.dart b/frontend/lib/widgets/dashboard/validation_family_wizard.dart similarity index 91% rename from frontend/lib/widgets/admin/validation_family_wizard.dart rename to frontend/lib/widgets/dashboard/validation_family_wizard.dart index f72fc4b..a426f4d 100644 --- a/frontend/lib/widgets/admin/validation_family_wizard.dart +++ b/frontend/lib/widgets/dashboard/validation_family_wizard.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:p_tits_pas/models/dossier_unifie.dart'; -import 'package:p_tits_pas/widgets/admin/parent_dossier_wizard.dart'; +import 'package:p_tits_pas/widgets/dashboard/parent_dossier_wizard.dart'; /// Wrapper historique (#107) — délègue à [ParentDossierWizard.review]. class ValidationFamilyWizard extends StatelessWidget { diff --git a/frontend/lib/widgets/admin/validation_modal_theme.dart b/frontend/lib/widgets/dashboard/validation_modal_theme.dart similarity index 100% rename from frontend/lib/widgets/admin/validation_modal_theme.dart rename to frontend/lib/widgets/dashboard/validation_modal_theme.dart diff --git a/frontend/lib/widgets/admin/validation_refus_form.dart b/frontend/lib/widgets/dashboard/validation_refus_form.dart similarity index 100% rename from frontend/lib/widgets/admin/validation_refus_form.dart rename to frontend/lib/widgets/dashboard/validation_refus_form.dart diff --git a/frontend/lib/widgets/admin/validation_valider_confirm_dialog.dart b/frontend/lib/widgets/dashboard/validation_valider_confirm_dialog.dart similarity index 100% rename from frontend/lib/widgets/admin/validation_valider_confirm_dialog.dart rename to frontend/lib/widgets/dashboard/validation_valider_confirm_dialog.dart diff --git a/tests/scripts/register-parent-durand-rousseau-test.mjs b/tests/scripts/register-parent-durand-rousseau-test.mjs index 8dcfcbb..e8862eb 100644 --- a/tests/scripts/register-parent-durand-rousseau-test.mjs +++ b/tests/scripts/register-parent-durand-rousseau-test.mjs @@ -74,8 +74,7 @@ try { date_naissance: '2022-04-20', genre: 'F', photo_base64: toDataUri(chloeJpg), - photo_filename: 'chloe_rousseau.jpg', - grossesse_multiple: false, + photo_filename: 'chloe_rousseau.jpg' }, { prenom: 'Hugo', @@ -83,8 +82,7 @@ try { date_naissance: '2024-03-10', genre: 'H', photo_base64: toDataUri(hugoJpg), - photo_filename: 'hugo_rousseau.jpg', - grossesse_multiple: false, + photo_filename: 'hugo_rousseau.jpg' }, ], presentation_dossier: presentationDossier, diff --git a/tests/scripts/register-parent-lecomte-test.mjs b/tests/scripts/register-parent-lecomte-test.mjs index a03a7ab..fa7817b 100644 --- a/tests/scripts/register-parent-lecomte-test.mjs +++ b/tests/scripts/register-parent-lecomte-test.mjs @@ -40,8 +40,7 @@ const body = { date_naissance: '2023-04-15', genre: 'H', photo_base64: toDataUri(path.join(photosDir, 'lecomte-maxime.png')), - photo_filename: 'maxime_lecomte.png', - grossesse_multiple: false, + photo_filename: 'maxime_lecomte.png' }, ], presentation_dossier: presentationDossier, diff --git a/tests/scripts/register-parent-martin-test.mjs b/tests/scripts/register-parent-martin-test.mjs index 0232b38..46c5091 100644 --- a/tests/scripts/register-parent-martin-test.mjs +++ b/tests/scripts/register-parent-martin-test.mjs @@ -46,8 +46,7 @@ const body = { date_naissance: '2023-02-15', genre: 'F', photo_base64: toDataUri(path.join(photosDir, 'martin-emma.png')), - photo_filename: 'emma_martin.png', - grossesse_multiple: true, + photo_filename: 'emma_martin.png' }, { prenom: 'Noah', @@ -55,8 +54,7 @@ const body = { date_naissance: '2023-02-15', genre: 'H', photo_base64: toDataUri(path.join(photosDir, 'martin-noah.png')), - photo_filename: 'noah_martin.png', - grossesse_multiple: true, + photo_filename: 'noah_martin.png' }, { prenom: 'Léa', @@ -64,8 +62,7 @@ const body = { date_naissance: '2023-02-15', genre: 'F', photo_base64: toDataUri(path.join(photosDir, 'martin-lea.png')), - photo_filename: 'lea_martin.png', - grossesse_multiple: true, + photo_filename: 'lea_martin.png' }, ], presentation_dossier: presentationDossier,