finish form behaviour

This commit is contained in:
Julien Fastré 2021-06-24 12:44:24 +02:00
parent b72b1bd4c7
commit 92a95d4186
3 changed files with 197 additions and 8 deletions

View File

@ -45,6 +45,7 @@ use Symfony\Component\Validator\Constraints as Assert;
/** /**
* @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class) * @ORM\ManyToOne(targetEntity=AccompanyingPeriod::class)
* @Serializer\Groups({"read"})
*/ */
private ?AccompanyingPeriod $accompanyingPeriod = null; private ?AccompanyingPeriod $accompanyingPeriod = null;

View File

@ -69,6 +69,90 @@
<div><!-- empty for results --></div> <div><!-- empty for results --></div>
</div> </div>
</div> </div>
<div id="persons">
<h2>{{ $t('persons_involved') }}</h2>
<ul>
<li v-for="p in personsReachables" :key="p.id">
<input type="checkbox" :value="p.id" v-model="personsPicked">
<person :person="p"></person>
</li>
</ul>
</div>
<div id="handlingThirdParty">
<h2>Tiers traitant</h2>
<div v-if="!hasHandlingThirdParty">
<p class="chill-no-data-statement">
Aucun tiers traitant
</p>
<ul class="record_actions">
<li>
<add-persons
buttonTitle="Indiquer un tiers traitant"
modalTitle="Choisir un tiers"
v-bind:key="handlingThirdPartyPicker.key"
v-bind:options="handlingThirdPartyPicker.options"
@addNewPersons="setHandlingThirdParty"
ref="handlingThirdPartyPicker"> <!-- to cast child method -->
</add-persons>
</li>
</ul>
</div>
<div v-else>
<p>{{ handlingThirdParty.text }}</p>
<show-address :address="handlingThirdParty.address"></show-address>
<ul class="record_actions">
<li>
<button class="sc-button bt-delete" @click="removeHandlingThirdParty">
Supprimer le tiers traitant
</button>
</li>
</ul>
</div>
</div>
<div id="thirdParties">
<h2>Tiers intervenants</h2>
<div v-if="!hasThirdParties">
<p class="chill-no-data-statement">Aucun tiers intervenant</p>
</div>
<div v-else>
<ul>
<li v-for="t in thirdParties">
<p>{{ t.text }}</p>
<show-address :address="t.address"></show-address>
<ul class="record_actions">
<button class="sc-button bt-delete" @click="removeThirdParty(t)"></button>
</ul>
</li>
</ul>
</div>
<ul class="record_actions">
<li>
<add-persons
buttonTitle="Ajouter des tiers"
modalTitle="Choisir des tiers"
v-bind:key="thirdPartyPicker.key"
v-bind:options="thirdPartyPicker.options"
@addNewPersons="addThirdParties"
ref="thirdPartyPicker"> <!-- to cast child method -->
</add-persons>
</li>
</ul>
</div>
</div> </div>
</template> </template>
@ -82,6 +166,9 @@
"startDate endDate" "startDate endDate"
"comment comment" "comment comment"
"objectives objectives" "objectives objectives"
"persons persons"
"handling handling"
"3parties 3parties"
; ;
#title { #title {
@ -116,6 +203,15 @@
} }
} }
} }
#persons {
grid-area: persons;
}
#handlingThirdParty {
grid-area: handling;
}
#thirdParties {
grid-area: 3parties;
}
} }
</style> </style>
@ -123,21 +219,43 @@
<script> <script>
import { mapState, mapGetters, } from 'vuex'; import { mapState, mapGetters, } from 'vuex';
import { dateToISO, ISOToDatetime } from 'ChillMainAssets/js/date.js'; import { dateToISO, ISOToDate, ISOToDatetime } from 'ChillMainAssets/js/date.js';
import CKEditor from '@ckeditor/ckeditor5-vue'; import CKEditor from '@ckeditor/ckeditor5-vue';
import ClassicEditor from 'ChillMainAssets/modules/ckeditor5/index.js'; import ClassicEditor from 'ChillMainAssets/modules/ckeditor5/index.js';
import AddResult from './_components/AddResult.vue'; import AddResult from './_components/AddResult.vue';
import Person from 'ChillPersonAssets/vuejs/_components/Person/Person.vue';
import AddPersons from 'ChillPersonAssets/vuejs/_components/AddPersons.vue';
import ShowAddress from 'ChillMainAssets/vuejs/_components/ShowAddress.vue';
export default { export default {
name: 'App', name: 'App',
components: { components: {
ckeditor: CKEditor.component, ckeditor: CKEditor.component,
AddResult, AddResult,
AddPersons,
Person,
ShowAddress,
}, },
data() { data() {
return { return {
editor: ClassicEditor, editor: ClassicEditor,
showAddObjective: false, showAddObjective: false,
handlingThirdPartyPicker: {
key: 'handling-third-party',
options: {
type: [ 'thirdparty' ],
priority: null,
uniq: true
},
},
thirdPartyPicker: {
key: 'third-party',
options: {
type: [ 'thirdparty' ],
priority: null,
uniq: false,
},
}
}; };
}, },
computed: { computed: {
@ -145,9 +263,14 @@ export default {
'work', 'work',
'resultsForAction', 'resultsForAction',
'goalsPicked', 'goalsPicked',
'personsReachables',
'handlingThirdParty',
'thirdParties'
]), ]),
...mapGetters([ ...mapGetters([
'hasResultsForAction', 'hasResultsForAction',
'hasHandlingThirdParty',
'hasThirdParties',
]), ]),
startDate: { startDate: {
get() { get() {
@ -155,7 +278,7 @@ export default {
return dateToISO(this.$store.state.startDate); return dateToISO(this.$store.state.startDate);
}, },
set(v) { set(v) {
this.$store.mutate('setStartDate', ISOToDate(v)); this.$store.commit('setStartDate', ISOToDate(v));
} }
}, },
endDate: { endDate: {
@ -164,7 +287,7 @@ export default {
return dateToISO(this.$store.state.endDate); return dateToISO(this.$store.state.endDate);
}, },
set(v) { set(v) {
this.$store.mutate('setEndDate', ISOToDate(v)); this.$store.commit('setEndDate', ISOToDate(v));
} }
}, },
note: { note: {
@ -172,7 +295,7 @@ export default {
return this.$store.state.note; return this.$store.state.note;
}, },
set(v) { set(v) {
this.$store.mutate('setNote', note); this.$store.commit('setNote', note);
} }
}, },
availableForCheckGoal() { availableForCheckGoal() {
@ -182,6 +305,18 @@ export default {
return this.$store.state.goalsForAction.filter(g => !pickedIds.includes(g.id)); return this.$store.state.goalsForAction.filter(g => !pickedIds.includes(g.id));
}, },
personsPicked: {
get() {
let s = this.$store.state.personsPicked.map(p => p.id);
console.log('persons picked', s);
return s;
},
set(v) {
console.log('persons picked', v);
this.$store.commit('setPersonsPickedIds', v);
}
},
}, },
methods: { methods: {
toggleAddObjective() { toggleAddObjective() {
@ -195,6 +330,26 @@ export default {
console.log('remove goal', g); console.log('remove goal', g);
this.$store.commit('removeGoal', g); this.$store.commit('removeGoal', g);
}, },
setHandlingThirdParty({ selected, modal }) {
console.log('setHandlingThirdParty', selected);
this.$store.commit('setHandlingThirdParty', selected.shift().result);
this.$refs.handlingThirdPartyPicker.resetSearch();
modal.showModal = false;
},
removeHandlingThirdParty() {
console.log('removeHandlingThirdParty');
this.$store.commit('setHandlingThirdParty', null);
},
addThirdParties({ selected, modal}) {
console.log('addThirdParties', selected);
this.$store.commit('addThirdParties', selected.map(r => r.result));
this.$refs.thirdPartyPicker.resetSearch();
modal.showModal = false;
},
removeThirdParty(t) {
console.log('remove third party', t);
this.$store.commit('removeThirdParty', t);
},
} }
}; };

View File

@ -20,6 +20,11 @@ const store = createStore({
resultsForAction: [], resultsForAction: [],
goalsForAction: [], goalsForAction: [],
resultsForGoal: [], resultsForGoal: [],
personsPicked: window.accompanyingCourseWork.persons,
personsReachables: window.accompanyingCourseWork.accompanyingPeriod.participations.filter(p => p.endDate == null)
.map(p => p.person),
handlingThirdParty: window.accompanyingCourseWork.handlingThierParty,
thirdParties: window.accompanyingCourseWork.thirdParties,
errors: [], errors: [],
}, },
getters: { getters: {
@ -38,7 +43,13 @@ const store = createStore({
let found = state.goalsPicked.find(g => g.id === goal.id); let found = state.goalsPicked.find(g => g.id === goal.id);
return found === undefined ? [] : found.results; return found === undefined ? [] : found.results;
} },
hasHandlingThirdParty(state) {
return state.handlingThirdParty !== null;
},
hasThirdParties(state) {
return state.thirdParties.length > 0;
},
}, },
mutations: { mutations: {
setStartDate(state, date) { setStartDate(state, date) {
@ -94,15 +105,37 @@ const store = createStore({
found.results = found.results.filter(r => r.id !== result.id); found.results = found.results.filter(r => r.id !== result.id);
}, },
setPersonsPickedIds(state, ids) {
console.log('persons ids', ids);
state.personsPicked = state.personsReachables
.filter(p => ids.includes(p.id))
},
setNote(state, note) {
state.note = note;
},
setHandlingThirdParty(state, thirdParty) {
state.handlingThirdParty = thirdParty;
},
addThirdParties(state, thirdParties) {
console.log('addThirdParties', thirdParties);
// filter to remove existing thirdparties
let ids = state.thirdParties.map(t => t.id);
let unexistings = thirdParties.filter(t => !ids.includes(t.id));
console.log('unexisting third parties', unexistings);
for (let i in unexistings) {
state.thirdParties.push(unexistings[i]);
}
},
removeThirdParty(state, thirdParty) {
state.thirdParties = state.thirdParties
.filter(t => t.id !== thirdParty.id);
},
addErrors(state, errors) { addErrors(state, errors) {
console.log('handling errors', errors); console.log('handling errors', errors);
for (let i in errors) { for (let i in errors) {
state.push(errors[i]); state.push(errors[i]);
} }
}, },
setNote(state, note) {
state.note = note;
},
}, },
actions: { actions: {
getReachablesGoalsForAction({ getters, commit, dispatch }) { getReachablesGoalsForAction({ getters, commit, dispatch }) {