@opengis/fastify-table 1.3.21 → 1.3.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/index.js +17 -6
  2. package/package.json +6 -3
  3. package/server/helpers/format/formatAuto.js +13 -0
  4. package/server/helpers/format/formatDate.js +258 -0
  5. package/server/helpers/format/formatDigit.js +21 -0
  6. package/server/helpers/format/formatNum.js +361 -0
  7. package/server/helpers/format/formatNumber.js +54 -0
  8. package/server/helpers/format/formatRelative.js +106 -0
  9. package/server/helpers/format/formatUnit.js +38 -0
  10. package/server/helpers/format/num_format.js +42 -0
  11. package/server/helpers/format/set.js +26 -0
  12. package/server/helpers/funcs/_math.js +50 -0
  13. package/server/helpers/funcs/contentList.js +58 -0
  14. package/server/helpers/funcs/empty.js +21 -0
  15. package/server/helpers/funcs/ifCond.js +106 -0
  16. package/server/helpers/funcs/ifCondAnd.js +96 -0
  17. package/server/helpers/funcs/ifCondOr.js +98 -0
  18. package/server/helpers/funcs/inc.js +21 -0
  19. package/server/helpers/funcs/json.js +3 -0
  20. package/server/helpers/funcs/qrcode.js +66 -0
  21. package/server/helpers/funcs/round.js +28 -0
  22. package/server/helpers/funcs/select.js +50 -0
  23. package/server/helpers/index.js +70 -3
  24. package/server/helpers/string/coalesce.js +31 -0
  25. package/server/helpers/string/concat.js +28 -0
  26. package/server/helpers/string/split.js +20 -0
  27. package/server/helpers/string/str_replace.js +61 -0
  28. package/server/helpers/string/substr.js +32 -0
  29. package/server/helpers/string/translit.js +23 -0
  30. package/server/helpers/string/utils/alphabet.js +76 -0
  31. package/server/plugins/crud/funcs/utils/logChanges.js +1 -1
  32. package/server/plugins/pg/funcs/getMeta.js +1 -1
  33. package/server/plugins/table/funcs/metaFormat/index.js +1 -1
  34. package/utils.js +2 -2
@@ -0,0 +1,361 @@
1
+ /* eslint-disable prefer-destructuring */
2
+
3
+ function saveEval(jsCode, context = {}) {
4
+ // TODO eval
5
+ const addcontext = Object.keys(context).map((key) => `let ${key}=context["${key}"];`).join('');
6
+ // eslint-disable-next-line no-eval
7
+ return eval(addcontext + jsCode);
8
+ }
9
+
10
+ const mapNumbers = {
11
+ ua: {
12
+ 0: [2, 1, 'нуль'],
13
+ 1: [0, 2, 'одна', 'один'],
14
+ 2: [1, 2, 'дві', 'два', 'дві'],
15
+ 3: [1, 1, 'три'],
16
+ 4: [1, 1, 'чотири'],
17
+ 5: [2, 1, "п'ять"],
18
+ 6: [2, 1, 'шість'],
19
+ 7: [2, 1, 'сім'],
20
+ 8: [2, 1, 'вісім'],
21
+ 9: [2, 1, "дев'ять"],
22
+ 10: [2, 1, 'десять'],
23
+ 11: [2, 1, 'одинадцять'],
24
+ 12: [2, 1, 'дванадцять'],
25
+ 13: [2, 1, 'тринадцять'],
26
+ 14: [2, 1, 'чотирнадцять'],
27
+ 15: [2, 1, "п'ятнадцять"],
28
+ 16: [2, 1, 'шістнадцять'],
29
+ 17: [2, 1, 'сімнадцять'],
30
+ 18: [2, 1, 'вісімнадцять'],
31
+ 19: [2, 1, "дев'ятнадцять"],
32
+ 20: [2, 1, 'двадцять'],
33
+ 30: [2, 1, 'тридцять'],
34
+ 40: [2, 1, 'сорок'],
35
+ 50: [2, 1, "п'ятдесят"],
36
+ 60: [2, 1, 'шістдесят'],
37
+ 70: [2, 1, 'сімдесят'],
38
+ 80: [2, 1, 'вісімдесят'],
39
+ 90: [2, 1, "дев'яносто"],
40
+ 100: [2, 1, 'сто'],
41
+ 200: [2, 1, 'двісті'],
42
+ 300: [2, 1, 'триста'],
43
+ 400: [2, 1, 'чотириста'],
44
+ 500: [2, 1, "п'ятсот"],
45
+ 600: [2, 1, 'шістсот'],
46
+ 700: [2, 1, 'сімсот'],
47
+ 800: [2, 1, 'вісімсот'],
48
+ 900: [2, 1, "дев'ятсот"],
49
+ },
50
+ ru: {
51
+ 0: [2, 1, 'ноль'],
52
+ 1: [0, 2, 'одна', 'один'],
53
+ 2: [1, 2, 'две', 'два', 'две'],
54
+ 3: [1, 1, 'три'],
55
+ 4: [1, 1, 'четыре'],
56
+ 5: [2, 1, 'пять'],
57
+ 6: [2, 1, 'шесть'],
58
+ 7: [2, 1, 'семь'],
59
+ 8: [2, 1, 'восемь'],
60
+ 9: [2, 1, 'девять'],
61
+ 10: [2, 1, 'десять'],
62
+ 11: [2, 1, 'одинадцать'],
63
+ 12: [2, 1, 'двенадцать'],
64
+ 13: [2, 1, 'тринадцать'],
65
+ 14: [2, 1, 'четырнадцать'],
66
+ 15: [2, 1, 'пятнадцать'],
67
+ 16: [2, 1, 'шестнадцать'],
68
+ 17: [2, 1, 'семнадцать'],
69
+ 18: [2, 1, 'восемнадцать'],
70
+ 19: [2, 1, 'девятнадцать'],
71
+ 20: [2, 1, 'двадцать'],
72
+ 30: [2, 1, 'тридцать'],
73
+ 40: [2, 1, 'сорок'],
74
+ 50: [2, 1, 'пятьдесят'],
75
+ 60: [2, 1, 'шестьдесят'],
76
+ 70: [2, 1, 'семьдесят'],
77
+ 80: [2, 1, 'восемьдесят'],
78
+ 90: [2, 1, 'девяносто'],
79
+ 100: [2, 1, 'сто'],
80
+ 200: [2, 1, 'двести'],
81
+ 300: [2, 1, 'триста'],
82
+ 400: [2, 1, 'четыреста'],
83
+ 500: [2, 1, 'пятьсот'],
84
+ 600: [2, 1, 'шестьсот'],
85
+ 700: [2, 1, 'семьсот'],
86
+ 800: [2, 1, 'восемьсот'],
87
+ 900: [2, 1, 'девятьсот'],
88
+ },
89
+ };
90
+ const mapOrders = {
91
+ ua: [
92
+ { _Gender: true, _arrStates: ['', '', ''] },
93
+ { _Gender: true, _arrStates: ['тисяча', 'тисячі', 'тисяч'] },
94
+ { _Gender: false, _arrStates: ['мільйон', 'мільйона', 'мільйонів'] },
95
+ { _Gender: false, _arrStates: ['мільярд', 'мільярда', 'мільярдів'] },
96
+ { _Gender: false, _arrStates: ['триліон', 'триліона', 'триліонів'] },
97
+ {
98
+ _Gender: true,
99
+ _arrStates: {
100
+ uah: ['грн.', 'грн.', 'грн.'],
101
+ rur: ['руб.', 'руб.', 'руб.'],
102
+ },
103
+ _bAddZeroWord: true,
104
+ },
105
+ {
106
+ _Gender: true,
107
+ _arrStates: ['ціла', 'цілих', 'цілих'],
108
+ _bAddZeroWord: true,
109
+ },
110
+ { _Gender: true, _arrStates: ['', '', ''], _bAddZeroWord: true },
111
+ {
112
+ _Gender: true,
113
+ _arrStates: ['дол.', 'дол.', 'дол.'],
114
+ _bAddZeroWord: true,
115
+ },
116
+ {
117
+ _Gender: true,
118
+ _arrStates: ['грн.', 'грн.', 'грн.'],
119
+ _bAddZeroWord: true,
120
+ },
121
+ ],
122
+ ru: [
123
+ { _Gender: true, _arrStates: ['', '', ''] },
124
+ { _Gender: true, _arrStates: ['тысяча', 'тысячи', 'тысяч'] },
125
+ { _Gender: false, _arrStates: ['миллион', 'миллиона', 'миллионов'] },
126
+ { _Gender: false, _arrStates: ['миллиард', 'миллиарда', 'миллиардов'] },
127
+ { _Gender: false, _arrStates: ['триллион', 'триллиона', 'триллионов'] },
128
+ {
129
+ _Gender: true,
130
+ _arrStates: {
131
+ uah: ['грн.', 'грн.', 'грн.'],
132
+ rur: ['руб.', 'руб.', 'руб.'],
133
+ usd: ['дол.', 'дол.', 'дол.'],
134
+ },
135
+ _bAddZeroWord: true,
136
+ },
137
+ {
138
+ _Gender: true,
139
+ _arrStates: ['целых', 'целых', 'целых'],
140
+ _bAddZeroWord: true,
141
+ },
142
+ { _Gender: true, _arrStates: ['', '', ''], _bAddZeroWord: true },
143
+ {
144
+ _Gender: true,
145
+ _arrStates: ['дол.', 'дол.', 'дол.'],
146
+ _bAddZeroWord: true,
147
+ },
148
+ ],
149
+ };
150
+ const objCur = {
151
+ _Gender: false,
152
+ _arrStates: {
153
+ uah: ['грн.', 'грн.', 'грн.'],
154
+ rur: ['руб.', 'руб.', 'руб.'],
155
+ usd: ['дол.', 'дол.', 'дол.'],
156
+ num: { ru: 'цел.', ua: 'ціл.', en: 'int.' },
157
+ },
158
+ };
159
+ const objCoin = {
160
+ _Gender: false,
161
+ _arrStates: {
162
+ uah: 'коп.',
163
+ rur: 'коп.',
164
+ usd: 'цен.',
165
+ num: { ru: 'сот.', ua: 'сот.', en: 'hund.' },
166
+ },
167
+ };
168
+ // функции которые отвечают за форматирование
169
+ /**
170
+ * Formatting from number to string
171
+ *
172
+ * @example
173
+ * // returns 'дві'
174
+ * value(2, true, 'ua');
175
+ * @example
176
+ * // returns 'два'
177
+ * value(2, false, 'ua');
178
+ * @param {Number} dVal
179
+ * @param {Any} bGender
180
+ * @param {String} lang
181
+ * @returns {String} Returns a formatted string
182
+ */
183
+ function value(dVal, bGender, lang) {
184
+ const dValNew = dVal || 0;
185
+ const xVal = mapNumbers[lang][dValNew];
186
+ if (xVal[1] === 1) {
187
+ return xVal[2];
188
+ }
189
+ return xVal[2 + (bGender ? 0 : 1)];
190
+ }
191
+
192
+ /**
193
+ * Add a number to array(arrRet) in capital form
194
+ *
195
+ * @example
196
+ * // returns null
197
+ * from0To999(arrRet, 404,
198
+ * oObjDesc:
199
+ * {
200
+ * _Gender: true,
201
+ * _bAddZeroWord: undefined,
202
+ * _arrStates: ['','',''],
203
+ * },
204
+ * lang: 'ru'
205
+ * })
206
+ * @param {Array} arrRet
207
+ * @param {Number} fValue
208
+ * @param {Object} [oObjDesc._Gender]
209
+ * @param {Object} [oObjDesc._bAddZeroWord]
210
+ * @param {Object} [oObjDesc._arrStates]
211
+ * @param oObjDesc
212
+ * @param {String} lang
213
+ */
214
+ function from0To999(arrRet, fValue, oObjDesc, lang) {
215
+ let fValueNew = fValue || 0;
216
+ let nCurrState = 2;
217
+ if (Math.floor(fValueNew / 100) > 0) {
218
+ const fCurr = Math.floor(fValueNew / 100) * 100;
219
+ arrRet.push(value(fCurr, oObjDesc._Gender, lang));
220
+ nCurrState = mapNumbers[lang][fCurr][0];
221
+ fValueNew -= fCurr;
222
+ }
223
+ if (fValueNew === 0) {
224
+ arrRet.push(value(fValueNew, oObjDesc._Gender, lang));
225
+ nCurrState = mapNumbers[lang][fValueNew][0];
226
+ } else if (fValueNew < 20) {
227
+ if (Math.floor(fValueNew) > 0 || oObjDesc._bAddZeroWord) {
228
+ arrRet.push(value(fValueNew, oObjDesc._Gender, lang));
229
+ nCurrState = mapNumbers[lang][fValueNew][0];
230
+ }
231
+ } else {
232
+ const fCurr = Math.floor(fValueNew / 10) * 10;
233
+ arrRet.push(value(fCurr, oObjDesc._Gender, lang));
234
+ nCurrState = mapNumbers[lang][fCurr][0];
235
+ fValueNew -= fCurr;
236
+
237
+ if (Math.floor(fValueNew) > 0) {
238
+ arrRet.push(value(fValueNew, oObjDesc._Gender, lang));
239
+ nCurrState = mapNumbers[lang][fValueNew][0];
240
+ }
241
+ }
242
+ arrRet.push(oObjDesc._arrStates[nCurrState]);
243
+ }
244
+
245
+ /**
246
+ * Formatting from number to string
247
+ *
248
+ * @example
249
+ * // returns '404 (четыреста четыре) руб. 101 (сто одна) коп.'
250
+ * floatToSamplesInWordsUkr(404.1011001001, '%d (%dt) %curr %f (%ft) %coin', 3, 'ru', 'rur');
251
+ * @returns {String|Number} fAmount
252
+ * @param {String} resultStr
253
+ * @param {Number} exp
254
+ * @param {String} lang
255
+ * @param {String} currency
256
+ * @returns {String} Returns a formatted string
257
+ */
258
+ function floatToSamplesInWordsUkr(fAmount, resultStr, exp, lang, currency) {
259
+ let resultStrNew = resultStr;
260
+ let fInt = Math.floor(parseInt(fAmount, 10) + 0.005); // ціла частина
261
+ const fDec = Math.floor((fAmount - fInt) * exp + 0.5); // дробова частина
262
+ let arrRet = [];
263
+ const arrSouthands = [];
264
+ for (; fInt > 0.9999; fInt /= 1000) {
265
+ arrSouthands.push(Math.floor(fInt % 1000));
266
+ }
267
+ if (arrSouthands.length === 0) {
268
+ arrSouthands.push(0);
269
+ }
270
+
271
+ for (let iSouth = arrSouthands.length - 1; iSouth >= 0; iSouth -= 1) {
272
+ from0To999(
273
+ arrRet,
274
+ arrSouthands[iSouth],
275
+ mapOrders[lang][iSouth],
276
+ lang,
277
+ );
278
+ }
279
+
280
+ // опрацювуЇмо формат
281
+ resultStrNew = resultStrNew.replace(
282
+ /%dt/,
283
+ arrRet.join(' ').replace(' )', ')').trim(),
284
+ );
285
+
286
+ resultStrNew = resultStrNew.replace(
287
+ /%d/,
288
+ Math.floor(parseInt(fAmount, 10) + 0.005),
289
+ );
290
+ if (currency !== 'num' && objCur._arrStates[currency]) { resultStrNew = resultStrNew.replace(/%curr/, objCur._arrStates[currency][0]); } else {
291
+ resultStrNew = resultStrNew.replace(
292
+ /%curr/,
293
+ objCur._arrStates[lang === 'ru' ? 'rur' : lang][0],
294
+ );
295
+ }
296
+
297
+ // опрацьовуЇмо дробову частину
298
+ arrRet = []; // опустошуЇмо масив для запису в нього тільки дробовоњ частини
299
+ from0To999(arrRet, fDec, mapOrders[lang][0], lang);
300
+
301
+ // опрацювуЇмо формат
302
+ resultStrNew = resultStrNew.replace(
303
+ /%ft/,
304
+ arrRet.join(' ').replace(' )', ')').trim(),
305
+ );
306
+
307
+ resultStrNew = resultStrNew.replace(/%f/, fDec);
308
+
309
+ if (currency !== 'num' && objCur._arrStates[currency]) { resultStrNew = resultStrNew.replace(/%coin/, objCoin._arrStates[currency]); } else {
310
+ resultStrNew = resultStrNew.replace(
311
+ /%coin/,
312
+ objCoin._arrStates[lang === 'ru' ? 'rur' : lang],
313
+ );
314
+ }
315
+ return resultStrNew;
316
+ }
317
+
318
+ /**
319
+ * Formatting from number to string
320
+ *
321
+ * @summary Formatting from number to string
322
+ * @priority 0
323
+ * @deprecated true
324
+ * @type helper
325
+ * @alias formatNum
326
+ * @param {Number} round Округлення
327
+ * @param {String} currency Валюта
328
+ * @param {String} lang Мова на якій видати інформацію
329
+ * @param {String} format Шаблон вигляду результату
330
+ * @param {String|Number} data Число для форматування
331
+ * @returns {String} Returns HTML
332
+ */
333
+
334
+ export default function formatNum(data, options = {}) {
335
+ let name = data;
336
+
337
+ if (!name) { name = 0; } // в случае значения NULL
338
+ if (typeof name === 'string' && !name.match(/^[a-zA-Z0-9.]+$/g)) {
339
+ let exec = name;
340
+ exec = exec.replace(
341
+ /([a-zA-Z_.]{3,100}[0-9]*)/g,
342
+ 'options.data.root.$1',
343
+ );
344
+
345
+ name = saveEval(exec);
346
+ name = name ? parseFloat(name) : 0;
347
+ if (options.hash.round) name = name.toFixed(options.hash.round);
348
+ }
349
+
350
+ const opt = options.hash; // додатков≥ опц≥њ
351
+ const currency = opt.currency || 'uah';
352
+
353
+ const lang = opt.lang || 'ua';
354
+ // if(['ru','ua'].indexOf(lang)==-1)
355
+ // lang=(['ru','ua'].indexOf(window.lang)>-1?window.lang:'ua');
356
+ const round = opt.round || 2;
357
+ const exp = 10 ** round; // к≥льк≥сть знак≥в псл¤ коми
358
+ const resultStr = opt.format || '%d (%dt) %curr %f (%ft) %coin';
359
+
360
+ return floatToSamplesInWordsUkr(name, resultStr, exp, lang, currency);
361
+ };
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Форматування до числа
3
+ *
4
+ * @summary Форматування до числа
5
+ * @priority 0
6
+ * @alias formatNumber
7
+ * @type helper
8
+ * @example
9
+ * {{{formatNumber space}}}
10
+ * @example
11
+ * {{{formatNumber amount}}}
12
+ * @example
13
+ * {{formatNumber size_log}}
14
+ * @example
15
+ * {{formatNumber (coalesce proj_finish 0) }}
16
+ * @param {String|Number} data Число для формування
17
+ * @param {Number} round Параметр округлення
18
+ * @param {String} style Стиль форматування (currency, decimal, percent, unit)
19
+ * @param {String} currency Валюта (наприклад, EUR)
20
+ * @param {String} unit Одиниця вимірювання (наприклад, liter)
21
+ * @param {String} locale Мова (наприклад, ua, en)
22
+ * @param {String} unitDisplay Стиль відображення одиниці (short, narrow, long)
23
+ * @param {String} notation Стиль скорочення чисел (compact)
24
+ * @returns {String} Відформатоване число
25
+ */
26
+
27
+ export default function formatNumber(data, options) {
28
+ const TP = typeof data;
29
+
30
+ if (!data || (TP !== 'number' && TP !== 'string')) return '';
31
+
32
+ if (TP === 'string') {
33
+ data = data.replace(',', '.') - 0;
34
+ }
35
+
36
+ const round = options.hash?.round ?? 2;
37
+ const style = options.hash?.style ?? 'decimal';
38
+ const currency = options.hash?.currency ?? 'UAH';
39
+ const unit = options.hash?.unit ?? 'liter';
40
+ const locale = options.hash?.locale ?? 'ua';
41
+ const unitDisplay = options.hash?.unitDisplay ?? 'short';
42
+ const notation = options.hash?.notation ?? 'standard';
43
+
44
+ const formatter = new Intl.NumberFormat(locale, {
45
+ style: style,
46
+ currency: currency,
47
+ unit: unit,
48
+ unitDisplay: unitDisplay,
49
+ notation: notation,
50
+ maximumFractionDigits: round
51
+ });
52
+
53
+ return formatter.format(data - 0);
54
+ }
@@ -0,0 +1,106 @@
1
+
2
+ /* eslint-disable no-param-reassign */
3
+ /**
4
+ * Форматування часу скільки залишилося чи пройшло від заданого
5
+ *
6
+ * @priority 3
7
+ * @deprecated true
8
+ * @type helper
9
+ * @alias formatRelative
10
+ * @example
11
+ * {{formatRelative '2022-01-13T13:05:40.841795' locate='ua'}}
12
+ * @example
13
+ * {{formatRelative '2022-01-13T13:20:40.841795' locate='ua' percent=1}}
14
+ * @param {Any} percent Будь-яке значення для відображення часу у відсотках
15
+ * @param {String} locale Мова якою відобразити час: en ru ua
16
+ * @param {String} data Отримана та введена дата для форматування
17
+ * @param {String} short
18
+ * @param {String} units
19
+ * @param {String} unit
20
+ * @param {String} data_only
21
+ * @returns {String} Returns HTML
22
+ */
23
+
24
+ export default function formatRelative(data, options) {
25
+ if (!data) return 'Date is required';
26
+ if (typeof data === 'string') {
27
+ data = new Date(data);
28
+ }
29
+
30
+ let chLang;
31
+ let timeOut;
32
+
33
+ const locale = options.hash.locate || 'en';
34
+
35
+ const dateFrom = data;
36
+ const dateTo = options.hash.date_to ? new Date(options.hash.date_to) : new Date();
37
+
38
+ const templDifPast = {
39
+ ua: ['секунд тому', 'хвилин тому', 'годин тому', 'днів тому', 'тижнів тому', 'місяців тому', 'років тому', 'Вибачте, але заданого типу не існує'],
40
+ ru: ['секунд назад', 'минут назад', 'часов назад', 'дней назад', 'недель назад', 'місяцев назад', 'лет назад', 'Простите, но данного типа не существует'],
41
+ en: ['seconds ago', 'minutes ago', 'hours ago', 'days ago', 'weeks ago', 'months ago', 'years ago', 'Sorry, no such type of date '],
42
+ };
43
+
44
+ const templDifFeature = {
45
+ ua: ['секунд залишилось', 'хвилин залишилось', 'годин залишилось', 'днів залишилось', 'тижнів залишилось', 'місяців залишилось', 'років залишилось', 'Вибачте, але заданого типу не існує'],
46
+ ru: ['секунд осталось', 'минут осталось', 'часов осталось', 'дней осталось', 'недель осталось', 'місяцев осталось', 'лет осталось', 'Простите, но данного типа не существует'],
47
+ en: ['seconds left', 'minutes left', 'hours left', 'days left', 'weeks left', 'months left', 'years left', 'Sorry, no such type of date '],
48
+ };
49
+
50
+ const short = {
51
+ ua: ['сек', 'хв', 'год', 'дн', 'тижд', 'міс', 'р', 'Вибачте, але заданого типу не існує'],
52
+ ru: ['сек', 'мин', 'час', 'дн', 'нед', 'мес', 'г', 'Простите, но данного типа не существует'],
53
+ en: ['sec', 'min', 'hr', 'day', 'wk', 'mon', 'y', 'Sorry, no such type of date '],
54
+ };
55
+
56
+ let dif = Math.floor(dateTo.getTime() - dateFrom.getTime()) / 1000;
57
+
58
+ if (options.hash.percent) {
59
+ return ((new Date().getTime() - dateFrom.getTime()) * 100) / (dateTo.getTime() - dateFrom.getTime());
60
+ }
61
+
62
+ if (dif > 0) {
63
+ chLang = options.hash.short ? short[locale] : templDifPast[locale];
64
+ } else if (dif < 0) {
65
+ chLang = options.hash.short ? short[locale] : templDifFeature[locale];
66
+ }
67
+ dif = Math.abs(dif);
68
+
69
+ const bestFit = [
70
+ dif < 60,
71
+ dif < 3600,
72
+ dif < 3600 * 24,
73
+ dif < 3600 * 24 * 30,
74
+ dif < 3600 * 24 * 365,
75
+ ].lastIndexOf(false) + 1;
76
+
77
+ options.hash.units = options.hash.units || options.hash.unit || ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'][bestFit];
78
+
79
+ switch (options.hash.units) {
80
+ case 'second':
81
+ timeOut = `${dif} ${options.hash.data_only ? '' : chLang[0]}`;
82
+ break;
83
+ case 'minute':
84
+ timeOut = `${Math.floor(dif / 60)} ${options.hash.data_only ? '' : chLang[1]}`;
85
+ break;
86
+ case 'hour':
87
+ timeOut = `${Math.floor(dif / (60 * 60))} ${options.hash.data_only ? '' : chLang[2]}`;
88
+ break;
89
+ case 'day':
90
+ timeOut = `${Math.floor(dif / (60 * 60 * 24))} ${options.hash.data_only ? '' : chLang[3]}`;
91
+ break;
92
+ case 'week':
93
+ timeOut = `${Math.floor(dif / (60 * 60 * 24 * 7))} ${options.hash.data_only ? '' : chLang[4]}`;
94
+ break;
95
+ case 'month':
96
+ timeOut = `${Math.floor(dif / (60 * 60 * 24 * 30))} ${options.hash.data_only ? '' : chLang[5]}`;
97
+ break;
98
+ case 'year':
99
+ timeOut = `${Math.floor(dif / (60 * 60 * 24 * 365))} ${options.hash.data_only ? '' : chLang[6]}`;
100
+ break;
101
+ default:
102
+ break;
103
+ }
104
+
105
+ return timeOut;
106
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Повертає розмір файлу на диску у встановлених одиницях вимірювання об'єму файлу.
3
+ *
4
+ * @summary Повертає розмір растру у відповідних одиницях об'єму файлу (Тбайт, Гбайт, Мбайт)
5
+ * @priority 2
6
+ * @type helper
7
+ * @tag format
8
+ * @alias formatUnit
9
+ * @example
10
+ * {{formatUnit '123.45678' number="2"}}
11
+ * @param {data} data Число для перетворення
12
+ * @param {Number} number Число після точки
13
+ * @param {String} unit "В"
14
+ * @returns {String} Returns HTML
15
+ */
16
+ export default function formatUnit(data, options) {
17
+ data = parseFloat(data);
18
+ if (isNaN(data)) return data;
19
+
20
+ const _UNIT = {
21
+ B: {
22
+ 4: 'TB', 3: 'GB', 2: 'MB', 1: 'KB', 0: 'B',
23
+ },
24
+ };
25
+
26
+ const unit = _UNIT[options.hash.unit] || _UNIT.B;
27
+ const number = options.hash.number || 0;
28
+
29
+ for (let i = 4; i >= 0; i -= 1) {
30
+ /* If i=0 then dataNew>0 - size in min units (17/03/20 by Olya) */
31
+ if (data >= (i ? (10 ** (3 * i)) : i)) {
32
+ return (data / (10 ** (3 * i)))
33
+ .toFixed(data % (10 ** (3 * i)) ? number : 0) + unit[i];
34
+ }
35
+ }
36
+
37
+ return data.toString();
38
+ };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Приведення чисел до стандартизованого виду
3
+ *
4
+ * @summary Форматування у число. Є можливість використання разом із значком span
5
+ * @priority 4
6
+ * @type helper
7
+ * @tag format
8
+ * @alias numFormat
9
+ * @example
10
+ * {{{num_format (coalesce rows.[0].attr 123.456) dec="2"}}}
11
+ * @example
12
+ * {{num_format (coalesce price 1) fixed="4"}}
13
+ * @example
14
+ * {{{num_format (math_sum multilang attr="total" fixed=2)}}}
15
+ * @param {String|Number} data Число для форматування
16
+ * @param {Object} span False - перевірка чи повернути у вигляді html з тега span
17
+ * @returns {String} Returns HTML
18
+ */
19
+ export default function numFormat(data, options) {
20
+ const TP = typeof data;
21
+ const { dec, fixed, span } = options.hash;
22
+ const charAfterZero = dec || fixed;
23
+
24
+ if (!data || (TP !== 'number' && TP !== 'string')) return '';
25
+
26
+ if (TP === 'string') {
27
+ data = parseFloat(data.replace(',', '.'));
28
+ }
29
+
30
+ if (isNaN(data)) return '';
31
+
32
+ const num = (data)
33
+ .toFixed(charAfterZero || 2)
34
+ .replace(/(\d)(?=(\d{3})+\.)/g, '$1 ')
35
+ .split('.');
36
+
37
+ if (span) {
38
+ return num.map((el, i) => `<span class="part${i + 1}">${el}</span>`).join('.');
39
+ }
40
+
41
+ return num.join('.');
42
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Створює змінну, яка використовується у шаблоні та може бути записана в БД.
3
+ * Використовується для спрощення зовнішнього вигляду коду та за умови багаторазового використання.
4
+ *
5
+ * @summary Записує на сайт зміни. Є можливість вносити зміни до бази даних.
6
+ * @priority 3
7
+ * @type helper
8
+ * @alias set
9
+ * @tag string
10
+ * @example
11
+ * {{set '_limit' 10}} {{_limit}}
12
+ * @descr Створює змінну _limit, яка може бути викликана з будь-якої частини шаблону та встановлює значення,
13
+ * яке отримується з хешу ( наприклад, через присвоєння limit=10 в межах handlebars (хелпер _hb) )
14
+ * @param {Any} save Для перевірки чи робити збереження в базі
15
+ * @param {Array} args Масив, у якому містяться html строки
16
+ * @returns {String} Returns HTML
17
+ */
18
+ export default function set(variableName, value) {
19
+ if (typeof variableName === 'string') {
20
+ this[variableName] = value;
21
+ } else {
22
+ console.error('Invalid variable name.');
23
+ }
24
+
25
+ return '';
26
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Хелпер для виконання математичних операцій з числами
3
+ *
4
+ * @summary Дії над числами. Дозволяє виконання простих математичних операцій.
5
+ * @priority 3
6
+ * @type helper
7
+ * @tag math
8
+ * @alias _math
9
+ * @example
10
+ * {{_math operator='-' arg1=10 arg2=5}}
11
+ * @descr Отримання різниці між arg1 та arg2
12
+ * @example
13
+ * {{_math '1' '+' '1'}}
14
+ * @descr Виконання складання довжини масиву + 2
15
+ * @param {Object} operator Оператор для дії з числами
16
+ * @param {Object} arg1 Перше число для дії
17
+ * @param {Object} arg2 Друге число для дії
18
+ * @param {Array} args[0]] Перше число для дії
19
+ * @param {Array} args[1]] Оператор для дії з числами
20
+ * @param {Array} args[2]] Друге число для дії
21
+ * @returns {String} Returns HTML
22
+ */
23
+ export default function _math(...args) {
24
+ const options = args.pop();
25
+ const opt = options.hash;
26
+
27
+ const operator = opt.operator ? opt.operator : args[1];
28
+ opt.arg1 = (opt.arg1 || args[0]) - 0;
29
+ opt.arg2 = (opt.arg2 || args[2]) - 0;
30
+
31
+ if (+opt.arg1 !== 0 && !opt.arg1) return '';
32
+ if (+opt.arg2 !== 0 && !opt.arg2) return '';
33
+
34
+ switch (operator) {
35
+ case '/':
36
+ return opt.arg1 / opt.arg2;
37
+ case '%':
38
+ return opt.arg1 % opt.arg2;
39
+ case '*':
40
+ return opt.arg1 * opt.arg2;
41
+ case '-':
42
+ return opt.arg1 - opt.arg2;
43
+ case '+':
44
+ return opt.arg1 + opt.arg2;
45
+ case '.%':
46
+ return `${((opt.arg1 * 100) / opt.arg2).toFixed(0)}%`;
47
+ default:
48
+ return 'operator is not defined';
49
+ }
50
+ }