zet-lib 1.0.0 → 1.0.1
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 +1 -2
- 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 +47 -46
- package/package.json +3 -1
package/lib/Util.js
CHANGED
|
@@ -863,8 +863,7 @@ Util.virtualHelper = function (obj) {
|
|
|
863
863
|
return str;
|
|
864
864
|
};
|
|
865
865
|
|
|
866
|
-
|
|
867
|
-
Util.nots = ['id', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy', 'created_at', 'updated_at', 'created_by', 'updated_by', 'modified_by', 'companyId', 'company_id'];
|
|
866
|
+
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
867
|
|
|
869
868
|
Util.requiredFields = function (obj) {
|
|
870
869
|
var nots = Util.nots;
|
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');
|
|
@@ -78,6 +80,7 @@ zRoute.postData = (obj) => {
|
|
|
78
80
|
};
|
|
79
81
|
|
|
80
82
|
zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
83
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
81
84
|
routeName = routeName || MYMODEL.routeName;
|
|
82
85
|
body = body || req.body;
|
|
83
86
|
let post = qs.parse(body);
|
|
@@ -89,7 +92,7 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
|
89
92
|
let checkboxes = [];
|
|
90
93
|
let multies = [];
|
|
91
94
|
fs.ensureDir(path_tmp, err => {
|
|
92
|
-
console.log('ensureDir',err); // => null
|
|
95
|
+
//console.log('ensureDir',err); // => null
|
|
93
96
|
});
|
|
94
97
|
if (!isEmptyFiles) {
|
|
95
98
|
files = qs.parse(req.files);
|
|
@@ -100,12 +103,12 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
|
100
103
|
hasFile = true;
|
|
101
104
|
//add folder again
|
|
102
105
|
fs.ensureDir(path_tmp + key, err => {
|
|
103
|
-
console.log('ensureDir',err); // => null
|
|
106
|
+
//console.log('ensureDir',err); // => null
|
|
104
107
|
});
|
|
105
108
|
} else {
|
|
106
109
|
fileRoute[key].mv(path_tmp + filename, function (err) {
|
|
107
110
|
if (err) {
|
|
108
|
-
console.log('fileempty move',err); // => null
|
|
111
|
+
//console.log('fileempty move',err); // => null
|
|
109
112
|
return res.status(500).send(err);
|
|
110
113
|
}
|
|
111
114
|
});
|
|
@@ -163,7 +166,7 @@ zRoute.post = (req, res, MYMODEL, routeName, body) => {
|
|
|
163
166
|
break;
|
|
164
167
|
|
|
165
168
|
case "table" :
|
|
166
|
-
const MODEL_TABLE =
|
|
169
|
+
const MODEL_TABLE = MYMODELS[widgets[key].table];
|
|
167
170
|
const postTableData = post[routeName][key];
|
|
168
171
|
const widgetTables = MODEL_TABLE.widgets;
|
|
169
172
|
const dataTable = []
|
|
@@ -283,6 +286,7 @@ zRoute.ajax = async (req, res) => {
|
|
|
283
286
|
let table = body.table;
|
|
284
287
|
let type = body.type;
|
|
285
288
|
let results;
|
|
289
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
286
290
|
let obj = {
|
|
287
291
|
table: table
|
|
288
292
|
};
|
|
@@ -304,7 +308,7 @@ zRoute.ajax = async (req, res) => {
|
|
|
304
308
|
if (!params.hasOwnProperty(table)) {
|
|
305
309
|
io.to(res.locals.token).emit("error", "You have no access to this page");
|
|
306
310
|
}
|
|
307
|
-
let MYMODEL =
|
|
311
|
+
let MYMODEL = MYMODELS[table];
|
|
308
312
|
if (type == "select") {
|
|
309
313
|
if (params[table].includes("index")) {
|
|
310
314
|
results = await connection.results(obj)
|
|
@@ -392,7 +396,8 @@ zRoute.selectData = (MYMODEL) => {
|
|
|
392
396
|
|
|
393
397
|
zRoute.relations = async (req, res, table) => {
|
|
394
398
|
try {
|
|
395
|
-
const
|
|
399
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
400
|
+
const MYMODEL = MYMODELS[table];
|
|
396
401
|
let relations = {}
|
|
397
402
|
relations["zattributes"] = {}
|
|
398
403
|
relations["zvirtuals"] = {}
|
|
@@ -408,7 +413,6 @@ zRoute.relations = async (req, res, table) => {
|
|
|
408
413
|
const widget = MYMODEL.widgets[key];
|
|
409
414
|
const widgetName = MYMODEL.widgets[key].name;
|
|
410
415
|
let emptyArray = Util.arrayUnShift(['id', 'zname']);
|
|
411
|
-
|
|
412
416
|
if (widgetName == "dropdown_multi") {
|
|
413
417
|
let obj = {
|
|
414
418
|
select: widget.fields.join(",") + " as zname ",
|
|
@@ -429,8 +433,8 @@ zRoute.relations = async (req, res, table) => {
|
|
|
429
433
|
relations[key] = [Util.arrayUnShift(['id', 'zname']), ...results];
|
|
430
434
|
relations[keyObject] = Util.arrayWithObject(relations[key], 'id', 'zname');
|
|
431
435
|
} else if (widgetName == "table") {
|
|
432
|
-
let MODEL_TABLE =
|
|
433
|
-
let nots =
|
|
436
|
+
let MODEL_TABLE = MYMODELS[widget.table];
|
|
437
|
+
let nots = Util.nots;
|
|
434
438
|
let obj = {}
|
|
435
439
|
let visibles = MODEL_TABLE.grids.visibles;
|
|
436
440
|
let invisibles = MODEL_TABLE.grids.invisibles;
|
|
@@ -451,11 +455,10 @@ zRoute.relations = async (req, res, table) => {
|
|
|
451
455
|
relations[`properties_${key}`] = properties;
|
|
452
456
|
relations[keyRow] = await zRoute.relations(req, res, widget.table);
|
|
453
457
|
relations[key + "Table"] = widget.table;
|
|
454
|
-
//let MODEL_TABLE = require("./../models/" + MYMODEL.widgets[key].table);
|
|
455
458
|
relations[key + "TABLE"] = await zRoute.relations(req, res, MODEL_TABLE.table);
|
|
456
459
|
|
|
457
460
|
} else if (widgetName == "multi_line_editor") {
|
|
458
|
-
let MODEL_TABLE =
|
|
461
|
+
let MODEL_TABLE = MYMODELS[widget.table];
|
|
459
462
|
relations[keyFields] = MYMODEL.widgets[key].fields;
|
|
460
463
|
relations[key] = await zRoute.relations(req, res, widget.table);
|
|
461
464
|
|
|
@@ -1056,6 +1059,7 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1056
1059
|
let fields = [];
|
|
1057
1060
|
let body = {};
|
|
1058
1061
|
let select = "";
|
|
1062
|
+
let arr = [];
|
|
1059
1063
|
let allfields = Object.keys(MYMODEL.widgets);
|
|
1060
1064
|
if (results.length) {
|
|
1061
1065
|
let result = results[0];
|
|
@@ -1064,8 +1068,8 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1064
1068
|
select = Util.selectMysql(fields);
|
|
1065
1069
|
if (zall) {
|
|
1066
1070
|
let difference = allfields.filter(x => !fields.includes(x));
|
|
1067
|
-
|
|
1068
|
-
select
|
|
1071
|
+
arr = [...fields, ...difference];
|
|
1072
|
+
select =`"${arr.join('","')}"`;
|
|
1069
1073
|
}
|
|
1070
1074
|
let whereArray = [];
|
|
1071
1075
|
let columns = body.columns;
|
|
@@ -1106,7 +1110,7 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1106
1110
|
});
|
|
1107
1111
|
}
|
|
1108
1112
|
if (zall) {
|
|
1109
|
-
fields =
|
|
1113
|
+
fields = arr;
|
|
1110
1114
|
}
|
|
1111
1115
|
|
|
1112
1116
|
const ztype = reqQuery.ztype == 1 ? true : false;
|
|
@@ -1121,7 +1125,6 @@ zRoute.excelQuery = async (req, res, MYMODEL) => {
|
|
|
1121
1125
|
zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
1122
1126
|
//if any other custom value then callback needed
|
|
1123
1127
|
callback = callback || function () {};
|
|
1124
|
-
const Excel = require('exceljs');
|
|
1125
1128
|
const workbook = new Excel.Workbook();
|
|
1126
1129
|
let worksheet = workbook.addWorksheet(res.locals.routeName, {pageSetup: {paperSize: 9, orientation: 'landscape'}})
|
|
1127
1130
|
worksheet.properties.defaultColWidth = 13;
|
|
@@ -1186,6 +1189,7 @@ zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
|
1186
1189
|
}
|
|
1187
1190
|
}
|
|
1188
1191
|
|
|
1192
|
+
const widgets = MYMODEL.widgets;
|
|
1189
1193
|
rows.forEach(function (result) {
|
|
1190
1194
|
fields.forEach((field, i) => {
|
|
1191
1195
|
let t;
|
|
@@ -1195,11 +1199,11 @@ zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
|
1195
1199
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1196
1200
|
} else if (field == 'updated_at' || field == 'updated_at') {
|
|
1197
1201
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1198
|
-
} else if (Util.in_array(field,
|
|
1202
|
+
} else if (Util.in_array(field, ['created_by','updated_by'])) {
|
|
1199
1203
|
if (isRaws) {
|
|
1200
1204
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1201
1205
|
} else {
|
|
1202
|
-
t = !callback(result, field) ? usersObj[result[field]] : callback(result, field);
|
|
1206
|
+
t = !callback(result, field) ? usersObj[result[field]].fullname : callback(result, field);
|
|
1203
1207
|
}
|
|
1204
1208
|
} else {
|
|
1205
1209
|
// callback will call if you have
|
|
@@ -1222,31 +1226,31 @@ zRoute.excel = async (req, res, MYMODEL, fields, rows, callback, fileName) => {
|
|
|
1222
1226
|
t = !callback(result, field) ? MYMODEL.dropdowns[field].fields[result[field]] : callback(result, field);
|
|
1223
1227
|
} else if (Util.in_array(field, passwords)) {
|
|
1224
1228
|
t = 'xxxxxx';
|
|
1225
|
-
} else if (
|
|
1229
|
+
} else if ( widgets.hasOwnProperty(field) && widgets[field].name == "select") {
|
|
1226
1230
|
if (isRaws) {
|
|
1227
1231
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1228
1232
|
} else {
|
|
1229
1233
|
t = !callback(result, field) ? Object.hasOwn(tableObj[field], result[field]) ? tableObj[field][result[field]] : result[field] : callback(result, field);
|
|
1230
1234
|
}
|
|
1231
|
-
} else if (
|
|
1235
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "datetime") {
|
|
1232
1236
|
if (isRaws) {
|
|
1233
1237
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1234
1238
|
} else {
|
|
1235
1239
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1236
1240
|
}
|
|
1237
|
-
} else if (
|
|
1241
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "datepicker") {
|
|
1238
1242
|
if (isRaws) {
|
|
1239
1243
|
t = !callback(result, field) ? Util.dateFormat(result[field]) : callback(result, field);
|
|
1240
1244
|
} else {
|
|
1241
1245
|
t = !callback(result, field) ? Util.dateFormat(result[field]) : callback(result, field);
|
|
1242
1246
|
}
|
|
1243
|
-
} else if (
|
|
1247
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "switch") {
|
|
1244
1248
|
if (isRaws) {
|
|
1245
1249
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1246
1250
|
} else {
|
|
1247
1251
|
t = !callback(result, field) ? tableObj[field][result[field]] || "" : callback(result, field);
|
|
1248
1252
|
}
|
|
1249
|
-
} else if (
|
|
1253
|
+
} else if (widgets.hasOwnProperty(field) && widgets[field].name == "relation") {
|
|
1250
1254
|
if (isRaws) {
|
|
1251
1255
|
t = !callback(result, field) ? result[field] : callback(result, field);
|
|
1252
1256
|
} else {
|
|
@@ -1320,7 +1324,7 @@ zRoute.pdf = async (req, res, MYMODEL, fields, rows, callback) => {
|
|
|
1320
1324
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1321
1325
|
} else if (field == 'updated_at' || field == 'updated_at') {
|
|
1322
1326
|
t = !callback(result, field) ? Util.timeSql(result[field]) : callback(result, field);
|
|
1323
|
-
} else if (Util.in_array(field,
|
|
1327
|
+
} else if (Util.in_array(field, ['created_by','updated_by'])) {
|
|
1324
1328
|
t = !callback(result, field) ? usersObj[result[field]] : callback(result, field);
|
|
1325
1329
|
} else {
|
|
1326
1330
|
// callback will call if you have
|
|
@@ -1415,14 +1419,14 @@ zRoute.generatePDF = async (file, layout = "pdf_bootstrap", options = {}) => {
|
|
|
1415
1419
|
'--no-sandbox',
|
|
1416
1420
|
'--disable-setuid-sandbox',
|
|
1417
1421
|
];
|
|
1418
|
-
let env =
|
|
1422
|
+
let env = process.env.NODE_ENV;
|
|
1419
1423
|
let puppeterOptions = {
|
|
1420
1424
|
args: args
|
|
1421
1425
|
};
|
|
1422
|
-
if (env
|
|
1426
|
+
if (env === "production") {
|
|
1423
1427
|
puppeterOptions.executablePath = '/usr/bin/google-chrome-stable';
|
|
1424
|
-
puppeterOptions.defaultViewport = {width: 1920, height: 1080};
|
|
1425
1428
|
}
|
|
1429
|
+
puppeterOptions.defaultViewport = {width: 1920, height: 1080};
|
|
1426
1430
|
const browser = await puppeteer.launch(puppeterOptions);
|
|
1427
1431
|
const page = await browser.newPage();
|
|
1428
1432
|
let mylayout = `${dirRoot}/views/layouts/${layout}.ejs`
|
|
@@ -1973,6 +1977,7 @@ zRoute.viewFormPlainText = (req, res, MYMODEL, relations, data = {}) => {
|
|
|
1973
1977
|
};
|
|
1974
1978
|
|
|
1975
1979
|
zRoute.viewFormsSync = async (req, res, MYMODEL, data = {}) => {
|
|
1980
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
1976
1981
|
const relations = await zRoute.relations(req, res, MYMODEL.table);
|
|
1977
1982
|
let forms = zRoute.viewForm(req, res, MYMODEL, relations, data);
|
|
1978
1983
|
//zRoute.moduleLib(req, res, MYMODEL, relations, forms);
|
|
@@ -1980,7 +1985,7 @@ zRoute.viewFormsSync = async (req, res, MYMODEL, data = {}) => {
|
|
|
1980
1985
|
for (let key in forms.obj) {
|
|
1981
1986
|
if(forms.obj[key].type == 'table') {
|
|
1982
1987
|
let obj = forms.obj[key];
|
|
1983
|
-
let MODEL =
|
|
1988
|
+
let MODEL = MYMODELS[MYMODEL.widgets[obj.id].table];
|
|
1984
1989
|
const relationsTable = await zRoute.relations(req,res,MODEL.table);
|
|
1985
1990
|
let tableForms = zRoute.viewForm(req,res,MODEL,relationsTable, obj.value || []);
|
|
1986
1991
|
let properties = obj.properties;
|
|
@@ -2130,6 +2135,7 @@ zRoute.viewTable = async (req, res, MYMODEL, results, isPreview, hasKeys = "") =
|
|
|
2130
2135
|
let editors = [];
|
|
2131
2136
|
let lexicals = {};
|
|
2132
2137
|
let row = {};
|
|
2138
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2133
2139
|
for (let key in results) {
|
|
2134
2140
|
if (Util.in_array(key, widgetsArray)) {
|
|
2135
2141
|
let widgetName = widgets[key].name;
|
|
@@ -2237,22 +2243,16 @@ zRoute.viewTable = async (req, res, MYMODEL, results, isPreview, hasKeys = "") =
|
|
|
2237
2243
|
break;
|
|
2238
2244
|
case "lexical" :
|
|
2239
2245
|
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
2246
|
break;
|
|
2245
2247
|
case "json" :
|
|
2246
2248
|
data[key] = results[key] ? JSON.stringify(results[key], undefined, 2) : "";
|
|
2247
2249
|
break;
|
|
2248
2250
|
case "table" :
|
|
2249
2251
|
let tableClass = isPreview ? "" : "table-striped table-hover";
|
|
2250
|
-
//let html = '';
|
|
2251
|
-
|
|
2252
2252
|
html = `<table class="table ${tableClass}">`;
|
|
2253
2253
|
html += `<tr>`;
|
|
2254
|
-
let MODEL_TABLE =
|
|
2255
|
-
var nots =
|
|
2254
|
+
let MODEL_TABLE = MYMODELS[MYMODEL.widgets[key].table];
|
|
2255
|
+
var nots = Util.nots;
|
|
2256
2256
|
var visibles = MODEL_TABLE.grids.visibles || [];
|
|
2257
2257
|
var invisibles = MODEL_TABLE.grids.invisibles || [];
|
|
2258
2258
|
var obj = {}
|
|
@@ -2356,7 +2356,6 @@ zRoute.moduleLib = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
|
|
|
2356
2356
|
Util.deleteAllFiles(path_head);
|
|
2357
2357
|
Util.deleteAllFiles(path_end);
|
|
2358
2358
|
//minify js
|
|
2359
|
-
const uglifyJS = require("uglify-js");
|
|
2360
2359
|
Util.writeFile(`${path_script}/${time}.js`, uglifyJS.minify(jsObj.script));
|
|
2361
2360
|
Util.writeFile(`${path_head}/head.txt`, jsObj.head);
|
|
2362
2361
|
Util.writeFile(`${path_end}/end.txt`, jsObj.end);
|
|
@@ -2392,6 +2391,7 @@ zRoute.generateJS = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
|
|
|
2392
2391
|
//scriptForm += zForms.scriptGroup;
|
|
2393
2392
|
}
|
|
2394
2393
|
let obj = {};
|
|
2394
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2395
2395
|
let widgets = MYMODEL.widgets,
|
|
2396
2396
|
widgetsArray = Object.keys(widgets) || [];
|
|
2397
2397
|
let hasDatePicker = false;
|
|
@@ -2621,7 +2621,7 @@ zRoute.generateJS = (req, res, MYMODEL, relations, zForms = "", data = {}) => {
|
|
|
2621
2621
|
break;
|
|
2622
2622
|
|
|
2623
2623
|
case "table" :
|
|
2624
|
-
let MODEL_TABLE =
|
|
2624
|
+
let MODEL_TABLE = MYMODELS[MYMODEL.widgets[keys].table];
|
|
2625
2625
|
//let MODEL_TABLE_RELATIONS = await zRoute.relations(req, res, MODEL_TABLE.table);
|
|
2626
2626
|
//relations[key + "TABLE"]
|
|
2627
2627
|
let MODEL_TABLE_RELATIONS = relations[keys + "TABLE"];
|
|
@@ -2795,7 +2795,8 @@ $("#body-${keys}>tr").each(function (index, tr) {
|
|
|
2795
2795
|
MySQL CRUD with context
|
|
2796
2796
|
*/
|
|
2797
2797
|
zRoute.insertSQL = async (req, res, table, data) => {
|
|
2798
|
-
|
|
2798
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2799
|
+
let MYMODEL = MYMODELS[table];
|
|
2799
2800
|
let fields = MYMODEL.keys;
|
|
2800
2801
|
if (fields.includes("company_id")) data.company_id = res.locals.companyId || 1;
|
|
2801
2802
|
if (fields.includes("updated_at")) data.updated_at = Util.now();
|
|
@@ -2808,7 +2809,8 @@ zRoute.insertSQL = async (req, res, table, data) => {
|
|
|
2808
2809
|
};
|
|
2809
2810
|
|
|
2810
2811
|
zRoute.updateSQL = async (req, res, table, data, whereData) => {
|
|
2811
|
-
|
|
2812
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
2813
|
+
let MYMODEL = MYMODELS[table];
|
|
2812
2814
|
let fields = MYMODEL.keys;
|
|
2813
2815
|
if (fields.includes('updated_at')) {
|
|
2814
2816
|
data.updated_at = Util.now();
|
|
@@ -2823,7 +2825,7 @@ zRoute.updateSQL = async (req, res, table, data, whereData) => {
|
|
|
2823
2825
|
for (let key in MYMODEL.widgets) {
|
|
2824
2826
|
if (MYMODEL.widgets[key].name == "table") {
|
|
2825
2827
|
tableFields[key] = [];
|
|
2826
|
-
const MYMODEL_TABLE =
|
|
2828
|
+
const MYMODEL_TABLE = MYMODELS[MYMODEL.widgets[key].table];
|
|
2827
2829
|
for (let q in MYMODEL_TABLE.widgets) {
|
|
2828
2830
|
if (MYMODEL_TABLE.widgets[q].name == "file" || MYMODEL_TABLE.widgets[q].name == "image") {
|
|
2829
2831
|
hasImages = true;
|
|
@@ -2891,7 +2893,7 @@ zRoute.deleteSQL = async (table, id, company_id) => {
|
|
|
2891
2893
|
|
|
2892
2894
|
//for import
|
|
2893
2895
|
zRoute.import = async (req, res, MYMODEL) => {
|
|
2894
|
-
const userId = res.locals
|
|
2896
|
+
const userId = res.locals.userId;
|
|
2895
2897
|
const room = res.locals.token;
|
|
2896
2898
|
let progress = 0;
|
|
2897
2899
|
let datas = [];
|
|
@@ -2945,7 +2947,6 @@ zRoute.import = async (req, res, MYMODEL) => {
|
|
|
2945
2947
|
hd += `</tr>`;
|
|
2946
2948
|
//convert to table header
|
|
2947
2949
|
io.to(room).emit('import', hd);
|
|
2948
|
-
|
|
2949
2950
|
let isInsert = true;
|
|
2950
2951
|
hd += `<tr>`
|
|
2951
2952
|
for (let i = 3; i < result.length; i++) {
|
|
@@ -3042,7 +3043,8 @@ zRoute.buildFileModel = (json, index = 0) => {
|
|
|
3042
3043
|
|
|
3043
3044
|
zRoute.approversFooter = async (results, noActivity) => {
|
|
3044
3045
|
noActivity = noActivity || false;
|
|
3045
|
-
|
|
3046
|
+
const MYMODELS = myCache.get('MYMODELS');
|
|
3047
|
+
let MYMODEL = MYMODELS.zapprovals_details;
|
|
3046
3048
|
let users = Util.arrayToObject(await connection.results({table: "zuser"}), "id");
|
|
3047
3049
|
let html = '';
|
|
3048
3050
|
let id = 0;
|
|
@@ -3056,7 +3058,7 @@ zRoute.approversFooter = async (results, noActivity) => {
|
|
|
3056
3058
|
}
|
|
3057
3059
|
if (result.type == 1) {
|
|
3058
3060
|
let html = "";
|
|
3059
|
-
let sign = users[result.user_id].verify_signed && result.status == 3 ? `<img src="${
|
|
3061
|
+
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
3062
|
//var sign = "";
|
|
3061
3063
|
html += `<span class="status-approver">${sign}</span>`;
|
|
3062
3064
|
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 +3114,6 @@ zRoute.approversFooter = async (results, noActivity) => {
|
|
|
3112
3114
|
|
|
3113
3115
|
|
|
3114
3116
|
/*
|
|
3115
|
-
Caches include WPA
|
|
3116
3117
|
cache models in so it's no need call database repeatly
|
|
3117
3118
|
*/
|
|
3118
3119
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zet-lib",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
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
|
}
|