@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
94 lines • 13.3 kB
JavaScript
import { DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe as NgDatePipe } from '@angular/common';
import { Inject, LOCALE_ID, Optional, Pipe } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { gettext } from '../i18n/gettext';
import { DateFormatService } from './date-format.service';
import { AppStateService } from './ui-state.service';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "./ui-state.service";
import * as i3 from "./date-format.service";
/**
* The range of times supported by ECMAScript Date objects in milliseconds.
* @see http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.1
*/
export const ES_MAX_TIME_MILLISECONDS = 8640000000000000;
/**
* Formats a date value according to locale rules. If no other format specified it defaults to `medium`
* used as standard date/time format.
*
* Extends Angular's DatePipe in a way so that date values exceeding the range supported by ECMAScript
* are displayed as earliest/latest supported point in time printed in the desired format pre- or postfixed
* by the word `before` or `after`, respectively.
* In all other cases the pipe behaves as the standard [DatePipe]{@link https://angular.io/api/common/DatePipe}.
*
* ```html
* <span class="highlight">{{ deadline | c8yDate }}</span> <!-- e.g. 7 May 2020, 17:45:19 (en-GB) or 07.05.2020, 17:45:19 (de) -->
* <span>{{ lastUpdated | c8yDate: 'a h:MM:ss' }}</span> <!-- e.g. pm 5:45:19 -->
* <span>{{ 8640000000000000 + 1 | c8yDate }}</span> <!-- e.g. after 13 Sep 275760, 03:00:00 -->
* ```
*/
export class DatePipe extends NgDatePipe {
constructor(locale, translateService, appStateService, dateFormatService, defaultTimezone, defaultOptions) {
super(locale, defaultTimezone, { dateFormat: 'medium', ...defaultOptions });
this.translateService = translateService;
this.appStateService = appStateService;
this.dateFormatService = dateFormatService;
}
transform(value, format, timezone, locale) {
let currentLocale = locale;
if (!currentLocale && this.appStateService) {
currentLocale = this.appStateService.state.lang;
}
if (format === 'short' && this.dateFormatService && currentLocale) {
// Angular doesn't provide a predefined format with leading zeros (e.g., "01.01.2025")
// The 'shortDate' format would display as "1/1/25" (without leading zeros and with 2-digit year)
// Using custom date formatter ensures consistency with date formats across the application
format = this.dateFormatService.getDateFormat({
locale: currentLocale,
useUppercaseFormat: false
});
}
let valueInBounds = value;
let valueBefore = false;
let valueBeyond = false;
if (typeof value === 'number' && !isNaN(value)) {
valueInBounds = Math.min(value, ES_MAX_TIME_MILLISECONDS);
valueInBounds = Math.max(valueInBounds, -ES_MAX_TIME_MILLISECONDS);
valueBefore = value < -ES_MAX_TIME_MILLISECONDS;
valueBeyond = value > ES_MAX_TIME_MILLISECONDS;
}
let result = super.transform(valueInBounds, format, timezone, currentLocale);
if (valueBefore) {
result = this.translateService.instant(gettext(`before {{date}}`), { date: result });
}
else if (valueBeyond) {
result = this.translateService.instant(gettext(`after {{date}}`), { date: result });
}
return result;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatePipe, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.AppStateService, optional: true }, { token: i3.DateFormatService, optional: true }, { token: DATE_PIPE_DEFAULT_TIMEZONE, optional: true }, { token: DATE_PIPE_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe }); }
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: DatePipe, isStandalone: true, name: "c8yDate" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatePipe, decorators: [{
type: Pipe,
args: [{ name: 'c8yDate', standalone: true }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [LOCALE_ID]
}] }, { type: i1.TranslateService }, { type: i2.AppStateService, decorators: [{
type: Optional
}] }, { type: i3.DateFormatService, decorators: [{
type: Optional
}] }, { type: undefined, decorators: [{
type: Inject,
args: [DATE_PIPE_DEFAULT_TIMEZONE]
}, {
type: Optional
}] }, { type: undefined, decorators: [{
type: Inject,
args: [DATE_PIPE_DEFAULT_OPTIONS]
}, {
type: Optional
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9jb21tb24vZGF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsMEJBQTBCLEVBRTFCLFFBQVEsSUFBSSxVQUFVLEVBQ3ZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7OztBQUVyRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUV6RDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxRQUFTLFNBQVEsVUFBVTtJQUN0QyxZQUNxQixNQUFjLEVBQ3pCLGdCQUFrQyxFQUN0QixlQUFpQyxFQUNqQyxpQkFBcUMsRUFDVCxlQUErQixFQUNoQyxjQUFzQztRQUVyRixLQUFLLENBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBTnBFLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDdEIsb0JBQWUsR0FBZixlQUFlLENBQWtCO1FBQ2pDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBb0I7SUFLM0QsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFVLEVBQUUsTUFBZSxFQUFFLFFBQWlCLEVBQUUsTUFBZTtRQUN2RSxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxNQUFNLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsRSxzRkFBc0Y7WUFDdEYsaUdBQWlHO1lBQ2pHLDJGQUEyRjtZQUMzRixNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztnQkFDNUMsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLGtCQUFrQixFQUFFLEtBQUs7YUFDMUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXhCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLHdCQUF3QixDQUFDLENBQUM7WUFDMUQsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUVuRSxXQUFXLEdBQUcsS0FBSyxHQUFHLENBQUMsd0JBQXdCLENBQUM7WUFDaEQsV0FBVyxHQUFHLEtBQUssR0FBRyx3QkFBd0IsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQVcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVyRixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQzthQUFNLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdkIsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0FoRFUsUUFBUSxrQkFFVCxTQUFTLDZJQUlULDBCQUEwQiw2QkFDMUIseUJBQXlCOzZHQVB4QixRQUFROzs0RkFBUixRQUFRO2tCQURwQixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFOzswQkFHdEMsTUFBTTsyQkFBQyxTQUFTOzswQkFFaEIsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQywwQkFBMEI7OzBCQUFHLFFBQVE7OzBCQUM1QyxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBQUcsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERBVEVfUElQRV9ERUZBVUxUX09QVElPTlMsXG4gIERBVEVfUElQRV9ERUZBVUxUX1RJTUVaT05FLFxuICBEYXRlUGlwZUNvbmZpZyxcbiAgRGF0ZVBpcGUgYXMgTmdEYXRlUGlwZVxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBMT0NBTEVfSUQsIE9wdGlvbmFsLCBQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IERhdGVGb3JtYXRTZXJ2aWNlIH0gZnJvbSAnLi9kYXRlLWZvcm1hdC5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4vdWktc3RhdGUuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIHJhbmdlIG9mIHRpbWVzIHN1cHBvcnRlZCBieSBFQ01BU2NyaXB0IERhdGUgb2JqZWN0cyBpbiBtaWxsaXNlY29uZHMuXG4gKiBAc2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS45LjEuMVxuICovXG5leHBvcnQgY29uc3QgRVNfTUFYX1RJTUVfTUlMTElTRUNPTkRTID0gODY0MDAwMDAwMDAwMDAwMDtcblxuLyoqXG4gKiBGb3JtYXRzIGEgZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzLiBJZiBubyBvdGhlciBmb3JtYXQgc3BlY2lmaWVkIGl0IGRlZmF1bHRzIHRvIGBtZWRpdW1gXG4gKiB1c2VkIGFzIHN0YW5kYXJkIGRhdGUvdGltZSBmb3JtYXQuXG4gKlxuICogRXh0ZW5kcyBBbmd1bGFyJ3MgRGF0ZVBpcGUgaW4gYSB3YXkgc28gdGhhdCBkYXRlIHZhbHVlcyBleGNlZWRpbmcgdGhlIHJhbmdlIHN1cHBvcnRlZCBieSBFQ01BU2NyaXB0XG4gKiBhcmUgZGlzcGxheWVkIGFzIGVhcmxpZXN0L2xhdGVzdCBzdXBwb3J0ZWQgcG9pbnQgaW4gdGltZSBwcmludGVkIGluIHRoZSBkZXNpcmVkIGZvcm1hdCBwcmUtIG9yIHBvc3RmaXhlZFxuICogYnkgdGhlIHdvcmQgYGJlZm9yZWAgb3IgYGFmdGVyYCwgcmVzcGVjdGl2ZWx5LlxuICogSW4gYWxsIG90aGVyIGNhc2VzIHRoZSBwaXBlIGJlaGF2ZXMgYXMgdGhlIHN0YW5kYXJkIFtEYXRlUGlwZV17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vRGF0ZVBpcGV9LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxzcGFuIGNsYXNzPVwiaGlnaGxpZ2h0XCI+e3sgZGVhZGxpbmUgfCBjOHlEYXRlIH19PC9zcGFuPiA8IS0tIGUuZy4gNyBNYXkgMjAyMCwgMTc6NDU6MTkgKGVuLUdCKSBvciAwNy4wNS4yMDIwLCAxNzo0NToxOSAoZGUpIC0tPlxuICogPHNwYW4+e3sgbGFzdFVwZGF0ZWQgfCBjOHlEYXRlOiAnYSBoOk1NOnNzJyB9fTwvc3Bhbj4gPCEtLSBlLmcuIHBtIDU6NDU6MTkgLS0+XG4gKiA8c3Bhbj57eyA4NjQwMDAwMDAwMDAwMDAwICsgMSB8IGM4eURhdGUgfX08L3NwYW4+IDwhLS0gZS5nLiBhZnRlciAxMyBTZXAgMjc1NzYwLCAwMzowMDowMCAtLT5cbiAqIGBgYFxuICovXG5AUGlwZSh7IG5hbWU6ICdjOHlEYXRlJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIERhdGVQaXBlIGV4dGVuZHMgTmdEYXRlUGlwZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTE9DQUxFX0lEKSBsb2NhbGU6IHN0cmluZyxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBhcHBTdGF0ZVNlcnZpY2U/OiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXRlRm9ybWF0U2VydmljZT86IERhdGVGb3JtYXRTZXJ2aWNlLFxuICAgIEBJbmplY3QoREFURV9QSVBFX0RFRkFVTFRfVElNRVpPTkUpIEBPcHRpb25hbCgpIGRlZmF1bHRUaW1lem9uZT86IHN0cmluZyB8IG51bGwsXG4gICAgQEluamVjdChEQVRFX1BJUEVfREVGQVVMVF9PUFRJT05TKSBAT3B0aW9uYWwoKSBkZWZhdWx0T3B0aW9ucz86IERhdGVQaXBlQ29uZmlnIHwgbnVsbFxuICApIHtcbiAgICBzdXBlcihsb2NhbGUsIGRlZmF1bHRUaW1lem9uZSwgeyBkYXRlRm9ybWF0OiAnbWVkaXVtJywgLi4uZGVmYXVsdE9wdGlvbnMgfSk7XG4gIH1cblxuICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgZm9ybWF0Pzogc3RyaW5nLCB0aW1lem9uZT86IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgY3VycmVudExvY2FsZSA9IGxvY2FsZTtcbiAgICBpZiAoIWN1cnJlbnRMb2NhbGUgJiYgdGhpcy5hcHBTdGF0ZVNlcnZpY2UpIHtcbiAgICAgIGN1cnJlbnRMb2NhbGUgPSB0aGlzLmFwcFN0YXRlU2VydmljZS5zdGF0ZS5sYW5nO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXQgPT09ICdzaG9ydCcgJiYgdGhpcy5kYXRlRm9ybWF0U2VydmljZSAmJiBjdXJyZW50TG9jYWxlKSB7XG4gICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJvdmlkZSBhIHByZWRlZmluZWQgZm9ybWF0IHdpdGggbGVhZGluZyB6ZXJvcyAoZS5nLiwgXCIwMS4wMS4yMDI1XCIpXG4gICAgICAvLyBUaGUgJ3Nob3J0RGF0ZScgZm9ybWF0IHdvdWxkIGRpc3BsYXkgYXMgXCIxLzEvMjVcIiAod2l0aG91dCBsZWFkaW5nIHplcm9zIGFuZCB3aXRoIDItZGlnaXQgeWVhcilcbiAgICAgIC8vIFVzaW5nIGN1c3RvbSBkYXRlIGZvcm1hdHRlciBlbnN1cmVzIGNvbnNpc3RlbmN5IHdpdGggZGF0ZSBmb3JtYXRzIGFjcm9zcyB0aGUgYXBwbGljYXRpb25cbiAgICAgIGZvcm1hdCA9IHRoaXMuZGF0ZUZvcm1hdFNlcnZpY2UuZ2V0RGF0ZUZvcm1hdCh7XG4gICAgICAgIGxvY2FsZTogY3VycmVudExvY2FsZSxcbiAgICAgICAgdXNlVXBwZXJjYXNlRm9ybWF0OiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlSW5Cb3VuZHMgPSB2YWx1ZTtcbiAgICBsZXQgdmFsdWVCZWZvcmUgPSBmYWxzZTtcbiAgICBsZXQgdmFsdWVCZXlvbmQgPSBmYWxzZTtcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlSW5Cb3VuZHMgPSBNYXRoLm1pbih2YWx1ZSwgRVNfTUFYX1RJTUVfTUlMTElTRUNPTkRTKTtcbiAgICAgIHZhbHVlSW5Cb3VuZHMgPSBNYXRoLm1heCh2YWx1ZUluQm91bmRzLCAtRVNfTUFYX1RJTUVfTUlMTElTRUNPTkRTKTtcblxuICAgICAgdmFsdWVCZWZvcmUgPSB2YWx1ZSA8IC1FU19NQVhfVElNRV9NSUxMSVNFQ09ORFM7XG4gICAgICB2YWx1ZUJleW9uZCA9IHZhbHVlID4gRVNfTUFYX1RJTUVfTUlMTElTRUNPTkRTO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBzdXBlci50cmFuc2Zvcm0odmFsdWVJbkJvdW5kcywgZm9ybWF0LCB0aW1lem9uZSwgY3VycmVudExvY2FsZSk7XG5cbiAgICBpZiAodmFsdWVCZWZvcmUpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoYGJlZm9yZSB7e2RhdGV9fWApLCB7IGRhdGU6IHJlc3VsdCB9KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlQmV5b25kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KGBhZnRlciB7e2RhdGV9fWApLCB7IGRhdGU6IHJlc3VsdCB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=