@acorex/core 20.1.12 → 20.1.14

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.
@@ -270,8 +270,9 @@ declare module '@acorex/core/format' {
270
270
  }
271
271
  }
272
272
  declare class AXTimeLeftFormatter implements AXFormatter {
273
+ private translateService;
273
274
  get name(): string;
274
- format(value: number | string, options?: AXTimeLeftFormatterOptions): string;
275
+ format(value: number | string | Date, options?: AXTimeLeftFormatterOptions): string;
275
276
  static ɵfac: i0.ɵɵFactoryDeclaration<AXTimeLeftFormatter, never>;
276
277
  static ɵprov: i0.ɵɵInjectableDeclaration<AXTimeLeftFormatter>;
277
278
  }
@@ -6,7 +6,7 @@ import * as i0 from '@angular/core';
6
6
  import { InjectionToken, inject, Injectable, Pipe, NgModule } from '@angular/core';
7
7
  import { BehaviorSubject, Subject } from 'rxjs';
8
8
  import { AX_GLOBAL_CONFIG } from '@acorex/core/config';
9
- import { defaults, orderBy, set, isNil } from 'lodash-es';
9
+ import { defaults, orderBy, set, isNil, isDate } from 'lodash-es';
10
10
  import { isBrowser } from '@acorex/core/platform';
11
11
  import { translateSync, AXTranslationService } from '@acorex/core/translation';
12
12
 
@@ -215,7 +215,7 @@ class AXDateTime {
215
215
  const parts = formatter.formatToParts(new Date());
216
216
  // Map parts to their respective format
217
217
  const formatMap = {
218
- day: 'dd',
218
+ day: 'DD',
219
219
  month: style == 'longDate' ? 'MMMM' : 'MM',
220
220
  year: 'yyyy',
221
221
  hour: 'HH',
@@ -1489,12 +1489,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImpor
1489
1489
  }] });
1490
1490
 
1491
1491
  class AXTimeLeftFormatter {
1492
+ constructor() {
1493
+ this.translateService = inject(AXTranslationService);
1494
+ }
1492
1495
  get name() {
1493
1496
  return 'timeleft';
1494
1497
  }
1495
1498
  format(value, options) {
1496
- const valueNumber = Number(value);
1497
- const sign = valueNumber >= 0 ? 'left' : 'ago';
1499
+ if (isNil(value)) {
1500
+ return '';
1501
+ }
1502
+ let valueNumber;
1503
+ if (isDate(value)) {
1504
+ valueNumber = value.getTime() - new Date().getTime();
1505
+ }
1506
+ else {
1507
+ valueNumber = Number(value);
1508
+ }
1509
+ const sign = this.translateService.translateSync(`@acorex:time.${valueNumber >= 0 ? 'left' : 'ago'}`);
1498
1510
  const milliseconds = Math.abs(valueNumber);
1499
1511
  const durationInSeconds = Math.round(milliseconds / 1000);
1500
1512
  let format = options?.format;
@@ -1502,69 +1514,74 @@ class AXTimeLeftFormatter {
1502
1514
  if (isNil(format)) {
1503
1515
  if (durationInSeconds < 45)
1504
1516
  format = 's';
1505
- else if (durationInSeconds < 60 * 45)
1517
+ else if (durationInSeconds < 2700)
1506
1518
  format = 'm';
1507
- else if (durationInSeconds < 60 * 60 * 22)
1519
+ else if (durationInSeconds < 79200)
1508
1520
  format = 'h';
1509
- else if (durationInSeconds < 60 * 60 * 24 * 26)
1521
+ else if (durationInSeconds < 2246400)
1510
1522
  format = 'd';
1511
- else if (durationInSeconds < 60 * 60 * 24 * 320)
1523
+ else if (durationInSeconds < 27648000)
1512
1524
  format = 'M';
1513
1525
  else
1514
1526
  format = 'y';
1515
1527
  }
1516
1528
  // Helper function for zero-padding
1517
1529
  const pad = (num) => num.toString().padStart(2, '0');
1530
+ const translate = (key, useSign = true) => {
1531
+ const translated = this.translateService.translateSync(`@acorex:time.${key}`);
1532
+ return useSign ? `${translated} ${sign}` : translated;
1533
+ };
1518
1534
  switch (format) {
1519
1535
  case 's':
1520
- return `${durationInSeconds} seconds ${sign}`;
1536
+ return `${durationInSeconds} ${translate('seconds')}`;
1521
1537
  case 'ss':
1522
- return `${pad(durationInSeconds)} seconds ${sign}`;
1538
+ return `${pad(durationInSeconds)} ${translate('seconds')}`;
1523
1539
  case 'm':
1524
- return `${Math.round(durationInSeconds / 60)} minute${durationInSeconds >= 120 ? 's' : ''} ${sign}`;
1540
+ return `${Math.round(durationInSeconds / 60)} ${translate(durationInSeconds >= 120 ? 'minutes' : 'minute')}`;
1525
1541
  case 'mm':
1526
- return `${pad(Math.round(durationInSeconds / 60))} minutes ${sign}`;
1542
+ return `${pad(Math.round(durationInSeconds / 60))} ${translate('minutes')}`;
1527
1543
  case 'h':
1528
1544
  case 'H':
1529
- if (durationInSeconds < 60 * 89)
1530
- return `an hour ${sign}`;
1531
- return `${Math.round(durationInSeconds / 3600)} hour${durationInSeconds >= 60 * 180 ? 's' : ''} ${sign}`;
1545
+ if (durationInSeconds < 5340)
1546
+ return translate('an-hour');
1547
+ return `${Math.round(durationInSeconds / 3600)} ${translate(durationInSeconds >= 10800 ? 'hours' : 'hour')}`;
1532
1548
  case 'hh':
1533
1549
  case 'HH':
1534
- if (durationInSeconds < 60 * 89)
1535
- return `01 hour ${sign}`;
1536
- return `${pad(Math.round(durationInSeconds / 3600))} hours ${sign}`;
1550
+ if (durationInSeconds < 5340)
1551
+ return `01 ${translate('hour')}`;
1552
+ return `${pad(Math.round(durationInSeconds / 3600))} ${translate('hours')}`;
1537
1553
  case 'd':
1538
1554
  case 'D':
1539
- if (durationInSeconds < 60 * 60 * 35)
1540
- return `a day ${sign}`;
1541
- return `${Math.round(durationInSeconds / (3600 * 24))} day${durationInSeconds >= 60 * 60 * 70 ? 's' : ''} ${sign}`;
1555
+ if (durationInSeconds < 126000)
1556
+ return translate('a-day');
1557
+ return `${Math.round(durationInSeconds / (3600 * 24))} ${translate(durationInSeconds >= 252000 ? 'days' : 'day')}`;
1542
1558
  case 'dd':
1543
1559
  case 'DD':
1544
- if (durationInSeconds < 60 * 60 * 35)
1545
- return `01 day ${sign}`;
1546
- return `${pad(Math.round(durationInSeconds / (3600 * 24)))} days ${sign}`;
1560
+ if (durationInSeconds < 126000)
1561
+ return `01 ${translate('day')}`;
1562
+ return `${pad(Math.round(durationInSeconds / (3600 * 24)))} ${translate('days')}`;
1547
1563
  case 'M':
1548
- if (durationInSeconds < 60 * 60 * 24 * 45)
1549
- return `a month ${sign}`;
1550
- return `${Math.round(durationInSeconds / (3600 * 24 * 30))} month${durationInSeconds >= 60 * 60 * 24 * 90 ? 's' : ''} ${sign}`;
1564
+ if (durationInSeconds < 3888000)
1565
+ return translate('a-month');
1566
+ return `${Math.round(durationInSeconds / (3600 * 24 * 30))} ${translate(durationInSeconds >= 7776000 ? 'months' : 'month')}`;
1551
1567
  case 'MM':
1552
- if (durationInSeconds < 60 * 60 * 24 * 45)
1553
- return `01 month ${sign}`;
1554
- return `${pad(Math.round(durationInSeconds / (3600 * 24 * 30)))} months ${sign}`;
1568
+ if (durationInSeconds < 3888000)
1569
+ return `01 ${translate('month')}`;
1570
+ return `${pad(Math.round(durationInSeconds / (3600 * 24 * 30)))} ${translate('months')}`;
1555
1571
  case 'y':
1556
1572
  case 'Y':
1557
- if (durationInSeconds < 60 * 60 * 24 * 547)
1558
- return `a year ${sign}`;
1559
- return `${Math.round(durationInSeconds / (3600 * 24 * 365))} year${durationInSeconds >= 60 * 60 * 24 * 730 ? 's' : ''} ${sign}`;
1573
+ if (durationInSeconds < 47260800)
1574
+ return translate('a-year');
1575
+ return `${Math.round(durationInSeconds / (3600 * 24 * 365))} ${translate(durationInSeconds >= 63072000 ? 'years' : 'year')}`;
1560
1576
  case 'yy':
1561
1577
  case 'YY':
1562
1578
  case 'yyyy':
1563
1579
  case 'YYYY':
1564
- if (durationInSeconds < 60 * 60 * 24 * 547)
1565
- return `01 year ${sign}`;
1566
- return `${pad(Math.round(durationInSeconds / (3600 * 24 * 365)))} years ${sign}`;
1580
+ if (durationInSeconds < 47260800)
1581
+ return `01 ${translate('year')}`;
1582
+ return `${pad(Math.round(durationInSeconds / (3600 * 24 * 365)))} ${translate('years')}`;
1567
1583
  default:
1584
+ console.error('Invalid format for timeleft formatter pipe');
1568
1585
  return 'Invalid format';
1569
1586
  }
1570
1587
  }