@opengis/fastify-table
Version:
core-plugins
181 lines (180 loc) • 6.04 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;
}