From e36268670714126d190fdd6b9cf2bef05af2ae9b Mon Sep 17 00:00:00 2001 From: Quentin Guillemin Date: Fri, 15 Dec 2023 10:29:56 +0100 Subject: [PATCH] feat: add quick add --- .../java/fr/recia/glc/db/dto/AlertDto.java | 1 + .../education/DisciplineRepository.java | 3 + .../fonction/FonctionRepository.java | 2 +- .../TypeFonctionFiliereRepository.java | 3 + .../glc/pojo/JsonAdditionalFonctionBody.java | 1 + .../glc/services/db/FonctionService.java | 17 +++ .../glc/web/rest/EtablissementController.java | 4 +- .../glc/web/rest/PersonneController.java | 7 +- .../webapp/src/components/AlertManager.vue | 63 +++++++++ .../src/components/dialogs/QuickAddDialog.vue | 122 ++++++++++++++++++ .../webapp/src/locales/en/additionals.json | 8 ++ .../webapp/src/locales/fr/additionals.json | 8 ++ .../webapp/src/services/personneService.ts | 14 +- .../webapp/src/stores/configurationStore.ts | 11 ++ src/main/webapp/src/types/alertType.ts | 1 + src/main/webapp/src/views/StructureView.vue | 2 + .../src/views/structure/DashboardView.vue | 11 +- 17 files changed, 264 insertions(+), 14 deletions(-) create mode 100644 src/main/webapp/src/components/AlertManager.vue create mode 100644 src/main/webapp/src/components/dialogs/QuickAddDialog.vue diff --git a/src/main/java/fr/recia/glc/db/dto/AlertDto.java b/src/main/java/fr/recia/glc/db/dto/AlertDto.java index e30b4dbd..2a42b45d 100644 --- a/src/main/java/fr/recia/glc/db/dto/AlertDto.java +++ b/src/main/java/fr/recia/glc/db/dto/AlertDto.java @@ -25,5 +25,6 @@ public class AlertDto { private String title; private String text; private AlertType type; + private boolean action; } diff --git a/src/main/java/fr/recia/glc/db/repositories/education/DisciplineRepository.java b/src/main/java/fr/recia/glc/db/repositories/education/DisciplineRepository.java index c074c4c6..00afb5fa 100644 --- a/src/main/java/fr/recia/glc/db/repositories/education/DisciplineRepository.java +++ b/src/main/java/fr/recia/glc/db/repositories/education/DisciplineRepository.java @@ -65,4 +65,7 @@ public interface DisciplineRepository extends AbstractRepo "ORDER BY d.source") List findAllNonSarapisSources(); + @Query(value = "select d.id from discipline d where d.code = :code and (d.source = :source or d.source = CONCAT('SarapisUi_', :source))", nativeQuery = true) + Long findByCode(String code, String source); + } diff --git a/src/main/java/fr/recia/glc/db/repositories/fonction/FonctionRepository.java b/src/main/java/fr/recia/glc/db/repositories/fonction/FonctionRepository.java index 86f4037f..db2d2b88 100644 --- a/src/main/java/fr/recia/glc/db/repositories/fonction/FonctionRepository.java +++ b/src/main/java/fr/recia/glc/db/repositories/fonction/FonctionRepository.java @@ -76,7 +76,7 @@ public interface FonctionRepository extends AbstractReposito "inner join typefonctionfiliere tff on f.filiere_fk = tff.id " + "inner join discipline d on f.discipline_poste_fk = d.id " + "where f.astructure_fk = :structureId " + - "and (tff.codeFiliere != '-' and d.code != '-' and f.discipline_poste_fk is not null) " + + "and (tff.codeFiliere != '-' and d.code != '-' and f.discipline_poste_fk is not null) " + "group by af.personne_fk " + "having count(f.filiere_fk) > 0" + ") " + diff --git a/src/main/java/fr/recia/glc/db/repositories/fonction/TypeFonctionFiliereRepository.java b/src/main/java/fr/recia/glc/db/repositories/fonction/TypeFonctionFiliereRepository.java index 4bee2c83..045e0617 100644 --- a/src/main/java/fr/recia/glc/db/repositories/fonction/TypeFonctionFiliereRepository.java +++ b/src/main/java/fr/recia/glc/db/repositories/fonction/TypeFonctionFiliereRepository.java @@ -64,4 +64,7 @@ public interface TypeFonctionFiliereRepository ex "ORDER BY tff.libelleFiliere") List findWithoutSource(); + @Query(value = "select tff.id from typefonctionfiliere tff where tff.codeFiliere = :code and (tff.source = :source OR tff.source = CONCAT('SarapisUi_', :source))", nativeQuery = true) + Long findByCode(String code, String source); + } diff --git a/src/main/java/fr/recia/glc/pojo/JsonAdditionalFonctionBody.java b/src/main/java/fr/recia/glc/pojo/JsonAdditionalFonctionBody.java index 088d51ce..0c793483 100644 --- a/src/main/java/fr/recia/glc/pojo/JsonAdditionalFonctionBody.java +++ b/src/main/java/fr/recia/glc/pojo/JsonAdditionalFonctionBody.java @@ -24,5 +24,6 @@ public class JsonAdditionalFonctionBody { private Long structureId; private List additional; + private String additionalCode; } diff --git a/src/main/java/fr/recia/glc/services/db/FonctionService.java b/src/main/java/fr/recia/glc/services/db/FonctionService.java index 63020968..5213e041 100644 --- a/src/main/java/fr/recia/glc/services/db/FonctionService.java +++ b/src/main/java/fr/recia/glc/services/db/FonctionService.java @@ -232,6 +232,23 @@ public List getPersonnesWithoutFunctions(Long structureId) { return aPersonneRepository.findByPersonneIds(new HashSet<>(personnesIds)); } + public boolean saveAdditionalFonction(Long personneId, Long structureId, String additional) { + SimplePersonneDto personne = personneService.getPersonneSimple(personneId); + if (personne == null) return false; + if (!List.of(Etat.Invalide, Etat.Valide, Etat.Bloque).contains(personne.getEtat())) return false; + String source = personne.getSource().startsWith(Constants.SARAPISUI_) + ? personne.getSource().substring(Constants.SARAPISUI_.length()) + : personne.getSource(); + + final String[] split = additional.split("-"); + final Long filiere = typeFonctionFiliereRepository.findByCode(split[0], source); + final Long discipline = disciplineRepository.findByCode(split[1], source); + final String fonction = filiere + "-" + discipline; + log.debug("==>\n - {}\n - {}\n - {}\n<==", split, source, fonction); + + return saveAdditionalFonctions(personneId, structureId, List.of(fonction)); + } + public boolean saveAdditionalFonctions(Long personneId, Long structureId, List additional) { SimplePersonneDto personne = personneService.getPersonneSimple(personneId); if (personne == null) return false; diff --git a/src/main/java/fr/recia/glc/web/rest/EtablissementController.java b/src/main/java/fr/recia/glc/web/rest/EtablissementController.java index 02afb7dd..5ccfcbc0 100644 --- a/src/main/java/fr/recia/glc/web/rest/EtablissementController.java +++ b/src/main/java/fr/recia/glc/web/rest/EtablissementController.java @@ -176,8 +176,8 @@ public ResponseEntity getEtablissement(@PathVariable Long id) etablissement.setWithoutFunctions(withoutFunction); List alerts = new ArrayList<>(); - if (!fonctionService.isDiscipline(id, "GEST")) alerts.add(AlertDto.builder().title("ADF.GEST").type(AlertType.error).build()); - if (!fonctionService.isDiscipline(id, "D0010")) alerts.add(AlertDto.builder().title("DIR.D0010").type(AlertType.error).build()); + if (!fonctionService.isDiscipline(id, "GEST")) alerts.add(AlertDto.builder().title("ADF.GEST").type(AlertType.error).action(true).build()); + if (!fonctionService.isDiscipline(id, "D0010")) alerts.add(AlertDto.builder().title("DIR.D0010").type(AlertType.error).action(true).build()); etablissement.setAlerts(alerts); List fonctions = fonctionService.getStructureFonctions(id); diff --git a/src/main/java/fr/recia/glc/web/rest/PersonneController.java b/src/main/java/fr/recia/glc/web/rest/PersonneController.java index 63aae2b9..351af56a 100644 --- a/src/main/java/fr/recia/glc/web/rest/PersonneController.java +++ b/src/main/java/fr/recia/glc/web/rest/PersonneController.java @@ -97,7 +97,12 @@ public ResponseEntity setPersonneAdditionalFonctions(@PathVariable Long id, @Req throw new AccessDeniedException("Access is denied to anonymous !"); } - boolean success = fonctionService.saveAdditionalFonctions(id, body.getStructureId(), body.getAdditional()); + boolean success; + if (body.getAdditionalCode() == null) { + success = fonctionService.saveAdditionalFonctions(id, body.getStructureId(), body.getAdditional()); + } else { + success = fonctionService.saveAdditionalFonction(id, body.getStructureId(), body.getAdditionalCode()); + } if (!success) return new ResponseEntity<>(HttpStatus.BAD_REQUEST); return new ResponseEntity<>(HttpStatus.OK); diff --git a/src/main/webapp/src/components/AlertManager.vue b/src/main/webapp/src/components/AlertManager.vue new file mode 100644 index 00000000..aa909f33 --- /dev/null +++ b/src/main/webapp/src/components/AlertManager.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/main/webapp/src/components/dialogs/QuickAddDialog.vue b/src/main/webapp/src/components/dialogs/QuickAddDialog.vue new file mode 100644 index 00000000..e1bc3143 --- /dev/null +++ b/src/main/webapp/src/components/dialogs/QuickAddDialog.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/main/webapp/src/locales/en/additionals.json b/src/main/webapp/src/locales/en/additionals.json index fdea8ae9..d5474a25 100644 --- a/src/main/webapp/src/locales/en/additionals.json +++ b/src/main/webapp/src/locales/en/additionals.json @@ -5,6 +5,14 @@ }, "fonction": { "add": "Manage additional functions" + }, + "add": { + "ADF": { + "GEST": "Add a manager" + }, + "DIR": { + "D0010": "Add a director" + } } } } diff --git a/src/main/webapp/src/locales/fr/additionals.json b/src/main/webapp/src/locales/fr/additionals.json index 0d6c4989..43ee9a03 100644 --- a/src/main/webapp/src/locales/fr/additionals.json +++ b/src/main/webapp/src/locales/fr/additionals.json @@ -5,6 +5,14 @@ }, "fonction": { "add": "Gestion des fonctions complémentaires" + }, + "add": { + "ADF": { + "GEST": "Ajouter un Gestionnaire" + }, + "DIR": { + "D0010": "Ajouter un directeur" + } } } } diff --git a/src/main/webapp/src/services/personneService.ts b/src/main/webapp/src/services/personneService.ts index 3f426de7..7113b8db 100644 --- a/src/main/webapp/src/services/personneService.ts +++ b/src/main/webapp/src/services/personneService.ts @@ -7,4 +7,16 @@ const searchPersonne = async (name: string) => await axios.get(`/api/personne?na const setPersonneAdditional = async (id: number, structureId: number, additional: Array) => await axios.post(`/api/personne/${id}/fonction`, { structureId, additional }); -export { getPersonne, searchPersonne, setPersonneAdditional }; +const setPersonneAdditionalWithId = async (id: number, structureId: number, additional: string) => + await setPersonneAdditional(id, structureId, [additional]); + +const setPersonneAdditionalWithCode = async (id: number, structureId: number, additionalCode: string) => + await axios.post(`/api/personne/${id}/fonction`, { structureId, additionalCode }); + +export { + getPersonne, + searchPersonne, + setPersonneAdditional, + setPersonneAdditionalWithId, + setPersonneAdditionalWithCode, +}; diff --git a/src/main/webapp/src/stores/configurationStore.ts b/src/main/webapp/src/stores/configurationStore.ts index 1a9741d2..d67d5210 100644 --- a/src/main/webapp/src/stores/configurationStore.ts +++ b/src/main/webapp/src/stores/configurationStore.ts @@ -3,6 +3,7 @@ import type { Configuration } from '@/types/configurationType.ts'; import type { enumValues } from '@/types/enumValuesType.ts'; import { Tabs } from '@/types/enums/Tabs.ts'; import type { Identity } from '@/types/identityType.ts'; +import type { SimplePersonne } from '@/types/personneType.ts'; import type { StructureConfiguration } from '@/types/structureConfigurationType.ts'; import { getEtat } from '@/utils/accountUtils.ts'; import { errorHandler } from '@/utils/axiosUtils.ts'; @@ -120,6 +121,14 @@ export const useConfigurationStore = defineStore('configuration', () => { const isAdditional = ref(false); const isAddMode = ref(false); + const isQuickAdd = ref(false); + const requestAdd = ref<{ + i18n?: string; + function?: string; + type: 'id' | 'code'; + searchList?: Array; + }>(); + /* -- Gestion de l'authentification -- */ const identity = ref(); @@ -144,6 +153,8 @@ export const useConfigurationStore = defineStore('configuration', () => { isLoading, isAdditional, isAddMode, + isQuickAdd, + requestAdd, identity, isAuthenticated, }; diff --git a/src/main/webapp/src/types/alertType.ts b/src/main/webapp/src/types/alertType.ts index 06dcf0f5..eec0e367 100644 --- a/src/main/webapp/src/types/alertType.ts +++ b/src/main/webapp/src/types/alertType.ts @@ -2,4 +2,5 @@ export type Alert = { title?: string; text?: string; type: 'success' | 'info' | 'warning' | 'error'; + action: boolean; }; diff --git a/src/main/webapp/src/views/StructureView.vue b/src/main/webapp/src/views/StructureView.vue index 13bf6304..bddb2640 100644 --- a/src/main/webapp/src/views/StructureView.vue +++ b/src/main/webapp/src/views/StructureView.vue @@ -1,6 +1,7 @@