zet-lib 1.0.0

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/lib/Util.js ADDED
@@ -0,0 +1,1242 @@
1
+ const moment = require('moment');
2
+ const path = require('path');
3
+ const randomstring = require("randomstring");
4
+ const fs = require('fs-extra');
5
+ const { v4: uuidv4 } = require('uuid');
6
+ const sha256 = require('js-sha256');
7
+
8
+ const Util = {}
9
+
10
+ Util.tab = '\t';
11
+ Util.tabs = (n) => {
12
+ let ret = '';
13
+ for (var i = 0; i < n; i++) {
14
+ ret += Util.tab;
15
+ }
16
+ return ret;
17
+ };
18
+
19
+ Util.NEW_LINE = '\n';
20
+ Util.newLine = '\r\n';
21
+ Util.newLines = (n) => {
22
+ let ret = '';
23
+ for (var i = 0; i < n; i++) {
24
+ ret += Util.newLine;
25
+ }
26
+ return ret;
27
+ };
28
+
29
+ //sha256
30
+ Util.hash = (string) => {
31
+ return sha256(string);
32
+ };
33
+
34
+ Util.hashCompare = (myPlaintextPassword, hash) => {
35
+ return Util.hash(myPlaintextPassword) == hash;
36
+ };
37
+
38
+ Util.excelSequence = function () {
39
+ let abjads = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
40
+ let arr = abjads;
41
+ let char = 0;
42
+ let num = 26;
43
+ for (let x = 2; x < 15; x++) {
44
+ let idx = 0;
45
+ for (let i = 1; i <= 26; i++) {
46
+ arr[num] = abjads[char] + abjads[idx];
47
+ idx++;
48
+ num++;
49
+ }
50
+ char++;
51
+ }
52
+
53
+ return arr;
54
+ };
55
+
56
+ Util.now = function () {
57
+ return moment(new Date()).format("YYYY-MM-DD HH:mm:ss");
58
+ };
59
+
60
+ Util.nowShort = function () {
61
+ return moment(new Date()).format("YYYY-MM-DD");
62
+ };
63
+
64
+ Util.ago = (data) => {
65
+ return moment(data).fromNow();
66
+ };
67
+ /*
68
+ moment get one month ago from current
69
+ var monthago = moment().subtract(1, 'months').format('YYYY-MM-DD');
70
+
71
+ */
72
+
73
+ Util.dateSql = function (date, format) {
74
+ format = format || "YYYY-MM-DD";
75
+ if (date && date != "0000-00-00")
76
+ return moment(date).format(format);
77
+ else
78
+ return '';
79
+ };
80
+
81
+ Util.dateFormat = function (date, format) {
82
+ format = format || "YYYY-MM-DD";
83
+ if (date && date != "0000-00-00")
84
+ return moment(date).format(format);
85
+ else
86
+ return '';
87
+ };
88
+
89
+ Util.timePublic = function (date) {
90
+ if (date)
91
+ return moment(date).format("DD MMM YYYY");
92
+ else
93
+ return '';
94
+ };
95
+
96
+ Util.timeSql = function (date, format) {
97
+ if (date && date != "0000-00-00 00:00:00"){
98
+ format = format || "YYYY-MM-DD HH:mm:ss";
99
+ return moment(date).format(format);
100
+ }
101
+ else
102
+ return '';
103
+ };
104
+
105
+ Util.getDate = function (date) {
106
+ date = date + "" || "";
107
+ if (date != "") {
108
+ let explode = date.split("-");
109
+ return {
110
+ year: parseInt(explode[0]),
111
+ month: parseInt(explode[1]),
112
+ date: parseInt(explode[2]),
113
+ }
114
+ } else {
115
+ return {
116
+ year: 0,
117
+ month: 0,
118
+ date: 0
119
+ }
120
+ }
121
+ };
122
+
123
+ Util.dateIsBetween = (compare, start, end) => {
124
+ if (compare == "" || compare == "0000-00-00") {
125
+ return false;
126
+ }
127
+ compare = moment(compare).format("YYYY-MM-DD");
128
+ start = moment(start).format("YYYY-MM-DD");
129
+ end = moment(end).format("YYYY-MM-DD");
130
+ let today = moment(compare);
131
+ let startDate = moment(start);
132
+ let endDate = moment(end);
133
+
134
+ if (compare == start) {
135
+ return true;
136
+ } else if (compare == end) {
137
+ return true;
138
+ } else {
139
+ return today.isBetween(startDate, endDate);
140
+ }
141
+ };
142
+
143
+ Util.getMonth = function (date) {
144
+ if (date.length > 5) {
145
+ let n = new Date(date)
146
+ let m = n.getMonth();
147
+ return parseInt(m) + 1;
148
+ }
149
+ return 0;
150
+ };
151
+
152
+ Util.getYear = function (date) {
153
+ date = Util.dateSql(date) || "";
154
+ return date.slice(0, 4);
155
+ };
156
+
157
+ //first is smaller than second
158
+ Util.calculateDay = function (from, to, holidayInWeek = 0) {
159
+ holidayInWeek = parseInt(holidayInWeek) || 0;
160
+ let count = 0;
161
+ if (holidayInWeek == 1) {
162
+ let days = Util.enumerateDaysBetweenDates(moment(from).format("YYYY-MM-DD"), moment(to).format("YYYY-MM-DD"));
163
+ let countdays = days.filter((item) => parseInt(moment(item).format("d")) != 0);
164
+ count = countdays.length;
165
+ } else if (holidayInWeek == 2) {
166
+ let days = Util.enumerateDaysBetweenDates(moment(from).format("YYYY-MM-DD"), moment(to).format("YYYY-MM-DD"));
167
+ let countdays = days.filter((item) => parseInt(moment(item).format("d")) != 0 && parseInt(moment(item).format("d")) != 6);
168
+ count = countdays.length;
169
+ } else {
170
+ let a = moment(from);
171
+ let b = moment(to);
172
+ count = b.diff(a, 'days') + 1;
173
+ }
174
+
175
+ return count;
176
+ };
177
+
178
+ var getDaysBetweenDates = function (startDate, endDate) {
179
+ let now = startDate.clone(), dates = [];
180
+ while (now.isSameOrBefore(endDate)) {
181
+ dates.push(now.format('MM/DD/YYYY'));
182
+ now.add(1, 'days');
183
+ }
184
+ return dates;
185
+ };
186
+
187
+ //itterate days in array
188
+ Util.enumerateDaysBetweenDates = function (startDate, endDate) {
189
+ let now = moment(startDate).clone(), dates = [];
190
+ while (now.isSameOrBefore(endDate)) {
191
+ dates.push(now.format('MM/DD/YYYY'));
192
+ now.add(1, 'days');
193
+ }
194
+ return dates;
195
+ };
196
+
197
+ Util.tableArray = function (arr) {
198
+ let r = [];
199
+ let tables = arr[0];
200
+ for (let i = 0; i < tables.length; i++) {
201
+ for (let obj in tables[i]) {
202
+ r.push(tables[i][obj]);
203
+ }
204
+ }
205
+ return r;
206
+ };
207
+
208
+ /*
209
+ table array in sql to arr table name
210
+ only for generator
211
+ */
212
+ Util.tableArrayToObj = (arr) => {
213
+ return arr.map(m => Object.values(m)[0]);
214
+ };
215
+
216
+ Util.escapeRegExp = function (str) {
217
+ return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
218
+ };
219
+
220
+ Util.validateEmail = function (email) {
221
+ let re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
222
+ return re.test(email);
223
+ };
224
+
225
+ /*
226
+ Replace All like str_replace in PHP
227
+ example : Util.replaceAll("abd","a","")
228
+ */
229
+
230
+ Util.replaceAll = function (str, find, replace) {
231
+ let t = ''
232
+ if (Array.isArray(find)) {
233
+ t = str;
234
+ for (let i = 0; i < find.length; i++) {
235
+ if (str.indexOf(find[i]) > -1) {
236
+ t = str.replace(new RegExp(Util.escapeRegExp(find[i]), 'g'), replace);
237
+ //console.log(t)
238
+ }
239
+ }
240
+ } else {
241
+ if(typeof str == "string") {
242
+ t = str.replace(new RegExp(Util.escapeRegExp(find), 'g'), replace);
243
+ }
244
+ }
245
+ return t;
246
+ };
247
+
248
+ Util.phoneFixed = function (str) {
249
+ let ret = ''
250
+ str = Util.replaceAll(str, ' ', '')
251
+ let phone = str.trim()
252
+ phone = Util.replaceAll(phone, '-', '')
253
+ let first = phone.charAt(0)
254
+ if (first == '') {
255
+ ret = '';
256
+ } else if (first == '+') {
257
+ ret = phone;
258
+ } else if (first == '0') {
259
+ ret = '+62' + phone.replace('0', '');
260
+ } else {
261
+ ret = '+' + phone
262
+ }
263
+
264
+ return ret;
265
+ };
266
+
267
+ Util.jsonSuccess = function (message) {
268
+ message = message || LANGUAGE.data_saved;
269
+ let json = {type: 'success', status: 1, title: LANGUAGE.success, message: message}
270
+
271
+ return json;
272
+ };
273
+
274
+ Util.flashError = function (message, errors) {
275
+ errors = errors || [];
276
+ message = message || LANGUAGE.data_not_found;
277
+ let json = {type: 'error', status: 0, title: 'Error', message: message, errors: errors}
278
+
279
+ return json;
280
+ };
281
+
282
+ Util.jsonError = function (path, message) {
283
+ let json = {}
284
+ json.errorLog = 1;
285
+ json.type = 'error';
286
+ json.status = 0;
287
+ json.title = path + ' Error!';
288
+ json.message = message;
289
+ json.errors = [{path: path, message: message}]
290
+
291
+ return json;
292
+ };
293
+
294
+ Util.arrayToObject = (array, keyField, isInteger = false) => {
295
+ let obj = {}
296
+ if(array.length) {
297
+ array.forEach(function (item) {
298
+ var name = item[keyField] == null ? 'xxxxxx' : item[keyField] == 'null' ? 'xxxxxx' : isInteger ? item[keyField] : item[keyField] + "";
299
+ obj[name]=item
300
+ });
301
+ }
302
+ return obj;
303
+ };
304
+
305
+ //chase id:1,name:'test' t0 {1:'test'}
306
+ Util.modulesSwitch = (arr) => {
307
+ let stores = [];
308
+ stores.push({id: '', name: ''});
309
+ arr.forEach((ar, index) => {
310
+ stores.push({id: index, name: ar})
311
+ });
312
+ return stores;
313
+ };
314
+
315
+
316
+ Util.buildArrayObjectPrefix = function (arr) {
317
+ return Util.modulesSwitch(arr);
318
+ };
319
+
320
+ Util.arrayWithObject = (array, key, field) => {
321
+ if(array.length) {
322
+ return array.reduce((obj, item) => {
323
+ obj[item[key]] = item[field];
324
+ return obj;
325
+ }, {});
326
+ }
327
+ };
328
+
329
+ /*
330
+ for movedupload file using single file
331
+ */
332
+ Util.moveFile = function (buffer, filename) {
333
+ return new Promise(function (resolve, reject) {
334
+ buffer.mv(filename, function (err) {
335
+ if (err) {
336
+ reject(err)
337
+ } else {
338
+ resolve(filename)
339
+ }
340
+ });
341
+ });
342
+ };
343
+
344
+ Util.generateUnique = function (length, charset) {
345
+ let random = Util.generate(length, charset);
346
+ let uid = (new Date().valueOf()).toString(36)
347
+
348
+ return uid + random;
349
+ };
350
+
351
+ Util.generate = function (length, charset) {
352
+ length = length || 50;
353
+ //alphanumeric - [0-9 a-z A-Z] alphabetic - [a-z A-Z] numeric - [0-9] hex - [0-9 a-f] custom - any given characters
354
+ charset = charset || "alphanumeric";
355
+ return randomstring.generate({
356
+ length: length,
357
+ charset: charset
358
+ });
359
+ };
360
+
361
+
362
+ Util.uuid = () => {
363
+ return uuidv4();
364
+ };
365
+ /*
366
+ generate random string 8
367
+ */
368
+ Util.random = function (length) {
369
+ length = length || 5;
370
+ let text = "";
371
+ const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
372
+ for (let i = 0; i < length; i++)
373
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
374
+
375
+ return text;
376
+ };
377
+
378
+ Util.whitelist = function () {
379
+ return ['www', 'app', 'my', 'sintret', 'https', 'https'];
380
+ };
381
+
382
+ Util.convertDate = function (d) {
383
+ d = d.trim()
384
+ let myarr = d.split(" ");
385
+ return myarr[2] + '-' + Util.monthConvert(myarr[1]) + '-' + myarr[0];
386
+ };
387
+
388
+ // get string start from to
389
+ Util.cut = function (text, start, end) {
390
+ return text.substr(start, end)
391
+ };
392
+
393
+ Util.getFormattedDate = function (date) {
394
+ let year = date.getFullYear();
395
+ let month = (1 + date.getMonth()).toString();
396
+ month = month.length > 1 ? month : '0' + month;
397
+ let day = date.getDate().toString();
398
+ day = day.length > 1 ? day : '0' + day;
399
+ let time = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
400
+ return year + '-' + month + '-' + day + ' ' + time;
401
+ };
402
+
403
+ Util.uniqueId = function () {
404
+ return (Date.now().toString(36) + Math.random().toString(36).substr(2, 5)).toUpperCase();
405
+ };
406
+
407
+ Util.typePaperSize = [
408
+ {title: "F4", description: "FOLIO", width: 215, height: 330},
409
+ {title: "LEGAL", description: "LEGAL", width: 216, height: 356},
410
+ {title: "LETTER", description: "LETTER", width: 216, height: 279},
411
+ {title: "A3", description: "A3", width: 297, height: 420},
412
+ {title: "A4", description: "A4", width: 210, height: 297},
413
+ {title: "A5", description: "A5", width: 148, height: 210},
414
+ {title: "A6", description: "A6", width: 105, height: 148},
415
+ {title: "A7", description: "A7", width: 74, height: 105},
416
+ {title: "A8", description: "A8", width: 52, height: 74},
417
+ {title: "A9", description: "A9", width: 37, height: 52},
418
+ {title: "CUSTOM", description: "CUSTOM", width: 105, height: 148},
419
+ ]
420
+
421
+ Util.typeFont = [
422
+ 'Verdana, Geneva, sans-serif',
423
+ '"Times New Roman", Times, serif',
424
+ 'Georgia, serif',
425
+ '"Palatino Linotype", "Book Antiqua", Palatino, serif',
426
+ 'Arial, Helvetica, sans-serif',
427
+ '"Arial Black", Gadget, sans-serif',
428
+ '"Comic Sans MS", cursive, sans-serif',
429
+ 'Impact, Charcoal, sans-serif',
430
+ '"Lucida Sans Unicode", "Lucida Grande", sans-serif',
431
+ 'Tahoma, Geneva, sans-serif',
432
+ '"Trebuchet MS", Helvetica, sans-serif',
433
+ '"Courier New", Courier, monospace',
434
+ '"Lucida Console", Monaco, monospace'
435
+ ]
436
+
437
+ Util.objectToGridFormat = function (obj, isInteger) {
438
+ isInteger = isInteger || false;
439
+ let arr = []
440
+ arr.push({id: '', name: ''});
441
+ for (let keys in obj) {
442
+ if (isInteger) {
443
+ arr.push({id: parseInt(keys), name: obj[keys]})
444
+ } else {
445
+ arr.push({id: keys, name: obj[keys]})
446
+ }
447
+ }
448
+ return arr;
449
+ }
450
+
451
+ Util.random = function (length) {
452
+ length = length || 5;
453
+ let text = "";
454
+ const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
455
+ for (let i = 0; i < length; i++)
456
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
457
+
458
+ return text;
459
+ }
460
+
461
+ Util.typePrint = {
462
+ register: '{"paper_size":"F4","paper_size_width":"215","paper_size_height":"330","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"10","header":"SURAT PERINTAH KERJA","header_font":"0","header_font_size":"26"}',
463
+ estimation: '{"paper_size":"F4","paper_size_width":"215","paper_size_height":"330","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"12","header":"ESTIMASI BIAYA PERBAIKAN","header_font":"0","header_font_size":"18"}',
464
+ invoice: '{"paper_size":"A5","paper_size_width":"148","paper_size_height":"210","padding_top":"8","padding_right":"8","padding_bottom":"8","padding_left":"8","border":"1","font":"0","font_size":"12","header":"INVOICE","header_font":"0","header_font_size":"18"}',
465
+ currency: '{"symbol":"Rp","name":"Rupiah","thousand":"."}'
466
+ };
467
+
468
+ Util.isJson = function (text) {
469
+ if(text) {
470
+ if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
471
+ //the json is ok
472
+ return true;
473
+ } else {
474
+ return false;
475
+ //the json is not ok
476
+ }
477
+ }
478
+ return false;
479
+ };
480
+
481
+ Util.isEmptyObject = function (obj) {
482
+ for(let prop in obj) {
483
+ if(Object.prototype.hasOwnProperty.call(obj, prop)) {
484
+ return false;
485
+ }
486
+ }
487
+
488
+ return JSON.stringify(obj) === JSON.stringify({});
489
+ };
490
+
491
+ Util.serializeTable = function (table) {
492
+ return '`' + table + '`';
493
+ };
494
+
495
+ Util.getKey = function (obj, field) {
496
+ let t = '';
497
+ for (let item in obj) {
498
+ if (obj[item] == field) {
499
+ return item;
500
+ }
501
+ }
502
+ return t;
503
+ };
504
+
505
+ /**
506
+ * Camelize a string, cutting the string by multiple separators like
507
+ * hyphens, underscores and spaces.
508
+ *
509
+ * @param {text} string Text to camelize
510
+ * @return string Camelized text
511
+ *
512
+ * // someDatabaseFieldName
513
+ console.log(camelize("some_database_field_name"));
514
+
515
+ // someLabelThatNeedsToBeCamelized
516
+ console.log(camelize("Some label that needs to be camelized"));
517
+
518
+ // someJavascriptProperty
519
+ console.log(camelize("some-javascript-property"));
520
+
521
+ // someMixedStringWithSpacesUnderscoresAndHyphens
522
+ console.log(camelize("some-mixed_string with spaces_underscores-and-hyphens"));
523
+ */
524
+ Util.camelize = function (text) {
525
+ return text.replace(/^([A-Z])|[\s-_]+(\w)/g, function (match, p1, p2, offset) {
526
+ if (p2) return p2.toUpperCase();
527
+ return p1.toLowerCase();
528
+ });
529
+ }
530
+
531
+ /**
532
+ * Decamelizes a string with/without a custom separator (underscore by default).
533
+ *
534
+ * @param str String in camelcase
535
+ * @param separator Separator for the new decamelized string.
536
+ *
537
+ * // some database field name (separate with an empty space)
538
+ console.log(decamelize("someDatabaseFieldName", " "));
539
+
540
+ // some-label-that-needs-to-be-camelized (separate with an hyphen)
541
+ console.log(decamelize("someLabelThatNeedsToBeCamelized", "-"));
542
+
543
+ // some_javascript_property (separate with underscore)
544
+ console.log(decamelize("someJavascriptPraroperty", "_"));
545
+ */
546
+ Util.decamelize = function (str, separator) {
547
+ separator = typeof separator === 'undefined' ? '_' : separator;
548
+ return str
549
+ .replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
550
+ .replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2')
551
+ .replace("_", separator)
552
+ .toLowerCase();
553
+ }
554
+
555
+ /*
556
+ change : Order Step
557
+ to : order_tep
558
+ */
559
+
560
+ Util.toName = function (str, separator) {
561
+ if (str && str.length) {
562
+ separator = separator || "_";
563
+ str = str.trim();
564
+ //add if first character is number with string character
565
+ if(Util.isInteger(str.charAt(0))) {
566
+ str = "a"+str;
567
+ }
568
+ let string = str.replace(/\s+/g, separator).toLowerCase();
569
+ string = string.replace("/","");
570
+ string = string.replace("/\/","");
571
+ string = string.replace("__","_");
572
+ return string.replace(/[^A-Za-z0-9/_]/g, "")
573
+ }
574
+ }
575
+
576
+ /*
577
+ change : orderStep
578
+ to : Order Step
579
+ */
580
+ Util.fieldToName = function (str) {
581
+ let title = Util.capitalizeFirstLetter(Util.decamelize(str));
582
+ title = Util.replaceAll(title, "_", " ");
583
+ title = Util.replaceAll(title, " id", "");
584
+ title = Util.capitalizeAfterSpace(title);
585
+
586
+ const lastWords = Util.lastWord(title);
587
+ if (title.length > 4 && lastWords == "Id") {
588
+ title = title.replace("Id", "");
589
+ }
590
+
591
+ return title;
592
+ };
593
+
594
+ Util.capitalizeWord = (string) => {
595
+ return string.split(" ").map(m => m[0].toUpperCase() + m.substr(1)).join(" ");
596
+ };
597
+
598
+ Util.capitalizeFirstLetter = (string) => {
599
+ return string.charAt(0).toUpperCase() + string.slice(1);
600
+ };
601
+
602
+ Util.asyncWrap = (fn) => {
603
+ return (req, res, next) => {
604
+ fn(req, res, next).catch(next);
605
+ }
606
+ };
607
+
608
+ Util.capitalizeAfterSpace = function (str) {
609
+ str = Util.replaceAll(str, "_", " ");
610
+ return str.replace(
611
+ /\w\S*/g,
612
+ function (txt) {
613
+ return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
614
+ }
615
+ );
616
+ };
617
+
618
+ Util.capitalizeAfterSpaceTitle = function (str) {
619
+ str = Util.replaceAll(str, " ", "_");
620
+ return str.replace(
621
+ /\w\S*/g,
622
+ function (txt) {
623
+ return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
624
+ }
625
+ );
626
+ };
627
+
628
+ Util.lastWord = function (words) {
629
+ let n = words.split(" ");
630
+ return n[n.length - 1];
631
+ };
632
+
633
+ Util.arrayUnShift = function (arr) {
634
+ let obj = {}
635
+ obj[arr[0]] = '';
636
+ obj[arr[1]] = '';
637
+ return obj;
638
+ };
639
+
640
+ Util.in_array = function (needle, haystack) {
641
+ haystack = haystack || [];
642
+ if (haystack.length && needle) {
643
+ return haystack.includes(needle);
644
+ } else {
645
+ return false;
646
+ }
647
+ };
648
+
649
+ Util.gridSearch = function (visibles, relations, name, value) {
650
+ let index = 0;
651
+ let elm = "input";
652
+ for (let i = 0; i < visibles.length; i++) {
653
+ if (name == visibles[i]) {
654
+ index = i;
655
+ }
656
+ }
657
+ if (!Util.isEmptyObject(relations)) {
658
+ let arr = Object.keys(relations)
659
+ for (let i = 0; i < arr.length; i++) {
660
+ if (name == arr[i]) {
661
+ elm = "select";
662
+ }
663
+ }
664
+ }
665
+ return 'searchValue.eq(' + index + ').find("' + elm + '").val("' + value + '");';
666
+ };
667
+
668
+ Util.toNumber = function (num) {
669
+ num = num+"";
670
+ return parseFloat(Util.replaceAll(num,".",""));
671
+ };
672
+
673
+ Util.formatNumber = function (num, thousandSeparator='.') {
674
+ num = num || "";
675
+ let sep = "$1" + thousandSeparator;
676
+ let numString = num.toString();
677
+ if (numString.indexOf(".") > -1) {
678
+ let explode = numString.split(".");
679
+ return explode[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, sep) + "," + explode[1];
680
+ } else {
681
+ return numString.replace(/(\d)(?=(\d{3})+(?!\d))/g, sep);
682
+ }
683
+ };
684
+
685
+ Util.dumpError = function (err) {
686
+ if (typeof err === 'object') {
687
+ if (err.message) {
688
+ console.log('\nMessage: ' + err.message)
689
+ }
690
+ if (err.stack) {
691
+ console.log('\nStacktrace:')
692
+ console.log('====================')
693
+ console.log(err.stack);
694
+ }
695
+ } else {
696
+ console.log(err);
697
+ }
698
+ };
699
+
700
+ Util.fileAttribute = function (filename) {
701
+ filename = filename.toLowerCase() || "";
702
+ let ext = filename.split('.').pop();
703
+ let obj = {};
704
+ obj.ext = ext;
705
+ if (Util.in_array(ext, Util.fileImage)) {
706
+ obj.type = 'image';
707
+ } else {
708
+ obj.type = 'file';
709
+ }
710
+ return obj;
711
+ };
712
+
713
+ Util.fileImage = ['jpg', 'jpeg', 'png', 'webp', 'bmp', 'tif', 'gif', 'png','svg'];
714
+
715
+ Util.fileExtension = (filename) => {
716
+ filename = filename.toLowerCase() || "";
717
+ let obj = {}
718
+ let ext = filename.split('.').pop();
719
+ obj.ext=ext;
720
+ if (Util.in_array(ext, Util.fileImage)) {
721
+ obj.type = 'image';
722
+ } else {
723
+ obj.type = 'file';
724
+ }
725
+ let file = 'file.png';
726
+ if(ext == "docx" || ext == "doc") {
727
+ file = 'word.png'
728
+ } else if(ext == 'xls' || ext == 'xlsx') {
729
+ file = 'excel.png'
730
+ } else if(ext == 'pdf') {
731
+ file = 'pdf.png'
732
+ } else if(ext == 'ppt' || ext == 'pptx'){
733
+ file = 'ppt.png';
734
+ } else if(ext == 'txt') {
735
+ file = 'txt.png';
736
+ } else if(ext == 'zip') {
737
+ file = 'zip.jpg';
738
+ } else if(ext == 'rar') {
739
+ file = 'rar.jpg';
740
+ } else if(ext == 'rar') {
741
+ file = 'file.png';
742
+ }
743
+ obj.file = file;
744
+ return obj;
745
+ };
746
+
747
+ Util.fileView = function (dir, file, attributes={}) {
748
+ let filename = dir + file;
749
+ let html = '';
750
+ let width = attributes.hasOwnProperty('width') ? attributes.width : '300';
751
+ let withIcon = attributes.hasOwnProperty('withIcon') ? true : false;
752
+ let obj = Util.fileExtension(filename);
753
+ let className = attributes.hasOwnProperty('class') ? ` class="${attributes.class}" ` : '';
754
+ //console.log(JSON.stringify(obj))
755
+ if(filename.includes('https')) {
756
+ html = `<img src="${file}" ${className} class="img-responsive">`
757
+ } else {
758
+ if (obj.type == 'image') {
759
+ html = `<img src="${filename}" ${className} width="${width}px">`
760
+ } else {
761
+ if (file) {
762
+ if(withIcon) {
763
+ html = `<img class="mb-3 boxy-small" src="/img/${obj.file}" height="45px" width="45px"><a class="text-success" target="_blank" href="${filename}"> ${file.substring(13)}</a>`;
764
+ } else {
765
+ html = `<a class="text-success" target="_blank" href="${filename}"> ${file.substring(13)}</a>`;
766
+ }
767
+ }
768
+ }
769
+ }
770
+
771
+
772
+ return html;
773
+ };
774
+ /// end files
775
+
776
+
777
+ Util.arrayDelete = function (arr, value) {
778
+ return arr.filter((item)=> item != value);
779
+ };
780
+
781
+ Util.arrayDeletes = function (arr, array) {
782
+ return arr.filter((item)=> !Util.in_array(item,array));
783
+ };
784
+
785
+ Util.arrayToList = function (arr, array, delimiter, isCount) {
786
+ delimiter = delimiter || "<br>"
787
+ isCount = isCount || 1;
788
+ let html = '';
789
+ if (arr) {
790
+ for (var i = 0; i < arr.length; i++) {
791
+ html += isCount == 1 ? (i + 1) + ". " + array[arr[i]] + delimiter : " " + array[arr[i]] + delimiter;
792
+ }
793
+ html = html.slice(0, (delimiter.length * -1))
794
+ }
795
+
796
+ return html;
797
+ };
798
+
799
+ Util.menuAccess = function (menu, params) {
800
+ const roles = require('./role')
801
+ const routes = roles.routes;
802
+ if (Util.in_array(menu, routes)) {
803
+ if (Util.in_array(menu, params))
804
+ return true;
805
+ else return false;
806
+
807
+ } else {
808
+ return true;
809
+ }
810
+ };
811
+
812
+ Util.dropdownHelper = function (data, field, model) {
813
+ let fieldsx = field + '[]';
814
+ let name = field + "[]";
815
+ let myvalue = typeof data[fieldsx] == undefined ? " " : typeof data[fieldsx] == "string" ? '["' + data[fieldsx] + '"]' : JSON.stringify(data[name])
816
+ if (myvalue) {
817
+ let unique = myvalue.indexOf("[") > -1 ? myvalue : !myvalue ? "" : '[' + myvalue + ']';
818
+ unique = JSON.parse(unique);
819
+ data[field] = JSON.stringify(unique.filter(Util.arrayUnique));
820
+ delete data[name]
821
+ }
822
+ if (model.fields[field].required) {
823
+ if (!data[field]) {
824
+ return false;
825
+ }
826
+ }
827
+ return data;
828
+ };
829
+
830
+ Util.dropdownAdd = function (data, field, model, datas) {
831
+ let name = field + "[]";
832
+ let myvalue = typeof datas == undefined ? " " : typeof datas == "string" ? '["' + datas + '"]' : JSON.stringify(datas)
833
+ if (myvalue) {
834
+ let unique = myvalue.indexOf("[") > -1 ? myvalue : !myvalue ? "" : '[' + myvalue + ']';
835
+ unique = JSON.parse(unique);
836
+ myvalue = JSON.stringify(unique.filter(Util.arrayUnique));
837
+ delete data[name]
838
+
839
+ data[field] = myvalue;
840
+ }
841
+ if (model.fields[field].required) {
842
+ if (!myvalue) {
843
+ return false;
844
+ }
845
+ }
846
+ return data;
847
+ };
848
+ //array unique
849
+ // array.filter(Util.arrayUnique);
850
+ Util.arrayUnique = (value, index, self) => {
851
+ return self.indexOf(value) == index;
852
+ };
853
+
854
+ Util.virtualHelper = function (obj) {
855
+ if (Util.isEmptyObject(obj)) return;
856
+ if (obj == undefined) return;
857
+
858
+ var str = '';
859
+ for (var key in obj) {
860
+ str += ", `" + obj[key] + "` AS " + key;
861
+ }
862
+
863
+ return str;
864
+ };
865
+
866
+
867
+ Util.nots = ['id', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy', 'created_at', 'updated_at', 'created_by', 'updated_by', 'modified_by', 'companyId', 'company_id'];
868
+
869
+ Util.requiredFields = function (obj) {
870
+ var nots = Util.nots;
871
+ var arr = [];
872
+ for (var key in obj) {
873
+ if (!Util.in_array(key, nots)) {
874
+ if (obj[key].required == true) {
875
+ arr.push(key)
876
+ }
877
+ }
878
+ }
879
+ return arr;
880
+ };
881
+
882
+ Util.extractDetails = function (obj) {
883
+ let arr = [];
884
+ for (let key in obj) {
885
+ if (obj[key].length > 0) {
886
+ for (var i = 0; i < obj[key].length; i++) {
887
+ arr.push(obj[key][i])
888
+ }
889
+ }
890
+ }
891
+ return arr;
892
+ };
893
+
894
+ Util.arrayToConcat = function (arr) {
895
+ let str = 'CONCAT(';
896
+ for (let i = 0; i < arr.length; i++) {
897
+ str += arr[i] + '," - ",'
898
+ }
899
+ str = str.slice(0, -9);
900
+ str += ")"
901
+
902
+ return str;
903
+ };
904
+
905
+ //sequence all fields based on drag drop generator
906
+ Util.arraySequence = function (arr, left, right) {
907
+ left = left || [];
908
+ right = right || [];
909
+ let obj = Util.arrayToObject(arr, "Field");
910
+ let temp = [], stores = [];
911
+ for (let i = 0; i < arr.length; i++) {
912
+ if (arr[i].Field == "id") {
913
+ stores.push(arr[i].Field)
914
+ temp.push(arr[i])
915
+ }
916
+ }
917
+ if (Array.isArray(left)) {
918
+ for (let i = 0; i < left.length; i++) {
919
+ if (i % 2 == 0) {
920
+ temp.push(obj[left[i]])
921
+ stores.push(left[i])
922
+ }
923
+ }
924
+ }
925
+ if (Array.isArray(right)) {
926
+ for (let i = 0; i < right.length; i++) {
927
+ if (i % 2 == 0) {
928
+ temp.push(obj[right[i]])
929
+ stores.push(right[i])
930
+ }
931
+ }
932
+ }
933
+ if (Array.isArray(left)) {
934
+ for (let i = 0; i < left.length; i++) {
935
+ if (i % 2 == 1) {
936
+ temp.push(obj[left[i]])
937
+ stores.push(left[i])
938
+ }
939
+ }
940
+ }
941
+ if (Array.isArray(right)) {
942
+ for (let i = 0; i < right.length; i++) {
943
+ if (i % 2 == 1) {
944
+ temp.push(obj[right[i]])
945
+ stores.push(right[i])
946
+ }
947
+ }
948
+ }
949
+
950
+ for (let i = 0; i < arr.length; i++) {
951
+ const field = arr[i].Field;
952
+ if (!Util.in_array(field, stores)) {
953
+ temp.push(arr[i])
954
+ }
955
+ }
956
+
957
+ return temp;
958
+ };
959
+
960
+ Util.isInteger = (value) => {
961
+ return !isNaN(value) && (function (x) {
962
+ return (x | 0) === x;
963
+ })(parseFloat(value))
964
+ };
965
+
966
+ Util.isNumeric = function (value) {
967
+ return /^-?\d+$/.test(value);
968
+ };
969
+
970
+ Util.tags = function (tags) {
971
+ let html = '';
972
+ tags = tags || "";
973
+ if (tags.indexOf(",") > -1) {
974
+ let explode = tags.split(",");
975
+ for (var i = 0; i < explode.length; i++) {
976
+ html += `<a href="#" rel="tag">${explode[i]}</a>`
977
+ }
978
+ } else {
979
+ html += `<a href="#" rel="tag">${tags}</a>`;
980
+ }
981
+
982
+ return html;
983
+ };
984
+
985
+ /*
986
+ get extension of filename
987
+ */
988
+
989
+ Util.getExtensionFile = (str) => {
990
+ str = str || "";
991
+ let extension = str.split('.').pop();
992
+ extension = extension.toLowerCase();
993
+ let ret = extension;
994
+ if (extension == "jpg") {
995
+ ret = "jpeg";
996
+ }
997
+ return ret;
998
+ };
999
+
1000
+ Util.badgeError = (msg) => {
1001
+ return `<span class="badge badge-danger">${msg}</span>`;
1002
+ };
1003
+
1004
+ Util.badgeSuccess = (msg) => {
1005
+ return `<span class="badge badge-success">${msg}</span>`;
1006
+ };
1007
+
1008
+ Util.alertError = function (msg) {
1009
+ return `<div class="alert alert-danger" role="alert">${msg}</div>`;
1010
+ };
1011
+
1012
+ Util.alertSuccess = function (msg) {
1013
+ return `<div class="alert alert-success" role="alert">${msg}</div>`;
1014
+ };
1015
+
1016
+ Util.alertInfo = function (msg) {
1017
+ return `<div class="alert alert-info" role="alert">${msg}</div>`;
1018
+ };
1019
+
1020
+ Util.regexPassword = (lengthMin, lengthMax) => {
1021
+ //minimum length
1022
+ lengthMin = lengthMin || 6;
1023
+ lengthMax = lengthMax || 20;
1024
+
1025
+ return new RegExp('^[a-zA-Z0-9_-]{' + lengthMin + ',' + lengthMax + '}$', "i");
1026
+ };
1027
+
1028
+ //huruf dan angka saja
1029
+ Util.regexCode = (lengthMin, lengthMax) => {
1030
+ lengthMin = lengthMin || 2;
1031
+ lengthMax = lengthMax || 10;
1032
+
1033
+ return new RegExp('^[A-Z0-9]{' + lengthMin + ',' + lengthMax + '}$', "i");
1034
+ };
1035
+
1036
+ Util.imageProfile = function (image) {
1037
+ return image ? image.indexOf("http") > -1 ? image : "/uploads/user/" + image : "/img/user.png";
1038
+ };
1039
+
1040
+ /*
1041
+ Files
1042
+ */
1043
+ Util.readFile = function (filename) {
1044
+ try {
1045
+ if(Util.fileExist(filename)) {
1046
+ const data = fs.readFileSync(filename, 'utf8');
1047
+ return data;
1048
+ }
1049
+ } catch (err) {
1050
+ console.error(err)
1051
+ }
1052
+ return ""
1053
+
1054
+ };
1055
+ //check directory if not exist create or not return true/false
1056
+ Util.dirExist = (dir, create = false) =>{
1057
+ try {
1058
+ if(create) {
1059
+ fs.ensureDir(dir, err => {
1060
+ console.log(err); // => null
1061
+ });
1062
+ }
1063
+ // check if directory exists
1064
+ if (fs.existsSync(dir)) {
1065
+ return true;
1066
+ }
1067
+ } catch (e) {
1068
+ console.log(e);
1069
+ }
1070
+ return false;
1071
+ };
1072
+
1073
+ Util.fileExist = (filename) => {
1074
+ if (fs.existsSync(filename)) {
1075
+ return true;
1076
+ }
1077
+ return false;
1078
+ };
1079
+
1080
+ Util.getAllFiles = (dir) => {
1081
+ let files = [];
1082
+ try {
1083
+ if(Util.dirExist(dir, true)) {
1084
+ files = fs.readdirSync(dir);
1085
+ }
1086
+ } catch (e) {
1087
+ console.log('error',e.toString());
1088
+ return [];
1089
+ }
1090
+ return files;
1091
+ };
1092
+
1093
+ Util.writeFile = (filename, content) => {
1094
+ try {
1095
+ let dir = require('path').dirname(filename);
1096
+ Util.dirExist(dir,true);
1097
+ fs.writeFileSync(filename, content);
1098
+ return true
1099
+ } catch (e) {
1100
+ console.log(e)
1101
+ return false
1102
+ }
1103
+ };
1104
+
1105
+ Util.deleteAllFiles = (dir) => {
1106
+ try {
1107
+ fs.emptyDirSync(dir);
1108
+ return true
1109
+ } catch (e) {
1110
+ console.log(e)
1111
+ return false
1112
+ }
1113
+ };
1114
+
1115
+ Util.findFilesName = (arr,filename) => {
1116
+ console.log(filename)
1117
+ arr = arr || [];
1118
+ return arr.filter((item) => item.includes(filename));
1119
+ };
1120
+
1121
+ Util.getFiles = function (dir, token = "") {
1122
+ let arr = fs.readdirSync(dir);
1123
+ let folders = "";
1124
+ let files = "";
1125
+ arr.forEach(function (item) {
1126
+ if (item.indexOf(".") > -1) {
1127
+ var explode = dir.split("public/");
1128
+ var path = explode[1];
1129
+ var url = "/" + path + "/" + item;
1130
+ var extension = item.split('.').pop();
1131
+ files += ` <div class="folder data-file ui-draggable ui-draggable-handle ui-selectee" data-toggle="tooltip" data-type="file" data-url="${url}" data-extension="${extension}" data-name="${item}" filename="${item}" data-original-title="${item}">
1132
+ <img src="/assets/images/formats/file.png" class="img-responsive ui-selectee">
1133
+ <p class="text-ellipsis ui-selectee">${item}</p>
1134
+ </div>`;
1135
+ } else {
1136
+ console.log(dir);
1137
+ let explode = dir.split(token);
1138
+ console.log(token)
1139
+ let path = explode[1] || "";
1140
+
1141
+ console.log(path)
1142
+ let state = "";
1143
+ if (path == "") {
1144
+ state = "/" + item;
1145
+ } else {
1146
+ state = path.replace(item, "") + "/" + item;
1147
+ }
1148
+ folders += `<div class="folder data-folder ui-draggable ui-draggable-handle ui-droppable ui-selectee" data-toggle="tooltip" data-type="folder" data-state="${state}" data-name="${item}" data-original-title="${item}">
1149
+ <img src="/assets/images/folder.png" class="img-responsive ui-selectee">
1150
+ <p class="text-ellipsis ui-selectee">${item}</p>
1151
+ </div>`;
1152
+ }
1153
+ });
1154
+
1155
+ return folders + files;
1156
+ };
1157
+
1158
+ Util.ejsOpen = "<%- ";
1159
+ Util.ejsStart = "<% ";
1160
+ Util.ejsClose = " %>";
1161
+ Util.ejsFunction = (yourCode, isStatement = false) => {
1162
+ const open = isStatement ? Util.ejsStart : Util.ejsOpen;
1163
+ return open + yourCode + Util.ejsClose;
1164
+ };
1165
+
1166
+ Util.attributeOptions = (obj, defaultObj = {}) => {
1167
+ let html = '';
1168
+ let arr = Object.keys(defaultObj) || [];
1169
+ for (const key in obj) {
1170
+ let value = obj[key];
1171
+ if(defaultObj.hasOwnProperty(key)) {
1172
+ value = defaultObj[key] + obj[key];
1173
+ Util.arrayDelete(arr,key);
1174
+ }
1175
+ html += ` ${key}="${value}" `;
1176
+ }
1177
+ if(arr.length){
1178
+ arr.map(item => html += ` ${item}="${defaultObj[item]}" `)
1179
+ }
1180
+ return html;
1181
+ };
1182
+
1183
+ Util.userAvatar = (img) => {
1184
+ return img ? img.includes("http") ? img : `/uploads/user/${img}` : `/img/user.png`;
1185
+ };
1186
+
1187
+ /*
1188
+ MYSQL HELPER
1189
+ */
1190
+
1191
+ Util.selectMysql = (fields,relations={}) => {
1192
+ let obj = {}
1193
+ let arr = [];
1194
+ let virtuals = {};
1195
+ let virtualArray = [];
1196
+ if(relations.hasOwnProperty("zvirtuals")){
1197
+ virtuals = relations.zvirtuals;
1198
+ delete relations.zvirtuals;
1199
+ virtualArray = Object.keys(virtuals);
1200
+ virtualArray.forEach(function (item) {
1201
+ fields = Util.arrayDelete(fields,item);
1202
+ });
1203
+ }
1204
+ let selects = [];
1205
+ fields = fields || [];
1206
+ fields.forEach(function (item) {
1207
+ if(item != "actionColumn") {
1208
+ if (item == "no") {
1209
+ selects.push("id");
1210
+ } else {
1211
+ selects.push(item);
1212
+ }
1213
+ }
1214
+ })
1215
+ //make sure id
1216
+ selects.push("id")
1217
+ let select =`"${selects.join('","')}"`;
1218
+ if(virtualArray.length) {
1219
+ for(let key in virtuals) {
1220
+ select += `, ${virtuals[key]} `;
1221
+ }
1222
+ }
1223
+ return select;
1224
+ };
1225
+
1226
+ /*
1227
+ Sorting array object with key name
1228
+ */
1229
+ Util.sortArray = (arr,key) => {
1230
+ function compare( a, b ) {
1231
+ if ( a[key] < b[key] ){
1232
+ return -1;
1233
+ }
1234
+ if ( a[key] > b[key] ){
1235
+ return 1;
1236
+ }
1237
+ return 0;
1238
+ }
1239
+ return arr.sort(compare);
1240
+ };
1241
+
1242
+ module.exports = Util;