From 21ac39d538865777a260e38f9fd2c8d3e111f1b4 Mon Sep 17 00:00:00 2001 From: puriphatt Date: Thu, 12 Sep 2024 11:22:11 +0700 Subject: [PATCH] refactor(04): service new img dialog --- .../TotalProductCardComponent.vue | 2 +- src/pages/04_product-service/MainPage.vue | 232 ++++++++++++++---- src/stores/product-service/index.ts | 147 ++++++++--- src/stores/product-service/types.ts | 7 + 4 files changed, 296 insertions(+), 92 deletions(-) diff --git a/src/components/04_product-service/TotalProductCardComponent.vue b/src/components/04_product-service/TotalProductCardComponent.vue index b8ba78ba..78d424b1 100644 --- a/src/components/04_product-service/TotalProductCardComponent.vue +++ b/src/components/04_product-service/TotalProductCardComponent.vue @@ -146,7 +146,7 @@ withDefaults( style="background-color: transparent" loading="lazy" :src=" - `${baseUrl}/${data?.type === 'service' ? 'service' : 'product'}/${data?.id}/image`.concat( + `${baseUrl}/${data?.type}/${data?.id}/image/${data?.selectedImage}`.concat( noTimeImg ? '' : `?ts=${Date.now()}`, ) " diff --git a/src/pages/04_product-service/MainPage.vue b/src/pages/04_product-service/MainPage.vue index 6f4e4253..a7523197 100644 --- a/src/pages/04_product-service/MainPage.vue +++ b/src/pages/04_product-service/MainPage.vue @@ -490,6 +490,15 @@ const branchOption = ref<{ id: string; name: string }[]>([]); const currentStatus = ref('All'); +// img +const isImageEdit = ref(false); +const refreshImageState = ref(false); +const imageList = ref<{ selectedImage: string; list: string[] }>(); +const onCreateImageList = ref<{ + selectedImage: string; + list: { url: string; imgFile: File | null; name: string }[]; +}>({ selectedImage: '', list: [] }); + async function searchProduct(isAdd: boolean = true) { const res = await fetchListProduct({ query: inputSearchProductAndService.value, @@ -869,9 +878,10 @@ async function assignFormDataProductService(id: string) { const res = await fetchListServiceById(id); if (res) { + await fetchImageList(res.id, res.selectedImage || '', 'service'); serviceTab.value = 1; statusToggle.value = res.status === 'INACTIVE' ? false : true; - profileUrl.value = res.imageUrl; + profileUrl.value = `${baseUrl.value}/service/${res.id}/image/${res.selectedImage}`; profileSubmit.value = true; currentService.value = JSON.parse(JSON.stringify(res)); @@ -884,6 +894,7 @@ async function assignFormDataProductService(id: string) { work: [], status: res.status, productGroupId: res.productGroupId, + selectedImage: res.selectedImage, }; formDataProductService.value = { ...prevService.value }; @@ -932,12 +943,13 @@ const prevProduct = ref({ image: undefined, }); -function assignFormDataProduct(data: ProductList) { +async function assignFormDataProduct(data: ProductList) { productTab.value = 1; statusToggle.value = data.status === 'INACTIVE' ? false : true; - profileUrl.value = `${baseUrl.value}/product/${data?.id}/image`; + profileUrl.value = `${baseUrl.value}/product/${data?.id}/image/${data?.selectedImage}`; - profileSubmit.value = true; + await fetchImageList(data.id, data.selectedImage || '', 'product'); + // profileSubmit.value = true; prevProduct.value = { productGroupId: data.productGroupId, @@ -953,8 +965,8 @@ function assignFormDataProduct(data: ProductList) { status: data.status, expenseType: data.expenseType, vatIncluded: data.vatIncluded, + selectedImage: data.selectedImage, }; - formDataProduct.value = { ...prevProduct.value }; } @@ -1028,7 +1040,7 @@ function assignFormDataProductServiceCreate() { }); } -async function submitService() { +async function submitService(notClose = false) { assignFormDataProductServiceCreate(); formDataProductService.value.productGroupId = currentIdGrop.value; @@ -1045,7 +1057,10 @@ async function submitService() { return; } - const res = await createService(formDataProductService.value); + const res = await createService( + formDataProductService.value, + onCreateImageList.value, + ); if (res) { allStat.value[1].count = allStat.value[1].count + 1; stat.value[1].count = stat.value[1].count + 1; @@ -1063,15 +1078,16 @@ async function submitService() { }); } + if (!notClose) clearFormService(); + if (productAndServiceTab.value === 'service') { await fetchListOfService(); } flowStore.rotate(); - clearFormService(); } -async function submitProduct() { +async function submitProduct(notClose = false) { formDataProduct.value.productGroupId = currentIdGrop.value; if (profileFileImg.value) { formDataProduct.value.image = profileFileImg.value; @@ -1085,7 +1101,10 @@ async function submitProduct() { productTab.value = 1; return; } - const res = await createProduct(formDataProduct.value); + const res = await createProduct( + formDataProduct.value, + onCreateImageList.value, + ); if (res) { allStat.value[2].count = allStat.value[2].count + 1; @@ -1102,7 +1121,7 @@ async function submitProduct() { }); } totalProduct.value = totalProduct.value + 1; - clearFormProduct(); + if (!notClose) clearFormProduct(); if (productAndServiceTab.value === 'product') { await fetchListOfProduct(); @@ -1234,12 +1253,14 @@ async function alternativeFetch() { } } -function cloneData() { +function cloneServiceData() { if (!currentService.value) return; + const currentSelectedImage = formDataProductService.value.selectedImage; formDataProductService.value = { ...prevService.value, attributes: JSON.parse(JSON.stringify(currentService.value.attributes)), }; + formDataProductService.value.selectedImage = currentSelectedImage; workItems.value = currentService.value.work.map((item) => { return { @@ -1317,6 +1338,19 @@ function handleHold(node: ProductGroup & { type: string }) { currentNode.value = node; } +async function fetchImageList( + id: string, + selectedName: string, + type: 'product' | 'service', +) { + const res = await productServiceStore.fetchImageListById(id, type); + imageList.value = { + selectedImage: selectedName, + list: res.map((n: string) => `${type}/${id}/image/${n}`), + }; + return res; +} + onMounted(async () => { utilsStore.currentTitle.title = 'productService.title'; utilsStore.currentTitle.path = [ @@ -1442,6 +1476,13 @@ watch(productMode, async () => { await calculateStats({ type: 'product' }); } }); + +watch( + () => profileFileImg.value, + () => { + if (profileFileImg.value !== null) isImageEdit.value = true; + }, +);