feat(order): store structured json address and render cleanly in admin modal
Some checks failed
Deploy Canina / deploy (push) Failing after 7s
E2E Playwright Tests / Run Full E2E & Security Suites (push) Failing after 3s

This commit is contained in:
parsa aghaei 2026-09-05 11:35:07 +03:30
parent 9e3ea3a1b1
commit 4be51741e0
2 changed files with 57 additions and 18 deletions

View File

@ -970,22 +970,41 @@ export default function Orders() {
اطلاعات پستی و ارسال
</h4>
<div className="space-y-2 text-xs">
<div>
<span className="text-gray-500 block mb-1">آدرس کامل تحویل:</span>
<span className="font-bold text-gray-900 leading-relaxed block">
{selectedOrder.address?.province ? `${selectedOrder.address.province}، ` : ''}
{selectedOrder.address?.city ? `${selectedOrder.address.city}، ` : ''}
{selectedOrder.address?.fullAddress || selectedOrder.shippingAddress || 'ثبت نشده'}
</span>
</div>
{selectedOrder.address?.postalCode && (
<div className="flex justify-between pt-1">
<span className="text-gray-500">کد پستی:</span>
<span className="font-mono font-bold text-gray-900">
{toPersianDigits(selectedOrder.address.postalCode)}
</span>
</div>
)}
{(() => {
let addrText = selectedOrder.address?.fullAddress || selectedOrder.shippingAddress || 'ثبت نشده';
let postCode = selectedOrder.address?.postalCode;
let prov = selectedOrder.address?.province;
let ct = selectedOrder.address?.city;
if (typeof selectedOrder.shippingAddress === 'string' && selectedOrder.shippingAddress.trim().startsWith('{')) {
try {
const parsed = JSON.parse(selectedOrder.shippingAddress);
addrText = parsed.formatted || `${parsed.province || ''}، ${parsed.city || ''}، ${parsed.address || ''}`;
if (parsed.postalCode) postCode = parsed.postalCode;
if (parsed.province) prov = parsed.province;
if (parsed.city) ct = parsed.city;
} catch {}
}
return (
<>
<div>
<span className="text-gray-500 block mb-1">آدرس کامل تحویل:</span>
<span className="font-bold text-gray-900 leading-relaxed block">
{addrText}
</span>
</div>
{postCode && (
<div className="flex justify-between pt-1">
<span className="text-gray-500">کد پستی:</span>
<span className="font-mono font-bold text-gray-900">
{toPersianDigits(postCode)}
</span>
</div>
)}
</>
);
})()}
{/* Postal Tracking Code Input */}
<div className="pt-2 border-t border-gray-200">
<label className="block text-gray-500 font-bold mb-1">کد رهگیری پستی / تیپاکس:</label>

View File

@ -131,7 +131,18 @@ export default function CheckoutPage() {
let shippingAddressStr = '';
if (selectedAddr) {
shippingAddressStr = `${selectedAddr.province}، ${selectedAddr.city}، ${selectedAddr.detail}${selectedAddr.zipCode ? ` (کد پستی: ${selectedAddr.zipCode})` : ''} (گیرنده: ${selectedAddr.receptorName} - ${toPersian(selectedAddr.phone)})`;
const cleanPhone = normalizeDigits(selectedAddr.phone);
const cleanZip = normalizeDigits(selectedAddr.zipCode);
const text = `${selectedAddr.province}، ${selectedAddr.city}، ${selectedAddr.detail}${cleanZip ? ` (کد پستی: ${cleanZip})` : ''} (گیرنده: ${selectedAddr.receptorName} - ${toPersian(cleanPhone)})`;
shippingAddressStr = JSON.stringify({
province: selectedAddr.province,
city: selectedAddr.city,
address: selectedAddr.detail,
postalCode: cleanZip,
fullName: selectedAddr.receptorName,
phone: cleanPhone,
formatted: text
});
} else {
const addrErrors = validateAddressForm(manualAddressData);
setManualErrors(addrErrors);
@ -143,7 +154,16 @@ export default function CheckoutPage() {
const cleanPhone = normalizeDigits(manualAddressData.phone);
const cleanZip = normalizeDigits(manualAddressData.zipCode);
shippingAddressStr = `${manualAddressData.province}، ${manualAddressData.city}، ${manualAddressData.detail}${cleanZip ? ` (کد پستی: ${cleanZip})` : ''} (گیرنده: ${manualAddressData.receptorName} - ${toPersian(cleanPhone)})`;
const text = `${manualAddressData.province}، ${manualAddressData.city}، ${manualAddressData.detail}${cleanZip ? ` (کد پستی: ${cleanZip})` : ''} (گیرنده: ${manualAddressData.receptorName} - ${toPersian(cleanPhone)})`;
shippingAddressStr = JSON.stringify({
province: manualAddressData.province,
city: manualAddressData.city,
address: manualAddressData.detail,
postalCode: cleanZip,
fullName: manualAddressData.receptorName,
phone: cleanPhone,
formatted: text
});
// Auto-save the new manual address to user's permanent address list
try {