Files
2026-07-21 15:03:40 +07:00

132 lines
4.7 KiB
JavaScript
Vendored

const App = {
setup() {
const state = Vue.reactive({
company: {
name: '',
emailAddress: '',
phoneNumber: '',
street: '',
city: '',
state: '',
zipCode: '',
country: ''
},
companyAddress: '',
warehouseFrom: '',
warehouseTo: '',
number: '',
date: '',
pdfTransactionList: [],
isDownloading: false,
mappedItems: [],
movementTotal: 0
});
const services = {
getPDFData: async (id) => {
try {
const response = await AxiosManager.get('/TransferOut/GetTransferOutSingle?id=' + id, {});
return response;
} catch (error) {
throw error;
}
},
};
const methods = {
populatePDFData: async (id) => {
const response = await services.getPDFData(id);
state.pdfData = response?.data?.content?.data || {};
state.pdfTransactionList = response?.data?.content?.transactionList || [];
methods.bindPDFControls();
},
bindPDFControls: () => {
const company = StorageManager.getCompany() || state.company;
state.company = {
name: company.name,
emailAddress: company.emailAddress,
phoneNumber: company.phoneNumber,
street: company.street,
city: company.city,
state: company.state,
zipCode: company.zipCode,
country: company.country
};
state.companyAddress = [
company.street,
company.city,
company.state,
company.zipCode,
company.country
].filter(Boolean).join(', ');
const pdfData = state.pdfData;
state.warehouseFrom = pdfData?.warehouseFrom?.name || '';
state.warehouseTo = pdfData?.warehouseTo?.name || '';
state.number = pdfData?.number || '';
state.date = DateFormatManager.formatToLocale(pdfData?.transferReleaseDate) || '';
state.mappedItems = (state.pdfTransactionList || []).map(item => ({
product: `${item.product?.number || ''} ${item.product?.name || ''}`.trim(),
movement: item.movement || 0,
}));
let movementTotal = (state.pdfTransactionList || []).reduce((sum, item) => sum + (item.movement || 0), 0);
state.movementTotal = NumberFormatManager.formatToLocale(movementTotal);
}
};
const handler = {
downloadPDF: async () => {
state.isDownloading = true;
await new Promise(resolve => setTimeout(resolve, 500));
try {
const { jsPDF } = window.jspdf;
const doc = new jsPDF('p', 'mm', 'a4');
const content = document.getElementById('content');
await html2canvas(content, {
scale: 2,
useCORS: true
}).then(canvas => {
const imgData = canvas.toDataURL('image/png');
const imgWidth = 210;
const pageHeight = 297;
const imgHeight = (canvas.height * imgWidth) / canvas.width;
let position = 0;
doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
doc.save(`transfer-out-${state.number || 'unknown'}.pdf`);
});
} catch (error) {
console.error('Error generating PDF:', error);
} finally {
state.isDownloading = false;
}
},
};
Vue.onMounted(async () => {
try {
await SecurityManager.authorizePage(['TransferOuts']);
var urlParams = new URLSearchParams(window.location.search);
var id = urlParams.get('id');
await methods.populatePDFData(id ?? '');
} catch (e) {
console.error('page init error:', e);
} finally {
}
});
return {
state,
handler,
};
}
};
Vue.createApp(App).mount('#app');