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 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
- .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();
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
- /\w\S*/g,
612
- function (txt) {
613
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
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
- /\w\S*/g,
622
- function (txt) {
623
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
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
@@ -22,6 +22,7 @@ module.exports = {
22
22
  zReport: require('./zReport'),
23
23
  zRoute: require('./zRoute'),
24
24
  zRole : require('./zRole'),
25
+ zPage: require('./zPage'),
25
26
  zTester: require('./zTester'),
26
27
  zCache : require('./zCache'),
27
28
  UI : require('./UI')
package/lib/io.js CHANGED
@@ -37,7 +37,6 @@ io.on('connection', function (socket) {
37
37
  socket.on('room', function(room) {
38
38
  socket.join(room);
39
39
  });
40
-
41
40
  });
42
41
 
43
42
  io.socketArray = socketArray;
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("TABLES")) {
59
+ if (myCache.has("MYMODELS")) {
61
60
  i = i + 1;
62
61
  } else {
63
- //console.log("cache TABLES not exist " + i)
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 (name != "index"){
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 = require('./../models/' + widgets[key].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 = require(`./../models/${table}`);
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 MYMODEL = require("./../models/" + table);
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 = require(`./../models/${widget.table}`);
433
- let nots = [...CONFIG.generator.notRenderField, ...['no', 'actionColumn']];
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 = require(`./../models/${widget.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
- /*case "json" :
715
- dataTable[key] = `<input type="number" class="form-control form-control-sm" value="${value}" id="data_table_${key}" >`;
716
- types[key] = 'input';
717
- break;*/
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
- let arr = [...fields, ...difference];
1068
- select = arr.join(",");
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 = select.split(",");
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, CONFIG.generator.createdupdated_by)) {
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 (MYMODEL.widgets[field].name == "select") {
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 (MYMODEL.widgets[field].name == "datetime") {
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 (MYMODEL.widgets[field].name == "datepicker") {
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 (MYMODEL.widgets[field].name == "switch") {
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 (MYMODEL.widgets[field].name == "relation") {
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, CONFIG.generator.createdupdated_by)) {
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 = CONFIG.environment;
1423
+ let env = process.env.NODE_ENV;
1419
1424
  let puppeterOptions = {
1420
1425
  args: args
1421
1426
  };
1422
- if (env == "production") {
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 = require(`./../models/${MYMODEL.widgets[obj.id].table}`);
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 = require("./../models/" + MYMODEL.widgets[key].table);
2255
- var nots = [...CONFIG.generator.notRenderField, ...['no', 'actionColumn']];
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
- widgetsArray = Object.keys(widgets) || [];
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 = require("./../models/" + MYMODEL.widgets[keys].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
- let MYMODEL = require("./../models/" + table);
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
- let MYMODEL = require("./../models/" + table);
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 = require("./../models/" + MYMODEL.widgets[key].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[CONFIG.generator.userId];
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
- let MYMODEL = require("./../models/zapprovals_details");
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="${CONFIG.app.url}/uploads/zuser/${users[result.user_id].verify_signed}" width="200">` : MYMODEL.widgets.status.fields[result.status];
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.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
  }