add results for actions in course edit form

This commit is contained in:
Julien Fastré 2021-06-23 21:26:36 +02:00
parent 154fa4719d
commit 5a4a0a3617
3 changed files with 151 additions and 7 deletions

View File

@ -2,30 +2,41 @@
<h1>Hello</h1> <h1>Hello</h1>
<div id="workEditor"> <div id="workEditor">
<div> <div id="title">
<label>{{ $t('action_title') }}</label> <label>{{ $t('action_title') }}</label>
<p>{{ work.socialAction.text }}</p> <p>{{ work.socialAction.text }}</p>
</div> </div>
<div> <div id="startDate">
<label>{{ $t('startDate') }}</label> <label>{{ $t('startDate') }}</label>
<input type="date" v-model="startDate" /> <input type="date" v-model="startDate" />
</div> </div>
<div> <div id="endDate">
<label>{{ $t('endDate') }}</label> <label>{{ $t('endDate') }}</label>
<input type="date" v-model="endDate" /> <input type="date" v-model="endDate" />
</div> </div>
<div> <div id="comment">
<ckeditor <ckeditor
:editor="editor" :editor="editor"
v-model="note" v-model="note"
tag-name="textarea" tag-name="textarea"
></ckeditor> ></ckeditor>
</div> </div>
<div class="objectives_list"> <div id="objectives" class="objectives_list">
<div class="title" aria="hidden"> <div class="title" aria="hidden">
<div><h3>Objectifs</h3></div> <div><h3>Objectifs</h3></div>
<div><h3>Résultats</h3></div> <div><h3>Résultats</h3></div>
</div> </div>
<!-- résultats sans objectifs -->
<div v-if="hasResultsForAction">
<div>
{{ $t('results_without_objective') }}
</div>
<div>
<add-result :availableResults="resultsForAction" destination="action"></add-result>
</div>
</div>
</div> </div>
</div> </div>
@ -33,20 +44,64 @@
<style lang="scss"> <style lang="scss">
#workEditor {
display: grid;
grid-template-areas:
"title title"
"startDate endDate"
"comment comment"
"objectives objectives"
;
#title {
grid-area: title;
}
#startDate {
grid-area: startDate;
}
#endDate {
grid-area: endDate;
}
#comment {
grid-area: comment;
}
#objectives {
grid-area: objectives;
> div {
display: grid;
grid-template-areas: "obj res";
grid-template-columns: "50% 50%";
column-gap: 1rem;
> div {
&:nth-child(1) {
grid-area: obj;
}
&:nth-child(2) {
grid-area: res;
}
}
}
}
}
</style> </style>
<script> <script>
import { mapState } from 'vuex'; import { mapState, mapGetters, } from 'vuex';
import { dateToISO, ISOToDatetime } from 'ChillMainAssets/js/date.js'; import { dateToISO, 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';
export default { export default {
name: 'App', name: 'App',
components: { components: {
ckeditor: CKEditor.component, ckeditor: CKEditor.component,
AddResult,
}, },
data() { data() {
return { return {
@ -55,7 +110,11 @@ export default {
}, },
computed: { computed: {
...mapState([ ...mapState([
'work' 'work',
'resultsForAction',
]),
...mapGetters([
'hasResultsForAction',
]), ]),
startDate: { startDate: {
get() { get() {

View File

@ -0,0 +1,76 @@
<template>
<div class="addResult">
<ul>
<li v-for="r in pickedResults" @click="removeResult(r)">
<i class="fa fa-times"></i>
{{ r.title.fr }}
</li>
</ul>
<div v-if="isExpanded">
<p>pick result</p>
<ul>
<li v-for="r in availableForCheckResults" @click="addResult(r)">
<i class="fa fa-plus"></i>
{{ r.title.fr }}
</li>
</ul>
</div>
<button @click="toggleSelect">
{{ $t('add_a_result') }}
</button>
</div>
</template>
<script>
export default {
name: "AddResult",
props: [ 'availableResults', 'destination' ],
data() {
return {
isExpanded: false,
};
},
computed: {
pickedResults() {
console.log('get checked');
console.log('this.destination', this.destination);
if (this.destination === 'action') {
return this.$store.state.resultsPicked;
}
throw Error(`this.destination is not implemented: ${this.destination}`);
},
availableForCheckResults() {
console.log('availableForCheckResults');
if (this.destination === 'action') {
let pickedIds = this.$store.state.resultsPicked.map(r => r.id);
console.log('picked ids', pickedIds);
return this.$store.state.resultsForAction.filter(r => !pickedIds.includes(r.id));
}
console.log('destination not implemented', this.destination);
}
},
methods: {
toggleSelect() {
this.isExpanded = !this.isExpanded;
},
addResult(r) {
console.log('addResult', r);
if (this.destination === 'action') {
this.$store.commit('addResultPicked', r);
}
},
removeResult(r) {
console.log('removeresult', r);
if (this.destination === 'action') {
this.$store.commit('removeResultPicked', r);
}
}
}
}
</script>

View File

@ -26,6 +26,9 @@ const store = createStore({
socialAction(state) { socialAction(state) {
return state.work.socialAction; return state.work.socialAction;
}, },
hasResultsForAction(state) {
return state.resultsForAction.length > 0;
}
}, },
mutations: { mutations: {
setStartDate(state, date) { setStartDate(state, date) {
@ -48,6 +51,12 @@ const store = createStore({
state.resultsForGoal.push(r); state.resultsForGoal.push(r);
} }
}, },
addResultPicked(state, result) {
state.resultsPicked.push(result);
},
removeResultPicked(state, result) {
state.resultsPicked = state.resultsPicked.filter(r => r.id !== result.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) {