@acorex/core 20.2.38 → 20.2.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -364,6 +364,7 @@ declare module '@acorex/core/format' {
364
364
  declare class AXTimeLeftFormatter implements AXFormatter {
365
365
  private translateService;
366
366
  get name(): string;
367
+ updateInterval: number;
367
368
  format(value: number | string | Date, options?: AXTimeLeftFormatterOptions): string;
368
369
  static ɵfac: i0.ɵɵFactoryDeclaration<AXTimeLeftFormatter, never>;
369
370
  static ɵprov: i0.ɵɵInjectableDeclaration<AXTimeLeftFormatter>;
@@ -1554,6 +1554,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
1554
1554
  class AXTimeLeftFormatter {
1555
1555
  constructor() {
1556
1556
  this.translateService = inject(AXTranslationService);
1557
+ this.updateInterval = 1000; // Update every second
1557
1558
  }
1558
1559
  get name() {
1559
1560
  return 'timeleft';
@@ -1569,24 +1570,30 @@ class AXTimeLeftFormatter {
1569
1570
  else {
1570
1571
  valueNumber = Number(value);
1571
1572
  }
1573
+ const isPast = valueNumber < 0;
1572
1574
  const sign = this.translateService.translateSync(`@acorex:time.${valueNumber >= 0 ? 'left' : 'ago'}`);
1573
1575
  const milliseconds = Math.abs(valueNumber);
1574
1576
  const durationInSeconds = Math.round(milliseconds / 1000);
1575
1577
  let format = options?.format;
1576
- // Determine the best format if format is null
1578
+ // Determine the best format if format is null (following standard conventions)
1579
+ // Standard time thresholds based on common social media platforms
1577
1580
  if (isNil(format)) {
1578
- if (durationInSeconds < 45)
1579
- format = 's';
1580
- else if (durationInSeconds < 2700)
1581
- format = 'm';
1582
- else if (durationInSeconds < 79200)
1583
- format = 'h';
1584
- else if (durationInSeconds < 2246400)
1585
- format = 'd';
1586
- else if (durationInSeconds < 27648000)
1587
- format = 'M';
1581
+ if (durationInSeconds < 10)
1582
+ format = 'now'; // 0-10s: "just now"
1583
+ else if (durationInSeconds < 60)
1584
+ format = 's'; // 10-60s: "X seconds ago"
1585
+ else if (durationInSeconds < 3600)
1586
+ format = 'm'; // 1-60 min: "X minutes ago"
1587
+ else if (durationInSeconds < 86400)
1588
+ format = 'h'; // 1-24 hours: "X hours ago"
1589
+ else if (durationInSeconds < 604800)
1590
+ format = 'd'; // 1-7 days: "X days ago"
1591
+ else if (durationInSeconds < 2592000)
1592
+ format = 'w'; // 1-4 weeks: "X weeks ago"
1593
+ else if (durationInSeconds < 31536000)
1594
+ format = 'M'; // 1-12 months: "X months ago"
1588
1595
  else
1589
- format = 'y';
1596
+ format = 'y'; // 1+ years: "X years ago"
1590
1597
  }
1591
1598
  // Helper function for zero-padding
1592
1599
  const pad = (num) => num.toString().padStart(2, '0');
@@ -1595,54 +1602,69 @@ class AXTimeLeftFormatter {
1595
1602
  return useSign ? `${translated} ${sign}` : translated;
1596
1603
  };
1597
1604
  switch (format) {
1605
+ case 'now':
1606
+ // Just now (0-10 seconds) - Standard: immediate time
1607
+ if (isPast) {
1608
+ return translate('just-now', false);
1609
+ }
1610
+ return translate('right-now', false);
1598
1611
  case 's':
1599
- return `${durationInSeconds} ${translate('seconds')}`;
1612
+ // Seconds (10-59 seconds) - Standard: show exact seconds
1613
+ return `${durationInSeconds} ${translate(durationInSeconds === 1 ? 'second' : 'seconds')}`;
1600
1614
  case 'ss':
1601
1615
  return `${pad(durationInSeconds)} ${translate('seconds')}`;
1602
- case 'm':
1603
- return `${Math.round(durationInSeconds / 60)} ${translate(durationInSeconds >= 120 ? 'minutes' : 'minute')}`;
1616
+ case 'm': {
1617
+ // Minutes (1-59 minutes) - Standard: show exact minutes
1618
+ const minutes = Math.round(durationInSeconds / 60);
1619
+ return `${minutes} ${translate(minutes === 1 ? 'minute' : 'minutes')}`;
1620
+ }
1604
1621
  case 'mm':
1605
1622
  return `${pad(Math.round(durationInSeconds / 60))} ${translate('minutes')}`;
1606
1623
  case 'h':
1607
- case 'H':
1608
- if (durationInSeconds < 5340)
1609
- return translate('an-hour');
1610
- return `${Math.round(durationInSeconds / 3600)} ${translate(durationInSeconds >= 10800 ? 'hours' : 'hour')}`;
1624
+ case 'H': {
1625
+ // Hours (1-23 hours) - Standard: show exact hours
1626
+ const hours = Math.round(durationInSeconds / 3600);
1627
+ return `${hours} ${translate(hours === 1 ? 'hour' : 'hours')}`;
1628
+ }
1611
1629
  case 'hh':
1612
1630
  case 'HH':
1613
- if (durationInSeconds < 5340)
1614
- return `01 ${translate('hour')}`;
1615
1631
  return `${pad(Math.round(durationInSeconds / 3600))} ${translate('hours')}`;
1616
1632
  case 'd':
1617
- case 'D':
1618
- if (durationInSeconds < 126000)
1619
- return translate('a-day');
1620
- return `${Math.round(durationInSeconds / (3600 * 24))} ${translate(durationInSeconds >= 252000 ? 'days' : 'day')}`;
1633
+ case 'D': {
1634
+ // Days (1-6 days) - Standard: show exact days
1635
+ const days = Math.round(durationInSeconds / 86400);
1636
+ return `${days} ${translate(days === 1 ? 'day' : 'days')}`;
1637
+ }
1621
1638
  case 'dd':
1622
1639
  case 'DD':
1623
- if (durationInSeconds < 126000)
1624
- return `01 ${translate('day')}`;
1625
- return `${pad(Math.round(durationInSeconds / (3600 * 24)))} ${translate('days')}`;
1626
- case 'M':
1627
- if (durationInSeconds < 3888000)
1628
- return translate('a-month');
1629
- return `${Math.round(durationInSeconds / (3600 * 24 * 30))} ${translate(durationInSeconds >= 7776000 ? 'months' : 'month')}`;
1640
+ return `${pad(Math.round(durationInSeconds / 86400))} ${translate('days')}`;
1641
+ case 'w':
1642
+ case 'W': {
1643
+ // Weeks (1-4 weeks) - Standard: show weeks for 7-30 days
1644
+ const weeks = Math.round(durationInSeconds / 604800);
1645
+ return `${weeks} ${translate(weeks === 1 ? 'week' : 'weeks')}`;
1646
+ }
1647
+ case 'ww':
1648
+ case 'WW':
1649
+ return `${pad(Math.round(durationInSeconds / 604800))} ${translate('weeks')}`;
1650
+ case 'M': {
1651
+ // Months (1-11 months) - Standard: show months
1652
+ const months = Math.round(durationInSeconds / 2592000);
1653
+ return `${months} ${translate(months === 1 ? 'month' : 'months')}`;
1654
+ }
1630
1655
  case 'MM':
1631
- if (durationInSeconds < 3888000)
1632
- return `01 ${translate('month')}`;
1633
- return `${pad(Math.round(durationInSeconds / (3600 * 24 * 30)))} ${translate('months')}`;
1656
+ return `${pad(Math.round(durationInSeconds / 2592000))} ${translate('months')}`;
1634
1657
  case 'y':
1635
- case 'Y':
1636
- if (durationInSeconds < 47260800)
1637
- return translate('a-year');
1638
- return `${Math.round(durationInSeconds / (3600 * 24 * 365))} ${translate(durationInSeconds >= 63072000 ? 'years' : 'year')}`;
1658
+ case 'Y': {
1659
+ // Years (1+ years) - Standard: show years
1660
+ const years = Math.round(durationInSeconds / 31536000);
1661
+ return `${years} ${translate(years === 1 ? 'year' : 'years')}`;
1662
+ }
1639
1663
  case 'yy':
1640
1664
  case 'YY':
1641
1665
  case 'yyyy':
1642
1666
  case 'YYYY':
1643
- if (durationInSeconds < 47260800)
1644
- return `01 ${translate('year')}`;
1645
- return `${pad(Math.round(durationInSeconds / (3600 * 24 * 365)))} ${translate('years')}`;
1667
+ return `${pad(Math.round(durationInSeconds / 31536000))} ${translate('years')}`;
1646
1668
  default:
1647
1669
  console.error('Invalid format for timeleft formatter pipe');
1648
1670
  return 'Invalid format';