zet-lib 1.5.30 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Modal.js +85 -30
- package/lib/Model.js +118 -2
- package/lib/config_generator.js +24 -0
- package/lib/generatorApi.js +1328 -0
- package/lib/generatorApp.js +1342 -0
- package/lib/generatorModel.js +733 -0
- package/lib/lang_en.js +115 -0
- package/lib/routes/api.js +52 -0
- package/lib/routes/index.js +9 -0
- package/lib/views/error.ejs +3 -0
- package/lib/views/zgenerator/bootstrap3/_form.ejs +24 -0
- package/lib/views/zgenerator/bootstrap3/create.ejs +9 -0
- package/lib/views/zgenerator/bootstrap3/createjs.ejs +3 -0
- package/lib/views/zgenerator/bootstrap3/import.ejs +52 -0
- package/lib/views/zgenerator/bootstrap3/importjs.ejs +3 -0
- package/lib/views/zgenerator/bootstrap3/index.ejs +29 -0
- package/lib/views/zgenerator/bootstrap3/indexcss.ejs +1 -0
- package/lib/views/zgenerator/bootstrap3/indexjs.ejs +307 -0
- package/lib/views/zgenerator/bootstrap3/update.ejs +8 -0
- package/lib/views/zgenerator/bootstrap3/updatejs.ejs +3 -0
- package/lib/views/zgenerator/bootstrap3/view.ejs +57 -0
- package/lib/views/zgenerator/head.ejs +12 -0
- package/lib/views/zgenerator/index.ejs +271 -0
- package/lib/views/zgenerator/indexcss.ejs +87 -0
- package/lib/views/zgenerator/indexjs.ejs +705 -0
- package/lib/views/zgenerator/layout.ejs +198 -0
- package/lib/views/zgenerator/manual_basic.ejs +2 -0
- package/lib/views/zgenerator/manual_dropdown.ejs +126 -0
- package/lib/views/zgenerator/manual_modules.ejs +192 -0
- package/lib/views/zgenerator/manual_virtual.ejs +143 -0
- package/lib/views/zgenerator/mini.ejs +341 -0
- package/lib/views/zgenerator/routerApp.ejs +359 -0
- package/lib/views/zgenerator/views/_form.ejs +25 -0
- package/lib/views/zgenerator/views/approval.ejs +42 -0
- package/lib/views/zgenerator/views/create.ejs +7 -0
- package/lib/views/zgenerator/views/createjs.ejs +16 -0
- package/lib/views/zgenerator/views/import.ejs +49 -0
- package/lib/views/zgenerator/views/importjs.ejs +4 -0
- package/lib/views/zgenerator/views/index.ejs +9 -0
- package/lib/views/zgenerator/views/indexcss.ejs +2 -0
- package/lib/views/zgenerator/views/indexjs.ejs +2 -0
- package/lib/views/zgenerator/views/preview.ejs +34 -0
- package/lib/views/zgenerator/views/update.ejs +7 -0
- package/lib/views/zgenerator/views/updatejs.ejs +16 -0
- package/lib/views/zgenerator/views/view.ejs +36 -0
- package/lib/zGeneratorRouter.js +46 -22
- package/lib/zRoute.js +14 -3
- package/package.json +1 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
const router = require('express').Router();
|
|
2
|
+
const csrf = require('csurf');
|
|
3
|
+
const csrfProtection = csrf({cookie: true});
|
|
4
|
+
const {Util, access, connection, moduleLib, zDebug, zRoute, zRole, zDataTable, zForm} = require('zet-lib');
|
|
5
|
+
const MYMODEL = require('./../models/[[[TABLE_NAME]]]');
|
|
6
|
+
|
|
7
|
+
router.get('/', async (req, res) => {
|
|
8
|
+
await zRoute.attributeData(res, MYMODEL);
|
|
9
|
+
let dataTable = new zDataTable(res.locals);
|
|
10
|
+
dataTable.filterMODEL = await zRoute.dataTableFilterSync(req,res, MYMODEL, res.locals.gridFilter);
|
|
11
|
+
const levels = zRole.myLevel(req, res, MYMODEL.table);
|
|
12
|
+
dataTable.levels = levels;
|
|
13
|
+
res.render(`layouts/${layout}`, {
|
|
14
|
+
dataTable: dataTable,
|
|
15
|
+
levels : levels,
|
|
16
|
+
titleHeader: `<strong class="text text-info">${MYMODEL.title}</strong>`,
|
|
17
|
+
breadcrumb : zForm.breadcrumbIndex(),
|
|
18
|
+
myModal : zForm.modal({
|
|
19
|
+
attributeData: res.locals.attributeData,
|
|
20
|
+
visibles: res.locals.visibles,
|
|
21
|
+
invisibles: res.locals.invisibles,
|
|
22
|
+
routeName: MYMODEL.table,
|
|
23
|
+
}, LANGUAGE),
|
|
24
|
+
renderHead: `${MYMODEL.routeName}/indexcss.ejs`,
|
|
25
|
+
renderBody: `${MYMODEL.routeName}/index.ejs`,
|
|
26
|
+
renderEnd: `${MYMODEL.routeName}/indexjs.ejs`
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
router.post('/list', async (req, res) => {
|
|
31
|
+
const data = await zRoute.listData(req, res, MYMODEL, zRole);
|
|
32
|
+
res.json(data);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
router.get('/create', csrfProtection, async(req, res) => {
|
|
36
|
+
let data = MYMODEL.datas;
|
|
37
|
+
const zForms = await zRoute.formsFieldSync(req, res, MYMODEL, data);
|
|
38
|
+
res.render(`layouts/${layout}`, {
|
|
39
|
+
data: data,
|
|
40
|
+
zForms: zForms,
|
|
41
|
+
titleHeader: `${LANGUAGE['form_create']} : <strong><a href="/${MYMODEL.routeName}">${MYMODEL.title}</a></strong>`,
|
|
42
|
+
csrfToken: req.csrfToken(),
|
|
43
|
+
breadcrumb : zForm.breadcrumbCreate(MYMODEL.routeName),
|
|
44
|
+
renderBody: `${MYMODEL.routeName}/create.ejs`,
|
|
45
|
+
renderEnd: `${MYMODEL.routeName}/createjs.ejs`
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
router.post('/create', csrfProtection, async (req, res) => {
|
|
50
|
+
let json = Util.jsonSuccess(LANGUAGE['data_saved']);
|
|
51
|
+
try {
|
|
52
|
+
let data = zRoute.post(req,res, MYMODEL)[MYMODEL.routeName];
|
|
53
|
+
const validator = zRoute.validator(data, MYMODEL);
|
|
54
|
+
if(validator.status == 0) return res.json(validator.message);
|
|
55
|
+
const result = await zRoute.insertSQL(req, res, MYMODEL.table, data);
|
|
56
|
+
json.data=result;
|
|
57
|
+
} catch (err) {
|
|
58
|
+
if(Object.hasOwn(err,"sqlMessage")){
|
|
59
|
+
json = Util.flashError(err.sqlMessage);
|
|
60
|
+
} else {
|
|
61
|
+
json = Util.flashError(err.toString());
|
|
62
|
+
}
|
|
63
|
+
zDebug(req, res, err);
|
|
64
|
+
}
|
|
65
|
+
res.json(json);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
router.get('/update/:id', csrfProtection, async (req, res) => {
|
|
69
|
+
const id = parseInt(req.params.id);
|
|
70
|
+
const results = await connection.results({
|
|
71
|
+
select:zRoute.selectData(MYMODEL),
|
|
72
|
+
table: MYMODEL.table,
|
|
73
|
+
where: {
|
|
74
|
+
id: id,
|
|
75
|
+
company_id: res.locals.companyId
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
if (results.length == 0) {
|
|
79
|
+
req.session.sessionFlash = Util.flashError(LANGUAGE['data_not_found']);
|
|
80
|
+
return res.redirect('/' + MYMODEL.routeName);
|
|
81
|
+
}
|
|
82
|
+
let data = results[0];
|
|
83
|
+
const zForms = await zRoute.formsFieldSync(req, res, MYMODEL, data);
|
|
84
|
+
res.render(`layouts/${layout}`, {
|
|
85
|
+
data: data,
|
|
86
|
+
zForms: zForms,
|
|
87
|
+
titleHeader: `${LANGUAGE['form_update']} : <strong><a href="/${MYMODEL.routeName}">${MYMODEL.title}</a></strong>`,
|
|
88
|
+
csrfToken: req.csrfToken(),
|
|
89
|
+
breadcrumb : zForm.breadcrumbUpdate(MYMODEL.routeName, id),
|
|
90
|
+
renderBody: `${MYMODEL.routeName}/update.ejs`,
|
|
91
|
+
renderEnd: `${MYMODEL.routeName}/updatejs.ejs`,
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
router.post('/update/:id', csrfProtection, async (req, res) => {
|
|
96
|
+
let json = Util.jsonSuccess(LANGUAGE['data_saved']);
|
|
97
|
+
try {
|
|
98
|
+
const id = parseInt(req.params.id);
|
|
99
|
+
let data = zRoute.post(req,res, MYMODEL)[MYMODEL.routeName];
|
|
100
|
+
const validator = zRoute.validator(data, MYMODEL);
|
|
101
|
+
if(validator.status == 0) return res.json(validator.message);
|
|
102
|
+
const result = await zRoute.updateSQL(req, res,MYMODEL.table, data, {id:id});
|
|
103
|
+
json.data=result;
|
|
104
|
+
} catch (err) {
|
|
105
|
+
console.log(err)
|
|
106
|
+
if(Object.hasOwn(err,"sqlMessage")){
|
|
107
|
+
json = Util.flashError(err.sqlMessage);
|
|
108
|
+
} else {
|
|
109
|
+
json = Util.flashError(err.toString());
|
|
110
|
+
}
|
|
111
|
+
zDebug(req, res, err)
|
|
112
|
+
}
|
|
113
|
+
res.json(json);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
router.delete('/delete', async (req, res) => {
|
|
117
|
+
const id = req.body.id;
|
|
118
|
+
let json = Util.jsonSuccess(LANGUAGE['data_delete']);
|
|
119
|
+
try {
|
|
120
|
+
await zRoute.deleteSQL(MYMODEL.table, id, res.locals.companyId);
|
|
121
|
+
} catch (err) {
|
|
122
|
+
json = Util.flashError(err.toString());
|
|
123
|
+
zDebug(req, res, err)
|
|
124
|
+
}
|
|
125
|
+
res.json(json);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
router.get('/view/:id', async (req, res) => {
|
|
129
|
+
await zRoute.attributeData(res, MYMODEL);
|
|
130
|
+
const id = req.params.id;
|
|
131
|
+
let data = {};
|
|
132
|
+
let zForms = {};
|
|
133
|
+
try {
|
|
134
|
+
const results = await connection.results({select:zRoute.selectData(MYMODEL),table:MYMODEL.table,where:{id:id}});
|
|
135
|
+
if (results.length == 0) {
|
|
136
|
+
req.session.sessionFlash = Util.flashError(LANGUAGE['data_not_found']);
|
|
137
|
+
return res.redirect('/' + MYMODEL.routeName);
|
|
138
|
+
}
|
|
139
|
+
data = results[0];
|
|
140
|
+
zForms = await zRoute.viewFormsSync(req, res, MYMODEL, data);
|
|
141
|
+
} catch (err){
|
|
142
|
+
zDebug(req, res, err);
|
|
143
|
+
res.send("Err");
|
|
144
|
+
}
|
|
145
|
+
res.render(`layouts/${layout}`, {
|
|
146
|
+
data: data,
|
|
147
|
+
Util:Util,
|
|
148
|
+
zForms:zForms,
|
|
149
|
+
titleHeader: `View : <strong><a href="/${MYMODEL.routeName}">${MYMODEL.title}</a></strong>`,
|
|
150
|
+
breadcrumb : zForm.breadcrumbView(MYMODEL.routeName),
|
|
151
|
+
levels: zRole.myLevel(req, res, MYMODEL.table),
|
|
152
|
+
renderBody: `${MYMODEL.routeName}/view.ejs`
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
router.get('/excel-query', async (req,res) => {
|
|
157
|
+
await zRoute.excelQuery(req, res, MYMODEL);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
router.get('/excel', async (req, res) => {
|
|
161
|
+
const fields = MYMODEL.keysExcel;
|
|
162
|
+
const results = await connection.results({
|
|
163
|
+
table: MYMODEL.table,
|
|
164
|
+
where: {company_id: res.locals.companyId},
|
|
165
|
+
orderBy: ['id', 'DESC']
|
|
166
|
+
});
|
|
167
|
+
await zRoute.excel(req, res, MYMODEL, fields, results);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
router.get('/sample', async (req, res) => {
|
|
171
|
+
let fields = [];
|
|
172
|
+
for (let i = 0; i < MYMODEL.keysExcel.length; i++) {
|
|
173
|
+
if (!Util.in_array(MYMODEL.keysExcel[i], Util.nots)) {
|
|
174
|
+
fields.push(MYMODEL.keysExcel[i]);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const results = await connection.results({
|
|
178
|
+
table:MYMODEL.table,
|
|
179
|
+
where:{
|
|
180
|
+
company_id:res.locals.companyId
|
|
181
|
+
},
|
|
182
|
+
orderBy:["id","desc"], limit:10
|
|
183
|
+
});
|
|
184
|
+
let callback=(result,field)=> {
|
|
185
|
+
return MYMODEL.widgets[field] && MYMODEL.widgets[field].name == 'datepicker' ? Util.dateSql(result[field]) : result[field];
|
|
186
|
+
};
|
|
187
|
+
await zRoute.excel(req, res, MYMODEL, fields, results, callback);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
router.get('/import',csrfProtection, async (req, res) => {
|
|
191
|
+
const room = res.locals.token;
|
|
192
|
+
res.render(`layouts/${layout}`, {
|
|
193
|
+
room: room,
|
|
194
|
+
titleHeader: `Import / Upload data : <strong><a href="/${MYMODEL.routeName}">${MYMODEL.title}</a></strong>`,
|
|
195
|
+
csrfToken: req.csrfToken(),
|
|
196
|
+
breadcrumb : zForm.breadcrumbImport(MYMODEL.routeName),
|
|
197
|
+
renderBody: `${MYMODEL.routeName}/import.ejs`,
|
|
198
|
+
renderEnd: `${MYMODEL.routeName}/importjs.ejs`
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
router.post('/import', async(req, res) => {
|
|
204
|
+
res.json(await zRoute.import(req,res,MYMODEL));
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
router.get('/approval/:id', async (req, res) => {
|
|
208
|
+
await zRoute.attributeData(res, MYMODEL);
|
|
209
|
+
const id = req.params.id;
|
|
210
|
+
let data = {};
|
|
211
|
+
let data2 = {};
|
|
212
|
+
let zForms = {};
|
|
213
|
+
let zForms2 = {};
|
|
214
|
+
let result = {};
|
|
215
|
+
try {
|
|
216
|
+
result = await connection.result({table: MYMODEL.table, where: {id: id}});
|
|
217
|
+
if (!result.id) {
|
|
218
|
+
req.session.sessionFlash = Util.flashError(LANGUAGE['data_not_found']);
|
|
219
|
+
return res.redirect('/' + MYMODEL.routeName);
|
|
220
|
+
}
|
|
221
|
+
data=result;
|
|
222
|
+
moduleLib.editor(req, res);
|
|
223
|
+
zForms = await zRoute.viewFormsSync(req, res, MYMODEL, result);
|
|
224
|
+
const contentScript = `$("#submit_draft").on("click", function () {$("#status").val(1);ajaxPost("/zzapproval",$("#form-group").serializeArray(), function (data) {
|
|
225
|
+
if (data.status == 0) {
|
|
226
|
+
toastr.error(data.message, data.title);
|
|
227
|
+
} else {
|
|
228
|
+
toastr.success(data.title, data.message);
|
|
229
|
+
}
|
|
230
|
+
});});
|
|
231
|
+
$("#submit").on("click", function () {
|
|
232
|
+
$('[name="zapprovals[status]"]').val(2);
|
|
233
|
+
ajaxPost("/zzapproval",$("#form-group").serializeArray(), function (data) {
|
|
234
|
+
if (data.status == 0) {
|
|
235
|
+
toastr.error(data.message, data.title);
|
|
236
|
+
} else {
|
|
237
|
+
toastr.success(data.title, data.message);
|
|
238
|
+
location.href = "";
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
`;
|
|
243
|
+
await moduleLib.addScript(req, res, contentScript);
|
|
244
|
+
const MODEL_APROVALS = require("./../models/zapprovals");
|
|
245
|
+
const rows = await connection.results({
|
|
246
|
+
table: "zapprovals",
|
|
247
|
+
where: {table: MYMODEL.table, company_id: res.locals.companyId, id_data: id}
|
|
248
|
+
});
|
|
249
|
+
if (rows.length) {
|
|
250
|
+
data2 = rows[0];
|
|
251
|
+
} else {
|
|
252
|
+
let obj = {};
|
|
253
|
+
obj.token = Util.uuid();
|
|
254
|
+
obj.status = 1;
|
|
255
|
+
obj.table = MYMODEL.table;
|
|
256
|
+
obj.company_id = res.locals.companyId;
|
|
257
|
+
obj.id_data = id;
|
|
258
|
+
obj.created_by = res.locals.userId;
|
|
259
|
+
obj.updated_by = res.locals.userId;
|
|
260
|
+
obj.created_at = Util.now();
|
|
261
|
+
let zfields = await connection.result({table: "zfields", where: {table: MYMODEL.table}});
|
|
262
|
+
let jsonApproval = zfields.approval_json || {}
|
|
263
|
+
obj.template = jsonApproval.content || {}
|
|
264
|
+
let title = jsonApproval.title;
|
|
265
|
+
if (title) {
|
|
266
|
+
let titleData = title;
|
|
267
|
+
for (var key in data) {
|
|
268
|
+
titleData = Util.replaceAll(titleData, "{{" + key + "}}", data[key])
|
|
269
|
+
}
|
|
270
|
+
obj.title = titleData
|
|
271
|
+
}
|
|
272
|
+
if (jsonApproval.hasOwnProperty("approvers")) {
|
|
273
|
+
obj.approvers = JSON.stringify(jsonApproval.approvers);
|
|
274
|
+
obj.knowings = JSON.stringify(jsonApproval.knowings);
|
|
275
|
+
obj.type = 1;
|
|
276
|
+
}
|
|
277
|
+
//insert default data
|
|
278
|
+
await connection.insert({table: "zapprovals", data: obj});
|
|
279
|
+
data2 = obj;
|
|
280
|
+
}
|
|
281
|
+
zForms2 = await zRoute.formsFieldSync(req, res, MODEL_APROVALS, data2);
|
|
282
|
+
} catch (err) {
|
|
283
|
+
zDebug(req, res, err);
|
|
284
|
+
res.send("Err");
|
|
285
|
+
}
|
|
286
|
+
res.render(`layouts/${layout}`, {
|
|
287
|
+
zForms: zForms,
|
|
288
|
+
zForms2: zForms2,
|
|
289
|
+
data: result,
|
|
290
|
+
result:result,
|
|
291
|
+
data2: data2,
|
|
292
|
+
Util: Util,
|
|
293
|
+
levels: zRole.myLevel(req, res, MYMODEL.table),
|
|
294
|
+
breadcrumb : zForm.breadcrumbApproval(MYMODEL.routeName, id),
|
|
295
|
+
renderBody: `${MYMODEL.routeName}/approval.ejs`
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
router.get('/preview/:token', async (req, res) => {
|
|
300
|
+
let token = req.params.token;
|
|
301
|
+
let data = {}, data2 = {};
|
|
302
|
+
let template = "";
|
|
303
|
+
let footers = "";
|
|
304
|
+
try {
|
|
305
|
+
let zfields = await connection.result({table: "zfields", where: {table: MYMODEL.table}});
|
|
306
|
+
let jsonApproval = zfields.approval_json || {}
|
|
307
|
+
let mytemplate = jsonApproval.content || {}
|
|
308
|
+
let results = await connection.results({table: "zapprovals", where: {token: token}});
|
|
309
|
+
if (results.length == 0) {
|
|
310
|
+
req.session.sessionFlash = Util.flashError(LANGUAGE['data_not_found']);
|
|
311
|
+
return res.redirect('/' + MYMODEL.routeName);
|
|
312
|
+
}
|
|
313
|
+
if(results[0].status == 1){
|
|
314
|
+
await connection.update({
|
|
315
|
+
table : "zapprovals",
|
|
316
|
+
data: {
|
|
317
|
+
template : mytemplate
|
|
318
|
+
},
|
|
319
|
+
where : {
|
|
320
|
+
token:token
|
|
321
|
+
}
|
|
322
|
+
})
|
|
323
|
+
results = await connection.results({table: "zapprovals", where: {token: token}});
|
|
324
|
+
}
|
|
325
|
+
let MYMODEL2 = require("./../models/zapprovals")
|
|
326
|
+
data = await zRoute.viewTable(req, res, MYMODEL2, results[0], true);
|
|
327
|
+
let row = await connection.result({table: results[0].table, where: {id: results[0].id_data}});
|
|
328
|
+
data2 = await zRoute.viewTable(req, res, MYMODEL, row, true);
|
|
329
|
+
template = data.template;
|
|
330
|
+
let title = data.title || ""
|
|
331
|
+
for (var key in data2) {
|
|
332
|
+
template = Util.replaceAll(template, "{{" + key + "}}", data2[key])
|
|
333
|
+
title = Util.replaceAll(title, "{{" + key + "}}", data2[key])
|
|
334
|
+
}
|
|
335
|
+
data.title = title;
|
|
336
|
+
var details = await connection.results({table: "zapprovals_details", where: {title_id: results[0].id}});
|
|
337
|
+
if (details.length) {
|
|
338
|
+
footers = await zRoute.approversFooter(details);
|
|
339
|
+
}
|
|
340
|
+
} catch (err) {
|
|
341
|
+
zDebug(req, res, err);
|
|
342
|
+
res.send("Err");
|
|
343
|
+
}
|
|
344
|
+
res.render(`layouts/blank`, {
|
|
345
|
+
template: template,
|
|
346
|
+
data: data,
|
|
347
|
+
footers: footers,
|
|
348
|
+
Util: Util,
|
|
349
|
+
details: details,
|
|
350
|
+
renderBody: 'index/zapprovals_preview.ejs'
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
router.post('/grid', access, zRoute.postGrid);
|
|
355
|
+
router.post('/reload', access, zRoute.postGridReload);
|
|
356
|
+
router.post('/chains', access, zRoute.chains);
|
|
357
|
+
router.post('/get_attributes',access, zRoute.getAttributes);
|
|
358
|
+
|
|
359
|
+
module.exports = router;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<form id="form-group" method="post" action="" class="boxy" enctype="multipart/form-data" [[[NO_VALI_DATE_NOVALIDATE]]] >
|
|
2
|
+
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
|
|
3
|
+
<div class="page-header">
|
|
4
|
+
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
[[[GENERATE_FORM]]]
|
|
8
|
+
|
|
9
|
+
<div class="row">
|
|
10
|
+
<div class="col-md-12">
|
|
11
|
+
<br>
|
|
12
|
+
<button id="form-submit" type="submit" class="btn btn btn-success boxy image-button ">
|
|
13
|
+
<img src="/assets/icons/send.svg" class="icons-bg-white"> <span><%- LANGUAGE['submit'] %></span>
|
|
14
|
+
</button>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="row">
|
|
19
|
+
<div class="col-md-12">
|
|
20
|
+
<br>
|
|
21
|
+
<p class="text-muted"><strong>*</strong> <%- LANGUAGE['required_not_empty'] %></p>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
</form>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<%- breadcrumb %>
|
|
2
|
+
<div class="page-header">
|
|
3
|
+
<h2>Approvals</h2>
|
|
4
|
+
</div>
|
|
5
|
+
<p> </p>
|
|
6
|
+
<form id="form-group" method="post" action="" class="boxy" enctype="multipart/form-data" [[[NO_VALI_DATE_NOVALIDATE]]] >
|
|
7
|
+
|
|
8
|
+
<div class="container">
|
|
9
|
+
[[[GENERATE_VIEW]]]
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<input type="hidden" name="zapprovals[table]" value="<%- routeName %>">
|
|
13
|
+
<input type="hidden" name="zapprovals[id_data]" value="<%- result.id%>">
|
|
14
|
+
<input type="hidden" name="zapprovals[status]" id="status" value="1">
|
|
15
|
+
<input type="hidden" name="zapprovals[token]" value="<%- data2.token%>">
|
|
16
|
+
<div class="boxy mt-3">
|
|
17
|
+
<div class="row">
|
|
18
|
+
<div class="col-md-6">
|
|
19
|
+
<%- zForms2.build["title"] %>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="col-md-6">
|
|
22
|
+
<%- zForms2.build["type"] %>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="row">
|
|
26
|
+
<div class="col-md-12">
|
|
27
|
+
<%- zForms2.build["approvers"] %>
|
|
28
|
+
<%- zForms2.build["knowings"] %>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="row">
|
|
32
|
+
<div class="col-md-12">
|
|
33
|
+
<br>
|
|
34
|
+
<a id="submit_preview" target="_blank" href="/<%- routeName%>/preview/<%- data2.token%>" class="btn btn-block boxy btn-warning"><span class="fa fa-paper-plane"></span> Preview</a>
|
|
35
|
+
<% if(data2.status < 2) {%>
|
|
36
|
+
<button id="submit_draft" type="button" class="btn btn-block boxy btn-primary"><span class="fa fa-paper-plane"></span> Save as Draft</button>
|
|
37
|
+
<button id="submit" type="button" class="btn btn-block boxy btn-success"><span class="fa fa-paper-plane"></span> Submit</button>
|
|
38
|
+
<%}%>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</form>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
submitForm('form-group', '', '', function (data) {
|
|
3
|
+
if(data.status == 1) {
|
|
4
|
+
location.href = `/<%- routeName%>/view/${data.data.id}`;
|
|
5
|
+
}
|
|
6
|
+
});
|
|
7
|
+
$(window).keydown(function(event){
|
|
8
|
+
if((event.keyCode == 13)) {
|
|
9
|
+
var eltarget = $(event.target);
|
|
10
|
+
if(eltarget.attr("type") == "input") {
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
</script>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<%- breadcrumb %>
|
|
2
|
+
|
|
3
|
+
<div class="page-header">
|
|
4
|
+
<h3 class="mb-3"><%- titleHeader %></h3>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<form id="form-import" method="post" enctype="multipart/form-data" class="boxy">
|
|
8
|
+
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
|
|
9
|
+
<div class="row">
|
|
10
|
+
<div class="col-md-10">
|
|
11
|
+
<p> </p>
|
|
12
|
+
<div class="form-group mb-3">
|
|
13
|
+
<label class="control-label col-md-4" for="file"><%- LANGUAGE['form_label_excel_file']%></label>
|
|
14
|
+
<div class="col-md-10">
|
|
15
|
+
<input type="file" required id="file" name="excel" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" class="form-control">
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="row">
|
|
21
|
+
<div class="col-md-10 col-md-offset-1">
|
|
22
|
+
<p> </p>
|
|
23
|
+
<button id="form-submit" type="submit" class="btn btn btn-success boxy image-button ">
|
|
24
|
+
<img src="/assets/icons/upload.svg" class="icons-bg-white"> <%- LANGUAGE['upload']%>
|
|
25
|
+
</button>
|
|
26
|
+
 
|
|
27
|
+
<p> </p>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="container">
|
|
32
|
+
<h3><%- LANGUAGE['import_results']%>:</h3>
|
|
33
|
+
<div class="results"></div>
|
|
34
|
+
<div class="row">
|
|
35
|
+
<div class="col-md-12">
|
|
36
|
+
<div class="table-responsive">
|
|
37
|
+
<table class="table table-sm table-striped" id="resultsforimport">
|
|
38
|
+
|
|
39
|
+
</table>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
</form>
|
|
45
|
+
|
|
46
|
+
<hr>
|
|
47
|
+
<div class="row">
|
|
48
|
+
<div class="col-md-10"> <%- LANGUAGE['import_example']%> : <a id="sample-parsing" href="/<%- routeName%>/sample">sample.xlsx</a></div>
|
|
49
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<div class=""> <%- breadcrumb %>
|
|
2
|
+
<div class="page-header"><h3><%- titleHeader %></h3></div>
|
|
3
|
+
<div class="gridbox">
|
|
4
|
+
<div class="row">
|
|
5
|
+
<div class="float"> <%- dataTable.buttons2 %> </div>
|
|
6
|
+
<div style="padding-top:7px"></div>
|
|
7
|
+
</div> <%- dataTable.table %> </div>
|
|
8
|
+
</div>
|
|
9
|
+
<%- myModal %>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<nav class="navbar navbar-expand-lg navbar-light bg-danger fixed-top" style="color:white" >
|
|
2
|
+
<div class="container-fluid">
|
|
3
|
+
<a class="navbar-brand" href="#"><img src="/img/logo.png" width="80"> </a>
|
|
4
|
+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
|
5
|
+
<span class="navbar-toggler-icon"></span>
|
|
6
|
+
</button>
|
|
7
|
+
|
|
8
|
+
<div class=" navbar-collapse justify-content-center" >
|
|
9
|
+
<h2><%- data.title%></h2>
|
|
10
|
+
<p><%- data.status%></p>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="collapse navbar-collapse justify-content-end" id="navbarSupportedContent">
|
|
14
|
+
<ul class="nav justify-content-end">
|
|
15
|
+
<li class="nav-item">
|
|
16
|
+
<a class="nav-link active" style="color:white" aria-current="page" href="#">Document</a>
|
|
17
|
+
</li>
|
|
18
|
+
<li class="nav-item">
|
|
19
|
+
<a class="nav-link" style="color:white" href="/dashboard">Home</a>
|
|
20
|
+
</li>
|
|
21
|
+
<li class="nav-item">
|
|
22
|
+
<a class="nav-link" style="color:white" href="<%- routeName%>">Module</a>
|
|
23
|
+
</li>
|
|
24
|
+
</ul>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</nav>
|
|
28
|
+
<div class="container" style="margin-top: 100px;">
|
|
29
|
+
<%- template %>
|
|
30
|
+
<p> </p>
|
|
31
|
+
<%- footers %>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<p></p>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
submitForm('form-group', '', '', function (data) {
|
|
3
|
+
if(data.status == 1) {
|
|
4
|
+
location.href = `/<%- routeName%>/view/${data.data.id}`;
|
|
5
|
+
}
|
|
6
|
+
});
|
|
7
|
+
$(window).keydown(function(event){
|
|
8
|
+
if((event.keyCode == 13)) {
|
|
9
|
+
var eltarget = $(event.target);
|
|
10
|
+
if(eltarget.attr("type") == "input") {
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
</script>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<%- breadcrumb %>
|
|
2
|
+
|
|
3
|
+
<div class="page-header">
|
|
4
|
+
<h3 class="mb-3"><%- titleHeader %> - <%= data.id %></h3>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
<div class="row">
|
|
8
|
+
<div class="col-md-6">
|
|
9
|
+
</div>
|
|
10
|
+
<div class="col-md-6">
|
|
11
|
+
<div class="btn-group float-end" role="group" aria-label="button">
|
|
12
|
+
<% if(levels.update && !data.lock){ %>
|
|
13
|
+
<a class="btn btn-primary image-button btn-rounded dimens2x" href="/<%- routeName%>/update/<%= data.id %>">
|
|
14
|
+
<img src="/assets/icons/pencil.svg" class="icons-bg-white" alt="Update">
|
|
15
|
+
<span><%- LANGUAGE['update']%></span>
|
|
16
|
+
</a>
|
|
17
|
+
<% } %>
|
|
18
|
+
<% if(levels.delete && !data.lock){ %>
|
|
19
|
+
<button class="btn btn-danger image-button btn-rounded dimens2x" id="<%- routeName %>-delete" data-id="<%= data.id %>">
|
|
20
|
+
<img src="/assets/icons/trash.svg" class="icons-bg-white" alt="Delete">
|
|
21
|
+
<span><%- LANGUAGE['delete'] %></span>
|
|
22
|
+
</button>
|
|
23
|
+
<% } %>
|
|
24
|
+
<% if(levels.create){ %>
|
|
25
|
+
<a class="btn btn-success image-button btn-rounded dimens2x" href="/<%- routeName%>/create">
|
|
26
|
+
<img src="/assets/icons/plus.svg" class="icons-bg-white" alt="<%- LANGUAGE['create']%>">
|
|
27
|
+
<span><%- LANGUAGE['create']%></span>
|
|
28
|
+
</a>
|
|
29
|
+
<% } %>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
<p> </p>
|
|
34
|
+
<div class="boxy">
|
|
35
|
+
[[[GENERATE_VIEW]]]
|
|
36
|
+
</div>
|