Feature: [address] apply details button on address-render-box

This commit is contained in:
Julien Fastré 2023-03-20 18:27:18 +01:00
parent 8177a0fcce
commit f256dda6fe
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
10 changed files with 62 additions and 12 deletions

View File

@ -51,6 +51,33 @@ class AddressToReferenceMatcherController
);
}
/**
* Set an address back to "to review". Only if the address is in "reviewed" state.
*
* @Route("/api/1.0/main/address/reference-match/{id}/set/to_review", methods={"POST"})
*/
public function markAddressAsToReview(Address $address): JsonResponse
{
if (!$this->security->isGranted('ROLE_USER')) {
throw new AccessDeniedHttpException();
}
if (Address::ADDR_REFERENCE_STATUS_REVIEWED !== $address->getRefStatus()) {
throw new AccessDeniedHttpException("forbidden to mark a matching address to 'to review'");
}
$address->setRefStatus(Address::ADDR_REFERENCE_STATUS_TO_REVIEW);
$this->entityManager->flush();
return new JsonResponse(
$this->serializer->serialize($address, 'json', [AbstractNormalizer::GROUPS => ['read']]),
JsonResponse::HTTP_OK,
[],
true
);
}
/**
* @Route("/api/1.0/main/address/reference-match/{id}/sync-with-reference", methods={"POST"})
*/

View File

@ -29,3 +29,7 @@ export const syncAddressWithReference = async (address: Address): Promise<Addres
export const markAddressReviewed = async (address: Address): Promise<Address> => {
return makeFetch<null, Address>("POST", `/api/1.0/main/address/reference-match/${address.address_id}/set/reviewed`);
}
export const markAddressToReview = async (address: Address): Promise<Address> => {
return makeFetch<null, Address>("POST", `/api/1.0/main/address/reference-match/${address.address_id}/set/to_review`);
}

View File

@ -23,6 +23,10 @@ document.querySelectorAll<HTMLSpanElement>('span[data-address-details]').forEach
template: '<address-details-button :address_id="addressId" :address_ref_status="addressRefStatus" @update-address="onUpdateAddress"></address-details-button>',
methods: {
onUpdateAddress: (address: Address): void => {
if (address.refStatus === 'to_review' || address.refStatus === 'reviewed') {
// in this two case, the address content do not change
return;
}
if (window.confirm("L'adresse a été modifiée. Vous pouvez continuer votre travail. Cependant, pour afficher les données immédiatement, veuillez recharger la page. \n\n Voulez-vous recharger la page immédiatement ?")) {
window.location.reload();
}

View File

@ -53,7 +53,6 @@ async function clickOrOpen(): Promise<void> {
}
const onUpdateAddress = (address: Address): void => {
console.log('from details button', address);
data.working_address = address;
data.working_ref_status = address.refStatus;
emit('update-address', address);

View File

@ -1,5 +1,5 @@
<template>
<address-render-box :address="props.address"></address-render-box>
<address-render-box :address="props.address" :show-button-details="false"></address-render-box>
<address-details-ref-matching :address="props.address" @update-address="onUpdateAddress"></address-details-ref-matching>
<address-details-map :address="props.address"></address-details-map>
<address-details-geographical-layers :address="props.address"></address-details-geographical-layers>
@ -23,7 +23,6 @@ const emit = defineEmits<{
}>();
const onUpdateAddress = (address: Address): void => {
console.log('from details content', address);
emit('update-address', address);
}

View File

@ -42,7 +42,6 @@ const close = (): void => {
}
const onUpdateAddress = (address: Address): void => {
console.log('from details modal', address);
emit('update-address', address);
}

View File

@ -29,7 +29,8 @@ let marker: L.Marker|null = null;
onMounted(() => {
if (map_div.value === null) {
throw new Error('map div not found');
// there is no map div when the address does not have any Point
return;
}
if (props.address.point !== null) {

View File

@ -1,7 +1,8 @@
<template>
<template v-if="props.address.refStatus !== 'match'">
<div v-if="props.address.refStatus === 'to_review'" class="alert alert-danger">
<p><i class="fa fa-warning"></i> L'adresse de référence a été modifiée.</p>
<div v-if="props.address.refStatus === 'to_review' || props.address.refStatus === 'reviewed'" :class="{alert: true, 'alert-danger': props.address.refStatus === 'to_review', 'alert-warning': props.address.refStatus === 'reviewed'}">
<p v-if="props.address.refStatus === 'to_review'"><i class="fa fa-warning"></i> L'adresse de référence a été modifiée.</p>
<p v-if="props.address.refStatus === 'reviewed'">L'adresse est conservée, mais diffère de l'adresse de référence.</p>
<template v-if="props.address.addressReference.street !== props.address.street || props.address.addressReference.streetNumber !== props.address.streetNumber">
<template v-if="props.address.country.code === 'BE'">
@ -33,8 +34,9 @@
</template>
<ul class="record_actions">
<li><button class="btn btn-sm btn-update" @click="applyUpdate">Appliquer les modifications</button></li>
<li><button class="btn btn-sm btn-primary" @click="keepCurrentAddress">Conserver</button></li>
<li v-if="props.address.refStatus === 'to_review'"><button class="btn btn-sm btn-update" @click="applyUpdate">Appliquer les modifications</button></li>
<li v-if="props.address.refStatus === 'to_review'"><button class="btn btn-sm btn-primary" @click="keepCurrentAddress">Conserver</button></li>
<li v-if="props.address.refStatus === 'reviewed'"><button class="btn btn-sm btn-primary" @click="backToReview">-examiner</button></li>
</ul>
</div>
</template>
@ -43,7 +45,7 @@
<script lang="ts" setup>
import {Address} from "../../../../types";
import {markAddressReviewed, syncAddressWithReference} from "../../../../lib/api/address";
import {markAddressReviewed, markAddressToReview, syncAddressWithReference} from "../../../../lib/api/address";
export interface AddressDetailsRefMatchingProps {
address: Address;
@ -67,6 +69,12 @@ const keepCurrentAddress = async () => {
emit("update-address", new_address);
}
const backToReview = async () => {
const new_address = await markAddressToReview(props.address);
emit("update-address", new_address);
}
</script>
<style scoped lang="scss">

View File

@ -11,6 +11,7 @@
<p v-for="(l, i) in address.lines" :key="`line-${i}`">
{{ l }}
</p>
<p v-if="showButtonDetails"><address-details-button :address_id="address.address_id" :address_ref_status="address.refStatus"></address-details-button></p>
</div>
<div v-else>
<p v-if="'' !== address.text"
@ -35,11 +36,12 @@
<p v-for="(l, i) in address.lines" :key="`line-${i}`">
{{ l }}
</p>
<p v-if="showButtonDetails"><address-details-button :address_id="address.address_id" :address_ref_status="address.refStatus"></address-details-button></p>
</div>
<div v-else>
<p v-if="address.text"
class="street">
{{ address.text }}
{{ address.text }} <template v-if="showButtonDetails"><address-details-button :address_id="address.address_id" :address_ref_status="address.refStatus"></address-details-button></template>
</p>
</div>
</div>
@ -65,11 +67,13 @@
<script>
import Confidential from 'ChillMainAssets/vuejs/_components/Confidential.vue';
import AddressDetailsButton from "ChillMainAssets/vuejs/_components/AddressDetails/AddressDetailsButton.vue";
export default {
name: 'AddressRenderBox',
components: {
Confidential
Confidential,
AddressDetailsButton,
},
props: {
address: {
@ -82,6 +86,10 @@ export default {
useDatePane: {
default: false,
type: Boolean
},
showButtonDetails: {
default: true,
type: Boolean
}
},
computed: {

View File

@ -206,6 +206,7 @@ import Confidential from 'ChillMainAssets/vuejs/_components/Confidential.vue';
import BadgeEntity from 'ChillMainAssets/vuejs/_components/BadgeEntity.vue';
import PersonText from 'ChillPersonAssets/vuejs/_components/Entity/PersonText.vue';
import ThirdPartyText from 'ChillThirdPartyAssets/vuejs/_components/Entity/ThirdPartyText.vue';
import AddressDetailsButton from "ChillMainAssets/vuejs/_components/AddressDetails/AddressDetailsButton.vue";
export default {
name: "PersonRenderBox",