SEO: robots.txt, sitemap, Organization & Event schema; dashboard fmtTime fix; frontend updates

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Michilis
2026-02-12 07:55:43 +00:00
parent 95ee5a5dec
commit 18254c566e
31 changed files with 227 additions and 196 deletions

View File

@@ -125,6 +125,7 @@ export default function AdminBookingsPage() {
year: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};

View File

@@ -49,6 +49,7 @@ export default function AdminContactsPage() {
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};

View File

@@ -373,6 +373,7 @@ export default function AdminEmailsPage() {
year: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};
@@ -545,7 +546,7 @@ export default function AdminEmailsPage() {
<div className="flex items-center gap-2">
{hasDraft && (
<span className="text-xs text-gray-500">
Draft saved {composeForm.savedAt ? new Date(composeForm.savedAt).toLocaleString() : ''}
Draft saved {composeForm.savedAt ? new Date(composeForm.savedAt).toLocaleString(locale === 'es' ? 'es-ES' : 'en-US', { timeZone: 'America/Asuncion' }) : ''}
</span>
)}
<Button variant="outline" size="sm" onClick={saveDraft}>
@@ -571,7 +572,7 @@ export default function AdminEmailsPage() {
<option value="">Choose an event</option>
{events.filter(e => e.status === 'published').map((event) => (
<option key={event.id} value={event.id}>
{event.title} - {new Date(event.startDatetime).toLocaleDateString()}
{event.title} - {new Date(event.startDatetime).toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { timeZone: 'America/Asuncion' })}
</option>
))}
</select>

View File

@@ -194,6 +194,7 @@ export default function AdminEventDetailPage() {
year: 'numeric',
month: 'long',
day: 'numeric',
timeZone: 'America/Asuncion',
});
};
@@ -201,6 +202,7 @@ export default function AdminEventDetailPage() {
return new Date(dateStr).toLocaleTimeString(locale === 'es' ? 'es-ES' : 'en-US', {
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};
@@ -754,7 +756,7 @@ export default function AdminEventDetailPage() {
{getStatusBadge(ticket.status)}
{ticket.checkinAt && (
<p className="text-xs text-gray-400 mt-1">
{new Date(ticket.checkinAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
{new Date(ticket.checkinAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', timeZone: 'America/Asuncion' })}
</p>
)}
</td>
@@ -768,7 +770,7 @@ export default function AdminEventDetailPage() {
)}
</td>
<td className="px-6 py-4 text-sm text-gray-600">
{new Date(ticket.createdAt).toLocaleDateString()}
{new Date(ticket.createdAt).toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { timeZone: 'America/Asuncion' })}
</td>
<td className="px-6 py-4">
<div className="flex items-center justify-end gap-2">
@@ -927,6 +929,7 @@ export default function AdminEventDetailPage() {
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
})
) : (
<span className="text-gray-400"></span>

View File

@@ -240,6 +240,7 @@ export default function AdminEventsPage() {
month: 'short',
day: 'numeric',
year: 'numeric',
timeZone: 'America/Asuncion',
});
};

View File

@@ -112,6 +112,7 @@ export default function AdminGalleryPage() {
year: 'numeric',
month: 'short',
day: 'numeric',
timeZone: 'America/Asuncion',
});
};

View File

@@ -164,6 +164,7 @@ export default function AdminLegalPagesPage() {
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
} catch {
return dateStr;

View File

@@ -35,6 +35,7 @@ export default function AdminDashboardPage() {
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};

View File

@@ -199,6 +199,7 @@ export default function AdminPaymentsPage() {
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};

View File

@@ -190,7 +190,7 @@ function ScanResultModal({
const statusSubtitle = isSuccess ? 'Ready for check-in' :
isAlreadyCheckedIn ? (
scanResult.validation?.ticket?.checkinAt
? `Checked in at ${new Date(scanResult.validation.ticket.checkinAt).toLocaleTimeString()}${scanResult.validation?.ticket?.checkedInBy ? ` by ${scanResult.validation.ticket.checkedInBy}` : ''}`
? `Checked in at ${new Date(scanResult.validation.ticket.checkinAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', timeZone: 'America/Asuncion' })}${scanResult.validation?.ticket?.checkedInBy ? ` by ${scanResult.validation.ticket.checkedInBy}` : ''}`
: 'This ticket was already used'
) :
isPending ? 'Ticket not yet confirmed' :
@@ -400,7 +400,7 @@ export default function AdminScannerPage() {
setRecentCheckins(prev => [
{
name: result.ticket.attendeeName || 'Guest',
time: new Date().toLocaleTimeString()
time: new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', timeZone: 'America/Asuncion' })
},
...prev.slice(0, 4),
]);
@@ -441,6 +441,7 @@ export default function AdminScannerPage() {
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};

View File

@@ -213,6 +213,7 @@ export default function AdminSettingsPage() {
month: 'long',
day: 'numeric',
year: 'numeric',
timeZone: 'America/Asuncion',
})}
</p>
<p className="text-xs text-amber-600 mt-1">

View File

@@ -140,6 +140,7 @@ export default function AdminTicketsPage() {
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZone: 'America/Asuncion',
});
};

View File

@@ -112,6 +112,7 @@ export default function AdminUsersPage() {
year: 'numeric',
month: 'short',
day: 'numeric',
timeZone: 'America/Asuncion',
});
};