@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.
- package/README.md +86 -86
- package/index.js +9 -0
- package/package.json +1 -1
- package/server/helpers/format/formatAuto.js +13 -13
- package/server/helpers/format/formatDate.js +258 -258
- package/server/helpers/format/formatDigit.js +20 -20
- package/server/helpers/format/formatNum.js +361 -361
- package/server/helpers/format/formatNumber.js +54 -54
- package/server/helpers/format/formatRelative.js +106 -106
- package/server/helpers/format/formatUnit.js +38 -38
- package/server/helpers/format/num_format.js +41 -41
- package/server/helpers/funcs/_math.js +49 -49
- package/server/helpers/funcs/empty.js +21 -21
- package/server/helpers/funcs/ifCond.js +106 -106
- package/server/helpers/funcs/ifCondAnd.js +96 -96
- package/server/helpers/funcs/ifCondOr.js +98 -98
- package/server/helpers/funcs/inc.js +20 -20
- package/server/helpers/funcs/json.js +2 -2
- package/server/helpers/funcs/round.js +27 -27
- package/server/helpers/string/coalesce.js +31 -31
- package/server/helpers/string/concat.js +28 -28
- package/server/helpers/string/split.js +19 -19
- package/server/helpers/string/str_replace.js +60 -60
- package/server/helpers/string/substr.js +31 -31
- package/server/helpers/string/translit.js +23 -23
- package/server/helpers/string/utils/alphabet.js +75 -75
- package/server/plugins/cron/funcs/addCron.js +52 -52
- package/server/plugins/cron/index.js +76 -76
- package/server/plugins/crud/funcs/getOpt.js +14 -14
- package/server/plugins/crud/funcs/setOpt.js +21 -21
- package/server/plugins/crud/funcs/setToken.js +43 -43
- package/server/plugins/crud/funcs/utils/getFolder.js +11 -11
- package/server/plugins/crud/index.js +23 -23
- package/server/plugins/hook/index.js +8 -8
- package/server/plugins/logger/errorStatus.js +19 -19
- package/server/plugins/logger/index.js +26 -26
- package/server/plugins/migration/index.js +7 -7
- package/server/plugins/pg/index.js +11 -2
- package/server/plugins/policy/sqlInjection.js +33 -33
- package/server/plugins/redis/client.js +8 -8
- package/server/plugins/redis/funcs/redisClients.js +3 -3
- package/server/plugins/redis/index.js +17 -17
- package/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
- package/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
- package/server/plugins/table/funcs/getTemplates.js +19 -19
- package/server/plugins/table/funcs/gisIRColumn.js +82 -82
- package/server/plugins/table/funcs/loadTemplate.js +1 -1
- package/server/plugins/table/funcs/loadTemplatePath.js +1 -1
- package/server/plugins/table/funcs/userTemplateDir.js +1 -1
- package/server/plugins/table/index.js +13 -13
- package/server/plugins/util/index.js +7 -7
- package/server/routes/cron/index.js +16 -14
- package/server/routes/crud/index.js +8 -7
- package/server/routes/data/controllers/cardData.js +144 -0
- package/server/routes/data/controllers/cardTabData.js +58 -0
- package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -0
- package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -0
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -0
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -0
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -0
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -0
- package/server/routes/data/controllers/tableData.js +55 -0
- package/server/routes/data/controllers/tableFilter.js +16 -0
- package/server/routes/data/controllers/tableInfo.js +110 -0
- package/server/routes/data/controllers/tokenInfo.js +12 -0
- package/server/routes/data/controllers/utils/assignTokens.js +31 -0
- package/server/routes/data/controllers/utils/conditions.js +19 -0
- package/server/routes/data/controllers/utils/getColumns.js +9 -0
- package/server/routes/data/index.mjs +22 -0
- package/server/routes/data/schema.js +54 -0
- package/server/routes/dblist/index.mjs +9 -7
- package/server/routes/logger/controllers/logger.file.js +93 -93
- package/server/routes/logger/controllers/utils/checkUserAccess.js +19 -19
- package/server/routes/logger/controllers/utils/getRootDir.js +26 -26
- package/server/routes/logger/index.js +17 -17
- package/server/routes/menu/controllers/getMenu.js +97 -0
- package/server/routes/menu/controllers/interfaces.js +21 -0
- package/server/routes/menu/index.mjs +8 -0
- package/server/routes/menu/schema.js +0 -0
- package/server/routes/properties/controllers/properties.add.js +55 -55
- package/server/routes/properties/controllers/properties.get.js +17 -17
- package/server/routes/properties/index.js +16 -16
- package/server/routes/table/controllers/form.js +42 -42
- package/server/routes/table/controllers/search.js +74 -74
- package/server/routes/table/controllers/suggest.js +28 -14
- package/server/routes/table/index.js +10 -10
- package/server/routes/table/schema.js +65 -64
- package/server/routes/templates/controllers/getTemplate.js +51 -0
- package/server/routes/templates/index.mjs +10 -0
- package/server/routes/templates/schema.js +9 -0
- package/server/routes/util/controllers/status.monitor.js +8 -8
- package/server/routes/util/index.js +2 -2
- 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
|
+
};
|