UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

94 lines 13.3 kB
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=