@opengis/fastify-table 1.3.71 → 1.3.73

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 (93) hide show
  1. package/README.md +86 -86
  2. package/index.js +9 -0
  3. package/package.json +1 -1
  4. package/server/helpers/format/formatAuto.js +13 -13
  5. package/server/helpers/format/formatDate.js +258 -258
  6. package/server/helpers/format/formatDigit.js +20 -20
  7. package/server/helpers/format/formatNum.js +361 -361
  8. package/server/helpers/format/formatNumber.js +54 -54
  9. package/server/helpers/format/formatRelative.js +106 -106
  10. package/server/helpers/format/formatUnit.js +38 -38
  11. package/server/helpers/format/num_format.js +41 -41
  12. package/server/helpers/funcs/_math.js +49 -49
  13. package/server/helpers/funcs/empty.js +21 -21
  14. package/server/helpers/funcs/ifCond.js +106 -106
  15. package/server/helpers/funcs/ifCondAnd.js +96 -96
  16. package/server/helpers/funcs/ifCondOr.js +98 -98
  17. package/server/helpers/funcs/inc.js +20 -20
  18. package/server/helpers/funcs/json.js +2 -2
  19. package/server/helpers/funcs/round.js +27 -27
  20. package/server/helpers/string/coalesce.js +31 -31
  21. package/server/helpers/string/concat.js +28 -28
  22. package/server/helpers/string/split.js +19 -19
  23. package/server/helpers/string/str_replace.js +60 -60
  24. package/server/helpers/string/substr.js +31 -31
  25. package/server/helpers/string/translit.js +23 -23
  26. package/server/helpers/string/utils/alphabet.js +75 -75
  27. package/server/plugins/cron/funcs/addCron.js +52 -52
  28. package/server/plugins/cron/index.js +76 -76
  29. package/server/plugins/crud/funcs/getOpt.js +14 -14
  30. package/server/plugins/crud/funcs/setOpt.js +21 -21
  31. package/server/plugins/crud/funcs/setToken.js +43 -43
  32. package/server/plugins/crud/funcs/utils/getFolder.js +11 -11
  33. package/server/plugins/crud/index.js +23 -23
  34. package/server/plugins/hook/index.js +8 -8
  35. package/server/plugins/logger/errorStatus.js +19 -19
  36. package/server/plugins/logger/index.js +26 -26
  37. package/server/plugins/migration/index.js +7 -7
  38. package/server/plugins/pg/index.js +11 -2
  39. package/server/plugins/policy/sqlInjection.js +33 -33
  40. package/server/plugins/redis/client.js +8 -8
  41. package/server/plugins/redis/funcs/redisClients.js +3 -3
  42. package/server/plugins/redis/index.js +17 -17
  43. package/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  44. package/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
  45. package/server/plugins/table/funcs/getTemplates.js +19 -19
  46. package/server/plugins/table/funcs/gisIRColumn.js +82 -82
  47. package/server/plugins/table/funcs/loadTemplate.js +1 -1
  48. package/server/plugins/table/funcs/loadTemplatePath.js +1 -1
  49. package/server/plugins/table/funcs/userTemplateDir.js +1 -1
  50. package/server/plugins/table/index.js +13 -13
  51. package/server/plugins/util/index.js +7 -7
  52. package/server/routes/cron/index.js +16 -14
  53. package/server/routes/crud/index.js +8 -7
  54. package/server/routes/data/controllers/cardData.js +144 -0
  55. package/server/routes/data/controllers/cardTabData.js +58 -0
  56. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -0
  57. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -0
  58. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -0
  59. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -0
  60. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -0
  61. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -0
  62. package/server/routes/data/controllers/tableData.js +55 -0
  63. package/server/routes/data/controllers/tableFilter.js +16 -0
  64. package/server/routes/data/controllers/tableInfo.js +110 -0
  65. package/server/routes/data/controllers/tokenInfo.js +12 -0
  66. package/server/routes/data/controllers/utils/assignTokens.js +31 -0
  67. package/server/routes/data/controllers/utils/conditions.js +19 -0
  68. package/server/routes/data/controllers/utils/getColumns.js +9 -0
  69. package/server/routes/data/index.mjs +22 -0
  70. package/server/routes/data/schema.js +54 -0
  71. package/server/routes/dblist/index.mjs +9 -7
  72. package/server/routes/logger/controllers/logger.file.js +93 -93
  73. package/server/routes/logger/controllers/utils/checkUserAccess.js +19 -19
  74. package/server/routes/logger/controllers/utils/getRootDir.js +26 -26
  75. package/server/routes/logger/index.js +17 -17
  76. package/server/routes/menu/controllers/getMenu.js +97 -0
  77. package/server/routes/menu/controllers/interfaces.js +21 -0
  78. package/server/routes/menu/index.mjs +8 -0
  79. package/server/routes/menu/schema.js +0 -0
  80. package/server/routes/properties/controllers/properties.add.js +55 -55
  81. package/server/routes/properties/controllers/properties.get.js +17 -17
  82. package/server/routes/properties/index.js +16 -16
  83. package/server/routes/table/controllers/form.js +42 -42
  84. package/server/routes/table/controllers/search.js +74 -74
  85. package/server/routes/table/controllers/suggest.js +28 -14
  86. package/server/routes/table/index.js +10 -10
  87. package/server/routes/table/schema.js +65 -64
  88. package/server/routes/templates/controllers/getTemplate.js +51 -0
  89. package/server/routes/templates/index.mjs +10 -0
  90. package/server/routes/templates/schema.js +9 -0
  91. package/server/routes/util/controllers/status.monitor.js +8 -8
  92. package/server/routes/util/index.js +2 -2
  93. package/utils.js +2 -0
@@ -1,361 +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
- };
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
+ };