From d9a3e117b26f056add6d47a49dd421b47d2c6db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 3 Jun 2021 18:11:05 +0200 Subject: [PATCH] WIP continue editor --- .../Controller/HouseholdMemberController.php | 30 +++++-- .../vuejs/HouseholdMembersEditor/App.vue | 6 +- .../components/Concerned.vue | 53 ++++++++---- .../components/Household.vue | 70 ++++++++++++++++ .../components/MemberDetails.vue | 51 +++++++++++ .../vuejs/HouseholdMembersEditor/js/i18n.js | 12 ++- .../HouseholdMembersEditor/store/index.js | 84 ++++++++++++++++--- 7 files changed, 274 insertions(+), 32 deletions(-) create mode 100644 src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue create mode 100644 src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/MemberDetails.vue diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php index e55fb3e9f..24d77467d 100644 --- a/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php +++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php @@ -5,6 +5,7 @@ namespace Chill\PersonBundle\Controller; use Chill\PersonBundle\Entity\Household\Position; use Chill\PersonBundle\Security\Authorization\PersonVoter; use Chill\PersonBundle\Entity\Person; +use Chill\PersonBundle\Entity\Household\Household; use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -57,6 +58,8 @@ class HouseholdMemberController extends ApiController */ public function editor(Request $request) { + $em = $this->getDoctrine()->getManager(); + if ($request->query->has('persons')) { $ids = $request->query->get('persons', []); @@ -65,8 +68,7 @@ class HouseholdMemberController extends ApiController "is not an array or empty"); } - $persons = $this->getDoctrine()->getManager() - ->getRepository(Person::class) + $persons = $em->getRepository(Person::class) ->findById($ids) ; @@ -77,6 +79,20 @@ class HouseholdMemberController extends ApiController } } + if ($householdId = $request->query->get('household', false)) { + $household = $em->getRepository(Household::class) + ->find($householdId) + ; + $allowHouseholdCreate = false; + $allowHouseholdSearch = false; + $allowLeaveWithoutHousehold = false; + + if (NULL === $household) { + throw $this->createNotFoundException('household not found'); + } + // TODO ACL on household + } + $positions = $this->getDoctrine()->getManager() ->getRepository(Position::class) ->findAll() @@ -84,10 +100,14 @@ class HouseholdMemberController extends ApiController $data = [ 'persons' => $persons ?? false ? - $this->getSerializer()->normalize($persons, 'json', [ 'groups' => [ 'read' ]]): [], - 'household' => null, + $this->getSerializer()->normalize($persons, 'json', [ 'groups' => [ 'read' ]]) : [], + 'household' => $household ?? false ? + $this->getSerializer()->normalize($household, 'json', [ 'groups' => [ 'read' ]]) : null, 'positions' => - $this->getSerializer()->normalize($positions, 'json', [ 'groups' => [ 'read' ]]) + $this->getSerializer()->normalize($positions, 'json', [ 'groups' => [ 'read' ]]), + 'allowHouseholdCreate' => $allowHouseholdCreate ?? true, + 'allowHouseholdSearch' => $allowHouseholdSearch ?? true, + 'allowLeaveWithoutHousehold' => $allowLeaveWithoutHousehold ?? $request->query->has('allow_leave_without_household'), ]; return $this->render('@ChillPerson/Household/members_editor.html.twig', [ diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue index a658a06db..e5d84e920 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue @@ -1,15 +1,19 @@ diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue new file mode 100644 index 000000000..81aced606 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Household.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/MemberDetails.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/MemberDetails.vue new file mode 100644 index 000000000..cfefa9654 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/MemberDetails.vue @@ -0,0 +1,51 @@ + + + + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js index d297ba1d7..c7724daff 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js @@ -5,10 +5,18 @@ const appMessages = { fr: { household_members_editor: { concerned: { - title: "Personnes concernées", + title: "Usagers concernés", add_persons: "Ajouter d'autres usagers", search: "Rechercher des usagers", - } + move_to: "Déplacer vers", + }, + holder: "Titulaire du ménage", + remove_position: "Retirer des {position}", + remove_concerned: "Enlever du ménage", + household_part: "Ménage de destination", + new_household: "Nouveau ménage", + create_household: "Créer un ménage", + search_household: "Chercher un ménage", } } }; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js index 257a46e57..f5db83c66 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js @@ -6,7 +6,8 @@ const concerned = window.household_members_editor_data.persons.map(p => { return { person: p, position: null, - start_date: null + start_date: null, + allowRemove: false, }; }); @@ -16,17 +17,31 @@ const store = createStore({ concerned, household: window.household_members_editor_data.household, positions: window.household_members_editor_data.positions, + allowHouseholdCreate: window.household_members_editor_data.allowHouseholdCreate, + allowHouseholdSearch: window.household_members_editor_data.allowHouseholdSearch, + allowLeaveWithoutHousehold: window.household_members_editor_data.allowLeaveWithoutHousehold, + forceLeaveWithoutHousehold: false }, getters: { + isHouseholdNew(state) { + console.log('isHouseholdNew', !Number.isInteger(state.household.id)); + console.log('household', state.household); + return !Number.isInteger(state.household.id); + }, + hasHousehold(state) { + return state.household !== null; + }, persons(state) { return state.concerned.map(conc => conc.person); }, - personsUnpositionned(state) { + concUnpositionned(state) { return state.concerned .filter(conc => conc.position === null) - .map(conc => conc.person) ; }, + positions(state) { + return state.positions; + }, personByPosition: (state) => (position_id) => { return state.concerned .filter(conc => @@ -35,14 +50,28 @@ const store = createStore({ .map(conc => conc.person) ; }, - positions(state) { - return state.positions; - } + concByPosition: (state) => (position_id) => { + return state.concerned + .filter(conc => + conc.position !== null ? conc.position.id === position_id : false + ) + ; + }, + concByPersonId: (state) => (person_id) => { + return state.concerned + .find(conc => conc.person.id === person_id) + ; + }, }, mutations: { addConcerned(state, person) { - console.log('from mutation addConcerned'); - state.concerned.push({ person, position: null, start_date: null }); + let persons = state.concerned.map(conc => conc.person.id); + if (!persons.includes(person.id)) { + state.concerned.push({ person, position: null, + start_date: null, allowRemove: true }); + } else { + console.err("person already included"); + } }, markPosition(state, { person_id, position_id}) { console.log('from mutation markPosition'); @@ -55,7 +84,27 @@ const store = createStore({ console.log(position); console.log(conc); conc.position = position; - } + }, + toggleHolder(state, conc) { + console.log('toggleHolder', conc); + conc.holder = !conc.holder; + }, + removePosition(state, conc) { + conc.holder = false; + conc.position = null; + }, + removeConcerned(state, conc) { + state.concerned = state.concerned.filter(c => + c.person.id !== conc.person.id + ) + }, + createHousehold(state) { + state.household = { type: 'household', members: [], address: null } + }, + forceLeaveWithoutHousehold(state) { + state.household = null; + state.forceLeaveWithoutHousehold = true; + }, }, actions: { addConcerned({ commit }, person) { @@ -67,7 +116,22 @@ const store = createStore({ console.log('person_id', person_id); console.log('position_id', position_id); commit('markPosition', { person_id, position_id }); - } + }, + toggleHolder({ commit }, conc) { + commit('toggleHolder', conc); + }, + removePosition({ commit }, conc) { + commit('removePosition', conc); + }, + removeConcerned({ commit }, conc) { + commit('removeConcerned', conc); + }, + createHousehold({ commit }) { + commit('createHousehold'); + }, + forceLeaveWithoutHousehold({ commit }) { + commit('forceLeaveWithoutHousehold'); + }, } });