UNPKG

@opengis/fastify-table

Version:

core-plugins

107 lines (91 loc) 4.77 kB
/* 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; }