addresses: edit address (WIP)

This commit is contained in:
nobohan 2021-06-15 21:03:50 +02:00
parent 000ae6c2cb
commit 35d35c9f40
7 changed files with 137 additions and 39 deletions

View File

@ -2,7 +2,8 @@
<div class='person__address__create'> <div class='person__address__create'>
<div> <div>
<h2>{{ $t('create_a_new_address') }}</h2> <h2 v-if="!edit">{{ $t('create_a_new_address') }}</h2>
<h2 v-else>{{ $t('edit_a_new_address') }}</h2>
<add-address <add-address
@addNewAddress="addNewAddress"> @addNewAddress="addNewAddress">
</add-address> </add-address>
@ -14,9 +15,12 @@
<div v-if="address.postcode"> <div v-if="address.postcode">
{{ address.postcode.name }} {{ address.postcode.name }}
</div> </div>
<div v-if="address.country">
{{ address.country.name }}
</div>
</div> </div>
</div> </div>
<div class='person__address__valid'> <div v-if="!edit" class='person__address__valid'>
<h2>{{ $t('date') }}</h2> <h2>{{ $t('date') }}</h2>
<input <input
type="date" type="date"
@ -33,7 +37,7 @@
<li class="cancel"> <li class="cancel">
<a :href=backUrl class="sc-button bt-cancel">{{ $t('back_to_the_list') }}</a> <a :href=backUrl class="sc-button bt-cancel">{{ $t('back_to_the_list') }}</a>
</li> </li>
<li> <li v-if="!edit">
<button type="submit" class="sc-button bt-update centered" @click="addToPerson"> <button type="submit" class="sc-button bt-update centered" @click="addToPerson">
{{ $t('add_an_address_to_person') }} {{ $t('add_an_address_to_person') }}
</button> </button>
@ -53,7 +57,9 @@ export default {
}, },
data() { data() {
return { return {
edit: window.mode === 'edit',
personId: window.personId, personId: window.personId,
addressId: window.addressId,
backUrl: `/fr/person/${window.personId}/address/list`, //TODO better way to pass this backUrl: `/fr/person/${window.personId}/address/list`, //TODO better way to pass this
validFrom: new Date().toISOString().split('T')[0] validFrom: new Date().toISOString().split('T')[0]
} }
@ -90,7 +96,7 @@ export default {
}); });
} }
if(address.writeNewPostalCode){ if (address.writeNewPostalCode){
let newPostalCode = address.newPostalCode; let newPostalCode = address.newPostalCode;
newPostalCode = Object.assign(newPostalCode, { newPostalCode = Object.assign(newPostalCode, {
'country': {'id': address.selected.country.id }, 'country': {'id': address.selected.country.id },
@ -100,16 +106,32 @@ export default {
}); });
} }
this.$store.dispatch('addAddress', newAddress); if (this.edit){
this.$store.dispatch('updateAddress', {
addressId: this.addressId,
newAddress: newAddress
});
} else {
this.$store.dispatch('addAddress', newAddress);
}
modal.showModal = false; modal.showModal = false;
}, },
addToPerson() { addToPerson() {
this.$store.dispatch('addDateToAddressAndAddressToPerson', { this.$store.dispatch('addDateToAddressAndAddressToPerson', {
personId: this.personId, personId: this.personId,
addressId: this.$store.state.address.address_id, addressId: this.$store.state.address.address_id,
body: { validFrom: {datetime: `${this.validFrom}T00:00:00+0100`}} body: { validFrom: {datetime: `${this.validFrom}T00:00:00+0100`}}
}) })
},
getEditAddress() {
this.$store.dispatch('getEditAddress', this.addressId);
} }
} },
mounted() {
if (this.edit) {
this.getEditAddress();
}
},
}; };
</script> </script>

View File

@ -1,7 +1,7 @@
import 'es6-promise/auto'; import 'es6-promise/auto';
import { createStore } from 'vuex'; import { createStore } from 'vuex';
import { patchAddress, postAddress, postPostalCode, postAddressToPerson } from '../../_api/AddAddress' import { patchAddress, postAddress, postPostalCode, postAddressToPerson, getAddress } from '../../_api/AddAddress'
const debug = process.env.NODE_ENV !== 'production'; const debug = process.env.NODE_ENV !== 'production';
@ -9,6 +9,8 @@ const store = createStore({
strict: debug, strict: debug,
state: { state: {
address: {}, address: {},
editAddress: {}, //TODO or should be address?
person: {},
errorMsg: [] errorMsg: []
}, },
getters: { getters: {
@ -21,6 +23,10 @@ const store = createStore({
console.log('@M addAddress address', address); console.log('@M addAddress address', address);
state.address = address; state.address = address;
}, },
updateAddress(state, address) {
console.log('@M updateAddress address', address);
state.address = address;
},
addAddressToPerson(state, person) { addAddressToPerson(state, person) {
console.log('@M addAddressToPerson person', person); console.log('@M addAddressToPerson person', person);
state.person = person; state.person = person;
@ -28,7 +34,11 @@ const store = createStore({
addDateToAddress(state, validFrom) { addDateToAddress(state, validFrom) {
console.log('@M addDateToAddress address.validFrom', validFrom); console.log('@M addDateToAddress address.validFrom', validFrom);
state.validFrom = validFrom; state.validFrom = validFrom;
} },
getEditAddress(state, address) {
console.log('@M getEditAddress address', address);
state.editAddress = address;
},
}, },
actions: { actions: {
addAddress({ commit }, payload) { addAddress({ commit }, payload) {
@ -81,6 +91,46 @@ const store = createStore({
commit('catchError', error); commit('catchError', error);
}); });
}, },
updateAddress({ commit }, payload) {
console.log('@A updateAddress payload', payload);
if('newPostalCode' in payload.newAddress){
postPostalCode(payload.newAddress.newPostalCode)
.then(postalCode => {
let body = payload;
body.postcode = {'id': postalCode.id },
patchAddress(body)
.then(address => new Promise((resolve, reject) => {
commit('updateAddress', address);
resolve();
}))
.catch((error) => {
commit('catchError', error);
});
})
} else {
patchAddress(payload.addressId, payload.newAddress)
.then(address => new Promise((resolve, reject) => {
commit('updateAddress', address);
resolve();
}))
.catch((error) => {
commit('catchError', error);
});
}
},
getEditAddress({ commit }, payload) {
console.log('@A getEditAddress payload', payload);
getAddress(payload).then(address => new Promise((resolve, reject) => {
commit('getEditAddress', address);
resolve();
}))
.catch((error) => {
commit('catchError', error);
});
},
} }
}); });

View File

@ -150,6 +150,21 @@ const postAddressToPerson = (personId, addressId) => {
}); });
}; };
/*
* Endpoint chill_api_single_address__index
* method GET, get Address Object
* @params {id} the address id
* @returns {Promise} a promise containing a Address object
*/
const getAddress = (id) => {
console.log('<<< get address');
const url = `/api/1.0/main/address/${id}.json`;
return fetch(url)
.then(response => {
if (response.ok) { return response.json(); }
throw Error('Error with request resource response');
});
};
export { export {
fetchCountries, fetchCountries,
@ -159,5 +174,6 @@ export {
postAddress, postAddress,
patchAddress, patchAddress,
postPostalCode, postPostalCode,
postAddressToPerson postAddressToPerson,
getAddress
}; };

View File

@ -1,7 +1,10 @@
<template> <template>
<button class="sc-button bt-create mt-4" @click="openModal"> <button v-if="!edit" class="sc-button bt-create mt-4" @click="openModal">
{{ $t('add_an_address_title') }} {{ $t('add_an_address_title') }}
</button> </button>
<button v-else class="sc-button bt-create mt-4" @click="openModal">
{{ $t('edit_an_address_title') }}
</button>
<teleport to="body"> <teleport to="body">
<modal v-if="modal.showModal" <modal v-if="modal.showModal"
@ -9,7 +12,8 @@
@close="modal.showModal = false"> @close="modal.showModal = false">
<template v-slot:header> <template v-slot:header>
<h3 class="modal-title">{{ $t('add_an_address_title') }}</h3> <h3 v-if="!edit" class="modal-title">{{ $t('add_an_address_title') }}</h3>
<h3 v-if="edit" class="modal-title">{{ $t('edit_an_address_title') }}</h3>
</template> </template>
<template v-slot:body> <template v-slot:body>
@ -101,6 +105,7 @@ export default {
emits: ['addNewAddress'], emits: ['addNewAddress'],
data() { data() {
return { return {
edit: window.mode === 'edit',
modal: { modal: {
showModal: false, showModal: false,
modalDialogClass: "modal-dialog-scrollable modal-xl" modalDialogClass: "modal-dialog-scrollable modal-xl"
@ -202,6 +207,7 @@ export default {
}, },
resetAll() { resetAll() {
console.log('reset all selected'); console.log('reset all selected');
console.log(this.$store.state.editAddress);
this.address.loaded.addresses = []; this.address.loaded.addresses = [];
this.address.selected.address = {}; this.address.selected.address = {};
this.address.loaded.cities = []; this.address.loaded.cities = [];
@ -210,7 +216,7 @@ export default {
this.address.isNoAddress = false; this.address.isNoAddress = false;
this.address.street = null; this.address.street = null;
this.address.streetNumber = null; this.address.streetNumber = null;
this.address.floor = null; this.address.floor = this.$store.state.editAddress.floor; //TODO other field and test if no edit
this.address.corridor = null; this.address.corridor = null;
this.address.steps = null; this.address.steps = null;
this.address.flat = null; this.address.flat = null;

View File

@ -14,8 +14,15 @@ class AddressNormalizer implements NormalizerAwareInterface, NormalizerInterface
public function normalize($address, string $format = null, array $context = []) public function normalize($address, string $format = null, array $context = [])
{ {
$data['address_id'] = $address->getId(); $data['address_id'] = $address->getId();
$data['text'] = $address->getStreet().', '.$address->getBuildingName(); $data['text'] = $address->getStreet().', '.$address->getStreetNumber();
$data['postcode']['name'] = $address->getPostCode()->getName(); $data['postcode']['name'] = $address->getPostCode()->getName();
$data['country']['name'] = $address->getPostCode()->getCountry()->getName();
$data['floor'] = $address->getFloor();
$data['steps'] = $address->getSteps();
$data['flat'] = $address->getBuildingName();
$data['buildingName'] = $address->getFlat();
$data['distribution'] = $address->getDistribution();
$data['extra'] = $address->getExtra();
return $data; return $data;
} }
@ -25,5 +32,5 @@ class AddressNormalizer implements NormalizerAwareInterface, NormalizerInterface
return $data instanceof Address; return $data instanceof Address;
} }
} }

View File

@ -22,27 +22,23 @@
{% block personcontent %} {% block personcontent %}
<h1>{{ 'Update address for %name%'|trans({ '%name%': person.firstName ~ ' ' ~ person.lastName } ) }}</h1> {% block content %}
<h1>{{ block('title') }}</h1>
<div id="address"></div>
{% endblock %}
{{ form_start(form) }} {% block stylesheets %}
<link href="{{ asset('build/address.css') }}" type="text/css" rel="stylesheet" />
{% endblock %}
{{ form_row(form.isNoAddress) }} {% block js %}
{{ form_row(form.street) }} <script type="text/javascript">
{{ form_row(form.streetNumber) }} window.personId = {{ person.id|e('js') }};
{{ form_row(form.postCode) }} window.addressId = {{ address.id|e('js') }};
{{ form_row(form.validFrom) }} window.mode = 'edit';
window.vueRootComponent = 'app';
<ul class="record_actions sticky-form-buttons"> </script>
<li class="cancel"> {{ encore_entry_script_tags('address') }}
<a href="{{ path('chill_person_address_list', { 'person_id' : person.id } ) }}" class="sc-button bt-cancel"> {% endblock %}
{{ 'Back to the list'|trans }}
</a>
</li>
<li>
{{ form_row(form.submit, { 'attr' : { 'class': 'sc-button bt-save' }, 'label': 'Save' } ) }}
</li>
</ul>
{{ form_end(form) }}
{% endblock personcontent %} {% endblock personcontent %}

View File

@ -34,6 +34,7 @@
{% block js %} {% block js %}
<script type="text/javascript"> <script type="text/javascript">
window.personId = {{ person.id|e('js') }}; window.personId = {{ person.id|e('js') }};
window.mode = 'new';
window.vueRootComponent = 'app'; window.vueRootComponent = 'app';
</script> </script>
{{ encore_entry_script_tags('address') }} {{ encore_entry_script_tags('address') }}