mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-29 21:46:14 +00:00
101 lines
3.0 KiB
Vue
101 lines
3.0 KiB
Vue
<template>
|
|
<div class="vue-component">
|
|
<h2><a id="section-40"></a>{{ $t('admin_location.title') }}</h2>
|
|
|
|
<div class="mb-4">
|
|
<label for="selectAdminLocation">
|
|
{{ $t('admin_location.title') }}
|
|
</label>
|
|
|
|
<VueMultiselect
|
|
name="selectAdminLocation"
|
|
label="text"
|
|
:custom-label="customLabel"
|
|
track-by="id"
|
|
:multiple="false"
|
|
:searchable="true"
|
|
:placeholder="$t('admin_location.placeholder')"
|
|
v-model="value"
|
|
:options="options"
|
|
group-values="locations"
|
|
group-label="locationCategories"
|
|
:select-label="$t('multiselect.select_label')"
|
|
:deselect-label="$t('multiselect.deselect_label')"
|
|
:selected-label="$t('multiselect.selected_label')"
|
|
@select="updateAdminLocation">
|
|
</VueMultiselect>
|
|
</div>
|
|
|
|
<div v-if="!isAdminLocationValid" class="alert alert-warning to-confirm">
|
|
{{ $t('admin_location.not_valid') }}
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import VueMultiselect from 'vue-multiselect';
|
|
import { fetchResults } from 'ChillMainAssets/lib/api/apiMethods';
|
|
import { mapState, mapGetters } from 'vuex';
|
|
|
|
export default {
|
|
name: 'AdminLocation',
|
|
components: { VueMultiselect },
|
|
data() {
|
|
return {
|
|
options: []
|
|
}
|
|
},
|
|
computed: {
|
|
...mapState({
|
|
value: state => state.accompanyingCourse.administrativeLocation,
|
|
}),
|
|
...mapGetters([
|
|
'isAdminLocationValid'
|
|
])
|
|
},
|
|
mounted() {
|
|
this.getOptions();
|
|
},
|
|
methods: {
|
|
getOptions() {
|
|
fetchResults(`/api/1.0/main/location.json`)
|
|
.then(response => {
|
|
let uniqueLocationTypeId = [...new Set(response.map(o => o.locationType.id))];
|
|
let results = [];
|
|
for (let id of uniqueLocationTypeId) {
|
|
results.push({
|
|
locationCategories: response.filter(o => o.locationType.id === id)[0].locationType.title.fr,
|
|
locations: response.filter(o => o.locationType.id === id)
|
|
})
|
|
}
|
|
this.options = results;
|
|
})
|
|
},
|
|
updateAdminLocation(value) {
|
|
this.$store.dispatch('updateAdminLocation', value)
|
|
.catch(({name, violations}) => {
|
|
if (name === 'ValidationException' || name === 'AccessException') {
|
|
violations.forEach((violation) => this.$toast.open({message: violation}));
|
|
} else {
|
|
this.$toast.open({message: 'An error occurred'})
|
|
}
|
|
});
|
|
},
|
|
customLabel(value) {
|
|
return value.locationType
|
|
? value.name
|
|
? `${value.name} (${value.locationType.title.fr})`
|
|
: value.locationType.title.fr
|
|
: '';
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style src="vue-multiselect/dist/vue-multiselect.css"></style>
|
|
<style lang="css" scoped>
|
|
label {
|
|
display: none;
|
|
}
|
|
</style>
|