@acorex/core 20.2.37 → 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.
package/date-time/index.d.ts
CHANGED
|
@@ -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 <
|
|
1579
|
-
format = '
|
|
1580
|
-
else if (durationInSeconds <
|
|
1581
|
-
format = '
|
|
1582
|
-
else if (durationInSeconds <
|
|
1583
|
-
format = '
|
|
1584
|
-
else if (durationInSeconds <
|
|
1585
|
-
format = '
|
|
1586
|
-
else if (durationInSeconds <
|
|
1587
|
-
format = '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1609
|
-
|
|
1610
|
-
return `${
|
|
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
|
-
|
|
1619
|
-
|
|
1620
|
-
return `${
|
|
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
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1637
|
-
|
|
1638
|
-
return `${
|
|
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
|
-
|
|
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';
|