fix: lỗi nút xuất PDF và chèn link ở Địa điểm khi xuất PDF
This commit is contained in:
@@ -511,6 +511,7 @@ export const TourDetailPage = ({
|
||||
const tableColumn = ["STT", "Ngày giờ", "Chặng", "Địa điểm", "Ghi chú"];
|
||||
const tableRows: any[] = [];
|
||||
const legRowRanges: Record<string, { start: number; count: number }> = {};
|
||||
const pdfMapLinks: { [key: number]: string } = {};
|
||||
|
||||
const formatDateTime = (dateStr: string) => {
|
||||
if (!dateStr) return '';
|
||||
@@ -534,16 +535,15 @@ export const TourDetailPage = ({
|
||||
loc && (loc.plannedStart || loc.plannedEnd || loc.name)
|
||||
);
|
||||
|
||||
const startRow = globalRowIndex;
|
||||
|
||||
if (legLocations.length > 0) {
|
||||
const startRow = globalRowIndex;
|
||||
legRowRanges[leg.id] = { start: startRow, count: legLocations.length };
|
||||
|
||||
legLocations.forEach((loc: any) => {
|
||||
const timeStr = loc.plannedStart
|
||||
? formatDateTime(loc.plannedStart)
|
||||
: loc.plannedEnd
|
||||
? formatDateTime(loc.plannedEnd)
|
||||
: '';
|
||||
legLocations.forEach((loc: any, locIdx: number) => {
|
||||
const isStartPoint = loc.plannedStart && new Date(loc.plannedStart).getTime() === 0;
|
||||
const timeSource = isStartPoint ? loc.plannedEnd : loc.plannedStart;
|
||||
const timeStr = timeSource ? formatDateTime(timeSource) : '';
|
||||
|
||||
const locName = loc.name || '';
|
||||
const addressStr = loc.address || '';
|
||||
@@ -551,18 +551,44 @@ export const TourDetailPage = ({
|
||||
? `\n${loc.latitude}, ${loc.longitude}`
|
||||
: '';
|
||||
const locationText = [locName, addressStr, coordStr].filter(Boolean).join('\n');
|
||||
|
||||
const noteText = loc.note || '';
|
||||
|
||||
let mapUrl = '';
|
||||
if (loc.latitude && loc.longitude) {
|
||||
mapUrl = `https://www.google.com/maps/search/?api=1&query=${loc.latitude},${loc.longitude}`;
|
||||
} else if (addressStr || locName) {
|
||||
mapUrl = `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(addressStr || locName)}`;
|
||||
}
|
||||
|
||||
const currentRowPosition = tableRows.length;
|
||||
if (mapUrl) {
|
||||
pdfMapLinks[currentRowPosition] = mapUrl;
|
||||
}
|
||||
|
||||
const locationCellObj = {
|
||||
content: locationText,
|
||||
styles: mapUrl ? { textColor: [40, 83, 107], fontStyle: 'bold' as const } : {}
|
||||
};
|
||||
|
||||
tableRows.push([
|
||||
stt++,
|
||||
timeStr,
|
||||
legName,
|
||||
locationText,
|
||||
locIdx === 0 ? legName : '',
|
||||
locationCellObj,
|
||||
noteText
|
||||
]);
|
||||
globalRowIndex++;
|
||||
});
|
||||
} else {
|
||||
legRowRanges[leg.id] = { start: startRow, count: 1 };
|
||||
tableRows.push([
|
||||
stt++,
|
||||
'',
|
||||
legName,
|
||||
'Chưa có địa điểm trong chặng này',
|
||||
''
|
||||
]);
|
||||
globalRowIndex++;
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -618,17 +644,20 @@ export const TourDetailPage = ({
|
||||
cell.rowSpan = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (cell.column.index === 3) {
|
||||
const rowData = tableRows[cell.row.index];
|
||||
if (rowData && rowData[3]) {
|
||||
const coordMatch = rowData[3].match(/([\d.]+),\s*([\d.]+)/);
|
||||
if (coordMatch) {
|
||||
const lat = coordMatch[1];
|
||||
const lng = coordMatch[2];
|
||||
cell.cell.link = `https://www.openstreetmap.org/?mlat=${lat}&mlon=${lng}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
didDrawCell: (data: any) => {
|
||||
if (data.section === 'body' && data.column.index === 3) {
|
||||
const activeRowIndex = data.row.index;
|
||||
const targetMapUrl = pdfMapLinks[activeRowIndex];
|
||||
if (targetMapUrl) {
|
||||
data.doc.link(
|
||||
data.cell.x,
|
||||
data.cell.y,
|
||||
data.cell.width,
|
||||
data.cell.height,
|
||||
{ url: targetMapUrl }
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user