@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.
- package/index.js +17 -6
- package/package.json +6 -3
- package/server/helpers/format/formatAuto.js +13 -0
- package/server/helpers/format/formatDate.js +258 -0
- package/server/helpers/format/formatDigit.js +21 -0
- package/server/helpers/format/formatNum.js +361 -0
- package/server/helpers/format/formatNumber.js +54 -0
- package/server/helpers/format/formatRelative.js +106 -0
- package/server/helpers/format/formatUnit.js +38 -0
- package/server/helpers/format/num_format.js +42 -0
- package/server/helpers/format/set.js +26 -0
- package/server/helpers/funcs/_math.js +50 -0
- package/server/helpers/funcs/contentList.js +58 -0
- package/server/helpers/funcs/empty.js +21 -0
- package/server/helpers/funcs/ifCond.js +106 -0
- package/server/helpers/funcs/ifCondAnd.js +96 -0
- package/server/helpers/funcs/ifCondOr.js +98 -0
- package/server/helpers/funcs/inc.js +21 -0
- package/server/helpers/funcs/json.js +3 -0
- package/server/helpers/funcs/qrcode.js +66 -0
- package/server/helpers/funcs/round.js +28 -0
- package/server/helpers/funcs/select.js +50 -0
- package/server/helpers/index.js +70 -3
- package/server/helpers/string/coalesce.js +31 -0
- package/server/helpers/string/concat.js +28 -0
- package/server/helpers/string/split.js +20 -0
- package/server/helpers/string/str_replace.js +61 -0
- package/server/helpers/string/substr.js +32 -0
- package/server/helpers/string/translit.js +23 -0
- package/server/helpers/string/utils/alphabet.js +76 -0
- package/server/plugins/crud/funcs/utils/logChanges.js +1 -1
- package/server/plugins/pg/funcs/getMeta.js +1 -1
- package/server/plugins/table/funcs/metaFormat/index.js +1 -1
- 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
|
+
}
|