Merge branch 'fix_address' into person_renderbox_thirdparty_onthefly

This commit is contained in:
Mathieu Jaumotte 2021-09-03 18:57:33 +02:00
commit 3ccc82147b
12 changed files with 126 additions and 32 deletions

View File

@ -4,6 +4,8 @@
<VueMultiselect <VueMultiselect
id="addressSelector" id="addressSelector"
v-model="value" v-model="value"
@search-change="listenInputSearch"
ref="addressSelector"
@select="selectAddress" @select="selectAddress"
name="field" name="field"
track-by="id" track-by="id"
@ -17,7 +19,8 @@
:options="addresses"> :options="addresses">
</VueMultiselect> </VueMultiselect>
</div> </div>
<div class="custom-address row g-1" v-if="writeNewAddress || writeNewPostalCode">
<div class="custom-address row g-1" v-if="writeNewAddress || writeNewPostalCode || (isEnteredCustomAddress && !isAddressSelectorOpen)">
<div class="col-10"> <div class="col-10">
<div class="form-floating"> <div class="form-floating">
<input class="form-control" <input class="form-control"
@ -60,6 +63,12 @@ export default {
writeNewPostalCode() { writeNewPostalCode() {
return this.entity.selected.writeNew.postCode; return this.entity.selected.writeNew.postCode;
}, },
isAddressSelectorOpen() {
return this.$refs.addressSelector.$data.isOpen;
},
isEnteredCustomAddress() {
return this.$data.value !== null && typeof this.$data.value.text !== 'undefined';
},
addresses() { addresses() {
return this.entity.loaded.addresses; return this.entity.loaded.addresses;
}, },
@ -90,6 +99,42 @@ export default {
this.entity.selected.address.streetNumber = value.streetNumber; this.entity.selected.address.streetNumber = value.streetNumber;
this.updateMapCenter(value.point); this.updateMapCenter(value.point);
}, },
listenInputSearch(query) {
//console.log('listenInputSearch', query, this.isAddressSelectorOpen);
if (this.isAddressSelectorOpen) {
this.$data.value = { text: query };
} else if (this.isEnteredCustomAddress) {
let addr = this.splitAddress(this.$data.value.text);
this.entity.selected.address.street = addr.street;
this.entity.selected.address.streetNumber = addr.number;
}
},
splitAddress(address) {
let substr = address
.split(',')
.map(s => s.trim());
if (substr.length === 1) {
substr = address.split(' ');
}
let decimal = [];
substr.forEach((s, i) => { decimal[i] = /^\d+$/.test(s) });
if (decimal[0] === true) {
return {
number: substr.shift(),
street: substr.join(' ')
}
}
else if (decimal[decimal.length - 1] === true) {
return {
number: substr.pop(),
street: substr.join(' ')
}
}
return {
number: '',
street: substr.join(' ')
}
},
addAddress() { addAddress() {
this.entity.selected.writeNew.address = true; this.entity.selected.writeNew.address = true;
} }

View File

@ -4,6 +4,8 @@
<VueMultiselect <VueMultiselect
id="citySelector" id="citySelector"
v-model="value" v-model="value"
@search-change="listenInputSearch"
ref="citySelector"
@select="selectCity" @select="selectCity"
name="field" name="field"
track-by="id" track-by="id"
@ -18,7 +20,7 @@
</VueMultiselect> </VueMultiselect>
</div> </div>
<div class="custom-postcode row g-1" v-if="writeNewPostcode"> <div class="custom-postcode row g-1" v-if="writeNewPostcode || (isEnteredCustomCity && !isCitySelectorOpen)">
<div class="col-4"> <div class="col-4">
<div class="form-floating"> <div class="form-floating">
<input class="form-control" <input class="form-control"
@ -59,6 +61,12 @@ export default {
writeNewPostcode() { writeNewPostcode() {
return this.entity.selected.writeNew.postcode; return this.entity.selected.writeNew.postcode;
}, },
isCitySelectorOpen() {
return this.$refs.citySelector.$data.isOpen;
},
isEnteredCustomCity() {
return this.$data.value !== null && typeof this.$data.value.text !== 'undefined';
},
cities() { cities() {
return this.entity.loaded.cities; return this.entity.loaded.cities;
}, },
@ -81,7 +89,7 @@ export default {
}, },
methods: { methods: {
transName(value) { transName(value) {
return `${value.code}-${value.name}` return (value.code && value.name) ? `${value.code}-${value.name}` : '';
}, },
selectCity(value) { selectCity(value) {
this.entity.selected.city = value; this.entity.selected.city = value;
@ -90,6 +98,45 @@ export default {
this.$emit('getReferenceAddresses', value); this.$emit('getReferenceAddresses', value);
this.focusOnAddress(); this.focusOnAddress();
}, },
listenInputSearch(query) {
console.log('listenInputSearch', query, this.isCitySelectorOpen);
if (this.isCitySelectorOpen) {
this.$data.value = { text: query };
} else if (this.isEnteredCustomCity) {
let city = this.splitCity(this.$data.value.text);
this.$refs.citySelector.currentOptionLabel = '';
this.entity.selected.city = city;
this.entity.selected.postcode.name = city.name;
this.entity.selected.postcode.code = city.code;
}
},
splitCity(city) {
let substr = city
.split('-')
.map(s => s.trim());
if (substr.length === 1) {
substr = city.split(' ');
}
console.log('substr', substr);
let decimal = [];
substr.forEach((s, i) => { decimal[i] = /^\d+$/.test(s) });
if (decimal[0] === true) {
return {
code: substr.shift(),
name: substr.join(' ')
}
}
else if (decimal[decimal.length - 1] === true) {
return {
code: substr.pop(),
name: substr.join(' ')
}
}
return {
code: '',
name: substr.join(' ')
}
},
addPostcode() { addPostcode() {
this.entity.selected.writeNew.postcode = true; this.entity.selected.writeNew.postcode = true;
} }

View File

@ -134,7 +134,9 @@ export default {
methods: { methods: {
focusOnAddress() { focusOnAddress() {
const addressSelector = document.getElementById('addressSelector'); const addressSelector = document.getElementById('addressSelector');
addressSelector.focus(); if (addressSelector !== null) {
addressSelector.focus();
}
}, },
updateMapCenter(point) { updateMapCenter(point) {
//console.log('point', point); //console.log('point', point);

View File

@ -11,7 +11,7 @@
{{ $t(getSuccessText) }} {{ $t(getSuccessText) }}
</div> </div>
<show-address :address="address"></show-address> <address-render-box :address="address"></address-render-box>
<div v-if="showDateFrom" class='address-valid date-since'> <div v-if="showDateFrom" class='address-valid date-since'>
<h3>{{ $t(getValidFromDateText) }}</h3> <h3>{{ $t(getValidFromDateText) }}</h3>
@ -48,12 +48,12 @@
<script> <script>
import { dateToISO, ISOToDate, ISOToDatetime } from 'ChillMainAssets/chill/js/date.js'; import { dateToISO, ISOToDate, ISOToDatetime } from 'ChillMainAssets/chill/js/date.js';
import ShowAddress from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue'; import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
export default { export default {
name: 'ShowAddressPane', name: 'ShowAddressPane',
components: { components: {
ShowAddress AddressRenderBox
}, },
props: [ props: [
'context', 'context',

View File

@ -28,8 +28,8 @@ const addressMessages = {
create_postal_code: 'Localité inconnue. Cliquez ici pour créer une nouvelle localité', create_postal_code: 'Localité inconnue. Cliquez ici pour créer une nouvelle localité',
postalCode_name: 'Nom', postalCode_name: 'Nom',
postalCode_code: 'Code postal', postalCode_code: 'Code postal',
date: 'Date de la nouvelle adresse', date: "Date de la nouvelle adresse",
validFrom: 'Date de la nouvelle adresse', validFrom: "L'adresse est valable à partir du",
back_to_the_list: 'Retour à la liste', back_to_the_list: 'Retour à la liste',
loading: 'chargement en cours...', loading: 'chargement en cours...',
address_new_success: 'La nouvelle adresse est enregistrée', address_new_success: 'La nouvelle adresse est enregistrée',

View File

@ -13,7 +13,7 @@
<h2 class="modal-title">{{ $t('courselocation.sure') }}</h2> <h2 class="modal-title">{{ $t('courselocation.sure') }}</h2>
</template> </template>
<template v-slot:body> <template v-slot:body>
<show-address :address="person.current_household_address"></show-address> <address-render-box :address="person.current_household_address"></address-render-box>
<p>{{ $t('courselocation.sure_description') }}</p> <p>{{ $t('courselocation.sure_description') }}</p>
</template> </template>
<template v-slot:footer> <template v-slot:footer>
@ -28,12 +28,12 @@
<script> <script>
import {mapState} from "vuex"; import {mapState} from "vuex";
import Modal from 'ChillMainAssets/vuejs/_components/Modal'; import Modal from 'ChillMainAssets/vuejs/_components/Modal';
import ShowAddress from "ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue"; import AddressRenderBox from "ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue";
export default { export default {
name: "ButtonLocation", name: "ButtonLocation",
components: { components: {
ShowAddress, import AddressRenderBox from,
Modal, Modal,
}, },
props: ['person'], props: ['person'],

View File

@ -17,9 +17,9 @@
<div class="flex-table" v-if="accompanyingCourse.location"> <div class="flex-table" v-if="accompanyingCourse.location">
<div class="item-bloc"> <div class="item-bloc">
<show-address <address-render-box
:address="accompanyingCourse.location"> :address="accompanyingCourse.location">
</show-address> </address-render-box>
<div v-if="isPersonLocation" class="alert alert-secondary separator"> <div v-if="isPersonLocation" class="alert alert-secondary separator">
<label class="col-form-label"> <label class="col-form-label">
@ -63,13 +63,13 @@
<script> <script>
import { mapState } from "vuex"; import { mapState } from "vuex";
import AddAddress from 'ChillMainAssets/vuejs/Address/components/AddAddress.vue'; import AddAddress from 'ChillMainAssets/vuejs/Address/components/AddAddress.vue';
import ShowAddress from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue'; import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
export default { export default {
name: "CourseLocation", name: "CourseLocation",
components: { components: {
AddAddress, AddAddress,
ShowAddress AddressRenderBox
}, },
data() { data() {
return { return {

View File

@ -150,7 +150,7 @@
</div> </div>
<div v-else> <div v-else>
<p>{{ handlingThirdParty.text }}</p> <p>{{ handlingThirdParty.text }}</p>
<show-address :address="handlingThirdParty.address"></show-address> <address-render-box :address="handlingThirdParty.address"></address-render-box>
<ul class="record_actions"> <ul class="record_actions">
<li> <li>
@ -173,7 +173,7 @@
<ul> <ul>
<li v-for="t in thirdParties"> <li v-for="t in thirdParties">
<p>{{ t.text }}</p> <p>{{ t.text }}</p>
<show-address :address="t.address"></show-address> <address-render-box :address="t.address"></address-render-box>
<ul class="record_actions"> <ul class="record_actions">
<button :title="$t('remove_thirdparty')" class="btn btn-remove" <button :title="$t('remove_thirdparty')" class="btn btn-remove"
@ -231,7 +231,7 @@ import AddResult from './components/AddResult.vue';
import AddEvaluation from './components/AddEvaluation.vue'; import AddEvaluation from './components/AddEvaluation.vue';
import PersonRenderBox from 'ChillPersonAssets/vuejs/_components/Entity/PersonRenderBox.vue'; import PersonRenderBox from 'ChillPersonAssets/vuejs/_components/Entity/PersonRenderBox.vue';
import AddPersons from 'ChillPersonAssets/vuejs/_components/AddPersons.vue'; import AddPersons from 'ChillPersonAssets/vuejs/_components/AddPersons.vue';
import ShowAddress from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue'; import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
const i18n = { const i18n = {
messages: { messages: {
@ -275,7 +275,7 @@ export default {
AddEvaluation, AddEvaluation,
AddPersons, AddPersons,
PersonRenderBox, PersonRenderBox,
ShowAddress, AddressRenderBox,
}, },
i18n, i18n,
data() { data() {

View File

@ -13,7 +13,7 @@
<div v-if="filterAddressesSuggestion.length > 0" class="flex-table householdAddressSuggestionList"> <div v-if="filterAddressesSuggestion.length > 0" class="flex-table householdAddressSuggestionList">
<div v-for="a in filterAddressesSuggestion" class="item-bloc"> <div v-for="a in filterAddressesSuggestion" class="item-bloc">
<show-address :address="a"></show-address> <address-render-box :address="a"></address-render-box>
<ul class="record_actions"> <ul class="record_actions">
<li> <li>
<button class="btn btn-action" @click="setHouseholdAddress(a)"> <button class="btn btn-action" @click="setHouseholdAddress(a)">
@ -125,14 +125,14 @@
<script> <script>
import { mapGetters, mapState } from 'vuex'; import { mapGetters, mapState } from 'vuex';
import HouseholdRenderBox from 'ChillPersonAssets/vuejs/_components/Entity/HouseholdRenderBox.vue'; import HouseholdRenderBox from 'ChillPersonAssets/vuejs/_components/Entity/HouseholdRenderBox.vue';
import ShowAddress from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue'; import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
import AddAddress from 'ChillMainAssets/vuejs/Address/components/AddAddress.vue'; import AddAddress from 'ChillMainAssets/vuejs/Address/components/AddAddress.vue';
export default { export default {
name: 'Household', name: 'Household',
components: { components: {
HouseholdRenderBox, HouseholdRenderBox,
ShowAddress, AddressRenderBox,
AddAddress, AddAddress,
}, },
data() { data() {

View File

@ -35,7 +35,7 @@
<!-- address part --> <!-- address part -->
<li v-if="hasAddress()"> <li v-if="hasAddress()">
<show-address :address="household.current_address" :isMultiline="isMultiline"></show-address> <address-render-box :address="household.current_address" :isMultiline="isMultiline"></address-render-box>
</li> </li>
<li v-else> <li v-else>
<span class="chill-no-data-statement">{{ $t('no_current_address') }}</span> <span class="chill-no-data-statement">{{ $t('no_current_address') }}</span>
@ -49,7 +49,7 @@
<script> <script>
import PersonRenderBox from 'ChillPersonAssets/vuejs/_components/Entity/PersonRenderBox.vue'; import PersonRenderBox from 'ChillPersonAssets/vuejs/_components/Entity/PersonRenderBox.vue';
import ShowAddress from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue'; import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
const i18n = { const i18n = {
"messages": { "messages": {
@ -69,7 +69,7 @@ export default {
props: ['household', 'isAddressMultiline'], props: ['household', 'isAddressMultiline'],
components: { components: {
PersonRenderBox, PersonRenderBox,
ShowAddress, AddressRenderBox,
}, },
i18n, i18n,
computed: { computed: {

View File

@ -48,7 +48,7 @@
<li v-if="person.current_household_address"> <li v-if="person.current_household_address">
<i class="fa fa-li fa-map-marker"></i> <i class="fa fa-li fa-map-marker"></i>
<show-address :address="person.current_household_address" :isMultiline="isMultiline"></show-address> <address-render-box :address="person.current_household_address" :isMultiline="isMultiline"></address-render-box>
</li> </li>
<li v-else-if="options.addNoData"> <li v-else-if="options.addNoData">
<i class="fa fa-li fa-map-marker"></i> <i class="fa fa-li fa-map-marker"></i>
@ -112,12 +112,12 @@
<script> <script>
import {dateToISO} from 'ChillMainAssets/chill/js/date.js'; import {dateToISO} from 'ChillMainAssets/chill/js/date.js';
import ShowAddress from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue'; import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
export default { export default {
name: "PersonRenderBox", name: "PersonRenderBox",
components: { components: {
ShowAddress AddressRenderBox
}, },
props: ['person', 'options', 'render'], props: ['person', 'options', 'render'],
computed: { computed: {

View File

@ -35,7 +35,7 @@
<ul class="list-content fa-ul"> <ul class="list-content fa-ul">
<li v-if="thirdparty.address"> <li v-if="thirdparty.address">
<i class="fa fa-li fa-map-marker"></i> <i class="fa fa-li fa-map-marker"></i>
<show-address :address="thirdparty.address" :isMultiline="isMultiline"></show-address> <address-render-box :address="thirdparty.address" :isMultiline="isMultiline"></address-render-box>
</li> </li>
<li v-if="thirdparty.phonenumber"> <li v-if="thirdparty.phonenumber">
<i class="fa fa-li fa-mobile"></i> <i class="fa fa-li fa-mobile"></i>
@ -57,13 +57,13 @@
</template> </template>
<script> <script>
import ShowAddress from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue'; import AddressRenderBox from 'ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue';
import {dateToISO} from 'ChillMainAssets/chill/js/date.js'; import {dateToISO} from 'ChillMainAssets/chill/js/date.js';
export default { export default {
name: "ThirdPartyRenderBox", name: "ThirdPartyRenderBox",
components: { components: {
ShowAddress AddressRenderBox
}, },
props: ['thirdparty', 'options'], props: ['thirdparty', 'options'],
computed: { computed: {