|
348 | 348 |
|
349 | 349 | function buildSeasonDateRange(presentations, fallback) { |
350 | 350 | const dates = presentations |
351 | | - .map((presentation) => presentation.date) |
| 351 | + .map((presentation) => parseDateValue(presentation.date)) |
352 | 352 | .filter(Boolean) |
353 | | - .map((value) => new Date(value)) |
354 | | - .filter((date) => !Number.isNaN(date.valueOf())) |
355 | 353 | .sort((a, b) => a - b); |
356 | 354 |
|
357 | 355 | if (dates.length === 0) { |
|
368 | 366 | } |
369 | 367 |
|
370 | 368 | function comparePresentations(a, b) { |
371 | | - const dateA = new Date(a.date || 0).valueOf(); |
372 | | - const dateB = new Date(b.date || 0).valueOf(); |
373 | | - if (!Number.isNaN(dateA) && !Number.isNaN(dateB)) { |
374 | | - return dateA - dateB; |
| 369 | + const dateA = parseDateValue(a.date); |
| 370 | + const dateB = parseDateValue(b.date); |
| 371 | + if (dateA && dateB) { |
| 372 | + return dateA.valueOf() - dateB.valueOf(); |
375 | 373 | } |
376 | | - if (!Number.isNaN(dateA)) return -1; |
377 | | - if (!Number.isNaN(dateB)) return 1; |
| 374 | + if (dateA) return -1; |
| 375 | + if (dateB) return 1; |
378 | 376 | return String(a.title || '').localeCompare(String(b.title || '')); |
379 | 377 | } |
380 | 378 |
|
|
392 | 390 | } |
393 | 391 |
|
394 | 392 | function formatDate(input, options = {}) { |
395 | | - const date = input instanceof Date ? input : new Date(input); |
396 | | - if (Number.isNaN(date.valueOf())) return String(input); |
| 393 | + const date = parseDateValue(input); |
| 394 | + if (!date) return String(input); |
397 | 395 |
|
398 | 396 | const locale = navigator.language || 'en-US'; |
399 | 397 | const config = { month: 'short', day: 'numeric' }; |
|
403 | 401 | return date.toLocaleDateString(locale, config); |
404 | 402 | } |
405 | 403 |
|
| 404 | + function parseDateValue(value) { |
| 405 | + if (!value) return null; |
| 406 | + if (value instanceof Date && !Number.isNaN(value.valueOf())) return value; |
| 407 | + |
| 408 | + if (typeof value === 'string') { |
| 409 | + const match = value.match(/^(\d{4})-(\d{2})-(\d{2})$/); |
| 410 | + if (match) { |
| 411 | + const [, year, month, day] = match; |
| 412 | + const date = new Date(Number(year), Number(month) - 1, Number(day)); |
| 413 | + if (!Number.isNaN(date.valueOf())) return date; |
| 414 | + } |
| 415 | + } |
| 416 | + |
| 417 | + const parsed = new Date(value); |
| 418 | + return Number.isNaN(parsed.valueOf()) ? null : parsed; |
| 419 | + } |
| 420 | + |
406 | 421 | function formatResourceLabel(type) { |
407 | 422 | if (!type) return 'Resource'; |
408 | 423 | return type.replace(/-/g, ' ').replace(/\b\w/g, (char) => char.toUpperCase()); |
|
0 commit comments