diff --git a/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js b/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js index dc4f9da6c..625103ebe 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js +++ b/src/Bundle/ChillMainBundle/Resources/public/lib/api/download.js @@ -21,10 +21,8 @@ const fetchResults = async (uri, params) => { let promises = [], page = 1; let firstData = await _fetchAction(page, uri, params); - console.log('firstData', firstData); promises.push(Promise.resolve(firstData.results)); - console.log('more ?', firstData.pagination.more); if (firstData.pagination.more) { do { diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue index ff1cab206..c2112007f 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/App.vue @@ -1,34 +1,127 @@ - - - - + + + {{ $t('household_members_editor.app.steps.'+s) }} + + + + + + + + + + + + + {{ $t('household_members_editor.app.cancel') }} + + + + + {{ $t('household_members_editor.app.next') }} + + + + + {{ $t('household_members_editor.app.save') }} + + + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/CurrentHousehold.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/CurrentHousehold.vue new file mode 100644 index 000000000..01667eab7 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/CurrentHousehold.vue @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue index be332523d..c40cc9cbc 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Dates.vue @@ -1,5 +1,8 @@ - {{ $t('household_members_editor.dates_title') }} + + + + {{ $t('household_members_editor.dates.dates_title') }} @@ -11,8 +14,13 @@ + + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Positioning.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Positioning.vue new file mode 100644 index 000000000..18bf0764d --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Positioning.vue @@ -0,0 +1,106 @@ + + + + {{ $t('household_members_editor.positioning.persons_to_positionnate')}} + + + + + + + + + + {{ $t('household_members_editor.positioning.holder') }} + + + + + {{ position.label.fr }} + + + + + + + + + + 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 c2d1d3dc3..5db77da0b 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js @@ -5,65 +5,78 @@ const appMessages = { fr: { household_members_editor: { household: { - no_household_choose_one: "Aucun ménage de destination. Choisissez un ménage. Les usagers concernés par la modification apparaitront ensuite.", - new_household: "Nouveau ménage", + no_household_choose_one: "Aucun ménage de destination. Choisissez un ménage.", +// new_household: "Nouveau ménage", create_household: "Créer", search_household: "Chercher un ménage", will_leave_any_household: "Les usagers ne rejoignent pas de ménage", leave: "Quitter", will_leave_any_household_explanation: "Les usagers quitteront leur ménage actuel, et ne seront pas associés à un autre ménage. Par ailleurs, ils seront enregistrés comme étant sans adresse connue.", leave_without_household: "Sans nouveau ménage", - set_address: "Indiquer une adresse", reset_mode: "Modifier la destination", - remove_address: "Supprimer l'adresse", - update_address: "Mettre à jour l'adresse", // remove ? /* where_live_the_household: "À quelle adresse habite ce ménage ?", household_live_to_this_address: "Sélectionner l'adresse", no_suggestions: "Aucune adresse à suggérer", - delete_this_address: "Supprimer cette adresse", - create_new_address: "Créer une nouvelle adresse", or_create_new_address: "Ou créer une nouvelle adresse", */ // end remove ? }, + household_address: { + mark_no_address: "Ne pas indiquer d'adresse", + remove_address: "Supprimer l'adresse", + update_address: "Mettre à jour l'adresse", + set_address: "Indiquer une adresse", + create_new_address: "Créer une nouvelle adresse", + }, concerned: { - title: "Nouveaux membres du ménage", + title: "Usagers déplacés", + persons_will_be_moved: "Les usagers suivants vont être déplacés", + add_at_least_onePerson: "Indiquez au moins un usager à déplacer", + remove_concerned: "Ne plus transférer", + // old ? add_persons: "Ajouter d'autres usagers", search: "Rechercher des usagers", move_to: "Déplacer vers", - persons_to_positionnate: 'Usagers à positionner', persons_leaving: "Usagers quittant leurs ménages", no_person_in_position: "Aucun usager ne sera ajouté à cette position", + }, + positioning: { + persons_to_positionnate: 'Usagers à positionner', + holder: "Titulaire", + }, + app: { + next: 'Suivant', + cancel: 'Annuler', + save: 'Enregistrer', + steps: { + concerned: 'Usagers concernés', + household: 'Ménage de destination', + household_address: 'Adresse du nouveau ménage', + positioning: 'Position dans le ménage', + confirm: 'Confirmation' + } }, drop_persons_here: "Glissez-déposez ici les usagers pour la position \"{position}\"", all_positionnated: "Tous les usagers sont positionnés", - holder: "Titulaire", - is_holder: "Est titulaire", - is_not_holder: "N'est pas titulaire", - remove_position: "Retirer des {position}", - remove_concerned: "Ne plus transférer", household_part: "Destination", suggestions: "Suggestions", hide_household_suggestion: "Masquer les suggestions", show_household_suggestion: 'Aucune suggestion | Afficher une suggestion | Afficher {count} suggestions', household_for_participants_accompanying_period: "Des ménages partagent le même parcours", select_household: "Sélectionner le ménage", - dates_title: "Période de validité", dates: { start_date: "Début de validité", end_date: "Fin de validité", + dates_title: "Période de validité", }, confirmation: { save: "Enregistrer", there_are_warnings: "Impossible de valider actuellement", check_those_items: "Veuillez corriger les éléments suivants", }, - give_a_position_to_every_person: "Indiquez une position pour chaque usager concerné", - add_destination: "Indiquez un ménage de destination", - add_at_least_onePerson: "Indiquez au moins un usager à transférer", } } }; 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 e4b9250f4..e15d79349 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js @@ -43,6 +43,10 @@ const store = createStore({ allowHouseholdSearch: window.household_members_editor_data.allowHouseholdSearch, allowLeaveWithoutHousehold: window.household_members_editor_data.allowLeaveWithoutHousehold, forceLeaveWithoutHousehold: false, + /** + * If true, the user explicitly said that no address is possible + */ + forceHouseholdNoAddress: false, /** * Household suggestions * @@ -80,6 +84,9 @@ const store = createStore({ isModeLeave(state) { return state.mode === "leave"; }, + isHouseholdForceNoAddress(state) { + return state.forceHouseholdNoAddress; + }, getSuggestions(state) { let suggestions = []; state.householdSuggestionByAccompanyingPeriod.forEach(h => { @@ -90,15 +97,12 @@ const store = createStore({ }, isHouseholdNew(state) { return state.mode === "new"; - /* - if (state.household === null) { - return false; - } - return !Number.isInteger(state.household.id); - - */ }, getAddressContext(state, getters) { + if (state.household === null) { + return {}; + } + if (!getters.hasHouseholdAddress) { return { edit: false, @@ -203,6 +207,40 @@ const store = createStore({ needsPositionning(state) { return state.forceLeaveWithoutHousehold === false; }, + fakeHouseholdWithConcerned(state, getters) { + if (null === state.household) { + throw Error('cannot create fake household without household'); + } + let h = { + type: 'household', + members: state.household.members, + current_address: state.household.current_address, + current_members_id: state.household.current_members_id, + new_members: [], + }; + + if (!getters.isHouseholdNew){ + h.id = state.household.id; + } + + state.concerned.forEach((c, index) => { + let m = { + id: index * -1, + person: c.person, + holder: c.holder, + position: c.position, + }; + if (c.position === null) { + m.position = { + ordering: 999999 + } + } + h.new_members.push(m); + }) + + console.log('fake household', h); + return h; + }, buildPayload: (state, getters) => { let conc, @@ -277,6 +315,10 @@ const store = createStore({ position = state.positions.find(pos => pos.id === position_id), conc = state.concerned.find(c => c.person.id === person_id); conc.position = position; + // reset position if changed: + if (!position.allowHolder && conc.holder) { + conc.holder = false; + } }, setComment(state, {conc, comment}) { conc.comment = comment; @@ -288,9 +330,9 @@ const store = createStore({ conc.holder = false; conc.position = null; }, - removeConcerned(state, conc) { + removePerson(state, person) { state.concerned = state.concerned.filter(c => - c.person.id !== conc.person.id + c.person.id !== person.id ) }, createHousehold(state) { @@ -315,6 +357,7 @@ const store = createStore({ } state.household.current_address = address; + state.forceHouseholdNoAddress = false; }, removeHouseholdAddress(state, address) { if (null === state.household) { @@ -324,6 +367,9 @@ const store = createStore({ state.household.current_address = null; }, + markHouseholdNoAddress(state) { + state.forceHouseholdNoAddress = true; + }, forceLeaveWithoutHousehold(state) { state.household = null; state.mode = "leave"; @@ -389,8 +435,8 @@ const store = createStore({ commit('removePosition', conc); dispatch('computeWarnings'); }, - removeConcerned({ commit, dispatch }, conc) { - commit('removeConcerned', conc); + removePerson({ commit, dispatch }, person) { + commit('removePerson', person); dispatch('computeWarnings'); dispatch('fetchAddressSuggestions'); }, diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue index c15938c4f..16d0fa2ff 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue @@ -19,15 +19,18 @@ - + + + + - + {{ $t('no_members_yet') }} @@ -82,7 +85,7 @@ export default { return this.household.current_members_id.length > 0; }, currentMembers() { - return this.household.members.filter(m => this.household.current_members_id.includes(m.id)) + let members = this.household.members.filter(m => this.household.current_members_id.includes(m.id)) .sort((a, b) => { if (a.position.ordering < b.position.ordering) { return -1; @@ -98,6 +101,17 @@ export default { } return 0; }); + + if (this.household.new_members !== undefined) { + this.household.new_members.map(m => { + m.is_new = true; + return m; + }).forEach(m => { + members.push(m); + }); + } + + return members; }, currentMembersLength() { return this.household.current_members_id.length; @@ -121,6 +135,13 @@ section.chill-entity { content: ''; } + .members { + .post-badge.is_new { + margin-left: 0.5rem; + color: var(--bs-chill-green); + } + } + } } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue index 2bc5f0b3b..f74cd4587 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue @@ -126,6 +126,7 @@ {{ person.text }} +
@@ -11,8 +14,13 @@ + + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Positioning.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Positioning.vue new file mode 100644 index 000000000..18bf0764d --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/components/Positioning.vue @@ -0,0 +1,106 @@ + + + + {{ $t('household_members_editor.positioning.persons_to_positionnate')}} + + + + + + + + + + {{ $t('household_members_editor.positioning.holder') }} + + + + + {{ position.label.fr }} + + + + + + + + + + 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 c2d1d3dc3..5db77da0b 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/js/i18n.js @@ -5,65 +5,78 @@ const appMessages = { fr: { household_members_editor: { household: { - no_household_choose_one: "Aucun ménage de destination. Choisissez un ménage. Les usagers concernés par la modification apparaitront ensuite.", - new_household: "Nouveau ménage", + no_household_choose_one: "Aucun ménage de destination. Choisissez un ménage.", +// new_household: "Nouveau ménage", create_household: "Créer", search_household: "Chercher un ménage", will_leave_any_household: "Les usagers ne rejoignent pas de ménage", leave: "Quitter", will_leave_any_household_explanation: "Les usagers quitteront leur ménage actuel, et ne seront pas associés à un autre ménage. Par ailleurs, ils seront enregistrés comme étant sans adresse connue.", leave_without_household: "Sans nouveau ménage", - set_address: "Indiquer une adresse", reset_mode: "Modifier la destination", - remove_address: "Supprimer l'adresse", - update_address: "Mettre à jour l'adresse", // remove ? /* where_live_the_household: "À quelle adresse habite ce ménage ?", household_live_to_this_address: "Sélectionner l'adresse", no_suggestions: "Aucune adresse à suggérer", - delete_this_address: "Supprimer cette adresse", - create_new_address: "Créer une nouvelle adresse", or_create_new_address: "Ou créer une nouvelle adresse", */ // end remove ? }, + household_address: { + mark_no_address: "Ne pas indiquer d'adresse", + remove_address: "Supprimer l'adresse", + update_address: "Mettre à jour l'adresse", + set_address: "Indiquer une adresse", + create_new_address: "Créer une nouvelle adresse", + }, concerned: { - title: "Nouveaux membres du ménage", + title: "Usagers déplacés", + persons_will_be_moved: "Les usagers suivants vont être déplacés", + add_at_least_onePerson: "Indiquez au moins un usager à déplacer", + remove_concerned: "Ne plus transférer", + // old ? add_persons: "Ajouter d'autres usagers", search: "Rechercher des usagers", move_to: "Déplacer vers", - persons_to_positionnate: 'Usagers à positionner', persons_leaving: "Usagers quittant leurs ménages", no_person_in_position: "Aucun usager ne sera ajouté à cette position", + }, + positioning: { + persons_to_positionnate: 'Usagers à positionner', + holder: "Titulaire", + }, + app: { + next: 'Suivant', + cancel: 'Annuler', + save: 'Enregistrer', + steps: { + concerned: 'Usagers concernés', + household: 'Ménage de destination', + household_address: 'Adresse du nouveau ménage', + positioning: 'Position dans le ménage', + confirm: 'Confirmation' + } }, drop_persons_here: "Glissez-déposez ici les usagers pour la position \"{position}\"", all_positionnated: "Tous les usagers sont positionnés", - holder: "Titulaire", - is_holder: "Est titulaire", - is_not_holder: "N'est pas titulaire", - remove_position: "Retirer des {position}", - remove_concerned: "Ne plus transférer", household_part: "Destination", suggestions: "Suggestions", hide_household_suggestion: "Masquer les suggestions", show_household_suggestion: 'Aucune suggestion | Afficher une suggestion | Afficher {count} suggestions', household_for_participants_accompanying_period: "Des ménages partagent le même parcours", select_household: "Sélectionner le ménage", - dates_title: "Période de validité", dates: { start_date: "Début de validité", end_date: "Fin de validité", + dates_title: "Période de validité", }, confirmation: { save: "Enregistrer", there_are_warnings: "Impossible de valider actuellement", check_those_items: "Veuillez corriger les éléments suivants", }, - give_a_position_to_every_person: "Indiquez une position pour chaque usager concerné", - add_destination: "Indiquez un ménage de destination", - add_at_least_onePerson: "Indiquez au moins un usager à transférer", } } }; 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 e4b9250f4..e15d79349 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/HouseholdMembersEditor/store/index.js @@ -43,6 +43,10 @@ const store = createStore({ allowHouseholdSearch: window.household_members_editor_data.allowHouseholdSearch, allowLeaveWithoutHousehold: window.household_members_editor_data.allowLeaveWithoutHousehold, forceLeaveWithoutHousehold: false, + /** + * If true, the user explicitly said that no address is possible + */ + forceHouseholdNoAddress: false, /** * Household suggestions * @@ -80,6 +84,9 @@ const store = createStore({ isModeLeave(state) { return state.mode === "leave"; }, + isHouseholdForceNoAddress(state) { + return state.forceHouseholdNoAddress; + }, getSuggestions(state) { let suggestions = []; state.householdSuggestionByAccompanyingPeriod.forEach(h => { @@ -90,15 +97,12 @@ const store = createStore({ }, isHouseholdNew(state) { return state.mode === "new"; - /* - if (state.household === null) { - return false; - } - return !Number.isInteger(state.household.id); - - */ }, getAddressContext(state, getters) { + if (state.household === null) { + return {}; + } + if (!getters.hasHouseholdAddress) { return { edit: false, @@ -203,6 +207,40 @@ const store = createStore({ needsPositionning(state) { return state.forceLeaveWithoutHousehold === false; }, + fakeHouseholdWithConcerned(state, getters) { + if (null === state.household) { + throw Error('cannot create fake household without household'); + } + let h = { + type: 'household', + members: state.household.members, + current_address: state.household.current_address, + current_members_id: state.household.current_members_id, + new_members: [], + }; + + if (!getters.isHouseholdNew){ + h.id = state.household.id; + } + + state.concerned.forEach((c, index) => { + let m = { + id: index * -1, + person: c.person, + holder: c.holder, + position: c.position, + }; + if (c.position === null) { + m.position = { + ordering: 999999 + } + } + h.new_members.push(m); + }) + + console.log('fake household', h); + return h; + }, buildPayload: (state, getters) => { let conc, @@ -277,6 +315,10 @@ const store = createStore({ position = state.positions.find(pos => pos.id === position_id), conc = state.concerned.find(c => c.person.id === person_id); conc.position = position; + // reset position if changed: + if (!position.allowHolder && conc.holder) { + conc.holder = false; + } }, setComment(state, {conc, comment}) { conc.comment = comment; @@ -288,9 +330,9 @@ const store = createStore({ conc.holder = false; conc.position = null; }, - removeConcerned(state, conc) { + removePerson(state, person) { state.concerned = state.concerned.filter(c => - c.person.id !== conc.person.id + c.person.id !== person.id ) }, createHousehold(state) { @@ -315,6 +357,7 @@ const store = createStore({ } state.household.current_address = address; + state.forceHouseholdNoAddress = false; }, removeHouseholdAddress(state, address) { if (null === state.household) { @@ -324,6 +367,9 @@ const store = createStore({ state.household.current_address = null; }, + markHouseholdNoAddress(state) { + state.forceHouseholdNoAddress = true; + }, forceLeaveWithoutHousehold(state) { state.household = null; state.mode = "leave"; @@ -389,8 +435,8 @@ const store = createStore({ commit('removePosition', conc); dispatch('computeWarnings'); }, - removeConcerned({ commit, dispatch }, conc) { - commit('removeConcerned', conc); + removePerson({ commit, dispatch }, person) { + commit('removePerson', person); dispatch('computeWarnings'); dispatch('fetchAddressSuggestions'); }, diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue index c15938c4f..16d0fa2ff 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/HouseholdRenderBox.vue @@ -19,15 +19,18 @@ - + + + + - + {{ $t('no_members_yet') }} @@ -82,7 +85,7 @@ export default { return this.household.current_members_id.length > 0; }, currentMembers() { - return this.household.members.filter(m => this.household.current_members_id.includes(m.id)) + let members = this.household.members.filter(m => this.household.current_members_id.includes(m.id)) .sort((a, b) => { if (a.position.ordering < b.position.ordering) { return -1; @@ -98,6 +101,17 @@ export default { } return 0; }); + + if (this.household.new_members !== undefined) { + this.household.new_members.map(m => { + m.is_new = true; + return m; + }).forEach(m => { + members.push(m); + }); + } + + return members; }, currentMembersLength() { return this.household.current_members_id.length; @@ -121,6 +135,13 @@ section.chill-entity { content: ''; } + .members { + .post-badge.is_new { + margin-left: 0.5rem; + color: var(--bs-chill-green); + } + } + } } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue index 2bc5f0b3b..f74cd4587 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue @@ -126,6 +126,7 @@ {{ person.text }} +
{{ $t('no_members_yet') }}