zet-lib 1.0.0 → 1.0.2
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 +13 -75
- package/lib/index.js +1 -0
- package/lib/io.js +0 -1
- package/lib/zCache.js +12 -25
- package/lib/zPage.js +188 -0
- package/lib/zRoute.js +54 -52
- package/package.json +3 -1
package/lib/Util.js
CHANGED
|
@@ -234,7 +234,6 @@ Util.replaceAll = function (str, find, replace) {
|
|
|
234
234
|
for (let i = 0; i < find.length; i++) {
|
|
235
235
|
if (str.indexOf(find[i]) > -1) {
|
|
236
236
|
t = str.replace(new RegExp(Util.escapeRegExp(find[i]), 'g'), replace);
|
|
237
|
-
//console.log(t)
|
|
238
237
|
}
|
|
239
238
|
}
|
|
240
239
|
} else {
|
|
@@ -502,25 +501,7 @@ Util.getKey = function (obj, field) {
|
|
|
502
501
|
return t;
|
|
503
502
|
};
|
|
504
503
|
|
|
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
504
|
|
|
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
505
|
Util.camelize = function (text) {
|
|
525
506
|
return text.replace(/^([A-Z])|[\s-_]+(\w)/g, function (match, p1, p2, offset) {
|
|
526
507
|
if (p2) return p2.toUpperCase();
|
|
@@ -528,28 +509,13 @@ Util.camelize = function (text) {
|
|
|
528
509
|
});
|
|
529
510
|
}
|
|
530
511
|
|
|
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
512
|
Util.decamelize = function (str, separator) {
|
|
547
513
|
separator = typeof separator === 'undefined' ? '_' : separator;
|
|
548
514
|
return str
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
515
|
+
.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2')
|
|
516
|
+
.replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2')
|
|
517
|
+
.replace("_", separator)
|
|
518
|
+
.toLowerCase();
|
|
553
519
|
}
|
|
554
520
|
|
|
555
521
|
/*
|
|
@@ -608,20 +574,20 @@ Util.asyncWrap = (fn) => {
|
|
|
608
574
|
Util.capitalizeAfterSpace = function (str) {
|
|
609
575
|
str = Util.replaceAll(str, "_", " ");
|
|
610
576
|
return str.replace(
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
577
|
+
/\w\S*/g,
|
|
578
|
+
function (txt) {
|
|
579
|
+
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
|
|
580
|
+
}
|
|
615
581
|
);
|
|
616
582
|
};
|
|
617
583
|
|
|
618
584
|
Util.capitalizeAfterSpaceTitle = function (str) {
|
|
619
585
|
str = Util.replaceAll(str, " ", "_");
|
|
620
586
|
return str.replace(
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
587
|
+
/\w\S*/g,
|
|
588
|
+
function (txt) {
|
|
589
|
+
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
|
|
590
|
+
}
|
|
625
591
|
);
|
|
626
592
|
};
|
|
627
593
|
|
|
@@ -682,21 +648,6 @@ Util.formatNumber = function (num, thousandSeparator='.') {
|
|
|
682
648
|
}
|
|
683
649
|
};
|
|
684
650
|
|
|
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
651
|
Util.fileAttribute = function (filename) {
|
|
701
652
|
filename = filename.toLowerCase() || "";
|
|
702
653
|
let ext = filename.split('.').pop();
|
|
@@ -751,7 +702,6 @@ Util.fileView = function (dir, file, attributes={}) {
|
|
|
751
702
|
let withIcon = attributes.hasOwnProperty('withIcon') ? true : false;
|
|
752
703
|
let obj = Util.fileExtension(filename);
|
|
753
704
|
let className = attributes.hasOwnProperty('class') ? ` class="${attributes.class}" ` : '';
|
|
754
|
-
//console.log(JSON.stringify(obj))
|
|
755
705
|
if(filename.includes('https')) {
|
|
756
706
|
html = `<img src="${file}" ${className} class="img-responsive">`
|
|
757
707
|
} else {
|
|
@@ -863,8 +813,7 @@ Util.virtualHelper = function (obj) {
|
|
|
863
813
|
return str;
|
|
864
814
|
};
|
|
865
815
|
|
|
866
|
-
|
|
867
|
-
Util.nots = ['id', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy', 'created_at', 'updated_at', 'created_by', 'updated_by', 'modified_by', 'companyId', 'company_id'];
|
|
816
|
+
Util.nots = ['id', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy', 'companyId', 'created_at', 'updated_at','updated_by', 'created_by', 'modified_by', 'company_id', 'token', 'version', 'signin_method', 'lastLogin', 'last_login', 'forgotPassword', 'forgot_password','no', 'actionColumn'];
|
|
868
817
|
|
|
869
818
|
Util.requiredFields = function (obj) {
|
|
870
819
|
var nots = Util.nots;
|
|
@@ -1047,7 +996,6 @@ Util.readFile = function (filename) {
|
|
|
1047
996
|
return data;
|
|
1048
997
|
}
|
|
1049
998
|
} catch (err) {
|
|
1050
|
-
console.error(err)
|
|
1051
999
|
}
|
|
1052
1000
|
return ""
|
|
1053
1001
|
|
|
@@ -1057,7 +1005,6 @@ Util.dirExist = (dir, create = false) =>{
|
|
|
1057
1005
|
try {
|
|
1058
1006
|
if(create) {
|
|
1059
1007
|
fs.ensureDir(dir, err => {
|
|
1060
|
-
console.log(err); // => null
|
|
1061
1008
|
});
|
|
1062
1009
|
}
|
|
1063
1010
|
// check if directory exists
|
|
@@ -1065,7 +1012,6 @@ Util.dirExist = (dir, create = false) =>{
|
|
|
1065
1012
|
return true;
|
|
1066
1013
|
}
|
|
1067
1014
|
} catch (e) {
|
|
1068
|
-
console.log(e);
|
|
1069
1015
|
}
|
|
1070
1016
|
return false;
|
|
1071
1017
|
};
|
|
@@ -1084,7 +1030,6 @@ Util.getAllFiles = (dir) => {
|
|
|
1084
1030
|
files = fs.readdirSync(dir);
|
|
1085
1031
|
}
|
|
1086
1032
|
} catch (e) {
|
|
1087
|
-
console.log('error',e.toString());
|
|
1088
1033
|
return [];
|
|
1089
1034
|
}
|
|
1090
1035
|
return files;
|
|
@@ -1097,7 +1042,6 @@ Util.writeFile = (filename, content) => {
|
|
|
1097
1042
|
fs.writeFileSync(filename, content);
|
|
1098
1043
|
return true
|
|
1099
1044
|
} catch (e) {
|
|
1100
|
-
console.log(e)
|
|
1101
1045
|
return false
|
|
1102
1046
|
}
|
|
1103
1047
|
};
|
|
@@ -1107,13 +1051,11 @@ Util.deleteAllFiles = (dir) => {
|
|
|
1107
1051
|
fs.emptyDirSync(dir);
|
|
1108
1052
|
return true
|
|
1109
1053
|
} catch (e) {
|
|
1110
|
-
console.log(e)
|
|
1111
1054
|
return false
|
|
1112
1055
|
}
|
|
1113
1056
|
};
|
|
1114
1057
|
|
|
1115
1058
|
Util.findFilesName = (arr,filename) => {
|
|
1116
|
-
console.log(filename)
|
|
1117
1059
|
arr = arr || [];
|
|
1118
1060
|
return arr.filter((item) => item.includes(filename));
|
|
1119
1061
|
};
|
|
@@ -1133,12 +1075,8 @@ Util.getFiles = function (dir, token = "") {
|
|
|
1133
1075
|
<p class="text-ellipsis ui-selectee">${item}</p>
|
|
1134
1076
|
</div>`;
|
|
1135
1077
|
} else {
|
|
1136
|
-
console.log(dir);
|
|
1137
1078
|
let explode = dir.split(token);
|
|
1138
|
-
console.log(token)
|
|
1139
1079
|
let path = explode[1] || "";
|
|
1140
|
-
|
|
1141
|
-
console.log(path)
|
|
1142
1080
|
let state = "";
|
|
1143
1081
|
if (path == "") {
|
|
1144
1082
|
state = "/" + item;
|
package/lib/index.js
CHANGED
package/lib/io.js
CHANGED
package/lib/zCache.js
CHANGED
|
@@ -11,7 +11,6 @@ const zCache = {};
|
|
|
11
11
|
//constants
|
|
12
12
|
zCache.KEYS = {
|
|
13
13
|
ROUTES: "ROUTES",
|
|
14
|
-
TABLES: "TABLES",
|
|
15
14
|
MYMODELS: "MYMODELS",
|
|
16
15
|
ROLES: "ROLES",
|
|
17
16
|
CONFIG: "CONFIG",
|
|
@@ -57,11 +56,10 @@ const cache = async()=> {
|
|
|
57
56
|
} else {
|
|
58
57
|
await zCache.ROUTES();
|
|
59
58
|
}
|
|
60
|
-
if (myCache.has("
|
|
59
|
+
if (myCache.has("MYMODELS")) {
|
|
61
60
|
i = i + 1;
|
|
62
61
|
} else {
|
|
63
|
-
|
|
64
|
-
await zCache.TABLES();
|
|
62
|
+
await zCache.MYMODELS();
|
|
65
63
|
}
|
|
66
64
|
if (myCache.has("CONFIG")) {
|
|
67
65
|
i = i + 1;
|
|
@@ -103,8 +101,8 @@ zCache.renew = async()=> {
|
|
|
103
101
|
await zCache.ROLES();
|
|
104
102
|
await zCache.MENU();
|
|
105
103
|
await zCache.CONFIG();
|
|
106
|
-
await zCache.TABLES();
|
|
107
104
|
await zCache.ROUTES();
|
|
105
|
+
await zCache.MYMODELS();
|
|
108
106
|
await zCache.MENU_SYSTEMS();
|
|
109
107
|
await zCache.MODELS_RELATIONS();
|
|
110
108
|
};
|
|
@@ -119,24 +117,16 @@ zCache.ROUTES = () => {
|
|
|
119
117
|
}
|
|
120
118
|
};
|
|
121
119
|
|
|
122
|
-
zCache.TABLES = () => {
|
|
123
|
-
let routes = zCache.get("ROUTES");
|
|
124
|
-
let modelsDirectory = path.join(directory, 'models');
|
|
125
|
-
let tables = [], obj = {};
|
|
126
|
-
routes.forEach((table) => {
|
|
127
|
-
if (fs.existsSync(modelsDirectory + "/" + table + ".js")) {
|
|
128
|
-
tables.push(table);
|
|
129
|
-
let MYMODEL = require("./../models/" + table);
|
|
130
|
-
obj[table] = MYMODEL;
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
myCache.set("TABLES", tables);
|
|
134
|
-
myCache.set("MYMODELS", obj);
|
|
135
|
-
//add to version after set
|
|
136
|
-
zCache.updateVersions("TABLES")
|
|
137
|
-
zCache.updateVersions("MYMODELS")
|
|
138
120
|
|
|
139
|
-
|
|
121
|
+
zCache.MYMODELS = () => {
|
|
122
|
+
if(myCache.has("MYMODELS")) {
|
|
123
|
+
return myCache.get("MYMODELS");
|
|
124
|
+
} else {
|
|
125
|
+
const models = zRoute.MYMODELS();
|
|
126
|
+
myCache.set("MYMODELS", models);
|
|
127
|
+
return models;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
140
130
|
|
|
141
131
|
zCache.ROLES = async() => {
|
|
142
132
|
let r = 0;
|
|
@@ -212,9 +202,6 @@ zCache.CONFIG = async() => {
|
|
|
212
202
|
zCache.updateVersions(zCache.KEYS.CONFIG)
|
|
213
203
|
};
|
|
214
204
|
|
|
215
|
-
zCache.MYMODELS = () => {
|
|
216
|
-
zCache.TABLES();
|
|
217
|
-
}
|
|
218
205
|
|
|
219
206
|
zCache.MENU = async() => {
|
|
220
207
|
let results = async() => {
|
package/lib/zPage.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* For dynamic router
|
|
3
|
+
*/
|
|
4
|
+
const axios = require('axios');
|
|
5
|
+
const fs = require('fs-extra');
|
|
6
|
+
const nodemailer = require('nodemailer');
|
|
7
|
+
const qs = require('qs');
|
|
8
|
+
const moment = require('moment');
|
|
9
|
+
const pm2 = require('pm2');
|
|
10
|
+
const { minify } = require('html-minifier-terser');
|
|
11
|
+
const connection = require('./connection');
|
|
12
|
+
const Util = require('./Util');
|
|
13
|
+
const myCache = require('./cache');
|
|
14
|
+
|
|
15
|
+
const zpage = {};
|
|
16
|
+
|
|
17
|
+
zpage.build = async (req, res) => {
|
|
18
|
+
let layouts = await connection.results({
|
|
19
|
+
table : "zlayout"
|
|
20
|
+
});
|
|
21
|
+
let layoutObj = Util.arrayToObject(layouts,"id");
|
|
22
|
+
let results = await connection.results({
|
|
23
|
+
table: "zpage",
|
|
24
|
+
where: {
|
|
25
|
+
active: 1
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
let server_code = zpage.coreCode();
|
|
29
|
+
results.forEach(function (result) {
|
|
30
|
+
server_code += zpage.createRoute(result, res.locals.token, layoutObj);
|
|
31
|
+
server_code += Util.newLine;
|
|
32
|
+
});
|
|
33
|
+
server_code += `module.exports = router;`;
|
|
34
|
+
|
|
35
|
+
fs.writeFileSync(dirRoot + "/routes/zindex.js", server_code, 'utf-8');
|
|
36
|
+
if (process.env.NODE_ENV === "production") {
|
|
37
|
+
setTimeout(function () {
|
|
38
|
+
pm2.connect(function (err) {
|
|
39
|
+
if (err) {
|
|
40
|
+
console.log(err.toString());
|
|
41
|
+
}
|
|
42
|
+
pm2.restart(process.env.PM2_NAME, (err, proc) => {
|
|
43
|
+
//io.to(room).emit("message","Restart done")
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}, 3000)
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
zpage.coreCode = () => {
|
|
51
|
+
return `const router = require('express').Router();
|
|
52
|
+
const csrf = require('csurf');
|
|
53
|
+
const csrfProtection = csrf({cookie: true});
|
|
54
|
+
const fs = require('fs-extra');
|
|
55
|
+
const qs = require('qs');
|
|
56
|
+
const axios = require('axios');
|
|
57
|
+
const nodemailer = require('nodemailer');
|
|
58
|
+
const {zRoute, zRole, connection, Util, io, zCache, debug, moduleLib, zFunction } = require('zet-lib');
|
|
59
|
+
|
|
60
|
+
`;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
zpage.createRoute = (obj, token, layoutObj) => {
|
|
64
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
65
|
+
const MYMODEL = MYMODELS.zpage;
|
|
66
|
+
let DIR = dirRoot + "/views/zindex";
|
|
67
|
+
let METHOD = MYMODEL.widgets.method.fields;
|
|
68
|
+
let layout = "new-blank.ejs";
|
|
69
|
+
if (obj.layouts == 2) {
|
|
70
|
+
layout = "one.ejs"
|
|
71
|
+
} else if (obj.layouts == 3) {
|
|
72
|
+
layout = "two.ejs";
|
|
73
|
+
} else if(obj.layouts == 4) {
|
|
74
|
+
layout = layoutObj[obj.layout_id].name+".ejs" || "blank.ejs";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let renderDataforGet = "";
|
|
78
|
+
let routerforGet = "";
|
|
79
|
+
if (obj.method == 1) {
|
|
80
|
+
renderDataforGet = `renderData.csrfToken = req.csrfToken()`;
|
|
81
|
+
routerforGet = "csrfProtection, "
|
|
82
|
+
}
|
|
83
|
+
let commonData = {
|
|
84
|
+
company_id: obj.company_id,
|
|
85
|
+
updated_by: obj.updated_by,
|
|
86
|
+
created_by: obj.created_by
|
|
87
|
+
};
|
|
88
|
+
let ioto = `io.to("${token}").emit("error", e.toString())`;
|
|
89
|
+
|
|
90
|
+
let render = "";
|
|
91
|
+
let renderData = "";
|
|
92
|
+
if (obj.head) {
|
|
93
|
+
fs.writeFileSync(`${DIR}/page${obj.id}-head.ejs`, obj.head, 'utf-8');
|
|
94
|
+
renderData += `renderData.renderHead = "zindex/page${obj.id}-head.ejs"; `
|
|
95
|
+
} else {
|
|
96
|
+
fs.unlink(`${DIR}/page${obj.id}-head.ejs`, function (err) {
|
|
97
|
+
if (err) return console.log(err);
|
|
98
|
+
console.log('file deleted successfully');
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let isrenderPage = false;
|
|
103
|
+
if (obj.client_code) {
|
|
104
|
+
fs.writeFileSync(`${DIR}/page${obj.id}.ejs`, obj.client_code, 'utf-8');
|
|
105
|
+
renderData += `renderData.renderBody = "zindex/page${obj.id}.ejs"; `
|
|
106
|
+
isrenderPage = true;
|
|
107
|
+
} else {
|
|
108
|
+
fs.unlink(`${DIR}/page${obj.id}.ejs`, function (err) {
|
|
109
|
+
if (err) return console.log(err);
|
|
110
|
+
console.log('file deleted successfully');
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//optional
|
|
114
|
+
if(!isrenderPage && obj.method == 1) {
|
|
115
|
+
fs.writeFileSync(`${DIR}/page${obj.id}.ejs`, obj.client_code, 'utf-8');
|
|
116
|
+
renderData += `renderData.renderBody = "zindex/page${obj.id}.ejs"; `
|
|
117
|
+
}
|
|
118
|
+
//end optional
|
|
119
|
+
if (obj.scripts) {
|
|
120
|
+
fs.writeFileSync(`${DIR}/page${obj.id}-script.ejs`, obj.scripts, 'utf-8');
|
|
121
|
+
renderData += `renderData.renderEnd = "zindex/page${obj.id}-script.ejs"; `
|
|
122
|
+
} else {
|
|
123
|
+
fs.unlink(`${DIR}/page${obj.id}-script.ejs`, function (err) {
|
|
124
|
+
if (err) return console.log(err);
|
|
125
|
+
console.log('file deleted successfully');
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
if (renderData) {
|
|
129
|
+
render += `${Util.tab}res.render("layouts/${layout}", renderData);`;
|
|
130
|
+
}
|
|
131
|
+
let scripts = `router.${METHOD[obj.method]}('${obj.page}', ${routerforGet} async(req,res) => {
|
|
132
|
+
try {
|
|
133
|
+
let renderData = {}
|
|
134
|
+
let commonData = ${JSON.stringify(commonData)};
|
|
135
|
+
commonData.updated_at = Util.now();
|
|
136
|
+
commonData.created_at = Util.now();
|
|
137
|
+
${renderDataforGet}
|
|
138
|
+
let layout = "${layout}";
|
|
139
|
+
${obj.server_code}
|
|
140
|
+
${renderData}
|
|
141
|
+
${render}
|
|
142
|
+
} catch (e) {
|
|
143
|
+
console.log(e);
|
|
144
|
+
${ioto}
|
|
145
|
+
res.json(e.toString());
|
|
146
|
+
}
|
|
147
|
+
}); ${Util.newLine}
|
|
148
|
+
`;
|
|
149
|
+
|
|
150
|
+
return scripts;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
zpage.buildLayout = async (obj) => {
|
|
155
|
+
let name = Util.toName(obj.name);
|
|
156
|
+
if (obj.active) {
|
|
157
|
+
let html = await minify(obj.code,{
|
|
158
|
+
removeComments:true,
|
|
159
|
+
minifyJS:true,
|
|
160
|
+
minifyCSS:true,
|
|
161
|
+
collapseWhitespace: true
|
|
162
|
+
});
|
|
163
|
+
fs.writeFileSync(dirRoot + "/views/layouts/" + name + ".ejs", html, 'utf-8');
|
|
164
|
+
if (process.env.NODE_ENV === "production") {
|
|
165
|
+
setTimeout(function () {
|
|
166
|
+
pm2.connect(function (err) {
|
|
167
|
+
if (err) {
|
|
168
|
+
console.log(err.toString());
|
|
169
|
+
}
|
|
170
|
+
pm2.restart(process.env.PM2_NAME, (err, proc) => {
|
|
171
|
+
//io.to(room).emit("message","Restart done")
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}, 3000)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
zpage.layoutDelete = async (obj) => {
|
|
180
|
+
let name = Util.toName(obj.name);
|
|
181
|
+
let path = dirRoot + "/views/layouts/customs/" + name + ".ejs"
|
|
182
|
+
fs.unlink(path, function (err) {
|
|
183
|
+
if (err) return console.log(err);
|
|
184
|
+
console.log('file deleted successfully');
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
module.exports = zpage;
|
package/lib/zRoute.js
CHANGED
|
@@ -7,10 +7,12 @@ const qs = require('qs');
|
|
|
7
7
|
//for generate PDF
|
|
8
8
|
const puppeteer = require('puppeteer');
|
|
9
9
|
const ejs = require('ejs');
|
|
10
|
+
const uglifyJS = require("uglify-js");
|
|
11
|
+
const Excel = require('exceljs');
|
|
12
|
+
const fs = require('fs-extra');
|
|
10
13
|
const Util = require('./Util');
|
|
11
14
|
const connection = require('./connection');
|
|
12
15
|
const gridTable = 'zgrid';
|
|
13
|
-
const fs = require('fs-extra');
|
|
14
16
|
const io = require('./io');
|
|
15
17
|
const myCache = require('./cache');
|
|
16
18
|
const moment = require('moment');
|
|
@@ -41,9 +43,10 @@ zRoute.ROUTES = () => {
|
|
|
41
43
|
let arr = [];
|
|
42
44
|
const dir = `${dirRoot}/routes`;
|
|
43
45
|
let routes = Util.getAllFiles(dir);
|
|
46
|
+
let nots = ['index','zindex','auth'];
|
|
44
47
|
for (const item of routes) {
|
|
45
48
|
let name = item.replace('.js', '');
|
|
46
|
-
if
|
|
49
|
+
if(!nots.includes(name)){
|
|
47
50
|
arr.push(name)
|
|
48
51
|
}
|
|
49
52
|
}
|
|
@@ -78,6 +81,7 @@ zRoute.postData = (obj) => {
|
|
|
78
81
|
};
|
|
79
82
|
|
|
80
83
|
zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
84
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
81
85
|
routeName = routeName || MYMODEL.routeName;
|
|
82
86
|
body = body || req.body;
|
|
83
87
|
let post = qs.parse(body);
|
|
@@ -89,7 +93,7 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
|
89
93
|
let checkboxes = [];
|
|
90
94
|
let multies = [];
|
|
91
95
|
fs.ensureDir(path_tmp, err => {
|
|
92
|
-
console.log('ensureDir',err); // => null
|
|
96
|
+
//console.log('ensureDir',err); // => null
|
|
93
97
|
});
|
|
94
98
|
if (!isEmptyFiles) {
|
|
95
99
|
files = qs.parse(req.files);
|
|
@@ -100,12 +104,12 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
|
100
104
|
hasFile = true;
|
|
101
105
|
//add folder again
|
|
102
106
|
fs.ensureDir(path_tmp + key, err => {
|
|
103
|
-
console.log('ensureDir',err); // => null
|
|
107
|
+
//console.log('ensureDir',err); // => null
|
|
104
108
|
});
|
|
105
109
|
} else {
|
|
106
110
|
fileRoute[key].mv(path_tmp + filename, function (err) {
|
|
107
111
|
if (err) {
|
|
108
|
-
console.log('fileempty move',err); // => null
|
|
112
|
+
//console.log('fileempty move',err); // => null
|
|
109
113
|
return res.status(500).send(err);
|
|
110
114
|
}
|
|
111
115
|
});
|
|
@@ -163,7 +167,7 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
|
163
167
|
break;
|
|
164
168
|
|
|
165
169
|
case "table" :
|
|
166
|
-
const MODEL_TABLE =
|
|
170
|
+
const MODEL_TABLE = MYMODELS[widgets[key].table];
|
|
167
171
|
const postTableData = post[routeName][key];
|
|
168
172
|
const widgetTables = MODEL_TABLE.widgets;
|
|
169
173
|
const dataTable = []
|
|
@@ -283,6 +287,7 @@ zRoute.ajax = async (req, res) => {
|
|
|
283
287
|
let table = body.table;
|
|
284
288
|
let type = body.type;
|
|
285
289
|
let results;
|
|
290
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
286
291
|
let obj = {
|
|
287
292
|
table: table
|
|
288
293
|
};
|
|
@@ -304,7 +309,7 @@ zRoute.ajax = async (req, res) => {
|
|
|
304
309
|
if (!params.hasOwnProperty(table)) {
|
|
305
310
|
io.to(res.locals.token).emit("error", "You have no access to this page");
|
|
306
311
|
}
|
|
307
|
-
let MYMODEL =
|
|
312
|
+
let MYMODEL = MYMODELS[table];
|
|
308
313
|
if (type == "select") {
|
|
309
314
|
if (params[table].includes("index")) {
|
|
310
315
|
results = await connection.results(obj)
|
|
@@ -392,7 +397,8 @@ zRoute.selectData = (MYMODEL) => {
|
|
|
392
397
|
|
|
393
398
|
zRoute.relations = async (req, res, table) => {
|
|
394
399
|
try {
|
|
395
|
-
const
|
|
400
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
401
|
+
const MYMODEL = MYMODELS[table];
|
|
396
402
|
let relations = {}
|
|
397
403
|
relations["zattributes"] = {}
|
|
398
404
|
relations["zvirtuals"] = {}
|
|
@@ -408,7 +414,6 @@ zRoute.relations = async (req, res, table) => {
|
|
|
408
414
|
const widget = MYMODEL.widgets[key];
|
|
409
415
|
const widgetName = MYMODEL.widgets[key].name;
|
|
410
416
|
let emptyArray = Util.arrayUnShift(['id', 'zname']);
|
|
411
|
-
|
|
412
417
|
if (widgetName == "dropdown_multi") {
|
|
413
418
|
let obj = {
|
|
414
419
|
select: widget.fields.join(",") + " as zname ",
|
|
@@ -429,8 +434,8 @@ zRoute.relations = async (req, res, table) => {
|
|
|
429
434
|
relations[key] = [Util.arrayUnShift(['id', 'zname']), ...results];
|
|
430
435
|
relations[keyObject] = Util.arrayWithObject(relations[key], 'id', 'zname');
|
|
431
436
|
} else if (widgetName == "table") {
|
|
432
|
-
let MODEL_TABLE =
|
|
433
|
-
let nots =
|
|
437
|
+
let MODEL_TABLE = MYMODELS[widget.table];
|
|
438
|
+
let nots = Util.nots;
|
|
434
439
|
let obj = {}
|
|
435
440
|
let visibles = MODEL_TABLE.grids.visibles;
|
|
436
441
|
let invisibles = MODEL_TABLE.grids.invisibles;
|
|
@@ -451,11 +456,10 @@ zRoute.relations = async (req, res, table) => {
|
|
|
451
456
|
relations[`properties_${key}`] = properties;
|
|
452
457
|
relations[keyRow] = await zRoute.relations(req, res, widget.table);
|
|
453
458
|
relations[key + "Table"] = widget.table;
|
|
454
|
-
//let MODEL_TABLE = require("./../models/" + MYMODEL.widgets[key].table);
|
|
455
459
|
relations[key + "TABLE"] = await zRoute.relations(req, res, MODEL_TABLE.table);
|
|
456
460
|
|
|
457
461
|
} else if (widgetName == "multi_line_editor") {
|
|
458
|
-
let MODEL_TABLE =
|
|
462
|
+
let MODEL_TABLE = MYMODELS[widget.table];
|
|
459
463
|
relations[keyFields] = MYMODEL.widgets[key].fields;
|
|
460
464
|
relations[key] = await zRoute.relations(req, res, widget.table);
|
|
461
465
|
|
|
@@ -711,10 +715,10 @@ zRoute.dataTableFilter = (MYMODEL, relations, filter) => {
|
|
|
711
715
|
types[key] = 'input';
|
|
712
716
|
break;
|
|
713
717
|
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
+
/*case "json" :
|
|
719
|
+
dataTable[key] = `<input type="number" class="form-control form-control-sm" value="${value}" id="data_table_${key}" >`;
|
|
720
|
+
types[key] = 'input';
|
|
721
|
+
break;*/
|
|
718
722
|
|
|
719
723
|
case "virtual" :
|
|
720
724
|
dataTable[key] = ``;
|
|
@@ -1056,6 +1060,7 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1056
1060
|
let fields = [];
|
|
1057
1061
|
let body = {};
|
|
1058
1062
|
let select = "";
|
|
1063
|
+
let arr = [];
|
|
1059
1064
|
let allfields = Object.keys(MYMODEL.widgets);
|
|
1060
1065
|
if (results.length) {
|
|
1061
1066
|
let result = results[0];
|
|
@@ -1064,8 +1069,8 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1064
1069
|
select = Util.selectMysql(fields);
|
|
1065
1070
|
if (zall) {
|
|
1066
1071
|
let difference = allfields.filter(x => !fields.includes(x));
|
|
1067
|
-
|
|
1068
|
-
select
|
|
1072
|
+
arr = [...fields, ...difference];
|
|
1073
|
+
select =`"${arr.join('","')}"`;
|
|
1069
1074
|
}
|
|
1070
1075
|
let whereArray = [];
|
|
1071
1076
|
let columns = body.columns;
|
|
@@ -1106,7 +1111,7 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1106
1111
|
});
|
|
1107
1112
|
}
|
|
1108
1113
|
if (zall) {
|
|
1109
|
-
fields =
|
|
1114
|
+
fields = arr;
|
|
1110
1115
|
}
|
|
1111
1116
|
|
|
1112
1117
|
const ztype = reqQuery.ztype == 1 ? true : false;
|
|
@@ -1121,7 +1126,6 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1121
1126
|
zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
1122
1127
|
//if any other custom value then callback needed
|
|
1123
1128
|
callback = callback || function () {};
|
|
1124
|
-
const Excel = require('exceljs');
|
|
1125
1129
|
const workbook = new Excel.Workbook();
|
|
1126
1130
|
let worksheet = workbook.addWorksheet(res.locals.routeName, {pageSetup: {paperSize: 9, orientation: 'landscape'}})
|
|
1127
1131
|
worksheet.properties.defaultColWidth = 13;
|
|
@@ -1186,6 +1190,7 @@ zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
|
1186
1190
|
}
|
|
1187
1191
|
}
|
|
1188
1192
|
|
|
1193
|
+
const widgets = MYMODEL.widgets;
|
|
1189
1194
|
rows.forEach(function (result) {
|
|
1190
1195
|
fields.forEach((field, i) => {
|
|
1191
1196
|
let t;
|
|
@@ -1195,11 +1200,11 @@ zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
|
1195
1200
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1196
1201
|
} else if (field == 'updated_at' || field == 'updated_at') {
|
|
1197
1202
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1198
|
-
} else if (Util.in_array(field,
|
|
1203
|
+
} else if (Util.in_array(field, ['created_by','updated_by'])) {
|
|
1199
1204
|
if (isRaws) {
|
|
1200
1205
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1201
1206
|
} else {
|
|
1202
|
-
t = !callback(result, field) ? usersObj[result[field]] : callback(result, field);
|
|
1207
|
+
t = !callback(result, field) ? usersObj[result[field]].fullname : callback(result, field);
|
|
1203
1208
|
}
|
|
1204
1209
|
} else {
|
|
1205
1210
|
// callback will call if you have
|
|
@@ -1222,31 +1227,31 @@ zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
|
1222
1227
|
t = !callback(result, field) ? MYMODEL.dropdowns[field].fields[result[field]] : callback(result, field);
|
|
1223
1228
|
} else if (Util.in_array(field, passwords)) {
|
|
1224
1229
|
t = 'xxxxxx';
|
|
1225
|
-
} else if (
|
|
1230
|
+
} else if ( widgets.hasOwnProperty(field) && widgets[field].name == "select") {
|
|
1226
1231
|
if (isRaws) {
|
|
1227
1232
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1228
1233
|
} else {
|
|
1229
1234
|
t = !callback(result, field) ? Object.hasOwn(tableObj[field], result[field]) ? tableObj[field][result[field]] : result[field] : callback(result, field);
|
|
1230
1235
|
}
|
|
1231
|
-
} else if (
|
|
1236
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "datetime") {
|
|
1232
1237
|
if (isRaws) {
|
|
1233
1238
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1234
1239
|
} else {
|
|
1235
1240
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1236
1241
|
}
|
|
1237
|
-
} else if (
|
|
1242
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "datepicker") {
|
|
1238
1243
|
if (isRaws) {
|
|
1239
1244
|
t = !callback(result, field) ? Util.dateFormat(result[field]) : callback(result, field);
|
|
1240
1245
|
} else {
|
|
1241
1246
|
t = !callback(result, field) ? Util.dateFormat(result[field]) : callback(result, field);
|
|
1242
1247
|
}
|
|
1243
|
-
} else if (
|
|
1248
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "switch") {
|
|
1244
1249
|
if (isRaws) {
|
|
1245
1250
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1246
1251
|
} else {
|
|
1247
1252
|
t = !callback(result, field) ? tableObj[field][result[field]] || "" : callback(result, field);
|
|
1248
1253
|
}
|
|
1249
|
-
} else if (
|
|
1254
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "relation") {
|
|
1250
1255
|
if (isRaws) {
|
|
1251
1256
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1252
1257
|
} else {
|
|
@@ -1320,7 +1325,7 @@ zRoute.pdf = async (req, res, MYMODEL, fields, rows, callback) => {
|
|
|
1320
1325
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1321
1326
|
} else if (field == 'updated_at' || field == 'updated_at') {
|
|
1322
1327
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1323
|
-
} else if (Util.in_array(field,
|
|
1328
|
+
} else if (Util.in_array(field, ['created_by','updated_by'])) {
|
|
1324
1329
|
t = !callback(result, field) ? usersObj[result[field]] : callback(result, field);
|
|
1325
1330
|
} else {
|
|
1326
1331
|
// callback will call if you have
|
|
@@ -1415,14 +1420,14 @@ zRoute.generatePDF = async (file, layout = "pdf_bootstrap", options = {}) => {
|
|
|
1415
1420
|
'--no-sandbox',
|
|
1416
1421
|
'--disable-setuid-sandbox',
|
|
1417
1422
|
];
|
|
1418
|
-
let env =
|
|
1423
|
+
let env = process.env.NODE_ENV;
|
|
1419
1424
|
let puppeterOptions = {
|
|
1420
1425
|
args: args
|
|
1421
1426
|
};
|
|
1422
|
-
if (env
|
|
1427
|
+
if (env === "production") {
|
|
1423
1428
|
puppeterOptions.executablePath = '/usr/bin/google-chrome-stable';
|
|
1424
|
-
puppeterOptions.defaultViewport = {width: 1920, height: 1080};
|
|
1425
1429
|
}
|
|
1430
|
+
puppeterOptions.defaultViewport = {width: 1920, height: 1080};
|
|
1426
1431
|
const browser = await puppeteer.launch(puppeterOptions);
|
|
1427
1432
|
const page = await browser.newPage();
|
|
1428
1433
|
let mylayout = `${dirRoot}/views/layouts/${layout}.ejs`
|
|
@@ -1973,6 +1978,7 @@ zRoute.viewFormPlainText = (req, res, MYMODEL, relations, data = {}) => {
|
|
|
1973
1978
|
};
|
|
1974
1979
|
|
|
1975
1980
|
zRoute.viewFormsSync = async (req, res, MYMODEL, data = {}) => {
|
|
1981
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
1976
1982
|
const relations = await zRoute.relations(req, res, MYMODEL.table);
|
|
1977
1983
|
let forms = zRoute.viewForm(req, res, MYMODEL, relations, data);
|
|
1978
1984
|
//zRoute.moduleLib(req, res, MYMODEL, relations, forms);
|
|
@@ -1980,7 +1986,7 @@ zRoute.viewFormsSync = async (req, res, MYMODEL, data = {}) => {
|
|
|
1980
1986
|
for (let key in forms.obj) {
|
|
1981
1987
|
if(forms.obj[key].type == 'table') {
|
|
1982
1988
|
let obj = forms.obj[key];
|
|
1983
|
-
let MODEL =
|
|
1989
|
+
let MODEL = MYMODELS[MYMODEL.widgets[obj.id].table];
|
|
1984
1990
|
const relationsTable = await zRoute.relations(req,res,MODEL.table);
|
|
1985
1991
|
let tableForms = zRoute.viewForm(req,res,MODEL,relationsTable, obj.value || []);
|
|
1986
1992
|
let properties = obj.properties;
|
|
@@ -2130,6 +2136,7 @@ zRoute.viewTable = async (req, res, MYMODEL, results, isPreview, hasKeys = "") =
|
|
|
2130
2136
|
let editors = [];
|
|
2131
2137
|
let lexicals = {};
|
|
2132
2138
|
let row = {};
|
|
2139
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2133
2140
|
for (let key in results) {
|
|
2134
2141
|
if (Util.in_array(key, widgetsArray)) {
|
|
2135
2142
|
let widgetName = widgets[key].name;
|
|
@@ -2237,22 +2244,16 @@ zRoute.viewTable = async (req, res, MYMODEL, results, isPreview, hasKeys = "") =
|
|
|
2237
2244
|
break;
|
|
2238
2245
|
case "lexical" :
|
|
2239
2246
|
hasLexical = true;
|
|
2240
|
-
/*
|
|
2241
|
-
lexicals[key] = results[key];
|
|
2242
|
-
data[key] = `<div id="lexical${key}"></div><div id="text${key}" style="display:none"></div><div id="container${key}"></div>`;
|
|
2243
|
-
*/
|
|
2244
2247
|
break;
|
|
2245
2248
|
case "json" :
|
|
2246
2249
|
data[key] = results[key] ? JSON.stringify(results[key], undefined, 2) : "";
|
|
2247
2250
|
break;
|
|
2248
2251
|
case "table" :
|
|
2249
2252
|
let tableClass = isPreview ? "" : "table-striped table-hover";
|
|
2250
|
-
//let html = '';
|
|
2251
|
-
|
|
2252
2253
|
html = `<table class="table ${tableClass}">`;
|
|
2253
2254
|
html += `<tr>`;
|
|
2254
|
-
let MODEL_TABLE =
|
|
2255
|
-
var nots =
|
|
2255
|
+
let MODEL_TABLE = MYMODELS[MYMODEL.widgets[key].table];
|
|
2256
|
+
var nots = Util.nots;
|
|
2256
2257
|
var visibles = MODEL_TABLE.grids.visibles || [];
|
|
2257
2258
|
var invisibles = MODEL_TABLE.grids.invisibles || [];
|
|
2258
2259
|
var obj = {}
|
|
@@ -2356,7 +2357,6 @@ zRoute.moduleLib = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
|
|
|
2356
2357
|
Util.deleteAllFiles(path_head);
|
|
2357
2358
|
Util.deleteAllFiles(path_end);
|
|
2358
2359
|
//minify js
|
|
2359
|
-
const uglifyJS = require("uglify-js");
|
|
2360
2360
|
Util.writeFile(`${path_script}/${time}.js`, uglifyJS.minify(jsObj.script));
|
|
2361
2361
|
Util.writeFile(`${path_head}/head.txt`, jsObj.head);
|
|
2362
2362
|
Util.writeFile(`${path_end}/end.txt`, jsObj.end);
|
|
@@ -2392,8 +2392,9 @@ zRoute.generateJS = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
|
|
|
2392
2392
|
//scriptForm += zForms.scriptGroup;
|
|
2393
2393
|
}
|
|
2394
2394
|
let obj = {};
|
|
2395
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2395
2396
|
let widgets = MYMODEL.widgets,
|
|
2396
|
-
|
|
2397
|
+
widgetsArray = Object.keys(widgets) || [];
|
|
2397
2398
|
let hasDatePicker = false;
|
|
2398
2399
|
let hasNumber = false;
|
|
2399
2400
|
let hasClockPicker = false;
|
|
@@ -2621,7 +2622,7 @@ zRoute.generateJS = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
|
|
|
2621
2622
|
break;
|
|
2622
2623
|
|
|
2623
2624
|
case "table" :
|
|
2624
|
-
let MODEL_TABLE =
|
|
2625
|
+
let MODEL_TABLE = MYMODELS[MYMODEL.widgets[keys].table];
|
|
2625
2626
|
//let MODEL_TABLE_RELATIONS = await zRoute.relations(req, res, MODEL_TABLE.table);
|
|
2626
2627
|
//relations[key + "TABLE"]
|
|
2627
2628
|
let MODEL_TABLE_RELATIONS = relations[keys + "TABLE"];
|
|
@@ -2795,7 +2796,8 @@ $("#body-${keys}>tr").each(function (index, tr) {
|
|
|
2795
2796
|
MySQL CRUD with context
|
|
2796
2797
|
*/
|
|
2797
2798
|
zRoute.insertSQL = async (req, res, table, data) => {
|
|
2798
|
-
|
|
2799
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2800
|
+
let MYMODEL = MYMODELS[table];
|
|
2799
2801
|
let fields = MYMODEL.keys;
|
|
2800
2802
|
if (fields.includes("company_id")) data.company_id = res.locals.companyId || 1;
|
|
2801
2803
|
if (fields.includes("updated_at")) data.updated_at = Util.now();
|
|
@@ -2808,7 +2810,8 @@ zRoute.insertSQL = async (req, res, table, data) => {
|
|
|
2808
2810
|
};
|
|
2809
2811
|
|
|
2810
2812
|
zRoute.updateSQL = async (req, res, table, data, whereData) => {
|
|
2811
|
-
|
|
2813
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2814
|
+
let MYMODEL = MYMODELS[table];
|
|
2812
2815
|
let fields = MYMODEL.keys;
|
|
2813
2816
|
if (fields.includes('updated_at')) {
|
|
2814
2817
|
data.updated_at = Util.now();
|
|
@@ -2823,7 +2826,7 @@ zRoute.updateSQL = async (req, res, table, data, whereData) => {
|
|
|
2823
2826
|
for (let key in MYMODEL.widgets) {
|
|
2824
2827
|
if (MYMODEL.widgets[key].name == "table") {
|
|
2825
2828
|
tableFields[key] = [];
|
|
2826
|
-
const MYMODEL_TABLE =
|
|
2829
|
+
const MYMODEL_TABLE = MYMODELS[MYMODEL.widgets[key].table];
|
|
2827
2830
|
for (let q in MYMODEL_TABLE.widgets) {
|
|
2828
2831
|
if (MYMODEL_TABLE.widgets[q].name == "file" || MYMODEL_TABLE.widgets[q].name == "image") {
|
|
2829
2832
|
hasImages = true;
|
|
@@ -2891,7 +2894,7 @@ zRoute.deleteSQL = async (table, id, company_id) => {
|
|
|
2891
2894
|
|
|
2892
2895
|
//for import
|
|
2893
2896
|
zRoute.import = async (req, res, MYMODEL) => {
|
|
2894
|
-
const userId = res.locals
|
|
2897
|
+
const userId = res.locals.userId;
|
|
2895
2898
|
const room = res.locals.token;
|
|
2896
2899
|
let progress = 0;
|
|
2897
2900
|
let datas = [];
|
|
@@ -2945,7 +2948,6 @@ zRoute.import = async (req, res, MYMODEL) => {
|
|
|
2945
2948
|
hd += `</tr>`;
|
|
2946
2949
|
//convert to table header
|
|
2947
2950
|
io.to(room).emit('import', hd);
|
|
2948
|
-
|
|
2949
2951
|
let isInsert = true;
|
|
2950
2952
|
hd += `<tr>`
|
|
2951
2953
|
for (let i = 3; i < result.length; i++) {
|
|
@@ -3042,7 +3044,8 @@ zRoute.buildFileModel = (json, index = 0) => {
|
|
|
3042
3044
|
|
|
3043
3045
|
zRoute.approversFooter = async (results, noActivity) => {
|
|
3044
3046
|
noActivity = noActivity || false;
|
|
3045
|
-
|
|
3047
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
3048
|
+
let MYMODEL = MYMODELS.zapprovals_details;
|
|
3046
3049
|
let users = Util.arrayToObject(await connection.results({table: "zuser"}), "id");
|
|
3047
3050
|
let html = '';
|
|
3048
3051
|
let id = 0;
|
|
@@ -3056,7 +3059,7 @@ zRoute.approversFooter = async (results, noActivity) => {
|
|
|
3056
3059
|
}
|
|
3057
3060
|
if (result.type == 1) {
|
|
3058
3061
|
let html = "";
|
|
3059
|
-
let sign = users[result.user_id].verify_signed && result.status == 3 ? `<img src="${
|
|
3062
|
+
let sign = users[result.user_id].verify_signed && result.status == 3 ? `<img src="${process.env.APP_URL}/uploads/zuser/${users[result.user_id].verify_signed}" width="200">` : MYMODEL.widgets.status.fields[result.status];
|
|
3060
3063
|
//var sign = "";
|
|
3061
3064
|
html += `<span class="status-approver">${sign}</span>`;
|
|
3062
3065
|
html += `<p class="footer-title"> <span style="text-decoration: underline;">${users[result.user_id].fullname}</span><span class="small-time"> ${users[result.user_id].position} <br> ${Util.dateFormat(result.updated_at, "DD MMM YYYY HH:mm")}</span></p>
|
|
@@ -3112,7 +3115,6 @@ zRoute.approversFooter = async (results, noActivity) => {
|
|
|
3112
3115
|
|
|
3113
3116
|
|
|
3114
3117
|
/*
|
|
3115
|
-
Caches include WPA
|
|
3116
3118
|
cache models in so it's no need call database repeatly
|
|
3117
3119
|
*/
|
|
3118
3120
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zet-lib",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "zet is a library that part of zet generator.",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18"
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"ejs": "^3.1.9",
|
|
35
35
|
"exceljs": "^4.3.0",
|
|
36
36
|
"fs-extra": "^11.1.1",
|
|
37
|
+
"html-minifier-terser": "^7.2.0",
|
|
37
38
|
"js-sha256": "^0.9.0",
|
|
38
39
|
"moment": "^2.29.4",
|
|
39
40
|
"node-cache": "^5.1.2",
|
|
@@ -44,6 +45,7 @@
|
|
|
44
45
|
"qs": "^6.11.2",
|
|
45
46
|
"randomstring": "^1.3.0",
|
|
46
47
|
"socket.io": "^4.7.2",
|
|
48
|
+
"uglify-js": "^3.17.4",
|
|
47
49
|
"uuid": "^9.0.0",
|
|
48
50
|
"xlsx": "^0.18.5"
|
|
49
51
|
}
|