zet-lib 3.0.7 → 3.0.8

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.
@@ -1,1328 +1,1328 @@
1
- const express = require('express');
2
- const router = express.Router();
3
- const generatorApp = require("./generatorApp");
4
- const configGenerator = require('./config_generator');
5
-
6
- const csrf = require('./csrf');
7
- const Model = require("./Model");
8
- const fs = require('fs-extra');
9
- //const {connection, Util} = require('zet-lib');
10
- const connection = require('./connection');
11
- const Util = require('./Util');
12
-
13
- const Api = {};
14
-
15
- Api.test = async (req, res) => {
16
- //console.log(req.body);
17
- var body = req.body;
18
- res.json(body)
19
- };
20
-
21
- Api.index = async (req, res) => {
22
- try {
23
- let datas = {table: '', tabs: [], labels: {}, details: {}, hardcode_grid: ""};
24
- let table = req.body.table || "", route = "";
25
- const results = req.body.results || [];
26
- const fields = req.body.fields || []
27
- const zFields = Util.arrayToObject(results, "table");
28
- /*let json = {
29
- datas: datas,
30
- table: table,
31
- rows: {},
32
- route: "",
33
- selects: Model.keys,
34
- }*/
35
- let json;
36
- if (table) {
37
- datas = zFields[table] || {}
38
- if (datas.hasOwnProperty("id")) {
39
- datas.details = datas.details || {};
40
- datas.labels = datas.labels || {};
41
- datas.tabs = datas.tabs || [];
42
- datas.left = datas.left || [];
43
- datas.right = datas.right || [];
44
- datas.properties = datas.properties || {};
45
- datas.hardcode_grid = datas.hardcode_grid || Model.hardcodeGrid;
46
- datas.zapprovals = datas.zapprovals || {};
47
- route = datas.route;
48
- //files
49
- //get contents or get it from views zgenerator/views
50
- datas.router = datas.router || fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", 'utf-8');
51
- delete datas.index_ejs;
52
- delete datas.indexcss_ejs;
53
- delete datas.indexjs_ejs;
54
- delete datas.form_ejs;
55
- delete datas.create_ejs;
56
- delete datas.createjs_ejs;
57
- delete datas.update_ejs;
58
- delete datas.updatejs_ejs;
59
- delete datas.import_ejs;
60
- delete datas.importjs_ejs;
61
- delete datas.index_ejs;
62
- delete datas.createjs_ejs;
63
- delete datas.updatejs_ejs;
64
- delete datas.importjs_ejs;
65
- delete datas.view_ejs;
66
- delete datas.importjs_ejs;
67
-
68
- }
69
- }
70
-
71
- if (zFields) {
72
- let rows = await connection.query(connection.showTables);
73
- let arr = [];
74
- rows.map(async (item) => {
75
- let obj = {}
76
- for (let key in item) {
77
- let name = item[key];
78
- obj.name = name;
79
- obj.label = Util.camelize(name);
80
- if (zFields.hasOwnProperty(name)) {
81
- if (zFields[name].name) {
82
- obj.label = zFields[name].name
83
- } else {
84
- let post = {
85
- name: Util.fieldToName(name),
86
- route: name
87
- }
88
- /*await connection.update({
89
- table: "zfields",
90
- data: post,
91
- where: {
92
- table: name
93
- }
94
- });*/
95
- zFields[name].label = Util.fieldToName(name);
96
- }
97
- } else {
98
- let properties = await zFieldsProperty(name, fields);
99
- /*await connection.insert({
100
- table: "zfields",
101
- data: properties
102
- })*/
103
- zFields[name] = properties;
104
- }
105
- }
106
- arr.push(obj)
107
- });
108
- }
109
- //add javascript object ZFIELDS
110
- let obj = {}
111
- for (let keys in zFields) {
112
- for (let key in zFields[keys]) {
113
- if (key == "labels") {
114
- zFields[keys].labels = zFields[keys].labels;
115
- } else if (key == "details") {
116
- zFields[keys].details = zFields[keys].details;
117
- } else if (key == "properties") {
118
- zFields[keys].properties = zFields[keys].properties;
119
- } else if (key == "left") {
120
- zFields[keys].left = zFields[keys].left;
121
- } else if (key == "right") {
122
- zFields[keys].right = zFields[keys].right;
123
- }
124
- }
125
- }
126
- /*
127
- Filter modules
128
- */
129
- //delete zFields.zapprovals;
130
- //delete zFields.zconfig;
131
- //delete zFields.zerror;
132
- //delete zFields.zfields;
133
- //delete zFields.zgrid;
134
- //delete zFields.zmenu;
135
- //delete zFields.znotification;
136
- //delete zFields.zrole;
137
- //delete zFields.zuser;
138
- //delete zFields.zuser_company;
139
- //delete zFields.zcompany;
140
- //delete zFields.zreport;
141
- //delete zFields.zreport_filter;
142
-
143
- delete datas.index_ejs;
144
- delete datas.indexcss_ejs;
145
- delete datas.indexjs_ejs;
146
- delete datas.form_ejs;
147
- delete datas.create_ejs;
148
- delete datas.createjs_ejs;
149
- delete datas.createjs_ejs;
150
- delete datas.updatecss_ejs;
151
- delete datas.update_ejs;
152
- delete datas.updatejs_ejs;
153
- delete datas.importjs_ejs;
154
- delete datas.import_ejs;
155
- delete datas.view_ejs;
156
-
157
- /*
158
- End filter
159
- */
160
- json = {
161
- datas: datas,
162
- table: table,
163
- rows: zFields,
164
- route: route,
165
- selects: Model.keys,
166
- }
167
- res.json(json);
168
- } catch (e) {
169
- console.log(e.toString());
170
- res.status(400).json({message: e.toString()})
171
- }
172
- }
173
-
174
- Api.modal = async (req, res) => {
175
- let body = req.body;
176
- let result = body.result;
177
- let others = result.others || {}
178
- let othersArr = Object.keys(others) || [];
179
- let json = {}
180
- if(othersArr.length) {
181
- console.log('masuk ke container')
182
- json = await Api.modalWithContainer(req,res);
183
- } else {
184
- json = await Api.modalClassic(req,res);
185
- }
186
- //console.log(JSON.stringify(json))
187
- res.json(json)
188
- };
189
-
190
- function containerObject(left,right,oneColumn,tabs = []) {
191
-
192
- /*
193
- For generator helper
194
- */
195
-
196
- try {
197
- let obj = {};
198
- let hasTabs = tabs.length;
199
- let leftObj={},rightObj={},oneColumnObj={};
200
- let leftsNew = [], rightsNew = [], oneColumnsNew = [];
201
-
202
- if(hasTabs) {
203
- tabs.forEach(function (tab, i) {
204
- let arrName = `arr${i}`;
205
- if (!leftObj.hasOwnProperty(arrName)) {
206
- leftObj[arrName] = [];
207
- }
208
- if (!rightObj.hasOwnProperty(arrName)) {
209
- rightObj[arrName] = [];
210
- }
211
- if (!oneColumnObj.hasOwnProperty(arrName)) {
212
- oneColumnObj[arrName] = [];
213
- }
214
- });
215
- }
216
-
217
- left.forEach(function (item) {
218
- if(typeof item == "string") {
219
- if(item.includes("___")) {
220
- let arr = item.split("___");
221
- leftObj[arr[1]].push(arr[0]);
222
- leftsNew.push(item)
223
- }
224
- } else {
225
- let keyname = "";
226
- for(let i = 0; i < item.length; i++) {
227
- let zitems = item[i];
228
- if(zitems.length) {
229
- if(zitems[0].includes("___")) {
230
- keyname = zitems[0].split("___")[1];
231
- }
232
- }
233
- }
234
- //console.log(keyname)
235
- if(keyname) {
236
- let myarr = [];
237
- item.forEach(function (myitem) {
238
- let me = []
239
- myitem.forEach(function (inem) {
240
- if(inem.includes("___")) {
241
- me.push(inem.split("___")[0]);
242
- } else {
243
- me.push(inem);
244
- }
245
- })
246
- myarr.push(me)
247
- });
248
- leftObj[keyname].push(myarr);
249
- leftsNew.push(item)
250
- } else {
251
- if(item.includes("___")) {
252
- let arr = item.split("___");
253
- leftObj[arr[1]].push(arr[0]);
254
- leftsNew.push(item)
255
- }
256
- }
257
- }
258
- })
259
-
260
- //right
261
- right.forEach(function (item) {
262
- if(typeof item == "string") {
263
- if(item.includes("___")) {
264
- let arr = item.split("___");
265
- rightObj[arr[1]].push(arr[0]);
266
- rightsNew.push(item)
267
- }
268
- } else {
269
- let keyname = "";
270
- for(let i = 0; i < item.length; i++) {
271
- let zitems = item[i];
272
- if(zitems.length) {
273
- if(zitems[0].includes("___")) {
274
- keyname = zitems[0].split("___")[1];
275
- }
276
- }
277
- }
278
- //console.log(keyname)
279
- if(keyname) {
280
- let myarr = [];
281
- item.forEach(function (myitem) {
282
- let me = []
283
- myitem.forEach(function (inem) {
284
- if(inem.includes("___")) {
285
- me.push(inem.split("___")[0]);
286
- } else {
287
- me.push(inem);
288
- }
289
- });
290
- myarr.push(me)
291
- });
292
- rightObj[keyname].push(myarr);
293
- rightsNew.push(item)
294
- } else {
295
- if(item.includes("___")) {
296
- let arr = item.split("___");
297
- rightObj[arr[1]].push(arr[0]);
298
- rightsNew.push(item)
299
- }
300
- }
301
- }
302
- })
303
-
304
- //oneColumn
305
- oneColumn.forEach(function (item) {
306
- if(typeof item == "string") {
307
- if(item.includes("___")) {
308
- let arr = item.split("___");
309
- oneColumnObj[arr[1]].push(arr[0]);
310
- oneColumnsNew.push(item)
311
- }
312
- } else {
313
- let keyname = "";
314
- for(let i = 0; i < item.length; i++) {
315
- let zitems = item[i];
316
- if(zitems.length) {
317
- if(zitems[0].includes("___")) {
318
- keyname = zitems[0].split("___")[1];
319
- }
320
- }
321
- }
322
- //console.log(keyname)
323
- if(keyname) {
324
- let myarr = [];
325
- item.forEach(function (myitem) {
326
- let me = []
327
- myitem.forEach(function (inem) {
328
- if(inem.includes("___")) {
329
- me.push(inem.split("___")[0]);
330
- } else {
331
- me.push(inem);
332
- }
333
- });
334
- myarr.push(me)
335
- });
336
- oneColumnObj[keyname].push(myarr);
337
- oneColumnsNew.push(item)
338
- } else {
339
- if(item.includes("___")) {
340
- let arr = item.split("___");
341
- oneColumnObj[arr[1]].push(arr[0]);
342
- oneColumnsNew.push(item)
343
- }
344
- }
345
- }
346
- });
347
-
348
- //caption left or right
349
- let datasLeft = left.filter(x => !leftsNew.includes(x));
350
- let datasRight = right.filter(x => !rightsNew.includes(x));
351
- let datasOneColumn = oneColumn.filter(x => !oneColumnsNew.includes(x));
352
-
353
- let myObject = {
354
- left : datasLeft || [],
355
- right : datasRight || [],
356
- oneColumn : datasOneColumn || [],
357
- tabLeft : leftObj || [],
358
- tabRight : rightObj|| [],
359
- tabOneColumn : oneColumnObj || [],
360
- };
361
-
362
- return myObject;
363
-
364
- } catch (e) {
365
- console.log(e)
366
- return {};
367
- }
368
- }
369
-
370
- Api.modalWithContainer = async (body) => {
371
- try {
372
- //let body = req.body;
373
- /* console.log(body)
374
- console.log("Container....")*/
375
- let table = body.table || "";
376
- let html = '';
377
- let fields = [];
378
- let datas = {table: '', tabs: [], labels: {}, details: {}, left: [], right: []};
379
- let count = 1;
380
- let tabView = '';
381
- let tabBox = '';
382
- let tabUl = '';
383
- let tabContent = '';
384
- let left = '', right = '', oneColumn = '';
385
- let hasTab = false;
386
- let properties = {};
387
- let rowsFields;
388
- let result = body.result;
389
- const others = result.others || {};
390
- let leftData = others.LEFT || [];
391
- //console.log(leftData);
392
- let rightData = others.RIGHT || [];
393
- let oneColumnData = others.ONE_COLUMN || [];
394
- let leftsNew = [], rightsNew = [], oneColumnsNew = [];
395
- let ALL_FIELDS = {};
396
- if (table) {
397
- rowsFields = body.rowsFields;
398
- //console.log('result : ' + JSON.stringify(result))
399
- if (result.id) {
400
- datas = {
401
- details: result.details || {},
402
- labels: result.labels || {},
403
- tabs: result.tabs || [],
404
- left: result.left || [],
405
- right: result.right || [],
406
- oneColumn: result.one_column || [],
407
- sorting: result.sorting || [],
408
- property: result.properties || {}
409
- };
410
- let details = datas.details;
411
- properties = datas.property;
412
- let tabs = datas.tabs;
413
- ALL_FIELDS = containerObject(leftData,rightData,oneColumnData,tabs);
414
- console.log(ALL_FIELDS);
415
- if (tabs.length) {
416
- hasTab = true;
417
- }
418
- if (hasTab) {
419
- let tabLeft = [], tabRight = [], tabOneColum = [];
420
-
421
- tabUl += '<ul class="nav nav-tabs" id="myTab" role="tablist">';
422
- tabContent += '<div class="tab-content" id="myTabContent">';
423
- tabs.forEach(function (item, i) {
424
- let navlink = i == 0 ? ' active' : '';
425
- let ariaselected = i == 0 ? "true" : "false";
426
- let showActive = i == 0 ? ' show active ' : '';
427
- let n = i + 1;
428
- let arrName = 'arr' + i;
429
- let dynamicsLeft = '', dynamicsRight = '', dynamicsOneColumn = '';
430
- tabLeft = ALL_FIELDS.tabLeft[arrName];
431
- tabRight = ALL_FIELDS.tabRight[arrName];
432
- tabOneColum = ALL_FIELDS.tabOneColumn[arrName];
433
- if (tabLeft.length) {
434
- if(i==0) {
435
- console.log(JSON.stringify(tabLeft))
436
- }
437
- tabLeft.map((o) => {
438
- dynamicsLeft += makeItemsOl(o,"LEFT",i,datas);
439
- });
440
- }
441
-
442
- if (tabRight.length) {
443
- tabRight.map((o) => {
444
- dynamicsRight += makeItemsOl(o,"RIGHT",i,datas);
445
- });
446
- }
447
-
448
- if (tabOneColum.length) {
449
- tabOneColum.map((o) => {
450
- dynamicsOneColumn += makeItemsOl(o,"ONE_COLUMN",i,datas);
451
- });
452
- }
453
-
454
-
455
- tabView += `<li class="item" draggable="true"><div class='divtabs'>${n}. <span class="tabname"> ${item}</span><input type='hidden' name='tabs[]' value='${item}' /> <button type='button' class='btn btn-sm btn-info edittab' data-toggle="modal" data-target="#modal_tab" data-name="${item}" data-id="${i}" > <i class='fas fa-edit'></i> </button> <button type='button' onclick='$(this).parent().remove();' class='btn btn-sm btn-danger trashtab'><i class='fas fa-trash'></i> </button></div></li>`;
456
- tabUl += `<li class="nav-item">
457
- <a class="nav-link ${navlink}" id="tabid${i}" data-toggle="tab" href="#tabgo${i}" role="tab" aria-controls="tabgo${i}" aria-selected="${ariaselected}">${item}</a>
458
- </li>`;
459
-
460
- tabContent += `<div class="tab-pane fade ${showActive}" id="tabgo${i}" role="tabpanel" aria-labelledby="tabtabgo${i}">
461
- <div class="container">
462
- <div class="row">
463
- <div class="col-md-6"><ol class="mydragable divbox" data-name="LEFT" id="arr${i}">${dynamicsLeft}</ol></div>
464
- <div class="col-md-6"><ol class="mydragable divbox" data-name="RIGHT" id="arr${i}">${dynamicsRight}</ol></div>
465
- </div>
466
- <div class="row">
467
- <div class="col-md-12"><ol class="mydragable divbox" data-name="ONE_COLUMN" id="arr${i}">${dynamicsOneColumn}</ol></div>
468
- </div>
469
- </div>
470
- </div>`;
471
- });
472
- //end tabs
473
- tabUl += '</ul>';
474
- tabContent += '</div>';
475
- count = tabs.length + 1;
476
- }
477
- }
478
- }
479
-
480
-
481
- //caption left or right
482
- let datasLeft = ALL_FIELDS.left;
483
- let datasRight = ALL_FIELDS.right;
484
- let datasOneColumn = ALL_FIELDS.oneColumn;
485
- //console.log(JSON.stringify(ALL_FIELDS));
486
-
487
- if (datasLeft.length) {
488
- datasLeft.forEach(function (item) {
489
- if(!Util.in_array(item,leftsNew)) {
490
- left += makeItemsOl(item,"LEFT","",datas);
491
- }
492
- });
493
- }
494
- if (datasRight.length) {
495
- datasRight.forEach(function (item) {
496
- if(!Util.in_array(item,rightsNew)) {
497
- right += makeItemsOl(item,"RIGHT","",datas);
498
- }
499
- });
500
- }
501
- if (datasOneColumn.length) {
502
- datasOneColumn.forEach(function (item) {
503
- //console.log(`item ${item}`);
504
- if(!Util.in_array(item,oneColumnsNew)) {
505
- oneColumn += makeItemsOl(item,"ONE_COLUMN","",datas);
506
- }
507
- });
508
- }
509
-
510
- datas.sorting.forEach(function (item, index) {
511
- if (item == 1) {
512
- html += columnOne(oneColumn);
513
- } else {
514
- html += `<div class="row sortable"><i class="fa fa-arrows icon-floats"></i>${columnLR(left, "LEFT")} ${columnLR(right, "RIGHT")}</div>`;
515
- }
516
- });
517
- datas.others = others;
518
- let json = {}
519
- json.html = html;
520
- json.datas = datas;
521
- json.tabview = tabView;
522
- json.count = count;
523
- json.tabBox = tabUl + tabContent;
524
-
525
- //console.log(JSON.stringify(json))
526
- //res.json(json);
527
- return json;
528
- } catch (e) {
529
- console.log(e)
530
- //res.status(400).json({message: e.toString()})
531
- return Util.flashError(e.toString());
532
- }
533
- };
534
-
535
- Api.modalClassic = async (body) => {
536
- try {
537
- //const body = req.body;
538
- //console.log(body)
539
- const table = body.table || "";
540
- let html = '';
541
- var datas = {table: '', tabs: [], labels: {}, details: {}, left: [], right: []};
542
- let count = 1;
543
- let tabView = '';
544
- let tabUl = '';
545
- let tabContent = '';
546
- let left = '', right = '', oneColumn = '';
547
- let hasTab = false;
548
- let properties = {}
549
- let rowsFields;
550
- if (table) {
551
- let result = body.result;
552
- rowsFields = body.rowsFields;
553
- //console.log('result : ' + JSON.stringify(result))
554
- if (result.id) {
555
- datas = {
556
- details: result.details || {},
557
- labels: result.labels || {},
558
- tabs: result.tabs || [],
559
- left: result.left || [],
560
- right: result.right || [],
561
- oneColumn: result.one_column || [],
562
- sorting: result.sorting || [],
563
- property: result.properties || {}
564
- };
565
- let details = datas.details;
566
- properties = datas.property;
567
- let tabs = datas.tabs;
568
- if (tabs.length) {
569
- hasTab = true;
570
- }
571
- if (hasTab) {
572
- tabUl += '<ul class="nav nav-tabs" id="myTab" role="tablist">';
573
- tabContent += '<div class="tab-content" id="myTabContent">';
574
- tabs.forEach(function (item, i) {
575
- const navlink = i == 0 ? ' active' : '';
576
- const ariaselected = i == 0 ? "true" : "false";
577
- const showActive = i == 0 ? ' show active ' : '';
578
- const n = i + 1;
579
- const arrName = 'arr' + i;
580
- let dynamicsLeft = '', dynamicsRight = '', dynamicsOneColumn = '';
581
- let tabLeft = [], tabRight = [], tabOneColum = [];
582
- if (datas.left.length) {
583
- datas.left.forEach(function (o) {
584
- if (typeof o == "object") {
585
- for (var key in o) {
586
- if (key == arrName) {
587
- tabLeft = o[key];
588
- }
589
- }
590
- }
591
- });
592
- }
593
- if (datas.right.length) {
594
- datas.right.forEach(function (o) {
595
- if (typeof o == "object") {
596
- for (var key in o) {
597
- if (key == arrName) {
598
- tabRight = o[key];
599
- }
600
- }
601
- }
602
- });
603
- }
604
- if (datas.oneColumn.length) {
605
- datas.oneColumn.forEach(function (o) {
606
- if (typeof o == "object") {
607
- for (var key in o) {
608
- if (key == arrName) {
609
- tabOneColum = o[key];
610
- }
611
- }
612
- }
613
- });
614
- }
615
-
616
- /* console.log(arrName);
617
- console.log("tableft");
618
- console.log(JSON.stringify(tabLeft));
619
- console.log("tableft end");
620
- console.log("tabright");
621
- console.log(JSON.stringify(tabRight));
622
- console.log("tabright");
623
- console.log("tabonecolumn");
624
- console.log(JSON.stringify(tabOneColum));
625
- console.log("tabonecolumn end");*/
626
-
627
-
628
- if (tabLeft.length) {
629
- tabLeft.map((o) => {
630
- if(datas.property[o] && datas.property[o].hasOwnProperty("type") ) {
631
- dynamicsLeft += dragable_with_icon(o, datas.labels[o], i, "LEFT", datas.property[o].type);
632
- }
633
- });
634
- }
635
- if (tabRight.length) {
636
- tabRight.map((o) => {
637
- if(datas.property[o] && datas.property[o].hasOwnProperty("type") ) {
638
- dynamicsRight += dragable_with_icon(o, datas.labels[o], i, "RIGHT", datas.property[o].type);
639
- }
640
- });
641
- }
642
-
643
- if (tabOneColum.length) {
644
- tabOneColum.map((o) => {
645
- if(datas.property[o] && datas.property[o].hasOwnProperty("type") ) {
646
- dynamicsOneColumn += dragable_with_icon(o, datas.labels[o], i, "ONE_COLUMN", datas.property[o].type);
647
- }
648
- });
649
- }
650
-
651
- tabView += `<li class="item" draggable="true"><div class='divtabs'>${n}. <span class="tabname"> ${item}</span><input type='hidden' name='tabs[]' value='${item}' /> <button type='button' class='btn btn-sm btn-info edittab' data-toggle="modal" data-target="#modal_tab" data-name="${item}" data-id="${i}" > <i class='fas fa-edit'></i> </button> <button type='button' onclick='$(this).parent().remove();' class='btn btn-sm btn-danger trashtab'><i class='fas fa-trash'></i> </button></div></li>`;
652
- tabUl += `<li class="nav-item">
653
- <a class="nav-link ${navlink}" id="tabid${i}" data-toggle="tab" href="#tabgo${i}" role="tab" aria-controls="tabgo${i}" aria-selected="${ariaselected}">${item}</a>
654
- </li>`;
655
-
656
- tabContent += `<div class="tab-pane fade ${showActive}" id="tabgo${i}" role="tabpanel" aria-labelledby="tabtabgo${i}">
657
- <div class="container">
658
- <div class="row">
659
- <div class="col-md-6"><ol class="mydragable divbox" data-name="LEFT" id="arr${i}">${dynamicsLeft}</ol></div>
660
- <div class="col-md-6"><ol class="mydragable divbox" data-name="RIGHT" id="arr${i}">${dynamicsRight}</ol></div>
661
- </div>
662
- <div class="row">
663
- <div class="col-md-12"><ol class="mydragable divbox" data-name="ONE_COLUMN" id="arr${i}">${dynamicsOneColumn}</ol></div>
664
- </div>
665
- </div>
666
- </div>`;
667
- });
668
- //end tabs
669
- tabUl += '</ul>';
670
- tabContent += '</div>';
671
- count = tabs.length + 1;
672
- }
673
- }
674
- }
675
-
676
- /* var rows = [];
677
- if (Util.isEmptyObject(datas.details)) {
678
- rows = await fieldsTable(table, rowsFields);
679
- } else {
680
- var d = datas.details;
681
- var notabs = d.hasOwnProperty('notabs') ? d.notabs : [];
682
- for (var i = 0; i < notabs.length; i++) {
683
- rows.push({name: notabs[i], label: datas.labels[notabs[i]]})
684
- }
685
- }*/
686
-
687
- //caption left or right
688
- if (datas.left.length) {
689
- datas.left.forEach(function (item) {
690
- if (properties.hasOwnProperty(item)) {
691
- left += dragable_with_icon(item, datas.labels[item], "", "LEFT", datas.property[item].type);
692
- }
693
- });
694
- }
695
- if (datas.right.length) {
696
- datas.right.forEach(function (item) {
697
- if (properties.hasOwnProperty(item)) {
698
- right += dragable_with_icon(item, datas.labels[item], "", "RIGHT", datas.property[item].type);
699
- }
700
- });
701
- }
702
- if (datas.oneColumn.length) {
703
- datas.oneColumn.forEach(function (item) {
704
- if (properties.hasOwnProperty(item)) {
705
- oneColumn += dragable_with_icon(item, datas.labels[item], "", "ONE_COLUMN", datas.property[item].type);
706
- }
707
- });
708
- }
709
- datas.sorting.forEach(function (item, index) {
710
- if (item == 1) {
711
- html += columnOne(oneColumn);
712
- } else {
713
- html += `<div class="row sortable"><i class="fa fa-arrows icon-floats"></i>${columnLR(left, "LEFT")} ${columnLR(right, "RIGHT")}</div>`;
714
- }
715
- });
716
- let json = {}
717
- json.html = html;
718
- json.datas = datas;
719
- json.tabview = tabView;
720
- json.count = count;
721
- json.tabBox = tabUl + tabContent;
722
-
723
- return json;
724
- //res.json(json);
725
- } catch (e) {
726
- console.log(e)
727
- //res.status(400).json({message: e.toString()})
728
- //json = {}
729
- return {}
730
- }
731
- }
732
-
733
- const makeItemsOl = (o,columnName,tabName, datas) => {
734
- let html = '';
735
- if(typeof o == "string") {
736
- if (datas.property[o] && datas.property[o].hasOwnProperty("type")) {
737
- html += dragable_with_icon(o, datas.labels[o], tabName, columnName, datas.property[o].type);
738
- }
739
- } else {
740
- let hasValues = o.some( function (a) { return a.length });
741
- if(hasValues) {
742
- let columncount = o.length;
743
- let col_md = bootstrapColumn(columncount);
744
- let myhtml = `<li class="container-nav"> <i class="fa fa-arrows icon-floating"></i><div class="row mt-1 mb-1">`;
745
- for(let i =1; i <= columncount; i++) {
746
- let n_i = i -1;
747
- myhtml += `<div class="${col_md}" style="background-color: rgba(0,0,0,.03)"><ol class="divboxlittle container-box"><li><i data-column="${columnName}" class="fa fa-plus-circle fa-2x add-container text-success"></i> </li> `;
748
- if(o[n_i].length) {
749
- o[n_i].forEach(function (myitem) {
750
- if(tabName) {
751
- myitem = myitem.replace('___'+tabName,'')
752
- }
753
- if (datas.property[myitem] && datas.property[myitem].hasOwnProperty("type")) {
754
- myhtml += dragable_with_icon(myitem, datas.labels[myitem], tabName, columnName, datas.property[myitem].type);
755
- }
756
- })
757
- }
758
- myhtml += `</ol> </div>`;
759
- }
760
- myhtml += `</div></li>`;
761
- html += myhtml;
762
- }
763
- }
764
- return html;
765
- }
766
-
767
- const bootstrapColumn = (count) => {
768
- return `col-md-${(12 / count)}`
769
- }
770
-
771
- Api.create = (body) => {
772
- return createTable(body);
773
- }
774
-
775
- Api.properties = (body) => {
776
- try {
777
- //const body = req.body;
778
- //console.log(req.body);
779
- //console.log("ok")
780
- //return;
781
- const details = body.details || [];
782
- const rows = body.rows;
783
- var json = Util.jsonSuccess("Success to update");
784
- if (details.length == 0) {
785
- json = Util.flashError("Please add some data");
786
- return json;
787
- }
788
- const hardcode_grid = body.hardcode_grid || "";
789
-
790
- let left = [], right = [], lefts = [], rights = [], oneColumn = [], oneColumns = [], tabLeft = {},tabRight = {};
791
- const obj = {}
792
- obj.notabs = []
793
- let labels = {};
794
- let hasTab = false;
795
- let tabs = {};
796
-
797
- //check if table is exist or not
798
- const checks = body.checks;
799
- json.create_table = {};
800
- if (!checks) {
801
- const create = createTable(rows[0], true);
802
- json.create_table.sql = create.datas.sql;
803
- json.create_table.post = create.datas.post;
804
- }
805
- labels = rows[0].labels || {};
806
- tabs = !rows[0].tabs ? [] : rows[0].tabs;
807
- if (tabs.length) {
808
- hasTab = true;
809
- tabs.forEach(function (item, i) {
810
- obj['arr' + i] = [];
811
- tabLeft['arr' + i] = [];
812
- tabRight['arr' + i] = [];
813
- });
814
- }
815
- details.forEach(function (item, index) {
816
- let name = item.name, value = item.value;
817
- if (name.includes("___")) {
818
- const explode = name.split("___");
819
- obj[explode[1]].push(explode[0])
820
- labels[explode[0]] = value;
821
- } else {
822
- if (name == 'LEFT') {
823
- left.push(value);
824
- } else if (name == 'RIGHT') {
825
- right.push(value);
826
- } else if (name == 'ONE_COLUMN') {
827
- oneColumn.push(value);
828
- } else {
829
- obj['notabs'].push(name);
830
- labels[name] = value;
831
- }
832
- }
833
- });
834
-
835
- const sorting = details[1].name == "ONE_COLUMN" ? [1, 2] : [2, 1];
836
- for (let key in obj) {
837
- if (key == "notabs") {
838
- lefts = obj[key].filter((item) => left.includes(item));
839
- rights = obj[key].filter((item) => right.includes(item));
840
- oneColumns = obj[key].filter((item) => oneColumn.includes(item));
841
- } else {
842
- let myobj = {}
843
- myobj[key] = obj[key].filter((item) => left.includes(item));
844
- lefts.push(myobj);
845
-
846
- myobj = {}
847
- myobj[key] = obj[key].filter((item) => right.includes(item));
848
- rights.push(myobj);
849
-
850
- myobj = {}
851
- myobj[key] = obj[key].filter((item) => oneColumn.includes(item));
852
- oneColumns.push(myobj);
853
- }
854
- }
855
-
856
- const post = {}
857
- post.labels = JSON.stringify(labels);
858
- post.details = JSON.stringify(obj);
859
- post.left = JSON.stringify(lefts);
860
- post.right = JSON.stringify(rights);
861
- post.one_column = JSON.stringify(oneColumns);
862
- post.sorting = JSON.stringify(sorting);
863
- post.hardcode_grid = hardcode_grid;
864
- //files
865
-
866
- //get contents or get it from views zgenerator/views
867
- post.router = body.router || fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", 'utf-8');
868
- post.index_ejs = body.index_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/index.ejs", 'utf-8');
869
- post.indexcss_ejs = body.indexcss_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexcss.ejs", 'utf-8');
870
- post.indexjs_ejs = body.indexjs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexjs.ejs", 'utf-8');
871
- post.form_ejs = body.form_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/_form.ejs", 'utf-8');
872
- post.create_ejs = body.create_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/create.ejs", 'utf-8');
873
- post.createjs_ejs = body.createjs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/createjs.ejs", 'utf-8');
874
- post.update_ejs = body.update_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/update.ejs", 'utf-8');
875
- post.updatejs_ejs = body.updatejs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/updatejs.ejs", 'utf-8');
876
- post.import_ejs = body.import_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/import.ejs", 'utf-8');
877
- post.importjs_ejs = body.importjs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/importjs.ejs", 'utf-8');
878
- post.view_ejs = body.view_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/view.ejs", 'utf-8');
879
-
880
- if (post.indexjs_ejs.indexOf(`</script>`) > -1) {
881
- post.indexjs_ejs = Util.replaceAll(post.indexjs_ejs, `</script>`, `</script>`);
882
- }
883
- if (post.createjs_ejs.indexOf(`</script>`) > -1) {
884
- post.createjs_ejs = Util.replaceAll(post.createjs_ejs, `</script>`, `</script>`);
885
- }
886
- if (post.updatejs_ejs.indexOf(`</script>`) > -1) {
887
- post.updatejs_ejs = Util.replaceAll(post.updatejs_ejs, `</script>`, `</script>`);
888
- }
889
- if (post.importjs_ejs.indexOf(`</script>`) > -1) {
890
- post.importjs_ejs = Util.replaceAll(post.importjs_ejs, `</script>`, `</script>`);
891
- }
892
- if (post.view_ejs.indexOf(`</script>`) > -1) {
893
- post.view_ejs = Util.replaceAll(post.view_ejs, `</script>`, `</script>`);
894
- }
895
- json.updateFields = {
896
- post: post,
897
- id: rows[0].id
898
- }
899
- return json;
900
- } catch (e) {
901
- console.log(e)
902
- //res.status(400).json({message: e.toString()})
903
- return Util.flashError(e.toString());
904
- }
905
- };
906
-
907
- Api.generate = async (body) => {
908
- try {
909
- console.log('generate');
910
- const json = Util.jsonSuccess("Success");
911
- const result = body.result;
912
- const columns = body.columns;
913
- const constraintList = body.constraintList;
914
- const files = {};
915
- const model = await generatorApp.CREATE_MODEL_API(columns, constraintList, result);
916
- const MYMODEL = model.modelObj;
917
- files.model = model;
918
- files.route = generatorApp.CREATE_ROUTER_API(MYMODEL, result);
919
- files.views = generatorApp.CREATE_VIEWS_API(MYMODEL, result);
920
- json.files = files;
921
- return json;
922
- } catch (e) {
923
- console.log(e)
924
- return Util.flashError(e.toString());
925
- }
926
- };
927
-
928
- Api.create_field = (body) => {
929
- let json = Util.jsonSuccess("Successfully create field");
930
- console.log(body);
931
- //return false;
932
- try {
933
- let table = body.table || "", position = body.position || "LEFT", label = body.name || "",
934
- type = body.type || "", name = Util.toName(label) || "";
935
- table = table.trim(), label = label.trim(), type = type.trim(), name = name.trim();
936
-
937
- let others = body.others ? JSON.parse(body.others) : {};
938
- let zFields = body.zFields || [];
939
- let details = zFields[0].details;
940
- let labels = zFields[0].labels || {};
941
- let notabs = details.notabs;
942
- let left = zFields[0].left || [];
943
- let right = zFields[0].right || [];
944
- let oneColumn = zFields[0].one_column || [];
945
-
946
- let all = [...left, ...right, ...oneColumn];
947
- all.push('lock');
948
- let properties = zFields[0].properties || {};
949
-
950
- //add name with suffix _id if relate to other table
951
- const arr = ['relation', 'typeahead'];
952
- if (Util.in_array(type, arr)) {
953
- name = name + "_id";
954
- }
955
- if (label.length < 2) {
956
- return Util.flashError("Field Name is not complete");
957
- }
958
- if (Util.in_array(name, all)) {
959
- return Util.flashError("Name exist", "");
960
- }
961
- //set position if table go to one column
962
- if (type == "table") {
963
- oneColumn.push(name);
964
- } else {
965
- if (position == "LEFT") {
966
- left.push(name);
967
- } else if (position == "RIGHT") {
968
- right.push(name)
969
- } else {
970
- oneColumn.push(name);
971
- }
972
- }
973
-
974
- /* console.log(JSON.stringify(left))
975
- console.log(JSON.stringify(right))
976
- console.log(JSON.stringify(oneColumn))
977
- console.log(position);*/
978
-
979
- let othersLength = Object.keys(others).length;
980
- if(othersLength) {
981
- if (position == "LEFT") {
982
- others.LEFT.push(name);
983
- } else if (position == "RIGHT") {
984
- others.RIGHT.push(name);
985
- } else {
986
- others.ONE_COLUMN.push(name);
987
- }
988
- }
989
- //return false;
990
-
991
- notabs.push(name);
992
- let defaultValues = Model[type].defaultValues;
993
- if (defaultValues.hasOwnProperty("tabindex")) {
994
- defaultValues.tabindex = Object.keys(properties).length + 1;
995
- }
996
- if (defaultValues.hasOwnProperty("required")) {
997
- defaultValues.hidden = false;
998
- }
999
- properties[name] = {
1000
- label: label,
1001
- type: type,
1002
- values: defaultValues
1003
- }
1004
- labels[name] = label;
1005
-
1006
- //for relation we need to override values
1007
- const relations = ["relation", "dropdown_multi", "table", "typeahead","dragdrop"];
1008
- if (Util.in_array(type, relations)) {
1009
- var propertyValue = properties[name].values || {}
1010
- var relationtable = body.relationtable || "";
1011
- var relationfield = body.relationfield || "";
1012
- var relationfields = body.relationfields || "";
1013
- var relationconcat = body.relationconcat || "";
1014
- if (!relationtable.length) {
1015
- return Util.flashError("Table Name empty!");
1016
- }
1017
- if (type != "table") {
1018
- if (!relationfield.length) {
1019
- return Util.flashError("Label relation empty!");
1020
- }
1021
- }
1022
- propertyValue["table"] = relationtable;
1023
- if (type != "table") {
1024
- propertyValue["name"] = relationfield;
1025
- if (relationconcat == "CONCAT()") {
1026
- propertyValue["concat"] = `CONCAT(${relationfield})`;
1027
- } else {
1028
- propertyValue["concat"] = relationconcat;
1029
- }
1030
- }
1031
- //additional dropdown chain for first time
1032
- //TODO simple code
1033
- if (relationfields) {
1034
- propertyValue["field"] = relationfields;
1035
- }
1036
- properties[name].values = propertyValue;
1037
- }
1038
- json.post = {
1039
- left: JSON.stringify(left),
1040
- right: JSON.stringify(right),
1041
- one_column: JSON.stringify(oneColumn),
1042
- properties: JSON.stringify(properties),
1043
- details: JSON.stringify({notabs: notabs}),
1044
- labels: JSON.stringify(labels),
1045
- others : JSON.stringify(others)
1046
- };
1047
- //await connection.update({table: 'zfields', where: {table: table}, data: post})
1048
- } catch (err) {
1049
- console.log(err.toString())
1050
- json = Util.flashError(err.toString())
1051
- }
1052
- return json;
1053
- }
1054
-
1055
-
1056
- Api.modal_settings = (body) => {
1057
- try {
1058
- const json = Util.jsonSuccess("Success")
1059
- const name = body.name;
1060
- //console.log(body);
1061
- let html = "";
1062
- let result = body.result;
1063
- let properties = result.properties ? result.properties : {};
1064
- let property = !properties[name] ? {} : properties[name];
1065
- let type = property.type;
1066
- //html += `<input type="hidden" value="${req.csrfToken()}" >`;
1067
- html += Model.buildWidget(name, type, property.values || {});
1068
- json.html = html;
1069
- return json;
1070
- } catch (e) {
1071
- console.log(e)
1072
- return Util.flashError(e.toString());
1073
- }
1074
- }
1075
-
1076
-
1077
- Api.reset = (req,res)=> {
1078
- res.json(Api.datas)
1079
- }
1080
-
1081
- Api.datas = {
1082
- router : fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", 'utf-8'),
1083
- index_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/index.ejs", 'utf-8'),
1084
- indexcss_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexcss.ejs", 'utf-8'),
1085
- indexjs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexjs.ejs", 'utf-8'),
1086
- form_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/_form.ejs", 'utf-8'),
1087
- create_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/create.ejs", 'utf-8'),
1088
- createjs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/createjs.ejs", 'utf-8'),
1089
- update_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/update.ejs", 'utf-8'),
1090
- updatejs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/updatejs.ejs", 'utf-8'),
1091
- import_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/import.ejs", 'utf-8'),
1092
- importjs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/importjs.ejs", 'utf-8'),
1093
- view_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/view.ejs", 'utf-8'),
1094
- hardcode_grid : Model.hardcodeGrid
1095
- }
1096
-
1097
- const replaceScript = (string) => {
1098
- if (!string) {
1099
- return "";
1100
- }
1101
- let html = string;
1102
- if (string.indexOf("script") > -1) {
1103
- html = Util.replaceAll(string, `</script>`, `</script>`)
1104
- }
1105
- return html;
1106
- }
1107
-
1108
- Api.createTable =(data) => {
1109
- return createTable(data);
1110
- };
1111
-
1112
- const createTable = (postData, isIgnore) => {
1113
- isIgnore = isIgnore || false;
1114
- let json = Util.jsonSuccess("Successfully create module");
1115
- let labels = {
1116
- id: "Id",
1117
- company_id: "Company",
1118
- lock:"Lock/Unlock",
1119
- approval_status:"Approval Status",
1120
- approval_history:"Approval History",
1121
- created_at: "Created At",
1122
- updated_at: "Updated At",
1123
- created_by: "Created By",
1124
- updated_by: "Updated By"
1125
- };
1126
-
1127
- let route = Util.toName(postData.route);
1128
- let name = postData.name;
1129
- name = name.trim();
1130
- let forbidden = ['group','copy','command','from','select','distinct','where','year','month','day','ignore','previous','next',
1131
- 'start','end','set','setof','show','size','row','rows','return','order'];
1132
- if(forbidden.includes(name)) {
1133
- json = Util.flashError("Module Name is Forbidden, try using other module name..", "route");
1134
- return json;
1135
- }
1136
- if (!name.length) {
1137
- json = Util.flashError("Module Name Empty", "route");
1138
- return json;
1139
- }
1140
- if (Util.in_array(name, configGenerator.notGenerateTable)) {
1141
- json = Util.flashError("Module Name Exist", "route");
1142
- return json;
1143
- }
1144
- if (!route.length) {
1145
- json = Util.flashError("Route Empty", "route");
1146
- return json;
1147
- }
1148
- try {
1149
- const datas = Api.datas;
1150
- let post = {
1151
- table: Util.toName(name),
1152
- name: name,
1153
- route: route,
1154
- labels: JSON.stringify(labels),
1155
- left: "[]",
1156
- right: "[]",
1157
- sorting: "[2,1]",
1158
- details: JSON.stringify({
1159
- notabs: []
1160
- }),
1161
- hardcode_grid: Model.hardcodeGrid,
1162
- company_id : 1,
1163
- }
1164
- for(let key in datas) {
1165
- post[key] = datas[key];
1166
- }
1167
- //console.log(datas.router);
1168
-
1169
- let sql = `
1170
- CREATE TABLE ${post.table} (
1171
- id BIGSERIAL PRIMARY KEY,
1172
- company_id BIGINT NOT NULL,
1173
- lock smallint default 0,
1174
- approval_status smallint DEFAULT 1,
1175
- approval_history jsonb[] DEFAULT NULL,
1176
- updated_by BIGINT DEFAULT NULL,
1177
- created_by BIGINT DEFAULT NULL,
1178
- created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
1179
- updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
1180
- CONSTRAINT fk_${post.table}_company_id FOREIGN KEY (company_id) REFERENCES zcompany (id)
1181
-
1182
- );`;
1183
- console.log(sql)
1184
- //await connection.query(sql);
1185
- json.post = post;
1186
- json.sql = sql;
1187
- } catch (e) {
1188
- json = Util.flashError(e.toString(), "")
1189
- }
1190
- //console.log(JSON.stringify(json))
1191
- return json
1192
- }
1193
-
1194
- const columnLR = (items, dataName) => {
1195
- return `<div class="col-md-6"><ol class="mydragable divboxlittle" data-name="${dataName}">${items}</ol></div>`;
1196
- }
1197
-
1198
- const columnOne = (items) => {
1199
- return `<div class="row sortable"><i class="fa fa-arrows icon-float"></i><div class="col-md-12"><ol class="mydragable divboxlittle" data-name="ONE_COLUMN">${items}</ol></div></div>`;
1200
- }
1201
-
1202
- /*
1203
- const fieldsTable = (rowsFields) => {
1204
- let rows = generateFields(rowsFields);
1205
- let arr = [];
1206
- if (rows.length > 0) {
1207
- for (let i = 0; i < rows.length; i++) {
1208
- if (!Util.in_array(rows[i].Field, config.generator.notRenderField))
1209
- arr.push({name: rows[i].Field, label: Util.fieldToName(rows[i].Field)});
1210
- }
1211
- }
1212
- return arr;
1213
- }*/
1214
-
1215
- const generateFields = async (rowsFields) => {
1216
- let rows = []
1217
- //let sql = connection.describeTable(table);
1218
- //let rowsFields = await connection.query(sql);
1219
- for (let k = 0; k < rowsFields.length; k++) {
1220
- let obj = rowsFields[k];
1221
- let Type = obj.Type;
1222
- if (Type.indexOf("character varying") > -1) {
1223
- obj.Type = Util.replaceAll(Type, "character varying", "varchar");
1224
- } else if (Type.indexOf("integer()") > -1) {
1225
- obj.Type = "int(11)";
1226
- } else if (Type.indexOf("smallint()") > -1) {
1227
- obj.Type = "int(4)";
1228
- } else if (Type.indexOf("()")) {
1229
- obj.Type = Util.replaceAll(Type, "()", "");
1230
- }
1231
-
1232
- rows.push(obj)
1233
- }
1234
- return rows;
1235
- }
1236
-
1237
- //drop down chains
1238
- /*
1239
- const chainings = (results, rows, arr) => {
1240
- //var results = await connection.query(connection.showFields(table));
1241
- var obj = {};
1242
- var tableObj = {}
1243
- var ret = {}
1244
- for (var i = 0; i < results.length; i++) {
1245
- var result = results[i];
1246
- if (Util.in_array(result.COLUMN_NAME, arr)) {
1247
- obj[result.COLUMN_NAME] = {
1248
- table: result.REFERENCED_TABLE_NAME
1249
- }
1250
- tableObj[result.REFERENCED_TABLE_NAME] = result.COLUMN_NAME;
1251
- }
1252
- }
1253
-
1254
- for (var key in obj) {
1255
- //var rows = await connection.query(connection.showFields(obj[key].table));
1256
- rows.forEach(function (row) {
1257
- for (var q in obj) {
1258
- console.log(row.REFERENCED_TABLE_NAME + ' == ' + obj[q].table)
1259
- if (row.REFERENCED_TABLE_NAME == obj[q].table) {
1260
- if (!obj[q].chains) {
1261
- obj[q].chains = {};
1262
- }
1263
- obj[q].chains[key] = {
1264
- column: row.COLUMN_NAME,
1265
- table: row.TABLE_NAME
1266
- }
1267
- }
1268
- }
1269
- });
1270
- }
1271
- return obj;
1272
- }
1273
- */
1274
-
1275
- const zFieldsProperty = async (table, fields) => {
1276
- let data = {}
1277
- data.table = table;
1278
- data.name = Util.fieldToName(table);
1279
- data.route = table;
1280
- let label = {}
1281
- let details = [], lefts = [], rights = [];
1282
- let nots = Util.nots;
1283
- //let fields = await connection.query(connection.showFullFields(table));
1284
- fields.forEach(function (item) {
1285
- label[item.Field] = Util.fieldToName(item.Field);
1286
- });
1287
- data.labels = JSON.stringify(label);
1288
- let num = 1;
1289
- fields.forEach(function (item) {
1290
- if (!Util.in_array(item.Field, nots)) {
1291
- details.push(item.Field);
1292
- if (num % 2 == 0) {
1293
- rights.push(item.Field)
1294
- } else {
1295
- lefts.push(item.Field)
1296
- }
1297
- num++;
1298
- }
1299
- });
1300
- let notabs = {
1301
- notabs: details
1302
- }
1303
-
1304
- data.details = JSON.stringify(notabs);
1305
- data.left = JSON.stringify(lefts);
1306
- data.right = JSON.stringify(rights);
1307
- return data;
1308
- };
1309
-
1310
-
1311
- const dragable_with_icon = (name, label, tab, leftright, type = "") => {
1312
- let myname = tab === "" ? name : name + "___arr" + tab;
1313
- leftright = leftright || "LEFT";
1314
- var typeName = type ? Model.keys[type] : "";
1315
- return `<li>
1316
- <div class="input-group">
1317
- <div class="input-group-prepend">
1318
- <span class="input-group-text modal_setting" data-type="${typeName}" data-name="${name}" data-label="${label}" ><i class="fa fa-cog text-info modal_setting" data-type="${typeName}" data-name="${name}" data-label="${label}"></i> </span>
1319
- <span class="input-group-text can-copy" data-name="${name}" title="click to copy"><i class="fa fa-copy"></i></span>
1320
- <span class="input-group-text" >${name}</span>
1321
- <input type="text" class="form-control" data-name="${name}" name="${myname}" value="${label}">
1322
- <input type="hidden" name="${leftright}" value="${name}">
1323
- </div>
1324
- </div><br></li>`;
1325
- };
1326
-
1327
-
1328
- module.exports = Api;
1
+ const express = require('express');
2
+ const router = express.Router();
3
+ const generatorApp = require("./generatorApp");
4
+ const configGenerator = require('./config_generator');
5
+
6
+ const csrf = require('./csrf');
7
+ const Model = require("./Model");
8
+ const fs = require('fs-extra');
9
+ //const {connection, Util} = require('zet-lib');
10
+ const connection = require('./connection');
11
+ const Util = require('./Util');
12
+
13
+ const Api = {};
14
+
15
+ Api.test = async (req, res) => {
16
+ //console.log(req.body);
17
+ var body = req.body;
18
+ res.json(body)
19
+ };
20
+
21
+ Api.index = async (req, res) => {
22
+ try {
23
+ let datas = {table: '', tabs: [], labels: {}, details: {}, hardcode_grid: ""};
24
+ let table = req.body.table || "", route = "";
25
+ const results = req.body.results || [];
26
+ const fields = req.body.fields || []
27
+ const zFields = Util.arrayToObject(results, "table");
28
+ /*let json = {
29
+ datas: datas,
30
+ table: table,
31
+ rows: {},
32
+ route: "",
33
+ selects: Model.keys,
34
+ }*/
35
+ let json;
36
+ if (table) {
37
+ datas = zFields[table] || {}
38
+ if (datas.hasOwnProperty("id")) {
39
+ datas.details = datas.details || {};
40
+ datas.labels = datas.labels || {};
41
+ datas.tabs = datas.tabs || [];
42
+ datas.left = datas.left || [];
43
+ datas.right = datas.right || [];
44
+ datas.properties = datas.properties || {};
45
+ datas.hardcode_grid = datas.hardcode_grid || Model.hardcodeGrid;
46
+ datas.zapprovals = datas.zapprovals || {};
47
+ route = datas.route;
48
+ //files
49
+ //get contents or get it from views zgenerator/views
50
+ datas.router = datas.router || fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", 'utf-8');
51
+ delete datas.index_ejs;
52
+ delete datas.indexcss_ejs;
53
+ delete datas.indexjs_ejs;
54
+ delete datas.form_ejs;
55
+ delete datas.create_ejs;
56
+ delete datas.createjs_ejs;
57
+ delete datas.update_ejs;
58
+ delete datas.updatejs_ejs;
59
+ delete datas.import_ejs;
60
+ delete datas.importjs_ejs;
61
+ delete datas.index_ejs;
62
+ delete datas.createjs_ejs;
63
+ delete datas.updatejs_ejs;
64
+ delete datas.importjs_ejs;
65
+ delete datas.view_ejs;
66
+ delete datas.importjs_ejs;
67
+
68
+ }
69
+ }
70
+
71
+ if (zFields) {
72
+ let rows = await connection.query(connection.showTables);
73
+ let arr = [];
74
+ rows.map(async (item) => {
75
+ let obj = {}
76
+ for (let key in item) {
77
+ let name = item[key];
78
+ obj.name = name;
79
+ obj.label = Util.camelize(name);
80
+ if (zFields.hasOwnProperty(name)) {
81
+ if (zFields[name].name) {
82
+ obj.label = zFields[name].name
83
+ } else {
84
+ let post = {
85
+ name: Util.fieldToName(name),
86
+ route: name
87
+ }
88
+ /*await connection.update({
89
+ table: "zfields",
90
+ data: post,
91
+ where: {
92
+ table: name
93
+ }
94
+ });*/
95
+ zFields[name].label = Util.fieldToName(name);
96
+ }
97
+ } else {
98
+ let properties = await zFieldsProperty(name, fields);
99
+ /*await connection.insert({
100
+ table: "zfields",
101
+ data: properties
102
+ })*/
103
+ zFields[name] = properties;
104
+ }
105
+ }
106
+ arr.push(obj)
107
+ });
108
+ }
109
+ //add javascript object ZFIELDS
110
+ let obj = {}
111
+ for (let keys in zFields) {
112
+ for (let key in zFields[keys]) {
113
+ if (key == "labels") {
114
+ zFields[keys].labels = zFields[keys].labels;
115
+ } else if (key == "details") {
116
+ zFields[keys].details = zFields[keys].details;
117
+ } else if (key == "properties") {
118
+ zFields[keys].properties = zFields[keys].properties;
119
+ } else if (key == "left") {
120
+ zFields[keys].left = zFields[keys].left;
121
+ } else if (key == "right") {
122
+ zFields[keys].right = zFields[keys].right;
123
+ }
124
+ }
125
+ }
126
+ /*
127
+ Filter modules
128
+ */
129
+ //delete zFields.zapprovals;
130
+ //delete zFields.zconfig;
131
+ //delete zFields.zerror;
132
+ //delete zFields.zfields;
133
+ //delete zFields.zgrid;
134
+ //delete zFields.zmenu;
135
+ //delete zFields.znotification;
136
+ //delete zFields.zrole;
137
+ //delete zFields.zuser;
138
+ //delete zFields.zuser_company;
139
+ //delete zFields.zcompany;
140
+ //delete zFields.zreport;
141
+ //delete zFields.zreport_filter;
142
+
143
+ delete datas.index_ejs;
144
+ delete datas.indexcss_ejs;
145
+ delete datas.indexjs_ejs;
146
+ delete datas.form_ejs;
147
+ delete datas.create_ejs;
148
+ delete datas.createjs_ejs;
149
+ delete datas.createjs_ejs;
150
+ delete datas.updatecss_ejs;
151
+ delete datas.update_ejs;
152
+ delete datas.updatejs_ejs;
153
+ delete datas.importjs_ejs;
154
+ delete datas.import_ejs;
155
+ delete datas.view_ejs;
156
+
157
+ /*
158
+ End filter
159
+ */
160
+ json = {
161
+ datas: datas,
162
+ table: table,
163
+ rows: zFields,
164
+ route: route,
165
+ selects: Model.keys,
166
+ }
167
+ res.json(json);
168
+ } catch (e) {
169
+ console.log(e.toString());
170
+ res.status(400).json({message: e.toString()})
171
+ }
172
+ }
173
+
174
+ Api.modal = async (req, res) => {
175
+ let body = req.body;
176
+ let result = body.result;
177
+ let others = result.others || {}
178
+ let othersArr = Object.keys(others) || [];
179
+ let json = {}
180
+ if(othersArr.length) {
181
+ console.log('masuk ke container')
182
+ json = await Api.modalWithContainer(req,res);
183
+ } else {
184
+ json = await Api.modalClassic(req,res);
185
+ }
186
+ //console.log(JSON.stringify(json))
187
+ res.json(json)
188
+ };
189
+
190
+ function containerObject(left,right,oneColumn,tabs = []) {
191
+
192
+ /*
193
+ For generator helper
194
+ */
195
+
196
+ try {
197
+ let obj = {};
198
+ let hasTabs = tabs.length;
199
+ let leftObj={},rightObj={},oneColumnObj={};
200
+ let leftsNew = [], rightsNew = [], oneColumnsNew = [];
201
+
202
+ if(hasTabs) {
203
+ tabs.forEach(function (tab, i) {
204
+ let arrName = `arr${i}`;
205
+ if (!leftObj.hasOwnProperty(arrName)) {
206
+ leftObj[arrName] = [];
207
+ }
208
+ if (!rightObj.hasOwnProperty(arrName)) {
209
+ rightObj[arrName] = [];
210
+ }
211
+ if (!oneColumnObj.hasOwnProperty(arrName)) {
212
+ oneColumnObj[arrName] = [];
213
+ }
214
+ });
215
+ }
216
+
217
+ left.forEach(function (item) {
218
+ if(typeof item == "string") {
219
+ if(item.includes("___")) {
220
+ let arr = item.split("___");
221
+ leftObj[arr[1]].push(arr[0]);
222
+ leftsNew.push(item)
223
+ }
224
+ } else {
225
+ let keyname = "";
226
+ for(let i = 0; i < item.length; i++) {
227
+ let zitems = item[i];
228
+ if(zitems.length) {
229
+ if(zitems[0].includes("___")) {
230
+ keyname = zitems[0].split("___")[1];
231
+ }
232
+ }
233
+ }
234
+ //console.log(keyname)
235
+ if(keyname) {
236
+ let myarr = [];
237
+ item.forEach(function (myitem) {
238
+ let me = []
239
+ myitem.forEach(function (inem) {
240
+ if(inem.includes("___")) {
241
+ me.push(inem.split("___")[0]);
242
+ } else {
243
+ me.push(inem);
244
+ }
245
+ })
246
+ myarr.push(me)
247
+ });
248
+ leftObj[keyname].push(myarr);
249
+ leftsNew.push(item)
250
+ } else {
251
+ if(item.includes("___")) {
252
+ let arr = item.split("___");
253
+ leftObj[arr[1]].push(arr[0]);
254
+ leftsNew.push(item)
255
+ }
256
+ }
257
+ }
258
+ })
259
+
260
+ //right
261
+ right.forEach(function (item) {
262
+ if(typeof item == "string") {
263
+ if(item.includes("___")) {
264
+ let arr = item.split("___");
265
+ rightObj[arr[1]].push(arr[0]);
266
+ rightsNew.push(item)
267
+ }
268
+ } else {
269
+ let keyname = "";
270
+ for(let i = 0; i < item.length; i++) {
271
+ let zitems = item[i];
272
+ if(zitems.length) {
273
+ if(zitems[0].includes("___")) {
274
+ keyname = zitems[0].split("___")[1];
275
+ }
276
+ }
277
+ }
278
+ //console.log(keyname)
279
+ if(keyname) {
280
+ let myarr = [];
281
+ item.forEach(function (myitem) {
282
+ let me = []
283
+ myitem.forEach(function (inem) {
284
+ if(inem.includes("___")) {
285
+ me.push(inem.split("___")[0]);
286
+ } else {
287
+ me.push(inem);
288
+ }
289
+ });
290
+ myarr.push(me)
291
+ });
292
+ rightObj[keyname].push(myarr);
293
+ rightsNew.push(item)
294
+ } else {
295
+ if(item.includes("___")) {
296
+ let arr = item.split("___");
297
+ rightObj[arr[1]].push(arr[0]);
298
+ rightsNew.push(item)
299
+ }
300
+ }
301
+ }
302
+ })
303
+
304
+ //oneColumn
305
+ oneColumn.forEach(function (item) {
306
+ if(typeof item == "string") {
307
+ if(item.includes("___")) {
308
+ let arr = item.split("___");
309
+ oneColumnObj[arr[1]].push(arr[0]);
310
+ oneColumnsNew.push(item)
311
+ }
312
+ } else {
313
+ let keyname = "";
314
+ for(let i = 0; i < item.length; i++) {
315
+ let zitems = item[i];
316
+ if(zitems.length) {
317
+ if(zitems[0].includes("___")) {
318
+ keyname = zitems[0].split("___")[1];
319
+ }
320
+ }
321
+ }
322
+ //console.log(keyname)
323
+ if(keyname) {
324
+ let myarr = [];
325
+ item.forEach(function (myitem) {
326
+ let me = []
327
+ myitem.forEach(function (inem) {
328
+ if(inem.includes("___")) {
329
+ me.push(inem.split("___")[0]);
330
+ } else {
331
+ me.push(inem);
332
+ }
333
+ });
334
+ myarr.push(me)
335
+ });
336
+ oneColumnObj[keyname].push(myarr);
337
+ oneColumnsNew.push(item)
338
+ } else {
339
+ if(item.includes("___")) {
340
+ let arr = item.split("___");
341
+ oneColumnObj[arr[1]].push(arr[0]);
342
+ oneColumnsNew.push(item)
343
+ }
344
+ }
345
+ }
346
+ });
347
+
348
+ //caption left or right
349
+ let datasLeft = left.filter(x => !leftsNew.includes(x));
350
+ let datasRight = right.filter(x => !rightsNew.includes(x));
351
+ let datasOneColumn = oneColumn.filter(x => !oneColumnsNew.includes(x));
352
+
353
+ let myObject = {
354
+ left : datasLeft || [],
355
+ right : datasRight || [],
356
+ oneColumn : datasOneColumn || [],
357
+ tabLeft : leftObj || [],
358
+ tabRight : rightObj|| [],
359
+ tabOneColumn : oneColumnObj || [],
360
+ };
361
+
362
+ return myObject;
363
+
364
+ } catch (e) {
365
+ console.log(e)
366
+ return {};
367
+ }
368
+ }
369
+
370
+ Api.modalWithContainer = async (body) => {
371
+ try {
372
+ //let body = req.body;
373
+ /* console.log(body)
374
+ console.log("Container....")*/
375
+ let table = body.table || "";
376
+ let html = '';
377
+ let fields = [];
378
+ let datas = {table: '', tabs: [], labels: {}, details: {}, left: [], right: []};
379
+ let count = 1;
380
+ let tabView = '';
381
+ let tabBox = '';
382
+ let tabUl = '';
383
+ let tabContent = '';
384
+ let left = '', right = '', oneColumn = '';
385
+ let hasTab = false;
386
+ let properties = {};
387
+ let rowsFields;
388
+ let result = body.result;
389
+ const others = result.others || {};
390
+ let leftData = others.LEFT || [];
391
+ //console.log(leftData);
392
+ let rightData = others.RIGHT || [];
393
+ let oneColumnData = others.ONE_COLUMN || [];
394
+ let leftsNew = [], rightsNew = [], oneColumnsNew = [];
395
+ let ALL_FIELDS = {};
396
+ if (table) {
397
+ rowsFields = body.rowsFields;
398
+ //console.log('result : ' + JSON.stringify(result))
399
+ if (result.id) {
400
+ datas = {
401
+ details: result.details || {},
402
+ labels: result.labels || {},
403
+ tabs: result.tabs || [],
404
+ left: result.left || [],
405
+ right: result.right || [],
406
+ oneColumn: result.one_column || [],
407
+ sorting: result.sorting || [],
408
+ property: result.properties || {}
409
+ };
410
+ let details = datas.details;
411
+ properties = datas.property;
412
+ let tabs = datas.tabs;
413
+ ALL_FIELDS = containerObject(leftData,rightData,oneColumnData,tabs);
414
+ console.log(ALL_FIELDS);
415
+ if (tabs.length) {
416
+ hasTab = true;
417
+ }
418
+ if (hasTab) {
419
+ let tabLeft = [], tabRight = [], tabOneColum = [];
420
+
421
+ tabUl += '<ul class="nav nav-tabs" id="myTab" role="tablist">';
422
+ tabContent += '<div class="tab-content" id="myTabContent">';
423
+ tabs.forEach(function (item, i) {
424
+ let navlink = i == 0 ? ' active' : '';
425
+ let ariaselected = i == 0 ? "true" : "false";
426
+ let showActive = i == 0 ? ' show active ' : '';
427
+ let n = i + 1;
428
+ let arrName = 'arr' + i;
429
+ let dynamicsLeft = '', dynamicsRight = '', dynamicsOneColumn = '';
430
+ tabLeft = ALL_FIELDS.tabLeft[arrName];
431
+ tabRight = ALL_FIELDS.tabRight[arrName];
432
+ tabOneColum = ALL_FIELDS.tabOneColumn[arrName];
433
+ if (tabLeft.length) {
434
+ if(i==0) {
435
+ console.log(JSON.stringify(tabLeft))
436
+ }
437
+ tabLeft.map((o) => {
438
+ dynamicsLeft += makeItemsOl(o,"LEFT",i,datas);
439
+ });
440
+ }
441
+
442
+ if (tabRight.length) {
443
+ tabRight.map((o) => {
444
+ dynamicsRight += makeItemsOl(o,"RIGHT",i,datas);
445
+ });
446
+ }
447
+
448
+ if (tabOneColum.length) {
449
+ tabOneColum.map((o) => {
450
+ dynamicsOneColumn += makeItemsOl(o,"ONE_COLUMN",i,datas);
451
+ });
452
+ }
453
+
454
+
455
+ tabView += `<li class="item" draggable="true"><div class='divtabs'>${n}. <span class="tabname"> ${item}</span><input type='hidden' name='tabs[]' value='${item}' /> <button type='button' class='btn btn-sm btn-info edittab' data-toggle="modal" data-target="#modal_tab" data-name="${item}" data-id="${i}" > <i class='fas fa-edit'></i> </button> <button type='button' onclick='$(this).parent().remove();' class='btn btn-sm btn-danger trashtab'><i class='fas fa-trash'></i> </button></div></li>`;
456
+ tabUl += `<li class="nav-item">
457
+ <a class="nav-link ${navlink}" id="tabid${i}" data-toggle="tab" href="#tabgo${i}" role="tab" aria-controls="tabgo${i}" aria-selected="${ariaselected}">${item}</a>
458
+ </li>`;
459
+
460
+ tabContent += `<div class="tab-pane fade ${showActive}" id="tabgo${i}" role="tabpanel" aria-labelledby="tabtabgo${i}">
461
+ <div class="container">
462
+ <div class="row">
463
+ <div class="col-md-6"><ol class="mydragable divbox" data-name="LEFT" id="arr${i}">${dynamicsLeft}</ol></div>
464
+ <div class="col-md-6"><ol class="mydragable divbox" data-name="RIGHT" id="arr${i}">${dynamicsRight}</ol></div>
465
+ </div>
466
+ <div class="row">
467
+ <div class="col-md-12"><ol class="mydragable divbox" data-name="ONE_COLUMN" id="arr${i}">${dynamicsOneColumn}</ol></div>
468
+ </div>
469
+ </div>
470
+ </div>`;
471
+ });
472
+ //end tabs
473
+ tabUl += '</ul>';
474
+ tabContent += '</div>';
475
+ count = tabs.length + 1;
476
+ }
477
+ }
478
+ }
479
+
480
+
481
+ //caption left or right
482
+ let datasLeft = ALL_FIELDS.left;
483
+ let datasRight = ALL_FIELDS.right;
484
+ let datasOneColumn = ALL_FIELDS.oneColumn;
485
+ //console.log(JSON.stringify(ALL_FIELDS));
486
+
487
+ if (datasLeft.length) {
488
+ datasLeft.forEach(function (item) {
489
+ if(!Util.in_array(item,leftsNew)) {
490
+ left += makeItemsOl(item,"LEFT","",datas);
491
+ }
492
+ });
493
+ }
494
+ if (datasRight.length) {
495
+ datasRight.forEach(function (item) {
496
+ if(!Util.in_array(item,rightsNew)) {
497
+ right += makeItemsOl(item,"RIGHT","",datas);
498
+ }
499
+ });
500
+ }
501
+ if (datasOneColumn.length) {
502
+ datasOneColumn.forEach(function (item) {
503
+ //console.log(`item ${item}`);
504
+ if(!Util.in_array(item,oneColumnsNew)) {
505
+ oneColumn += makeItemsOl(item,"ONE_COLUMN","",datas);
506
+ }
507
+ });
508
+ }
509
+
510
+ datas.sorting.forEach(function (item, index) {
511
+ if (item == 1) {
512
+ html += columnOne(oneColumn);
513
+ } else {
514
+ html += `<div class="row sortable"><i class="fa fa-arrows icon-floats"></i>${columnLR(left, "LEFT")} ${columnLR(right, "RIGHT")}</div>`;
515
+ }
516
+ });
517
+ datas.others = others;
518
+ let json = {}
519
+ json.html = html;
520
+ json.datas = datas;
521
+ json.tabview = tabView;
522
+ json.count = count;
523
+ json.tabBox = tabUl + tabContent;
524
+
525
+ //console.log(JSON.stringify(json))
526
+ //res.json(json);
527
+ return json;
528
+ } catch (e) {
529
+ console.log(e)
530
+ //res.status(400).json({message: e.toString()})
531
+ return Util.flashError(e.toString());
532
+ }
533
+ };
534
+
535
+ Api.modalClassic = async (body) => {
536
+ try {
537
+ //const body = req.body;
538
+ //console.log(body)
539
+ const table = body.table || "";
540
+ let html = '';
541
+ var datas = {table: '', tabs: [], labels: {}, details: {}, left: [], right: []};
542
+ let count = 1;
543
+ let tabView = '';
544
+ let tabUl = '';
545
+ let tabContent = '';
546
+ let left = '', right = '', oneColumn = '';
547
+ let hasTab = false;
548
+ let properties = {}
549
+ let rowsFields;
550
+ if (table) {
551
+ let result = body.result;
552
+ rowsFields = body.rowsFields;
553
+ //console.log('result : ' + JSON.stringify(result))
554
+ if (result.id) {
555
+ datas = {
556
+ details: result.details || {},
557
+ labels: result.labels || {},
558
+ tabs: result.tabs || [],
559
+ left: result.left || [],
560
+ right: result.right || [],
561
+ oneColumn: result.one_column || [],
562
+ sorting: result.sorting || [],
563
+ property: result.properties || {}
564
+ };
565
+ let details = datas.details;
566
+ properties = datas.property;
567
+ let tabs = datas.tabs;
568
+ if (tabs.length) {
569
+ hasTab = true;
570
+ }
571
+ if (hasTab) {
572
+ tabUl += '<ul class="nav nav-tabs" id="myTab" role="tablist">';
573
+ tabContent += '<div class="tab-content" id="myTabContent">';
574
+ tabs.forEach(function (item, i) {
575
+ const navlink = i == 0 ? ' active' : '';
576
+ const ariaselected = i == 0 ? "true" : "false";
577
+ const showActive = i == 0 ? ' show active ' : '';
578
+ const n = i + 1;
579
+ const arrName = 'arr' + i;
580
+ let dynamicsLeft = '', dynamicsRight = '', dynamicsOneColumn = '';
581
+ let tabLeft = [], tabRight = [], tabOneColum = [];
582
+ if (datas.left.length) {
583
+ datas.left.forEach(function (o) {
584
+ if (typeof o == "object") {
585
+ for (var key in o) {
586
+ if (key == arrName) {
587
+ tabLeft = o[key];
588
+ }
589
+ }
590
+ }
591
+ });
592
+ }
593
+ if (datas.right.length) {
594
+ datas.right.forEach(function (o) {
595
+ if (typeof o == "object") {
596
+ for (var key in o) {
597
+ if (key == arrName) {
598
+ tabRight = o[key];
599
+ }
600
+ }
601
+ }
602
+ });
603
+ }
604
+ if (datas.oneColumn.length) {
605
+ datas.oneColumn.forEach(function (o) {
606
+ if (typeof o == "object") {
607
+ for (var key in o) {
608
+ if (key == arrName) {
609
+ tabOneColum = o[key];
610
+ }
611
+ }
612
+ }
613
+ });
614
+ }
615
+
616
+ /* console.log(arrName);
617
+ console.log("tableft");
618
+ console.log(JSON.stringify(tabLeft));
619
+ console.log("tableft end");
620
+ console.log("tabright");
621
+ console.log(JSON.stringify(tabRight));
622
+ console.log("tabright");
623
+ console.log("tabonecolumn");
624
+ console.log(JSON.stringify(tabOneColum));
625
+ console.log("tabonecolumn end");*/
626
+
627
+
628
+ if (tabLeft.length) {
629
+ tabLeft.map((o) => {
630
+ if(datas.property[o] && datas.property[o].hasOwnProperty("type") ) {
631
+ dynamicsLeft += dragable_with_icon(o, datas.labels[o], i, "LEFT", datas.property[o].type);
632
+ }
633
+ });
634
+ }
635
+ if (tabRight.length) {
636
+ tabRight.map((o) => {
637
+ if(datas.property[o] && datas.property[o].hasOwnProperty("type") ) {
638
+ dynamicsRight += dragable_with_icon(o, datas.labels[o], i, "RIGHT", datas.property[o].type);
639
+ }
640
+ });
641
+ }
642
+
643
+ if (tabOneColum.length) {
644
+ tabOneColum.map((o) => {
645
+ if(datas.property[o] && datas.property[o].hasOwnProperty("type") ) {
646
+ dynamicsOneColumn += dragable_with_icon(o, datas.labels[o], i, "ONE_COLUMN", datas.property[o].type);
647
+ }
648
+ });
649
+ }
650
+
651
+ tabView += `<li class="item" draggable="true"><div class='divtabs'>${n}. <span class="tabname"> ${item}</span><input type='hidden' name='tabs[]' value='${item}' /> <button type='button' class='btn btn-sm btn-info edittab' data-toggle="modal" data-target="#modal_tab" data-name="${item}" data-id="${i}" > <i class='fas fa-edit'></i> </button> <button type='button' onclick='$(this).parent().remove();' class='btn btn-sm btn-danger trashtab'><i class='fas fa-trash'></i> </button></div></li>`;
652
+ tabUl += `<li class="nav-item">
653
+ <a class="nav-link ${navlink}" id="tabid${i}" data-toggle="tab" href="#tabgo${i}" role="tab" aria-controls="tabgo${i}" aria-selected="${ariaselected}">${item}</a>
654
+ </li>`;
655
+
656
+ tabContent += `<div class="tab-pane fade ${showActive}" id="tabgo${i}" role="tabpanel" aria-labelledby="tabtabgo${i}">
657
+ <div class="container">
658
+ <div class="row">
659
+ <div class="col-md-6"><ol class="mydragable divbox" data-name="LEFT" id="arr${i}">${dynamicsLeft}</ol></div>
660
+ <div class="col-md-6"><ol class="mydragable divbox" data-name="RIGHT" id="arr${i}">${dynamicsRight}</ol></div>
661
+ </div>
662
+ <div class="row">
663
+ <div class="col-md-12"><ol class="mydragable divbox" data-name="ONE_COLUMN" id="arr${i}">${dynamicsOneColumn}</ol></div>
664
+ </div>
665
+ </div>
666
+ </div>`;
667
+ });
668
+ //end tabs
669
+ tabUl += '</ul>';
670
+ tabContent += '</div>';
671
+ count = tabs.length + 1;
672
+ }
673
+ }
674
+ }
675
+
676
+ /* var rows = [];
677
+ if (Util.isEmptyObject(datas.details)) {
678
+ rows = await fieldsTable(table, rowsFields);
679
+ } else {
680
+ var d = datas.details;
681
+ var notabs = d.hasOwnProperty('notabs') ? d.notabs : [];
682
+ for (var i = 0; i < notabs.length; i++) {
683
+ rows.push({name: notabs[i], label: datas.labels[notabs[i]]})
684
+ }
685
+ }*/
686
+
687
+ //caption left or right
688
+ if (datas.left.length) {
689
+ datas.left.forEach(function (item) {
690
+ if (properties.hasOwnProperty(item)) {
691
+ left += dragable_with_icon(item, datas.labels[item], "", "LEFT", datas.property[item].type);
692
+ }
693
+ });
694
+ }
695
+ if (datas.right.length) {
696
+ datas.right.forEach(function (item) {
697
+ if (properties.hasOwnProperty(item)) {
698
+ right += dragable_with_icon(item, datas.labels[item], "", "RIGHT", datas.property[item].type);
699
+ }
700
+ });
701
+ }
702
+ if (datas.oneColumn.length) {
703
+ datas.oneColumn.forEach(function (item) {
704
+ if (properties.hasOwnProperty(item)) {
705
+ oneColumn += dragable_with_icon(item, datas.labels[item], "", "ONE_COLUMN", datas.property[item].type);
706
+ }
707
+ });
708
+ }
709
+ datas.sorting.forEach(function (item, index) {
710
+ if (item == 1) {
711
+ html += columnOne(oneColumn);
712
+ } else {
713
+ html += `<div class="row sortable"><i class="fa fa-arrows icon-floats"></i>${columnLR(left, "LEFT")} ${columnLR(right, "RIGHT")}</div>`;
714
+ }
715
+ });
716
+ let json = {}
717
+ json.html = html;
718
+ json.datas = datas;
719
+ json.tabview = tabView;
720
+ json.count = count;
721
+ json.tabBox = tabUl + tabContent;
722
+
723
+ return json;
724
+ //res.json(json);
725
+ } catch (e) {
726
+ console.log(e)
727
+ //res.status(400).json({message: e.toString()})
728
+ //json = {}
729
+ return {}
730
+ }
731
+ }
732
+
733
+ const makeItemsOl = (o,columnName,tabName, datas) => {
734
+ let html = '';
735
+ if(typeof o == "string") {
736
+ if (datas.property[o] && datas.property[o].hasOwnProperty("type")) {
737
+ html += dragable_with_icon(o, datas.labels[o], tabName, columnName, datas.property[o].type);
738
+ }
739
+ } else {
740
+ let hasValues = o.some( function (a) { return a.length });
741
+ if(hasValues) {
742
+ let columncount = o.length;
743
+ let col_md = bootstrapColumn(columncount);
744
+ let myhtml = `<li class="container-nav"> <i class="fa fa-arrows icon-floating"></i><div class="row mt-1 mb-1">`;
745
+ for(let i =1; i <= columncount; i++) {
746
+ let n_i = i -1;
747
+ myhtml += `<div class="${col_md}" style="background-color: rgba(0,0,0,.03)"><ol class="divboxlittle container-box"><li><i data-column="${columnName}" class="fa fa-plus-circle fa-2x add-container text-success"></i> </li> `;
748
+ if(o[n_i].length) {
749
+ o[n_i].forEach(function (myitem) {
750
+ if(tabName) {
751
+ myitem = myitem.replace('___'+tabName,'')
752
+ }
753
+ if (datas.property[myitem] && datas.property[myitem].hasOwnProperty("type")) {
754
+ myhtml += dragable_with_icon(myitem, datas.labels[myitem], tabName, columnName, datas.property[myitem].type);
755
+ }
756
+ })
757
+ }
758
+ myhtml += `</ol> </div>`;
759
+ }
760
+ myhtml += `</div></li>`;
761
+ html += myhtml;
762
+ }
763
+ }
764
+ return html;
765
+ }
766
+
767
+ const bootstrapColumn = (count) => {
768
+ return `col-md-${(12 / count)}`
769
+ }
770
+
771
+ Api.create = (body) => {
772
+ return createTable(body);
773
+ }
774
+
775
+ Api.properties = (body) => {
776
+ try {
777
+ //const body = req.body;
778
+ //console.log(req.body);
779
+ //console.log("ok")
780
+ //return;
781
+ const details = body.details || [];
782
+ const rows = body.rows;
783
+ var json = Util.jsonSuccess("Success to update");
784
+ if (details.length == 0) {
785
+ json = Util.flashError("Please add some data");
786
+ return json;
787
+ }
788
+ const hardcode_grid = body.hardcode_grid || "";
789
+
790
+ let left = [], right = [], lefts = [], rights = [], oneColumn = [], oneColumns = [], tabLeft = {},tabRight = {};
791
+ const obj = {}
792
+ obj.notabs = []
793
+ let labels = {};
794
+ let hasTab = false;
795
+ let tabs = {};
796
+
797
+ //check if table is exist or not
798
+ const checks = body.checks;
799
+ json.create_table = {};
800
+ if (!checks) {
801
+ const create = createTable(rows[0], true);
802
+ json.create_table.sql = create.datas.sql;
803
+ json.create_table.post = create.datas.post;
804
+ }
805
+ labels = rows[0].labels || {};
806
+ tabs = !rows[0].tabs ? [] : rows[0].tabs;
807
+ if (tabs.length) {
808
+ hasTab = true;
809
+ tabs.forEach(function (item, i) {
810
+ obj['arr' + i] = [];
811
+ tabLeft['arr' + i] = [];
812
+ tabRight['arr' + i] = [];
813
+ });
814
+ }
815
+ details.forEach(function (item, index) {
816
+ let name = item.name, value = item.value;
817
+ if (name.includes("___")) {
818
+ const explode = name.split("___");
819
+ obj[explode[1]].push(explode[0])
820
+ labels[explode[0]] = value;
821
+ } else {
822
+ if (name == 'LEFT') {
823
+ left.push(value);
824
+ } else if (name == 'RIGHT') {
825
+ right.push(value);
826
+ } else if (name == 'ONE_COLUMN') {
827
+ oneColumn.push(value);
828
+ } else {
829
+ obj['notabs'].push(name);
830
+ labels[name] = value;
831
+ }
832
+ }
833
+ });
834
+
835
+ const sorting = details[1].name == "ONE_COLUMN" ? [1, 2] : [2, 1];
836
+ for (let key in obj) {
837
+ if (key == "notabs") {
838
+ lefts = obj[key].filter((item) => left.includes(item));
839
+ rights = obj[key].filter((item) => right.includes(item));
840
+ oneColumns = obj[key].filter((item) => oneColumn.includes(item));
841
+ } else {
842
+ let myobj = {}
843
+ myobj[key] = obj[key].filter((item) => left.includes(item));
844
+ lefts.push(myobj);
845
+
846
+ myobj = {}
847
+ myobj[key] = obj[key].filter((item) => right.includes(item));
848
+ rights.push(myobj);
849
+
850
+ myobj = {}
851
+ myobj[key] = obj[key].filter((item) => oneColumn.includes(item));
852
+ oneColumns.push(myobj);
853
+ }
854
+ }
855
+
856
+ const post = {}
857
+ post.labels = JSON.stringify(labels);
858
+ post.details = JSON.stringify(obj);
859
+ post.left = JSON.stringify(lefts);
860
+ post.right = JSON.stringify(rights);
861
+ post.one_column = JSON.stringify(oneColumns);
862
+ post.sorting = JSON.stringify(sorting);
863
+ post.hardcode_grid = hardcode_grid;
864
+ //files
865
+
866
+ //get contents or get it from views zgenerator/views
867
+ post.router = body.router || fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", 'utf-8');
868
+ post.index_ejs = body.index_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/index.ejs", 'utf-8');
869
+ post.indexcss_ejs = body.indexcss_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexcss.ejs", 'utf-8');
870
+ post.indexjs_ejs = body.indexjs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexjs.ejs", 'utf-8');
871
+ post.form_ejs = body.form_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/_form.ejs", 'utf-8');
872
+ post.create_ejs = body.create_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/create.ejs", 'utf-8');
873
+ post.createjs_ejs = body.createjs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/createjs.ejs", 'utf-8');
874
+ post.update_ejs = body.update_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/update.ejs", 'utf-8');
875
+ post.updatejs_ejs = body.updatejs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/updatejs.ejs", 'utf-8');
876
+ post.import_ejs = body.import_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/import.ejs", 'utf-8');
877
+ post.importjs_ejs = body.importjs_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/importjs.ejs", 'utf-8');
878
+ post.view_ejs = body.view_ejs || fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/view.ejs", 'utf-8');
879
+
880
+ if (post.indexjs_ejs.indexOf(`</script>`) > -1) {
881
+ post.indexjs_ejs = Util.replaceAll(post.indexjs_ejs, `</script>`, `</script>`);
882
+ }
883
+ if (post.createjs_ejs.indexOf(`</script>`) > -1) {
884
+ post.createjs_ejs = Util.replaceAll(post.createjs_ejs, `</script>`, `</script>`);
885
+ }
886
+ if (post.updatejs_ejs.indexOf(`</script>`) > -1) {
887
+ post.updatejs_ejs = Util.replaceAll(post.updatejs_ejs, `</script>`, `</script>`);
888
+ }
889
+ if (post.importjs_ejs.indexOf(`</script>`) > -1) {
890
+ post.importjs_ejs = Util.replaceAll(post.importjs_ejs, `</script>`, `</script>`);
891
+ }
892
+ if (post.view_ejs.indexOf(`</script>`) > -1) {
893
+ post.view_ejs = Util.replaceAll(post.view_ejs, `</script>`, `</script>`);
894
+ }
895
+ json.updateFields = {
896
+ post: post,
897
+ id: rows[0].id
898
+ }
899
+ return json;
900
+ } catch (e) {
901
+ console.log(e)
902
+ //res.status(400).json({message: e.toString()})
903
+ return Util.flashError(e.toString());
904
+ }
905
+ };
906
+
907
+ Api.generate = async (body) => {
908
+ try {
909
+ console.log('generate');
910
+ const json = Util.jsonSuccess("Success");
911
+ const result = body.result;
912
+ const columns = body.columns;
913
+ const constraintList = body.constraintList;
914
+ const files = {};
915
+ const model = await generatorApp.CREATE_MODEL_API(columns, constraintList, result);
916
+ const MYMODEL = model.modelObj;
917
+ files.model = model;
918
+ files.route = generatorApp.CREATE_ROUTER_API(MYMODEL, result);
919
+ files.views = generatorApp.CREATE_VIEWS_API(MYMODEL, result);
920
+ json.files = files;
921
+ return json;
922
+ } catch (e) {
923
+ console.log(e)
924
+ return Util.flashError(e.toString());
925
+ }
926
+ };
927
+
928
+ Api.create_field = (body) => {
929
+ let json = Util.jsonSuccess("Successfully create field");
930
+ console.log(body);
931
+ //return false;
932
+ try {
933
+ let table = body.table || "", position = body.position || "LEFT", label = body.name || "",
934
+ type = body.type || "", name = Util.toName(label) || "";
935
+ table = table.trim(), label = label.trim(), type = type.trim(), name = name.trim();
936
+
937
+ let others = body.others ? JSON.parse(body.others) : {};
938
+ let zFields = body.zFields || [];
939
+ let details = zFields[0].details;
940
+ let labels = zFields[0].labels || {};
941
+ let notabs = details.notabs;
942
+ let left = zFields[0].left || [];
943
+ let right = zFields[0].right || [];
944
+ let oneColumn = zFields[0].one_column || [];
945
+
946
+ let all = [...left, ...right, ...oneColumn];
947
+ all.push('lock');
948
+ let properties = zFields[0].properties || {};
949
+
950
+ //add name with suffix _id if relate to other table
951
+ const arr = ['relation', 'typeahead'];
952
+ if (Util.in_array(type, arr)) {
953
+ name = name + "_id";
954
+ }
955
+ if (label.length < 2) {
956
+ return Util.flashError("Field Name is not complete");
957
+ }
958
+ if (Util.in_array(name, all)) {
959
+ return Util.flashError("Name exist", "");
960
+ }
961
+ //set position if table go to one column
962
+ if (type == "table") {
963
+ oneColumn.push(name);
964
+ } else {
965
+ if (position == "LEFT") {
966
+ left.push(name);
967
+ } else if (position == "RIGHT") {
968
+ right.push(name)
969
+ } else {
970
+ oneColumn.push(name);
971
+ }
972
+ }
973
+
974
+ /* console.log(JSON.stringify(left))
975
+ console.log(JSON.stringify(right))
976
+ console.log(JSON.stringify(oneColumn))
977
+ console.log(position);*/
978
+
979
+ let othersLength = Object.keys(others).length;
980
+ if(othersLength) {
981
+ if (position == "LEFT") {
982
+ others.LEFT.push(name);
983
+ } else if (position == "RIGHT") {
984
+ others.RIGHT.push(name);
985
+ } else {
986
+ others.ONE_COLUMN.push(name);
987
+ }
988
+ }
989
+ //return false;
990
+
991
+ notabs.push(name);
992
+ let defaultValues = Model[type].defaultValues;
993
+ if (defaultValues.hasOwnProperty("tabindex")) {
994
+ defaultValues.tabindex = Object.keys(properties).length + 1;
995
+ }
996
+ if (defaultValues.hasOwnProperty("required")) {
997
+ defaultValues.hidden = false;
998
+ }
999
+ properties[name] = {
1000
+ label: label,
1001
+ type: type,
1002
+ values: defaultValues
1003
+ }
1004
+ labels[name] = label;
1005
+
1006
+ //for relation we need to override values
1007
+ const relations = ["relation", "dropdown_multi", "table", "typeahead","dragdrop"];
1008
+ if (Util.in_array(type, relations)) {
1009
+ var propertyValue = properties[name].values || {}
1010
+ var relationtable = body.relationtable || "";
1011
+ var relationfield = body.relationfield || "";
1012
+ var relationfields = body.relationfields || "";
1013
+ var relationconcat = body.relationconcat || "";
1014
+ if (!relationtable.length) {
1015
+ return Util.flashError("Table Name empty!");
1016
+ }
1017
+ if (type != "table") {
1018
+ if (!relationfield.length) {
1019
+ return Util.flashError("Label relation empty!");
1020
+ }
1021
+ }
1022
+ propertyValue["table"] = relationtable;
1023
+ if (type != "table") {
1024
+ propertyValue["name"] = relationfield;
1025
+ if (relationconcat == "CONCAT()") {
1026
+ propertyValue["concat"] = `CONCAT(${relationfield})`;
1027
+ } else {
1028
+ propertyValue["concat"] = relationconcat;
1029
+ }
1030
+ }
1031
+ //additional dropdown chain for first time
1032
+ //TODO simple code
1033
+ if (relationfields) {
1034
+ propertyValue["field"] = relationfields;
1035
+ }
1036
+ properties[name].values = propertyValue;
1037
+ }
1038
+ json.post = {
1039
+ left: JSON.stringify(left),
1040
+ right: JSON.stringify(right),
1041
+ one_column: JSON.stringify(oneColumn),
1042
+ properties: JSON.stringify(properties),
1043
+ details: JSON.stringify({notabs: notabs}),
1044
+ labels: JSON.stringify(labels),
1045
+ others : JSON.stringify(others)
1046
+ };
1047
+ //await connection.update({table: 'zfields', where: {table: table}, data: post})
1048
+ } catch (err) {
1049
+ console.log(err.toString())
1050
+ json = Util.flashError(err.toString())
1051
+ }
1052
+ return json;
1053
+ }
1054
+
1055
+
1056
+ Api.modal_settings = (body) => {
1057
+ try {
1058
+ const json = Util.jsonSuccess("Success")
1059
+ const name = body.name;
1060
+ //console.log(body);
1061
+ let html = "";
1062
+ let result = body.result;
1063
+ let properties = result.properties ? result.properties : {};
1064
+ let property = !properties[name] ? {} : properties[name];
1065
+ let type = property.type;
1066
+ //html += `<input type="hidden" value="${req.csrfToken()}" >`;
1067
+ html += Model.buildWidget(name, type, property.values || {});
1068
+ json.html = html;
1069
+ return json;
1070
+ } catch (e) {
1071
+ console.log(e)
1072
+ return Util.flashError(e.toString());
1073
+ }
1074
+ }
1075
+
1076
+
1077
+ Api.reset = (req,res)=> {
1078
+ res.json(Api.datas)
1079
+ }
1080
+
1081
+ Api.datas = {
1082
+ router : fs.readFileSync(generatorApp.DIRECTORY + "/routerApp.ejs", 'utf-8'),
1083
+ index_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/index.ejs", 'utf-8'),
1084
+ indexcss_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexcss.ejs", 'utf-8'),
1085
+ indexjs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/indexjs.ejs", 'utf-8'),
1086
+ form_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/_form.ejs", 'utf-8'),
1087
+ create_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/create.ejs", 'utf-8'),
1088
+ createjs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/createjs.ejs", 'utf-8'),
1089
+ update_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/update.ejs", 'utf-8'),
1090
+ updatejs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/updatejs.ejs", 'utf-8'),
1091
+ import_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/import.ejs", 'utf-8'),
1092
+ importjs_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/importjs.ejs", 'utf-8'),
1093
+ view_ejs : fs.readFileSync(generatorApp.DIRECTORY_GENERATOR_VIEWS + "/view.ejs", 'utf-8'),
1094
+ hardcode_grid : Model.hardcodeGrid
1095
+ }
1096
+
1097
+ const replaceScript = (string) => {
1098
+ if (!string) {
1099
+ return "";
1100
+ }
1101
+ let html = string;
1102
+ if (string.indexOf("script") > -1) {
1103
+ html = Util.replaceAll(string, `</script>`, `</script>`)
1104
+ }
1105
+ return html;
1106
+ }
1107
+
1108
+ Api.createTable =(data) => {
1109
+ return createTable(data);
1110
+ };
1111
+
1112
+ const createTable = (postData, isIgnore) => {
1113
+ isIgnore = isIgnore || false;
1114
+ let json = Util.jsonSuccess("Successfully create module");
1115
+ let labels = {
1116
+ id: "Id",
1117
+ company_id: "Company",
1118
+ lock:"Lock/Unlock",
1119
+ approval_status:"Approval Status",
1120
+ approval_history:"Approval History",
1121
+ created_at: "Created At",
1122
+ updated_at: "Updated At",
1123
+ created_by: "Created By",
1124
+ updated_by: "Updated By"
1125
+ };
1126
+
1127
+ let route = Util.toName(postData.route);
1128
+ let name = postData.name;
1129
+ name = name.trim();
1130
+ let forbidden = ['group','copy','command','from','select','distinct','where','year','month','day','ignore','previous','next',
1131
+ 'start','end','set','setof','show','size','row','rows','return','order'];
1132
+ if(forbidden.includes(name)) {
1133
+ json = Util.flashError("Module Name is Forbidden, try using other module name..", "route");
1134
+ return json;
1135
+ }
1136
+ if (!name.length) {
1137
+ json = Util.flashError("Module Name Empty", "route");
1138
+ return json;
1139
+ }
1140
+ if (Util.in_array(name, configGenerator.notGenerateTable)) {
1141
+ json = Util.flashError("Module Name Exist", "route");
1142
+ return json;
1143
+ }
1144
+ if (!route.length) {
1145
+ json = Util.flashError("Route Empty", "route");
1146
+ return json;
1147
+ }
1148
+ try {
1149
+ const datas = Api.datas;
1150
+ let post = {
1151
+ table: Util.toName(name),
1152
+ name: name,
1153
+ route: route,
1154
+ labels: JSON.stringify(labels),
1155
+ left: "[]",
1156
+ right: "[]",
1157
+ sorting: "[2,1]",
1158
+ details: JSON.stringify({
1159
+ notabs: []
1160
+ }),
1161
+ hardcode_grid: Model.hardcodeGrid,
1162
+ company_id : 1,
1163
+ }
1164
+ for(let key in datas) {
1165
+ post[key] = datas[key];
1166
+ }
1167
+ //console.log(datas.router);
1168
+
1169
+ let sql = `
1170
+ CREATE TABLE ${post.table} (
1171
+ id BIGSERIAL PRIMARY KEY,
1172
+ company_id BIGINT NOT NULL,
1173
+ lock smallint default 0,
1174
+ approval_status smallint DEFAULT 1,
1175
+ approval_history jsonb[] DEFAULT NULL,
1176
+ updated_by BIGINT DEFAULT NULL,
1177
+ created_by BIGINT DEFAULT NULL,
1178
+ created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
1179
+ updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
1180
+ CONSTRAINT fk_${post.table}_company_id FOREIGN KEY (company_id) REFERENCES zcompany (id)
1181
+
1182
+ );`;
1183
+ console.log(sql)
1184
+ //await connection.query(sql);
1185
+ json.post = post;
1186
+ json.sql = sql;
1187
+ } catch (e) {
1188
+ json = Util.flashError(e.toString(), "")
1189
+ }
1190
+ //console.log(JSON.stringify(json))
1191
+ return json
1192
+ }
1193
+
1194
+ const columnLR = (items, dataName) => {
1195
+ return `<div class="col-md-6"><ol class="mydragable divboxlittle" data-name="${dataName}">${items}</ol></div>`;
1196
+ }
1197
+
1198
+ const columnOne = (items) => {
1199
+ return `<div class="row sortable"><i class="fa fa-arrows icon-float"></i><div class="col-md-12"><ol class="mydragable divboxlittle" data-name="ONE_COLUMN">${items}</ol></div></div>`;
1200
+ }
1201
+
1202
+ /*
1203
+ const fieldsTable = (rowsFields) => {
1204
+ let rows = generateFields(rowsFields);
1205
+ let arr = [];
1206
+ if (rows.length > 0) {
1207
+ for (let i = 0; i < rows.length; i++) {
1208
+ if (!Util.in_array(rows[i].Field, config.generator.notRenderField))
1209
+ arr.push({name: rows[i].Field, label: Util.fieldToName(rows[i].Field)});
1210
+ }
1211
+ }
1212
+ return arr;
1213
+ }*/
1214
+
1215
+ const generateFields = async (rowsFields) => {
1216
+ let rows = []
1217
+ //let sql = connection.describeTable(table);
1218
+ //let rowsFields = await connection.query(sql);
1219
+ for (let k = 0; k < rowsFields.length; k++) {
1220
+ let obj = rowsFields[k];
1221
+ let Type = obj.Type;
1222
+ if (Type.indexOf("character varying") > -1) {
1223
+ obj.Type = Util.replaceAll(Type, "character varying", "varchar");
1224
+ } else if (Type.indexOf("integer()") > -1) {
1225
+ obj.Type = "int(11)";
1226
+ } else if (Type.indexOf("smallint()") > -1) {
1227
+ obj.Type = "int(4)";
1228
+ } else if (Type.indexOf("()")) {
1229
+ obj.Type = Util.replaceAll(Type, "()", "");
1230
+ }
1231
+
1232
+ rows.push(obj)
1233
+ }
1234
+ return rows;
1235
+ }
1236
+
1237
+ //drop down chains
1238
+ /*
1239
+ const chainings = (results, rows, arr) => {
1240
+ //var results = await connection.query(connection.showFields(table));
1241
+ var obj = {};
1242
+ var tableObj = {}
1243
+ var ret = {}
1244
+ for (var i = 0; i < results.length; i++) {
1245
+ var result = results[i];
1246
+ if (Util.in_array(result.COLUMN_NAME, arr)) {
1247
+ obj[result.COLUMN_NAME] = {
1248
+ table: result.REFERENCED_TABLE_NAME
1249
+ }
1250
+ tableObj[result.REFERENCED_TABLE_NAME] = result.COLUMN_NAME;
1251
+ }
1252
+ }
1253
+
1254
+ for (var key in obj) {
1255
+ //var rows = await connection.query(connection.showFields(obj[key].table));
1256
+ rows.forEach(function (row) {
1257
+ for (var q in obj) {
1258
+ console.log(row.REFERENCED_TABLE_NAME + ' == ' + obj[q].table)
1259
+ if (row.REFERENCED_TABLE_NAME == obj[q].table) {
1260
+ if (!obj[q].chains) {
1261
+ obj[q].chains = {};
1262
+ }
1263
+ obj[q].chains[key] = {
1264
+ column: row.COLUMN_NAME,
1265
+ table: row.TABLE_NAME
1266
+ }
1267
+ }
1268
+ }
1269
+ });
1270
+ }
1271
+ return obj;
1272
+ }
1273
+ */
1274
+
1275
+ const zFieldsProperty = async (table, fields) => {
1276
+ let data = {}
1277
+ data.table = table;
1278
+ data.name = Util.fieldToName(table);
1279
+ data.route = table;
1280
+ let label = {}
1281
+ let details = [], lefts = [], rights = [];
1282
+ let nots = Util.nots;
1283
+ //let fields = await connection.query(connection.showFullFields(table));
1284
+ fields.forEach(function (item) {
1285
+ label[item.Field] = Util.fieldToName(item.Field);
1286
+ });
1287
+ data.labels = JSON.stringify(label);
1288
+ let num = 1;
1289
+ fields.forEach(function (item) {
1290
+ if (!Util.in_array(item.Field, nots)) {
1291
+ details.push(item.Field);
1292
+ if (num % 2 == 0) {
1293
+ rights.push(item.Field)
1294
+ } else {
1295
+ lefts.push(item.Field)
1296
+ }
1297
+ num++;
1298
+ }
1299
+ });
1300
+ let notabs = {
1301
+ notabs: details
1302
+ }
1303
+
1304
+ data.details = JSON.stringify(notabs);
1305
+ data.left = JSON.stringify(lefts);
1306
+ data.right = JSON.stringify(rights);
1307
+ return data;
1308
+ };
1309
+
1310
+
1311
+ const dragable_with_icon = (name, label, tab, leftright, type = "") => {
1312
+ let myname = tab === "" ? name : name + "___arr" + tab;
1313
+ leftright = leftright || "LEFT";
1314
+ var typeName = type ? Model.keys[type] : "";
1315
+ return `<li>
1316
+ <div class="input-group">
1317
+ <div class="input-group-prepend">
1318
+ <span class="input-group-text modal_setting" data-type="${typeName}" data-name="${name}" data-label="${label}" ><i class="fa fa-cog text-info modal_setting" data-type="${typeName}" data-name="${name}" data-label="${label}"></i> </span>
1319
+ <span class="input-group-text can-copy" data-name="${name}" title="click to copy"><i class="fa fa-copy"></i></span>
1320
+ <span class="input-group-text" >${name}</span>
1321
+ <input type="text" class="form-control" data-name="${name}" name="${myname}" value="${label}">
1322
+ <input type="hidden" name="${leftright}" value="${name}">
1323
+ </div>
1324
+ </div><br></li>`;
1325
+ };
1326
+
1327
+
1328
+ module.exports = Api;