@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
241 lines • 9.79 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import "core-js/modules/web.dom-collections.iterator.js";
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
import { LOCALE as defaultLocale } from '../../shared/defaults';
import { convertStringToDate } from '../date-picker/DatePickerCalc';
export function formatDate(dateValue) {
let {
locale = defaultLocale,
options = {
dateStyle: 'short'
}
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
const date = convertStringToDate(dateValue);
return typeof Intl !== 'undefined' ? new Intl.DateTimeFormat(locale, options).format(date) : date.toLocaleString(locale, options);
}
export function formatDateRange(dates) {
let {
locale = defaultLocale,
options = {
dateStyle: 'long'
}
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
const startDate = convertStringToDate(dates.startDate);
const endDate = convertStringToDate(dates.endDate);
if (typeof Intl !== 'undefined') {
return new Intl.DateTimeFormat(locale, options).formatRange(startDate, endDate);
}
const startDateString = startDate.toLocaleString(locale, options);
const endDateString = endDate.toLocaleString(locale, options);
return `${startDateString}-${endDateString}`;
}
const timeUnitsInMs = {
seconds: 1000,
minutes: 60_000,
hours: 3_600_000,
days: 86_400_000,
weeks: 604_800_000,
months: 30.4375 * 86_400_000,
years: 365.25 * 86_400_000
};
export function getRelativeTime(date) {
let locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultLocale;
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
numeric: 'always',
style: 'long'
};
let dateStyle = arguments.length > 3 ? arguments[3] : undefined;
const relativeTimeOptions = _objectSpread(_objectSpread({}, options), {}, {
style: dateStyle === 'short' ? 'narrow' : dateStyle === 'medium' ? 'short' : 'long'
});
const relativeTimeFormatter = new Intl.RelativeTimeFormat(locale, relativeTimeOptions);
const now = new Date();
const msDateDifference = date.getTime() - now.getTime();
const timeUnit = getTimeUnit(msDateDifference);
const timeUnitDifference = Math.round(msDateDifference / timeUnitsInMs[timeUnit]);
return relativeTimeFormatter.format(timeUnitDifference, timeUnit);
}
export function getRelativeTimeNextUpdateMs(date) {
let now = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();
const diff = date.getTime() - now.getTime();
if (!Number.isFinite(diff)) {
return 1000;
}
const unit = getTimeUnit(diff);
const unitMs = timeUnitsInMs[unit];
const v = diff / unitMs;
const msUntilFlip = (v - (Math.round(v) - 0.5)) * unitMs;
const min = unit === 'seconds' ? 500 : 1000;
return Math.max(min, Math.floor(msUntilFlip) + 50);
}
const UNIT_THRESHOLDS = [[timeUnitsInMs.minutes, 'seconds'], [timeUnitsInMs.hours, 'minutes'], [timeUnitsInMs.days, 'hours'], [timeUnitsInMs.weeks, 'days'], [timeUnitsInMs.months, 'weeks'], [timeUnitsInMs.years, 'months']];
function getTimeUnit(msDifference) {
var _UNIT_THRESHOLDS$find, _UNIT_THRESHOLDS$find2;
const abs = Math.abs(msDifference);
return (_UNIT_THRESHOLDS$find = (_UNIT_THRESHOLDS$find2 = UNIT_THRESHOLDS.find(_ref => {
let [limit] = _ref;
return abs < limit;
})) === null || _UNIT_THRESHOLDS$find2 === void 0 ? void 0 : _UNIT_THRESHOLDS$find2[1]) !== null && _UNIT_THRESHOLDS$find !== void 0 ? _UNIT_THRESHOLDS$find : 'years';
}
const DURATION_PATTERN = /^P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)W)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/;
export function parseDuration(durationString) {
if (!durationString || typeof durationString !== 'string') {
return 0;
}
const match = durationString.match(DURATION_PATTERN);
if (!match) {
return 0;
}
const [, years = '0', months = '0', weeks = '0', days = '0', hours = '0', minutes = '0', seconds = '0'] = match;
return parseInt(years) * timeUnitsInMs.years + parseInt(months) * timeUnitsInMs.months + parseInt(weeks) * timeUnitsInMs.weeks + parseInt(days) * timeUnitsInMs.days + parseInt(hours) * timeUnitsInMs.hours + parseInt(minutes) * timeUnitsInMs.minutes + parseInt(seconds) * timeUnitsInMs.seconds;
}
function buildDurationObject(durationMs, originalDurationString) {
if (originalDurationString) {
const match = originalDurationString.match(DURATION_PATTERN);
if (match) {
const [, years, months, weeks, days, hours, minutes, seconds] = match;
const result = {};
if (years !== undefined && years !== '0') {
result.years = parseInt(years);
}
if (months !== undefined && months !== '0') {
result.months = parseInt(months);
}
if (weeks !== undefined && weeks !== '0') {
result.weeks = parseInt(weeks);
}
if (days !== undefined && days !== '0') {
result.days = parseInt(days);
}
if (hours !== undefined && hours !== '0') {
result.hours = parseInt(hours);
}
if (minutes !== undefined && minutes !== '0') {
result.minutes = parseInt(minutes);
}
if (seconds !== undefined && seconds !== '0') {
result.seconds = parseInt(seconds);
}
return result;
}
}
const absDuration = Math.abs(durationMs);
const units = {
years: Math.floor(absDuration / timeUnitsInMs.years),
months: Math.floor(absDuration % timeUnitsInMs.years / timeUnitsInMs.months),
weeks: Math.floor(absDuration % timeUnitsInMs.months / timeUnitsInMs.weeks),
days: Math.floor(absDuration % timeUnitsInMs.weeks / timeUnitsInMs.days),
hours: Math.floor(absDuration % timeUnitsInMs.days / timeUnitsInMs.hours),
minutes: Math.floor(absDuration % timeUnitsInMs.hours / timeUnitsInMs.minutes),
seconds: Math.floor(absDuration % timeUnitsInMs.minutes / timeUnitsInMs.seconds)
};
if (durationMs === 0 && originalDurationString) {
const match = originalDurationString.match(DURATION_PATTERN);
if (match) {
const [, years, months, weeks, days, hours, minutes, seconds] = match;
const result = {};
if (years !== undefined) {
result.years = 0;
}
if (months !== undefined) {
result.months = 0;
}
if (weeks !== undefined) {
result.weeks = 0;
}
if (days !== undefined) {
result.days = 0;
}
if (hours !== undefined) {
result.hours = 0;
}
if (minutes !== undefined) {
result.minutes = 0;
}
if (seconds !== undefined) {
result.seconds = 0;
}
return Object.keys(result).length > 0 ? result : {
seconds: 0
};
}
return {
seconds: 0
};
}
return Object.fromEntries(Object.entries(units).filter(_ref2 => {
let [, value] = _ref2;
return value > 0;
}));
}
function createDurationFormatter(locale, dateStyle) {
try {
const DurationFormat = Intl.DurationFormat;
return new DurationFormat(locale, {
style: dateStyle === 'short' ? 'narrow' : dateStyle === 'medium' ? 'short' : 'long'
});
} catch {
return null;
}
}
export function formatDuration(durationMs) {
let locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultLocale;
let dateStyle = arguments.length > 2 ? arguments[2] : undefined;
let originalDurationString = arguments.length > 3 ? arguments[3] : undefined;
if (!Number.isFinite(durationMs)) {
return '0 seconds';
}
const durationObject = buildDurationObject(durationMs, originalDurationString);
let formatter = createDurationFormatter(locale, dateStyle);
if (formatter) {
try {
const result = formatter.format(durationObject);
if (result && result.trim() !== '') {
return result;
}
} catch {}
}
formatter = createDurationFormatter('en', dateStyle);
if (formatter) {
try {
const result = formatter.format(durationObject);
if (result && result.trim() !== '') {
return result;
}
} catch {}
}
if (durationMs === 0) {
return '0';
}
const parts = [];
const unitLabels = {
years: 'year',
months: 'month',
weeks: 'week',
days: 'day',
hours: 'hour',
minutes: 'minute',
seconds: 'second'
};
Object.entries(durationObject).forEach(_ref3 => {
let [unit, value] = _ref3;
if (value > 0) {
const label = unitLabels[unit];
parts.push(`${value} ${label}${value === 1 ? '' : 's'}`);
}
});
return parts.length > 0 ? parts.join(' ') : '0 seconds';
}
export function isValidDuration(durationString) {
if (!durationString || typeof durationString !== 'string') {
return false;
}
const match = durationString.match(DURATION_PATTERN);
if (!match) {
return false;
}
const [, years, months, weeks, days, hours, minutes, seconds] = match;
return !!(years !== undefined || months !== undefined || weeks !== undefined || days !== undefined || hours !== undefined || minutes !== undefined || seconds !== undefined);
}
//# sourceMappingURL=DateFormatUtils.js.map