diff --git a/src/components/05_quotation/ProductItem.vue b/src/components/05_quotation/ProductItem.vue index 03d7ad45..8b4407da 100644 --- a/src/components/05_quotation/ProductItem.vue +++ b/src/components/05_quotation/ProductItem.vue @@ -6,7 +6,11 @@ import { storeToRefs } from 'pinia'; import WorkerItem from './WorkerItem.vue'; import DeleteButton from '../button/DeleteButton.vue'; import { precisionRound } from 'src/utils/arithmetic'; -import { ProductServiceList, QuotationPayload } from 'stores/quotations/types'; +import { + ProductRelation, + ProductServiceList, + QuotationPayload, +} from 'stores/quotations/types'; import { formatNumberDecimal, commaInput } from 'stores/utils'; import { useConfigStore } from 'stores/config'; @@ -29,6 +33,7 @@ const props = defineProps<{ }>(); defineEmits<{ + (e: 'viewFile', data: ProductRelation): void; (e: 'delete', index: number): void; ( e: 'updateTable', @@ -449,6 +454,7 @@ watch( background-color: hsla(var(--positive-bg) / 0.1); color: hsl(var(--positive-bg)); " + @click="$emit('viewFile', props.row.product)" /> +import { reactive } from 'vue'; + +import DialogFormContainer from './DialogFormContainer.vue'; +import DialogHeader from './DialogHeader.vue'; +import MainButton from '../button/MainButton.vue'; +import NoData from '../NoData.vue'; + +defineProps<{ + title: string; + url?: string; +}>(); + +const open = defineModel({ default: false }); + +const state = reactive({ + imageZoom: 100, +}); + +function openDialog() { + state.imageZoom = 100; +} + + + diff --git a/src/pages/05_quotation/QuotationForm.vue b/src/pages/05_quotation/QuotationForm.vue index c8aa2242..f892cbcc 100644 --- a/src/pages/05_quotation/QuotationForm.vue +++ b/src/pages/05_quotation/QuotationForm.vue @@ -29,6 +29,7 @@ import { View } from './types.ts'; import { EmployeeWorker, PayCondition, + ProductRelation, ProductServiceList, QuotationPayload, } from 'src/stores/quotations/types'; @@ -64,6 +65,7 @@ import QuotationFormInfo from './QuotationFormInfo.vue'; import QuotationFormWorkerSelect from './QuotationFormWorkerSelect.vue'; import QuotationFormWorkerAddDialog from './QuotationFormWorkerAddDialog.vue'; import UploadFileSection from 'src/components/upload-file/UploadFileSection.vue'; +import DialogViewFile from 'src/components/dialog/DialogViewFile.vue'; import { columnPaySplit } from './constants'; import { precisionRound } from 'src/utils/arithmetic'; @@ -291,6 +293,9 @@ const pageState = reactive({ employeeModal: false, productServiceModal: false, remarkWrite: true, + imageDialog: false, + imageDialogTitle: '', + imageDialogUrl: '', }); const productList = ref>>({}); @@ -956,6 +961,14 @@ async function uploadAttachment(file?: File) { if (ret) await getAttachment(); } +function viewProductFile(data: ProductRelation) { + const base64 = data.detail.match(/src="([^"]+)"/); + + pageState.imageDialog = true; + pageState.imageDialogTitle = data.name; + pageState.imageDialogUrl = base64 ? base64[1] : ''; +} + const sessionData = ref>(); onMounted(async () => { @@ -1539,6 +1552,7 @@ watch( } " @update-table="handleUpdateProductTable" + @view-file="viewProductFile" /> @@ -2262,6 +2276,12 @@ watch( fetchQuotation(); " /> + +