@opengis/fastify-table
Version:
core-plugins
107 lines (91 loc) • 4.77 kB
JavaScript
/* eslint-disable no-param-reassign */
/**
* Форматування часу скільки залишилося чи пройшло від заданого
*
* @priority 3
* @deprecated true
* @type helper
* @alias formatRelative
* @example
* {{formatRelative '2022-01-13T13:05:40.841795' locate='ua'}}
* @example
* {{formatRelative '2022-01-13T13:20:40.841795' locate='ua' percent=1}}
* @param {Any} percent Будь-яке значення для відображення часу у відсотках
* @param {String} locale Мова якою відобразити час: en ru ua
* @param {String} data Отримана та введена дата для форматування
* @param {String} short
* @param {String} units
* @param {String} unit
* @param {String} data_only
* @returns {String} Returns HTML
*/
export default function formatRelative(data, options) {
if (!data) return 'Date is required';
if (typeof data === 'string') {
data = new Date(data);
}
let chLang;
let timeOut;
const locale = options.hash.locate || 'en';
const dateFrom = data;
const dateTo = options.hash.date_to ? new Date(options.hash.date_to) : new Date();
const templDifPast = {
ua: ['секунд тому', 'хвилин тому', 'годин тому', 'днів тому', 'тижнів тому', 'місяців тому', 'років тому', 'Вибачте, але заданого типу не існує'],
ru: ['секунд назад', 'минут назад', 'часов назад', 'дней назад', 'недель назад', 'місяцев назад', 'лет назад', 'Простите, но данного типа не существует'],
en: ['seconds ago', 'minutes ago', 'hours ago', 'days ago', 'weeks ago', 'months ago', 'years ago', 'Sorry, no such type of date '],
};
const templDifFeature = {
ua: ['секунд залишилось', 'хвилин залишилось', 'годин залишилось', 'днів залишилось', 'тижнів залишилось', 'місяців залишилось', 'років залишилось', 'Вибачте, але заданого типу не існує'],
ru: ['секунд осталось', 'минут осталось', 'часов осталось', 'дней осталось', 'недель осталось', 'місяцев осталось', 'лет осталось', 'Простите, но данного типа не существует'],
en: ['seconds left', 'minutes left', 'hours left', 'days left', 'weeks left', 'months left', 'years left', 'Sorry, no such type of date '],
};
const short = {
ua: ['сек', 'хв', 'год', 'дн', 'тижд', 'міс', 'р', 'Вибачте, але заданого типу не існує'],
ru: ['сек', 'мин', 'час', 'дн', 'нед', 'мес', 'г', 'Простите, но данного типа не существует'],
en: ['sec', 'min', 'hr', 'day', 'wk', 'mon', 'y', 'Sorry, no such type of date '],
};
let dif = Math.floor(dateTo.getTime() - dateFrom.getTime()) / 1000;
if (options.hash.percent) {
return ((new Date().getTime() - dateFrom.getTime()) * 100) / (dateTo.getTime() - dateFrom.getTime());
}
if (dif > 0) {
chLang = options.hash.short ? short[locale] : templDifPast[locale];
} else if (dif < 0) {
chLang = options.hash.short ? short[locale] : templDifFeature[locale];
}
dif = Math.abs(dif);
const bestFit = [
dif < 60,
dif < 3600,
dif < 3600 * 24,
dif < 3600 * 24 * 30,
dif < 3600 * 24 * 365,
].lastIndexOf(false) + 1;
options.hash.units = options.hash.units || options.hash.unit || ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'][bestFit];
switch (options.hash.units) {
case 'second':
timeOut = `${dif} ${options.hash.data_only ? '' : chLang[0]}`;
break;
case 'minute':
timeOut = `${Math.floor(dif / 60)} ${options.hash.data_only ? '' : chLang[1]}`;
break;
case 'hour':
timeOut = `${Math.floor(dif / (60 * 60))} ${options.hash.data_only ? '' : chLang[2]}`;
break;
case 'day':
timeOut = `${Math.floor(dif / (60 * 60 * 24))} ${options.hash.data_only ? '' : chLang[3]}`;
break;
case 'week':
timeOut = `${Math.floor(dif / (60 * 60 * 24 * 7))} ${options.hash.data_only ? '' : chLang[4]}`;
break;
case 'month':
timeOut = `${Math.floor(dif / (60 * 60 * 24 * 30))} ${options.hash.data_only ? '' : chLang[5]}`;
break;
case 'year':
timeOut = `${Math.floor(dif / (60 * 60 * 24 * 365))} ${options.hash.data_only ? '' : chLang[6]}`;
break;
default:
break;
}
return timeOut;
}