@saltcorn/server 0.6.2-beta.1 → 0.6.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app.js +9 -13
- package/auth/admin.js +5 -22
- package/auth/roleadmin.js +6 -16
- package/auth/routes.js +23 -52
- package/locales/en.json +20 -1
- package/markup/admin.js +17 -0
- package/package.json +15 -8
- package/public/saltcorn.css +2 -2
- package/restart_watcher.js +11 -2
- package/routes/actions.js +1 -15
- package/routes/admin.js +6 -23
- package/routes/api.js +51 -60
- package/routes/config.js +0 -1
- package/routes/crashlog.js +1 -4
- package/routes/delete.js +1 -2
- package/routes/edit.js +1 -2
- package/routes/eventlog.js +2 -15
- package/routes/events.js +0 -1
- package/routes/fields.js +1 -9
- package/routes/files.js +144 -64
- package/routes/homepage.js +3 -0
- package/routes/infoarch.js +12 -19
- package/routes/library.js +1 -4
- package/routes/list.js +2 -5
- package/routes/menu.js +6 -8
- package/routes/packs.js +2 -8
- package/routes/page.js +1 -7
- package/routes/pageedit.js +18 -30
- package/routes/plugins.js +21 -34
- package/routes/scapi.js +155 -184
- package/routes/search.js +6 -10
- package/routes/settings.js +1 -2
- package/routes/tables.js +1 -22
- package/routes/tenant.js +1 -9
- package/routes/utils.js +19 -19
- package/routes/view.js +7 -5
- package/routes/viewedit.js +18 -29
- package/s3storage.js +167 -0
package/routes/events.js
CHANGED
package/routes/fields.js
CHANGED
|
@@ -22,7 +22,7 @@ const {
|
|
|
22
22
|
} = require("@saltcorn/data/models/expression");
|
|
23
23
|
const db = require("@saltcorn/data/db");
|
|
24
24
|
|
|
25
|
-
const {
|
|
25
|
+
const { isAdmin, error_catcher } = require("./utils.js");
|
|
26
26
|
const expressionBlurb = require("../markup/expression_blurb");
|
|
27
27
|
const { readState } = require("@saltcorn/data/plugin-helper");
|
|
28
28
|
const { wizardCardTitle } = require("../markup/forms.js");
|
|
@@ -419,7 +419,6 @@ const fieldFlow = (req) =>
|
|
|
419
419
|
*/
|
|
420
420
|
router.get(
|
|
421
421
|
"/:id",
|
|
422
|
-
setTenant,
|
|
423
422
|
isAdmin,
|
|
424
423
|
error_catcher(async (req, res) => {
|
|
425
424
|
const { id } = req.params;
|
|
@@ -472,7 +471,6 @@ router.get(
|
|
|
472
471
|
*/
|
|
473
472
|
router.get(
|
|
474
473
|
"/new/:table_id",
|
|
475
|
-
setTenant,
|
|
476
474
|
isAdmin,
|
|
477
475
|
error_catcher(async (req, res) => {
|
|
478
476
|
const { table_id } = req.params;
|
|
@@ -509,7 +507,6 @@ router.get(
|
|
|
509
507
|
*/
|
|
510
508
|
router.post(
|
|
511
509
|
"/delete/:id",
|
|
512
|
-
setTenant,
|
|
513
510
|
isAdmin,
|
|
514
511
|
error_catcher(async (req, res) => {
|
|
515
512
|
const { id } = req.params;
|
|
@@ -535,7 +532,6 @@ router.post(
|
|
|
535
532
|
*/
|
|
536
533
|
router.post(
|
|
537
534
|
"/",
|
|
538
|
-
setTenant,
|
|
539
535
|
isAdmin,
|
|
540
536
|
error_catcher(async (req, res) => {
|
|
541
537
|
const wf = fieldFlow(req);
|
|
@@ -584,7 +580,6 @@ router.post(
|
|
|
584
580
|
*/
|
|
585
581
|
router.post(
|
|
586
582
|
"/test-formula",
|
|
587
|
-
setTenant,
|
|
588
583
|
isAdmin,
|
|
589
584
|
error_catcher(async (req, res) => {
|
|
590
585
|
const { formula, tablename, stored } = req.body;
|
|
@@ -622,7 +617,6 @@ router.post(
|
|
|
622
617
|
*/
|
|
623
618
|
router.post(
|
|
624
619
|
"/show-calculated/:tableName/:fieldName/:fieldview",
|
|
625
|
-
setTenant,
|
|
626
620
|
isAdmin,
|
|
627
621
|
error_catcher(async (req, res) => {
|
|
628
622
|
const { tableName, fieldName, fieldview } = req.params;
|
|
@@ -657,7 +651,6 @@ router.post(
|
|
|
657
651
|
*/
|
|
658
652
|
router.post(
|
|
659
653
|
"/preview/:tableName/:fieldName/:fieldview",
|
|
660
|
-
setTenant,
|
|
661
654
|
isAdmin,
|
|
662
655
|
error_catcher(async (req, res) => {
|
|
663
656
|
const { tableName, fieldName, fieldview } = req.params;
|
|
@@ -722,7 +715,6 @@ router.post(
|
|
|
722
715
|
*/
|
|
723
716
|
router.post(
|
|
724
717
|
"/preview/:tableName/:fieldName/",
|
|
725
|
-
setTenant,
|
|
726
718
|
isAdmin,
|
|
727
719
|
error_catcher(async (req, res) => {
|
|
728
720
|
res.send("");
|
package/routes/files.js
CHANGED
|
@@ -8,6 +8,7 @@ const Router = require("express-promise-router");
|
|
|
8
8
|
const File = require("@saltcorn/data/models/file");
|
|
9
9
|
const User = require("@saltcorn/data/models/user");
|
|
10
10
|
const { getState } = require("@saltcorn/data/db/state");
|
|
11
|
+
const s3storage = require("../s3storage");
|
|
11
12
|
|
|
12
13
|
const {
|
|
13
14
|
mkTable,
|
|
@@ -16,7 +17,7 @@ const {
|
|
|
16
17
|
post_btn,
|
|
17
18
|
post_delete_btn,
|
|
18
19
|
} = require("@saltcorn/markup");
|
|
19
|
-
const {
|
|
20
|
+
const { isAdmin, error_catcher } = require("./utils.js");
|
|
20
21
|
const {
|
|
21
22
|
span,
|
|
22
23
|
h5,
|
|
@@ -37,6 +38,11 @@ const {
|
|
|
37
38
|
const { csrfField } = require("./utils");
|
|
38
39
|
const { editRoleForm, fileUploadForm } = require("../markup/forms.js");
|
|
39
40
|
const { strictParseInt } = require("@saltcorn/data/plugin-helper");
|
|
41
|
+
const {
|
|
42
|
+
send_files_page,
|
|
43
|
+
config_fields_form,
|
|
44
|
+
save_config_from_form,
|
|
45
|
+
} = require("../markup/admin");
|
|
40
46
|
|
|
41
47
|
/**
|
|
42
48
|
* @type {object}
|
|
@@ -49,9 +55,9 @@ const router = new Router();
|
|
|
49
55
|
module.exports = router;
|
|
50
56
|
|
|
51
57
|
/**
|
|
52
|
-
* @param {*} file
|
|
53
|
-
* @param {*} roles
|
|
54
|
-
* @param {*} req
|
|
58
|
+
* @param {*} file
|
|
59
|
+
* @param {*} roles
|
|
60
|
+
* @param {*} req
|
|
55
61
|
* @returns {Form}
|
|
56
62
|
*/
|
|
57
63
|
const editFileRoleForm = (file, roles, req) =>
|
|
@@ -70,61 +76,53 @@ const editFileRoleForm = (file, roles, req) =>
|
|
|
70
76
|
*/
|
|
71
77
|
router.get(
|
|
72
78
|
"/",
|
|
73
|
-
setTenant,
|
|
74
79
|
isAdmin,
|
|
75
80
|
error_catcher(async (req, res) => {
|
|
76
81
|
const rows = await File.find({}, { orderBy: "filename" });
|
|
77
82
|
const roles = await User.get_roles();
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
rows,
|
|
122
|
-
{ hover: true }
|
|
123
|
-
),
|
|
124
|
-
fileUploadForm(req),
|
|
125
|
-
],
|
|
126
|
-
},
|
|
127
|
-
],
|
|
83
|
+
send_files_page({
|
|
84
|
+
res,
|
|
85
|
+
req,
|
|
86
|
+
active_sub: "Files",
|
|
87
|
+
contents: {
|
|
88
|
+
type: "card",
|
|
89
|
+
contents: [
|
|
90
|
+
mkTable(
|
|
91
|
+
[
|
|
92
|
+
{
|
|
93
|
+
label: req.__("Filename"),
|
|
94
|
+
key: (r) =>
|
|
95
|
+
div(
|
|
96
|
+
{ "data-inline-edit-dest-url": `/files/setname/${r.id}` },
|
|
97
|
+
r.filename
|
|
98
|
+
),
|
|
99
|
+
},
|
|
100
|
+
{ label: req.__("Size (KiB)"), key: "size_kb", align: "right" },
|
|
101
|
+
{ label: req.__("Media type"), key: (r) => r.mimetype },
|
|
102
|
+
{
|
|
103
|
+
label: req.__("Role to access"),
|
|
104
|
+
key: (r) => editFileRoleForm(r, roles, req),
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
label: req.__("Link"),
|
|
108
|
+
key: (r) => link(`/files/serve/${r.id}`, req.__("Link")),
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
label: req.__("Download"),
|
|
112
|
+
key: (r) => link(`/files/download/${r.id}`, req.__("Download")),
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
label: req.__("Delete"),
|
|
116
|
+
key: (r) =>
|
|
117
|
+
post_delete_btn(`/files/delete/${r.id}`, req, r.filename),
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
rows,
|
|
121
|
+
{ hover: true }
|
|
122
|
+
),
|
|
123
|
+
fileUploadForm(req),
|
|
124
|
+
],
|
|
125
|
+
},
|
|
128
126
|
});
|
|
129
127
|
})
|
|
130
128
|
);
|
|
@@ -137,7 +135,6 @@ router.get(
|
|
|
137
135
|
*/
|
|
138
136
|
router.get(
|
|
139
137
|
"/download/:id",
|
|
140
|
-
setTenant,
|
|
141
138
|
error_catcher(async (req, res) => {
|
|
142
139
|
const role = req.isAuthenticated() ? req.user.role_id : 10;
|
|
143
140
|
const user_id = req.user && req.user.id;
|
|
@@ -145,7 +142,8 @@ router.get(
|
|
|
145
142
|
const file = await File.findOne({ id });
|
|
146
143
|
if (role <= file.min_role_read || (user_id && user_id === file.user_id)) {
|
|
147
144
|
res.type(file.mimetype);
|
|
148
|
-
|
|
145
|
+
if (file.s3_store) s3storage.serveObject(file, res, true);
|
|
146
|
+
else res.download(file.location, file.filename);
|
|
149
147
|
} else {
|
|
150
148
|
req.flash("warning", req.__("Not authorized"));
|
|
151
149
|
res.redirect("/");
|
|
@@ -161,7 +159,6 @@ router.get(
|
|
|
161
159
|
*/
|
|
162
160
|
router.get(
|
|
163
161
|
"/serve/:id",
|
|
164
|
-
setTenant,
|
|
165
162
|
error_catcher(async (req, res) => {
|
|
166
163
|
const role = req.isAuthenticated() ? req.user.role_id : 10;
|
|
167
164
|
const user_id = req.user && req.user.id;
|
|
@@ -181,7 +178,8 @@ router.get(
|
|
|
181
178
|
res.type(file.mimetype);
|
|
182
179
|
const cacheability = file.min_role_read === 10 ? "public" : "private";
|
|
183
180
|
res.set("Cache-Control", `${cacheability}, max-age=86400`);
|
|
184
|
-
|
|
181
|
+
if (file.s3_store) s3storage.serveObject(file, res, false);
|
|
182
|
+
else res.sendFile(file.location);
|
|
185
183
|
} else {
|
|
186
184
|
req.flash("warning", req.__("Not authorized"));
|
|
187
185
|
res.redirect("/");
|
|
@@ -197,7 +195,6 @@ router.get(
|
|
|
197
195
|
*/
|
|
198
196
|
router.post(
|
|
199
197
|
"/setrole/:id",
|
|
200
|
-
setTenant,
|
|
201
198
|
isAdmin,
|
|
202
199
|
error_catcher(async (req, res) => {
|
|
203
200
|
const { id } = req.params;
|
|
@@ -225,7 +222,6 @@ router.post(
|
|
|
225
222
|
*/
|
|
226
223
|
router.post(
|
|
227
224
|
"/setname/:id",
|
|
228
|
-
setTenant,
|
|
229
225
|
isAdmin,
|
|
230
226
|
error_catcher(async (req, res) => {
|
|
231
227
|
const { id } = req.params;
|
|
@@ -244,7 +240,6 @@ router.post(
|
|
|
244
240
|
*/
|
|
245
241
|
router.post(
|
|
246
242
|
"/upload",
|
|
247
|
-
setTenant,
|
|
248
243
|
error_catcher(async (req, res) => {
|
|
249
244
|
let jsonResp = {};
|
|
250
245
|
const min_role_upload = getState().getConfig("min_role_upload", 1);
|
|
@@ -297,12 +292,18 @@ router.post(
|
|
|
297
292
|
*/
|
|
298
293
|
router.post(
|
|
299
294
|
"/delete/:id",
|
|
300
|
-
setTenant,
|
|
301
295
|
isAdmin,
|
|
302
296
|
error_catcher(async (req, res) => {
|
|
303
297
|
const { id } = req.params;
|
|
304
298
|
const f = await File.findOne({ id });
|
|
305
|
-
|
|
299
|
+
if (!f) {
|
|
300
|
+
req.flash("error", "File not found");
|
|
301
|
+
res.redirect("/files");
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const result = await f.delete(
|
|
305
|
+
f.s3_store ? s3storage.unlinkObject : undefined
|
|
306
|
+
);
|
|
306
307
|
if (result && result.error) {
|
|
307
308
|
req.flash("error", result.error);
|
|
308
309
|
} else {
|
|
@@ -311,3 +312,82 @@ router.post(
|
|
|
311
312
|
res.redirect(`/files`);
|
|
312
313
|
})
|
|
313
314
|
);
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Storage settings form definition
|
|
318
|
+
* @param {object} req request
|
|
319
|
+
* @returns {Promise<Form>} form
|
|
320
|
+
*/
|
|
321
|
+
const storage_form = async (req) => {
|
|
322
|
+
const form = await config_fields_form({
|
|
323
|
+
req,
|
|
324
|
+
field_names: [
|
|
325
|
+
"storage_s3_enabled",
|
|
326
|
+
"storage_s3_bucket",
|
|
327
|
+
"storage_s3_path_prefix",
|
|
328
|
+
"storage_s3_endpoint",
|
|
329
|
+
"storage_s3_region",
|
|
330
|
+
"storage_s3_access_key",
|
|
331
|
+
"storage_s3_access_secret",
|
|
332
|
+
"storage_s3_secure",
|
|
333
|
+
],
|
|
334
|
+
action: "/files/storage",
|
|
335
|
+
});
|
|
336
|
+
form.submitButtonClass = "btn-outline-primary";
|
|
337
|
+
form.submitLabel = req.__("Save");
|
|
338
|
+
form.onChange = "remove_outline(this)";
|
|
339
|
+
return form;
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* @name get/storage
|
|
344
|
+
* @function
|
|
345
|
+
* @memberof module:routes/admin~routes/adminRouter
|
|
346
|
+
*/
|
|
347
|
+
router.get(
|
|
348
|
+
"/storage",
|
|
349
|
+
isAdmin,
|
|
350
|
+
error_catcher(async (req, res) => {
|
|
351
|
+
const form = await storage_form(req);
|
|
352
|
+
send_files_page({
|
|
353
|
+
res,
|
|
354
|
+
req,
|
|
355
|
+
active_sub: "Storage",
|
|
356
|
+
contents: {
|
|
357
|
+
type: "card",
|
|
358
|
+
title: req.__("Storage settings"),
|
|
359
|
+
contents: [renderForm(form, req.csrfToken())],
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
})
|
|
363
|
+
);
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* @name post/email
|
|
367
|
+
* @function
|
|
368
|
+
* @memberof module:routes/admin~routes/adminRouter
|
|
369
|
+
*/
|
|
370
|
+
router.post(
|
|
371
|
+
"/storage",
|
|
372
|
+
isAdmin,
|
|
373
|
+
error_catcher(async (req, res) => {
|
|
374
|
+
const form = await storage_form(req);
|
|
375
|
+
form.validate(req.body);
|
|
376
|
+
if (form.hasErrors) {
|
|
377
|
+
send_admin_page({
|
|
378
|
+
res,
|
|
379
|
+
req,
|
|
380
|
+
active_sub: "Storage",
|
|
381
|
+
contents: {
|
|
382
|
+
type: "card",
|
|
383
|
+
title: req.__("Storage settings"),
|
|
384
|
+
contents: [renderForm(form, req.csrfToken())],
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
} else {
|
|
388
|
+
await save_config_from_form(form);
|
|
389
|
+
req.flash("success", req.__("Storage settings updated"));
|
|
390
|
+
res.redirect("/files/storage");
|
|
391
|
+
}
|
|
392
|
+
})
|
|
393
|
+
);
|
package/routes/homepage.js
CHANGED
|
@@ -19,6 +19,7 @@ const { get_latest_npm_version } = require("@saltcorn/data/models/config");
|
|
|
19
19
|
const packagejson = require("../package.json");
|
|
20
20
|
const Trigger = require("@saltcorn/data/models/trigger");
|
|
21
21
|
const { fileUploadForm } = require("../markup/forms");
|
|
22
|
+
const { get_base_url } = require("./utils.js");
|
|
22
23
|
|
|
23
24
|
/**
|
|
24
25
|
* @param {*} tables
|
|
@@ -224,6 +225,8 @@ const usersTab = async (req, users, roleMap) => {
|
|
|
224
225
|
* @returns {Promise<div>}
|
|
225
226
|
*/
|
|
226
227
|
const actionsTab = async (req, triggers) => {
|
|
228
|
+
const base_url = get_base_url(req);
|
|
229
|
+
|
|
227
230
|
return div(
|
|
228
231
|
{ class: "pb-3" },
|
|
229
232
|
triggers.length <= 1 &&
|
package/routes/infoarch.js
CHANGED
|
@@ -35,7 +35,6 @@ module.exports = router;
|
|
|
35
35
|
*/
|
|
36
36
|
router.get(
|
|
37
37
|
"/",
|
|
38
|
-
setTenant,
|
|
39
38
|
isAdmin,
|
|
40
39
|
error_catcher(async (req, res) => {
|
|
41
40
|
res.redirect(`/menu`);
|
|
@@ -43,7 +42,7 @@ router.get(
|
|
|
43
42
|
);
|
|
44
43
|
|
|
45
44
|
/**
|
|
46
|
-
* @param {object} req
|
|
45
|
+
* @param {object} req
|
|
47
46
|
* @returns {Form}
|
|
48
47
|
*/
|
|
49
48
|
const languageForm = (req) =>
|
|
@@ -83,7 +82,6 @@ const languageForm = (req) =>
|
|
|
83
82
|
*/
|
|
84
83
|
router.get(
|
|
85
84
|
"/localizer",
|
|
86
|
-
setTenant,
|
|
87
85
|
isAdmin,
|
|
88
86
|
error_catcher(async (req, res) => {
|
|
89
87
|
const cfgLangs = getState().getConfig("localizer_languages");
|
|
@@ -111,13 +109,13 @@ router.get(
|
|
|
111
109
|
},
|
|
112
110
|
{
|
|
113
111
|
label: req.__("Default"),
|
|
114
|
-
key: r
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
112
|
+
key: (r) =>
|
|
113
|
+
!!r.is_default
|
|
114
|
+
? i({
|
|
115
|
+
class: "fas fa-check-circle text-success",
|
|
116
|
+
})
|
|
117
|
+
: "",
|
|
119
118
|
},
|
|
120
|
-
|
|
121
119
|
],
|
|
122
120
|
Object.values(cfgLangs)
|
|
123
121
|
),
|
|
@@ -143,7 +141,6 @@ router.get(
|
|
|
143
141
|
*/
|
|
144
142
|
router.get(
|
|
145
143
|
"/localizer/add-lang",
|
|
146
|
-
setTenant,
|
|
147
144
|
isAdmin,
|
|
148
145
|
error_catcher(async (req, res) => {
|
|
149
146
|
send_infoarch_page({
|
|
@@ -167,7 +164,6 @@ router.get(
|
|
|
167
164
|
*/
|
|
168
165
|
router.get(
|
|
169
166
|
"/localizer/edit/:lang",
|
|
170
|
-
setTenant,
|
|
171
167
|
isAdmin,
|
|
172
168
|
error_catcher(async (req, res) => {
|
|
173
169
|
const { lang } = req.params;
|
|
@@ -175,8 +171,8 @@ router.get(
|
|
|
175
171
|
const form = languageForm(req);
|
|
176
172
|
form.values = cfgLangs[lang];
|
|
177
173
|
const { is_default } = form.values;
|
|
178
|
-
const cfgStrings = getState().getConfig("localizer_strings",{});
|
|
179
|
-
const translation = cfgStrings[lang] || {}
|
|
174
|
+
const cfgStrings = getState().getConfig("localizer_strings", {});
|
|
175
|
+
const translation = cfgStrings[lang] || {};
|
|
180
176
|
const strings = getState()
|
|
181
177
|
.getStringsForI18n()
|
|
182
178
|
.map((s) => ({ in_default: s, translated: translation[s] || s }));
|
|
@@ -232,16 +228,14 @@ router.get(
|
|
|
232
228
|
*/
|
|
233
229
|
router.post(
|
|
234
230
|
"/localizer/save-string/:lang/:defstring",
|
|
235
|
-
setTenant,
|
|
236
231
|
isAdmin,
|
|
237
232
|
error_catcher(async (req, res) => {
|
|
238
233
|
const { lang, defstring } = req.params;
|
|
239
234
|
|
|
240
235
|
const cfgStrings = getState().getConfigCopy("localizer_strings");
|
|
241
|
-
if(cfgStrings[lang])
|
|
242
|
-
cfgStrings[lang][defstring]
|
|
243
|
-
|
|
244
|
-
await getState().setConfig("localizer_strings", cfgStrings)
|
|
236
|
+
if (cfgStrings[lang]) cfgStrings[lang][defstring] = text(req.body.value);
|
|
237
|
+
else cfgStrings[lang] = { [defstring]: text(req.body.value) };
|
|
238
|
+
await getState().setConfig("localizer_strings", cfgStrings);
|
|
245
239
|
res.redirect(`/site-structure/localizer/edit/${lang}`);
|
|
246
240
|
})
|
|
247
241
|
);
|
|
@@ -254,7 +248,6 @@ router.post(
|
|
|
254
248
|
*/
|
|
255
249
|
router.post(
|
|
256
250
|
"/localizer/save-lang",
|
|
257
|
-
setTenant,
|
|
258
251
|
isAdmin,
|
|
259
252
|
error_catcher(async (req, res) => {
|
|
260
253
|
const form = languageForm(req);
|
package/routes/library.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
const Library = require("@saltcorn/data/models/library");
|
|
8
8
|
const Router = require("express-promise-router");
|
|
9
|
-
const {
|
|
9
|
+
const { isAdmin, error_catcher } = require("./utils.js");
|
|
10
10
|
const { send_infoarch_page } = require("../markup/admin.js");
|
|
11
11
|
const { mkTable, post_delete_btn } = require("@saltcorn/markup");
|
|
12
12
|
const { i } = require("@saltcorn/markup/tags");
|
|
@@ -29,7 +29,6 @@ module.exports = router;
|
|
|
29
29
|
*/
|
|
30
30
|
router.post(
|
|
31
31
|
"/savefrombuilder",
|
|
32
|
-
setTenant,
|
|
33
32
|
isAdmin,
|
|
34
33
|
error_catcher(async (req, res) => {
|
|
35
34
|
await Library.create(req.body);
|
|
@@ -45,7 +44,6 @@ router.post(
|
|
|
45
44
|
*/
|
|
46
45
|
router.get(
|
|
47
46
|
"/list",
|
|
48
|
-
setTenant,
|
|
49
47
|
isAdmin,
|
|
50
48
|
error_catcher(async (req, res) => {
|
|
51
49
|
const libs = await Library.find({});
|
|
@@ -89,7 +87,6 @@ router.get(
|
|
|
89
87
|
*/
|
|
90
88
|
router.post(
|
|
91
89
|
"/delete/:id",
|
|
92
|
-
setTenant,
|
|
93
90
|
isAdmin,
|
|
94
91
|
error_catcher(async (req, res) => {
|
|
95
92
|
const { id } = req.params;
|
package/routes/list.js
CHANGED
|
@@ -14,7 +14,7 @@ const db = require("@saltcorn/data/db");
|
|
|
14
14
|
const { mkTable, h, link, post_btn } = require("@saltcorn/markup");
|
|
15
15
|
const { a, script, domReady, div, text } = require("@saltcorn/markup/tags");
|
|
16
16
|
const Table = require("@saltcorn/data/models/table");
|
|
17
|
-
const {
|
|
17
|
+
const { isAdmin, error_catcher } = require("./utils");
|
|
18
18
|
const moment = require("moment");
|
|
19
19
|
const { readState } = require("@saltcorn/data/plugin-helper");
|
|
20
20
|
|
|
@@ -39,7 +39,6 @@ module.exports = router;
|
|
|
39
39
|
*/
|
|
40
40
|
router.get(
|
|
41
41
|
"/_versions/:name/:id",
|
|
42
|
-
setTenant,
|
|
43
42
|
isAdmin,
|
|
44
43
|
error_catcher(async (req, res) => {
|
|
45
44
|
const { name, id } = req.params;
|
|
@@ -88,7 +87,6 @@ router.get(
|
|
|
88
87
|
*/
|
|
89
88
|
router.post(
|
|
90
89
|
"/_restore/:name/:id/:_version",
|
|
91
|
-
setTenant,
|
|
92
90
|
isAdmin,
|
|
93
91
|
error_catcher(async (req, res) => {
|
|
94
92
|
const { name, id, _version } = req.params;
|
|
@@ -152,7 +150,7 @@ const typeToJsGridType = (t, field) => {
|
|
|
152
150
|
|
|
153
151
|
/**
|
|
154
152
|
* Version Field
|
|
155
|
-
* @param {string} tname
|
|
153
|
+
* @param {string} tname
|
|
156
154
|
* @returns {string}
|
|
157
155
|
*/
|
|
158
156
|
const versionsField = (tname) => `
|
|
@@ -183,7 +181,6 @@ jsGrid.fields.versions = VersionsField;
|
|
|
183
181
|
*/
|
|
184
182
|
router.get(
|
|
185
183
|
"/:tname",
|
|
186
|
-
setTenant,
|
|
187
184
|
isAdmin,
|
|
188
185
|
error_catcher(async (req, res) => {
|
|
189
186
|
const { tname } = req.params;
|
package/routes/menu.js
CHANGED
|
@@ -32,8 +32,8 @@ const router = new Router();
|
|
|
32
32
|
module.exports = router;
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
|
-
*
|
|
36
|
-
* @param {object} req
|
|
35
|
+
*
|
|
36
|
+
* @param {object} req
|
|
37
37
|
* @returns {Promise<Form>}
|
|
38
38
|
*/
|
|
39
39
|
const menuForm = async (req) => {
|
|
@@ -157,7 +157,7 @@ const menuForm = async (req) => {
|
|
|
157
157
|
//create -- new
|
|
158
158
|
|
|
159
159
|
/**
|
|
160
|
-
* @param {object[]} menu_items
|
|
160
|
+
* @param {object[]} menu_items
|
|
161
161
|
* @returns {string}
|
|
162
162
|
*/
|
|
163
163
|
const menuEditorScript = (menu_items) => `
|
|
@@ -202,8 +202,8 @@ const menuEditorScript = (menu_items) => `
|
|
|
202
202
|
`;
|
|
203
203
|
|
|
204
204
|
/**
|
|
205
|
-
* @param {object[]} menu_items
|
|
206
|
-
* @returns {object[]}
|
|
205
|
+
* @param {object[]} menu_items
|
|
206
|
+
* @returns {object[]}
|
|
207
207
|
*/
|
|
208
208
|
const menuTojQME = (menu_items) =>
|
|
209
209
|
(menu_items || []).map((mi) => ({
|
|
@@ -214,7 +214,7 @@ const menuTojQME = (menu_items) =>
|
|
|
214
214
|
}));
|
|
215
215
|
|
|
216
216
|
/**
|
|
217
|
-
* @param {object[]} menu_items
|
|
217
|
+
* @param {object[]} menu_items
|
|
218
218
|
* @returns {object[]}
|
|
219
219
|
*/
|
|
220
220
|
const jQMEtoMenu = (menu_items) =>
|
|
@@ -233,7 +233,6 @@ const jQMEtoMenu = (menu_items) =>
|
|
|
233
233
|
*/
|
|
234
234
|
router.get(
|
|
235
235
|
"/",
|
|
236
|
-
setTenant,
|
|
237
236
|
isAdmin,
|
|
238
237
|
error_catcher(async (req, res) => {
|
|
239
238
|
const form = await menuForm(req);
|
|
@@ -287,7 +286,6 @@ router.get(
|
|
|
287
286
|
*/
|
|
288
287
|
router.post(
|
|
289
288
|
"/",
|
|
290
|
-
setTenant,
|
|
291
289
|
isAdmin,
|
|
292
290
|
error_catcher(async (req, res) => {
|
|
293
291
|
if (req.xhr) {
|
package/routes/packs.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
const Router = require("express-promise-router");
|
|
8
|
-
const {
|
|
8
|
+
const { isAdmin, error_catcher } = require("./utils.js");
|
|
9
9
|
const { mkTable, renderForm, link, post_btn } = require("@saltcorn/markup");
|
|
10
10
|
const { getState } = require("@saltcorn/data/db/state");
|
|
11
11
|
const Table = require("@saltcorn/data/models/table");
|
|
@@ -54,7 +54,6 @@ module.exports = router;
|
|
|
54
54
|
*/
|
|
55
55
|
router.get(
|
|
56
56
|
"/create/",
|
|
57
|
-
setTenant,
|
|
58
57
|
isAdmin,
|
|
59
58
|
error_catcher(async (req, res) => {
|
|
60
59
|
const tables = await Table.find({});
|
|
@@ -139,7 +138,6 @@ router.get(
|
|
|
139
138
|
*/
|
|
140
139
|
router.post(
|
|
141
140
|
"/create",
|
|
142
|
-
setTenant,
|
|
143
141
|
isAdmin,
|
|
144
142
|
error_catcher(async (req, res) => {
|
|
145
143
|
var pack = {
|
|
@@ -211,7 +209,7 @@ router.post(
|
|
|
211
209
|
);
|
|
212
210
|
|
|
213
211
|
/**
|
|
214
|
-
* @param {object} req
|
|
212
|
+
* @param {object} req
|
|
215
213
|
* @returns {Form}
|
|
216
214
|
*/
|
|
217
215
|
const install_pack_form = (req) =>
|
|
@@ -236,7 +234,6 @@ const install_pack_form = (req) =>
|
|
|
236
234
|
*/
|
|
237
235
|
router.get(
|
|
238
236
|
"/install",
|
|
239
|
-
setTenant,
|
|
240
237
|
isAdmin,
|
|
241
238
|
error_catcher(async (req, res) => {
|
|
242
239
|
res.sendWrap(req.__(`Install Pack`), {
|
|
@@ -267,7 +264,6 @@ router.get(
|
|
|
267
264
|
*/
|
|
268
265
|
router.post(
|
|
269
266
|
"/install",
|
|
270
|
-
setTenant,
|
|
271
267
|
isAdmin,
|
|
272
268
|
error_catcher(async (req, res) => {
|
|
273
269
|
var pack, error;
|
|
@@ -326,7 +322,6 @@ router.post(
|
|
|
326
322
|
*/
|
|
327
323
|
router.post(
|
|
328
324
|
"/install-named/:name",
|
|
329
|
-
setTenant,
|
|
330
325
|
isAdmin,
|
|
331
326
|
error_catcher(async (req, res) => {
|
|
332
327
|
const { name } = req.params;
|
|
@@ -363,7 +358,6 @@ router.post(
|
|
|
363
358
|
*/
|
|
364
359
|
router.post(
|
|
365
360
|
"/uninstall/:name",
|
|
366
|
-
setTenant,
|
|
367
361
|
isAdmin,
|
|
368
362
|
error_catcher(async (req, res) => {
|
|
369
363
|
const { name } = req.params;
|