@saltcorn/server 0.7.2-beta.5 → 0.7.2-beta.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.
- package/app.js +7 -7
- package/load_plugins.js +10 -3
- package/locales/en.json +13 -2
- package/locales/it.json +2 -1
- package/locales/ru.json +26 -15
- package/markup/admin.js +25 -9
- package/package.json +8 -8
- package/public/saltcorn-common.js +442 -3
- package/public/saltcorn.js +3 -436
- package/routes/admin.js +24 -14
- package/routes/eventlog.js +30 -30
- package/routes/fields.js +6 -0
- package/routes/files.js +13 -22
- package/routes/homepage.js +35 -7
- package/routes/menu.js +11 -7
- package/routes/tables.js +1 -1
- package/routes/tenant.js +13 -10
- package/routes/viewedit.js +1 -1
- package/wrapper.js +55 -12
package/routes/eventlog.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @subcategory routes
|
|
6
6
|
*/
|
|
7
7
|
const Router = require("express-promise-router");
|
|
8
|
-
const { isAdmin, error_catcher
|
|
8
|
+
const { isAdmin, error_catcher } = require("./utils.js");
|
|
9
9
|
const { getState } = require("@saltcorn/data/db/state");
|
|
10
10
|
const Trigger = require("@saltcorn/data/models/trigger");
|
|
11
11
|
|
|
@@ -21,19 +21,19 @@ module.exports = router;
|
|
|
21
21
|
const {
|
|
22
22
|
mkTable,
|
|
23
23
|
renderForm,
|
|
24
|
-
link,
|
|
25
|
-
post_btn,
|
|
26
|
-
settingsDropdown,
|
|
27
|
-
post_dropdown_item,
|
|
24
|
+
//link,
|
|
25
|
+
//post_btn,
|
|
26
|
+
//settingsDropdown,
|
|
27
|
+
//post_dropdown_item,
|
|
28
28
|
post_delete_btn,
|
|
29
29
|
localeDateTime,
|
|
30
30
|
} = require("@saltcorn/markup");
|
|
31
31
|
const Form = require("@saltcorn/data/models/form");
|
|
32
32
|
const {
|
|
33
33
|
div,
|
|
34
|
-
code,
|
|
34
|
+
//code,
|
|
35
35
|
a,
|
|
36
|
-
span,
|
|
36
|
+
//span,
|
|
37
37
|
tr,
|
|
38
38
|
table,
|
|
39
39
|
tbody,
|
|
@@ -74,7 +74,7 @@ const logSettingsForm = async (req) => {
|
|
|
74
74
|
name: w + "_channel",
|
|
75
75
|
label: w + " channel",
|
|
76
76
|
sublabel:
|
|
77
|
-
"Channels to create events for. Separate by comma; leave blank for all",
|
|
77
|
+
req.__("Channels to create events for. Separate by comma; leave blank for all"),
|
|
78
78
|
type: "String",
|
|
79
79
|
showIf: { [w]: true },
|
|
80
80
|
});
|
|
@@ -168,25 +168,25 @@ router.get(
|
|
|
168
168
|
/**
|
|
169
169
|
* @returns {Form}
|
|
170
170
|
*/
|
|
171
|
-
const customEventForm = () =>
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
171
|
+
const customEventForm = async (req) => {
|
|
172
|
+
return new Form({
|
|
173
|
+
action: "/eventlog/custom/new",
|
|
174
|
+
submitButtonClass: "btn-outline-primary",
|
|
175
|
+
onChange: "remove_outline(this)",
|
|
176
|
+
fields: [
|
|
177
|
+
{
|
|
178
|
+
name: "name",
|
|
179
|
+
label: req.__("Event Name"),
|
|
180
|
+
type: "String",
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "hasChannel",
|
|
184
|
+
label: req.__("Has channels?"),
|
|
185
|
+
type: "Bool",
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
190
|
/**
|
|
191
191
|
* @name get/custom/new
|
|
192
192
|
* @function
|
|
@@ -197,7 +197,7 @@ router.get(
|
|
|
197
197
|
"/custom/new",
|
|
198
198
|
isAdmin,
|
|
199
199
|
error_catcher(async (req, res) => {
|
|
200
|
-
const form = customEventForm();
|
|
200
|
+
const form = await customEventForm(req);
|
|
201
201
|
send_events_page({
|
|
202
202
|
res,
|
|
203
203
|
req,
|
|
@@ -222,7 +222,7 @@ router.post(
|
|
|
222
222
|
"/custom/new",
|
|
223
223
|
isAdmin,
|
|
224
224
|
error_catcher(async (req, res) => {
|
|
225
|
-
const form = customEventForm();
|
|
225
|
+
const form = await customEventForm(req);
|
|
226
226
|
form.validate(req.body);
|
|
227
227
|
if (form.hasErrors) {
|
|
228
228
|
send_events_page({
|
|
@@ -323,7 +323,7 @@ router.get(
|
|
|
323
323
|
{ orderBy: "occur_at", orderDesc: true, limit: rows_per_page, offset }
|
|
324
324
|
);
|
|
325
325
|
if (evlog.length === rows_per_page || current_page > 1) {
|
|
326
|
-
const nrows = await EventLog.count();
|
|
326
|
+
const nrows = await EventLog.count({});
|
|
327
327
|
if (nrows > rows_per_page || current_page > 1) {
|
|
328
328
|
page_opts.pagination = {
|
|
329
329
|
current_page,
|
package/routes/fields.js
CHANGED
|
@@ -296,6 +296,12 @@ const fieldFlow = (req) =>
|
|
|
296
296
|
input_type: "select",
|
|
297
297
|
options: roles.map((r) => ({ value: r.id, label: r.role })),
|
|
298
298
|
},
|
|
299
|
+
{
|
|
300
|
+
name: "also_delete_file",
|
|
301
|
+
type: "Bool",
|
|
302
|
+
label: req.__("Cascade delete to file"),
|
|
303
|
+
sublabel: req.__("Deleting a row will also delete the file referenced by this field")
|
|
304
|
+
},
|
|
299
305
|
],
|
|
300
306
|
});
|
|
301
307
|
} else {
|
package/routes/files.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Files Route
|
|
2
3
|
* @category server
|
|
3
4
|
* @module routes/files
|
|
4
5
|
* @subcategory routes
|
|
@@ -9,34 +10,18 @@ const File = require("@saltcorn/data/models/file");
|
|
|
9
10
|
const User = require("@saltcorn/data/models/user");
|
|
10
11
|
const { getState } = require("@saltcorn/data/db/state");
|
|
11
12
|
const s3storage = require("../s3storage");
|
|
12
|
-
const
|
|
13
|
+
const resizer = require("resize-with-sharp-or-jimp");
|
|
13
14
|
|
|
14
15
|
const {
|
|
15
16
|
mkTable,
|
|
16
17
|
renderForm,
|
|
17
18
|
link,
|
|
18
|
-
post_btn,
|
|
19
|
+
//post_btn,
|
|
19
20
|
post_delete_btn,
|
|
20
21
|
} = require("@saltcorn/markup");
|
|
21
22
|
const { isAdmin, error_catcher, setTenant } = require("./utils.js");
|
|
22
|
-
const {
|
|
23
|
-
|
|
24
|
-
h5,
|
|
25
|
-
h1,
|
|
26
|
-
h4,
|
|
27
|
-
nbsp,
|
|
28
|
-
p,
|
|
29
|
-
a,
|
|
30
|
-
div,
|
|
31
|
-
form,
|
|
32
|
-
input,
|
|
33
|
-
select,
|
|
34
|
-
button,
|
|
35
|
-
option,
|
|
36
|
-
text,
|
|
37
|
-
label,
|
|
38
|
-
} = require("@saltcorn/markup/tags");
|
|
39
|
-
const { csrfField } = require("./utils");
|
|
23
|
+
const { h1, div, text } = require("@saltcorn/markup/tags");
|
|
24
|
+
// const { csrfField } = require("./utils");
|
|
40
25
|
const { editRoleForm, fileUploadForm } = require("../markup/forms.js");
|
|
41
26
|
const { strictParseInt } = require("@saltcorn/data/plugin-helper");
|
|
42
27
|
const {
|
|
@@ -44,7 +29,7 @@ const {
|
|
|
44
29
|
config_fields_form,
|
|
45
30
|
save_config_from_form,
|
|
46
31
|
} = require("../markup/admin");
|
|
47
|
-
const fsp = require("fs").promises;
|
|
32
|
+
// const fsp = require("fs").promises;
|
|
48
33
|
const fs = require("fs");
|
|
49
34
|
|
|
50
35
|
/**
|
|
@@ -58,6 +43,7 @@ const router = new Router();
|
|
|
58
43
|
module.exports = router;
|
|
59
44
|
|
|
60
45
|
/**
|
|
46
|
+
* Edit file Role form
|
|
61
47
|
* @param {*} file
|
|
62
48
|
* @param {*} roles
|
|
63
49
|
* @param {*} req
|
|
@@ -81,6 +67,7 @@ router.get(
|
|
|
81
67
|
"/",
|
|
82
68
|
isAdmin,
|
|
83
69
|
error_catcher(async (req, res) => {
|
|
70
|
+
// todo limit select from file by 10 or 20
|
|
84
71
|
const rows = await File.find({}, { orderBy: "filename" });
|
|
85
72
|
const roles = await User.get_roles();
|
|
86
73
|
send_files_page({
|
|
@@ -227,7 +214,11 @@ router.get(
|
|
|
227
214
|
}
|
|
228
215
|
const fnm = `${file.location}_w${width}`;
|
|
229
216
|
if (!fs.existsSync(fnm)) {
|
|
230
|
-
await
|
|
217
|
+
await resizer({
|
|
218
|
+
fromFileName: file.location,
|
|
219
|
+
width,
|
|
220
|
+
toFileName: fnm,
|
|
221
|
+
});
|
|
231
222
|
}
|
|
232
223
|
res.sendFile(fnm);
|
|
233
224
|
}
|
package/routes/homepage.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Default Home Page (Wellcome page)
|
|
3
|
+
* Opens for new site without any data
|
|
2
4
|
* @category server
|
|
3
5
|
* @module routes/homepage
|
|
4
6
|
* @subcategory routes
|
|
@@ -10,11 +12,11 @@ const View = require("@saltcorn/data/models/view");
|
|
|
10
12
|
const User = require("@saltcorn/data/models/user");
|
|
11
13
|
const File = require("@saltcorn/data/models/file");
|
|
12
14
|
const Page = require("@saltcorn/data/models/page");
|
|
13
|
-
const { link,
|
|
14
|
-
const {
|
|
15
|
+
const { link, mkTable } = require("@saltcorn/markup");
|
|
16
|
+
const { div, a, p, i } = require("@saltcorn/markup/tags");
|
|
15
17
|
const Table = require("@saltcorn/data/models/table");
|
|
16
18
|
const { fetch_available_packs } = require("@saltcorn/admin-models/models/pack");
|
|
17
|
-
const { restore_backup } = require("../markup/admin");
|
|
19
|
+
// const { restore_backup } = require("../markup/admin");
|
|
18
20
|
const { get_latest_npm_version } = require("@saltcorn/data/models/config");
|
|
19
21
|
const packagejson = require("../package.json");
|
|
20
22
|
const Trigger = require("@saltcorn/data/models/trigger");
|
|
@@ -22,6 +24,7 @@ const { fileUploadForm } = require("../markup/forms");
|
|
|
22
24
|
const { get_base_url } = require("./utils.js");
|
|
23
25
|
|
|
24
26
|
/**
|
|
27
|
+
* Tables List
|
|
25
28
|
* @param {*} tables
|
|
26
29
|
* @param {object} req
|
|
27
30
|
* @returns {Table}
|
|
@@ -39,6 +42,7 @@ const tableTable = (tables, req) =>
|
|
|
39
42
|
);
|
|
40
43
|
|
|
41
44
|
/**
|
|
45
|
+
* Tables Card
|
|
42
46
|
* @param {*} tables
|
|
43
47
|
* @param {object} req
|
|
44
48
|
* @returns {object}
|
|
@@ -68,6 +72,7 @@ const tableCard = (tables, req) => ({
|
|
|
68
72
|
});
|
|
69
73
|
|
|
70
74
|
/**
|
|
75
|
+
* Views List
|
|
71
76
|
* @param {*} views
|
|
72
77
|
* @param {object} req
|
|
73
78
|
* @returns {Table}
|
|
@@ -89,6 +94,7 @@ const viewTable = (views, req) =>
|
|
|
89
94
|
);
|
|
90
95
|
|
|
91
96
|
/**
|
|
97
|
+
* Views Card
|
|
92
98
|
* @param {*} views
|
|
93
99
|
* @param {object} req
|
|
94
100
|
* @returns {object}
|
|
@@ -120,6 +126,7 @@ const viewCard = (views, req) => ({
|
|
|
120
126
|
});
|
|
121
127
|
|
|
122
128
|
/**
|
|
129
|
+
* Pages List
|
|
123
130
|
* @param {*} pages
|
|
124
131
|
* @param {object} req
|
|
125
132
|
* @returns {Table}
|
|
@@ -141,6 +148,7 @@ const pageTable = (pages, req) =>
|
|
|
141
148
|
);
|
|
142
149
|
|
|
143
150
|
/**
|
|
151
|
+
* Page Card
|
|
144
152
|
* @param {*} pages
|
|
145
153
|
* @param {object} req
|
|
146
154
|
* @returns {object}
|
|
@@ -173,13 +181,14 @@ const pageCard = (pages, req) => ({
|
|
|
173
181
|
});
|
|
174
182
|
|
|
175
183
|
/**
|
|
184
|
+
* Files Tab
|
|
176
185
|
* @param {object} req
|
|
177
186
|
* @returns {Promise<div>}
|
|
178
187
|
*/
|
|
179
188
|
const filesTab = async (req) => {
|
|
180
189
|
const files = await File.find({}, { orderBy: "filename", cached: true });
|
|
181
190
|
return div(
|
|
182
|
-
files.length
|
|
191
|
+
files.length === 0
|
|
183
192
|
? p(req.__("No files"))
|
|
184
193
|
: mkTable(
|
|
185
194
|
[
|
|
@@ -197,7 +206,10 @@ const filesTab = async (req) => {
|
|
|
197
206
|
};
|
|
198
207
|
|
|
199
208
|
/**
|
|
209
|
+
* Users Tab
|
|
200
210
|
* @param {object} req
|
|
211
|
+
* @param users
|
|
212
|
+
* @param roleMap
|
|
201
213
|
* @returns {Promise<div>}
|
|
202
214
|
*/
|
|
203
215
|
const usersTab = async (req, users, roleMap) => {
|
|
@@ -221,7 +233,9 @@ const usersTab = async (req, users, roleMap) => {
|
|
|
221
233
|
};
|
|
222
234
|
|
|
223
235
|
/**
|
|
236
|
+
* Actions (Triggers) Tab
|
|
224
237
|
* @param {object} req
|
|
238
|
+
* @param triggers
|
|
225
239
|
* @returns {Promise<div>}
|
|
226
240
|
*/
|
|
227
241
|
const actionsTab = async (req, triggers) => {
|
|
@@ -234,7 +248,7 @@ const actionsTab = async (req, triggers) => {
|
|
|
234
248
|
{ class: "mt-2 pe-2" },
|
|
235
249
|
i(req.__("Triggers run actions in response to events."))
|
|
236
250
|
),
|
|
237
|
-
triggers.length
|
|
251
|
+
triggers.length === 0
|
|
238
252
|
? p(req.__("No triggers"))
|
|
239
253
|
: mkTable(
|
|
240
254
|
[
|
|
@@ -260,6 +274,12 @@ const actionsTab = async (req, triggers) => {
|
|
|
260
274
|
)
|
|
261
275
|
);
|
|
262
276
|
};
|
|
277
|
+
/**
|
|
278
|
+
* Plugins and Packs Tab
|
|
279
|
+
* @param req
|
|
280
|
+
* @param packlist
|
|
281
|
+
* @returns {*}
|
|
282
|
+
*/
|
|
263
283
|
const packTab = (req, packlist) =>
|
|
264
284
|
div(
|
|
265
285
|
{ class: "pb-3 pt-2 pe-4" },
|
|
@@ -286,7 +306,11 @@ const packTab = (req, packlist) =>
|
|
|
286
306
|
req.__("Go to pack store »")
|
|
287
307
|
)
|
|
288
308
|
);
|
|
289
|
-
|
|
309
|
+
/**
|
|
310
|
+
* Help Card
|
|
311
|
+
* @param req
|
|
312
|
+
* @returns {*}
|
|
313
|
+
*/
|
|
290
314
|
const helpCard = (req) =>
|
|
291
315
|
div(
|
|
292
316
|
{ class: "pb-3 pt-2 pe-4" },
|
|
@@ -321,6 +345,7 @@ const helpCard = (req) =>
|
|
|
321
345
|
);
|
|
322
346
|
|
|
323
347
|
/**
|
|
348
|
+
* Wellcome page
|
|
324
349
|
* @param {object} req
|
|
325
350
|
* @returns {Promise<object>}
|
|
326
351
|
*/
|
|
@@ -393,6 +418,7 @@ const welcome_page = async (req) => {
|
|
|
393
418
|
};
|
|
394
419
|
|
|
395
420
|
/**
|
|
421
|
+
* No Views logged in
|
|
396
422
|
* @param {object} req
|
|
397
423
|
* @param {object} res
|
|
398
424
|
* @returns {Promise<void>}
|
|
@@ -423,6 +449,7 @@ const no_views_logged_in = async (req, res) => {
|
|
|
423
449
|
};
|
|
424
450
|
|
|
425
451
|
/**
|
|
452
|
+
* Get Config respounce
|
|
426
453
|
* @param {number} role_id
|
|
427
454
|
* @param {object} res
|
|
428
455
|
* @param {object} req
|
|
@@ -430,6 +457,7 @@ const no_views_logged_in = async (req, res) => {
|
|
|
430
457
|
*/
|
|
431
458
|
const get_config_response = async (role_id, res, req) => {
|
|
432
459
|
const modernCfg = getState().getConfig("home_page_by_role", false);
|
|
460
|
+
// predefined roles
|
|
433
461
|
const legacy_role = { 10: "public", 8: "user", 4: "staff", 1: "admin" }[
|
|
434
462
|
role_id
|
|
435
463
|
];
|
|
@@ -472,7 +500,7 @@ module.exports =
|
|
|
472
500
|
const hasUsers = await User.nonEmpty();
|
|
473
501
|
if (!hasUsers) {
|
|
474
502
|
res.redirect("/auth/create_first_user");
|
|
475
|
-
return;
|
|
503
|
+
// return;
|
|
476
504
|
} else res.redirect("/auth/login");
|
|
477
505
|
} else {
|
|
478
506
|
await no_views_logged_in(req, res);
|
package/routes/menu.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Menu Editor
|
|
2
3
|
* @category server
|
|
3
4
|
* @module routes/menu
|
|
4
5
|
* @subcategory routes
|
|
@@ -6,18 +7,18 @@
|
|
|
6
7
|
|
|
7
8
|
const Router = require("express-promise-router");
|
|
8
9
|
|
|
9
|
-
const Field = require("@saltcorn/data/models/field");
|
|
10
|
+
//const Field = require("@saltcorn/data/models/field");
|
|
10
11
|
const Form = require("@saltcorn/data/models/form");
|
|
11
|
-
const { isAdmin,
|
|
12
|
+
const { isAdmin, error_catcher } = require("./utils.js");
|
|
12
13
|
const { getState } = require("@saltcorn/data/db/state");
|
|
13
|
-
const File = require("@saltcorn/data/models/file");
|
|
14
|
+
//const File = require("@saltcorn/data/models/file");
|
|
14
15
|
const User = require("@saltcorn/data/models/user");
|
|
15
16
|
const View = require("@saltcorn/data/models/view");
|
|
16
17
|
const Page = require("@saltcorn/data/models/page");
|
|
17
18
|
const { save_menu_items } = require("@saltcorn/data/models/config");
|
|
18
19
|
const db = require("@saltcorn/data/db");
|
|
19
20
|
|
|
20
|
-
const {
|
|
21
|
+
const { renderForm } = require("@saltcorn/markup");
|
|
21
22
|
const { script, domReady, div, ul } = require("@saltcorn/markup/tags");
|
|
22
23
|
const { send_infoarch_page } = require("../markup/admin.js");
|
|
23
24
|
const Table = require("@saltcorn/data/models/table");
|
|
@@ -33,7 +34,7 @@ const router = new Router();
|
|
|
33
34
|
module.exports = router;
|
|
34
35
|
|
|
35
36
|
/**
|
|
36
|
-
*
|
|
37
|
+
* Menu Form
|
|
37
38
|
* @param {object} req
|
|
38
39
|
* @returns {Promise<Form>}
|
|
39
40
|
*/
|
|
@@ -246,9 +247,11 @@ const menuForm = async (req) => {
|
|
|
246
247
|
//create -- new
|
|
247
248
|
|
|
248
249
|
/**
|
|
250
|
+
* Menu Editor Script
|
|
249
251
|
* @param {object[]} menu_items
|
|
250
252
|
* @returns {string}
|
|
251
253
|
*/
|
|
254
|
+
// todo move to file the content of menuEditorScript
|
|
252
255
|
const menuEditorScript = (menu_items) => `
|
|
253
256
|
var iconPickerOptions = {searchText: "Search icon...", labelHeader: "{0}/{1}"};
|
|
254
257
|
let lastState;
|
|
@@ -262,7 +265,7 @@ const menuEditorScript = (menu_items) => `
|
|
|
262
265
|
}
|
|
263
266
|
var sortableListOptions = {
|
|
264
267
|
placeholderCss: {'background-color': "#cccccc"},
|
|
265
|
-
onChange: ajax_save_menu
|
|
268
|
+
onChange: ajax_save_menu
|
|
266
269
|
};
|
|
267
270
|
editor = new MenuEditor('myEditor',
|
|
268
271
|
{
|
|
@@ -285,7 +288,7 @@ const menuEditorScript = (menu_items) => `
|
|
|
285
288
|
editor.update();
|
|
286
289
|
ajax_save_menu(true);
|
|
287
290
|
location.reload();
|
|
288
|
-
});
|
|
291
|
+
});
|
|
289
292
|
// Calling the add method
|
|
290
293
|
$('#btnAdd').click(function(){
|
|
291
294
|
editor.add();
|
|
@@ -360,6 +363,7 @@ router.get(
|
|
|
360
363
|
})
|
|
361
364
|
);
|
|
362
365
|
/**
|
|
366
|
+
* jQME to Menu
|
|
363
367
|
* @param {object[]} menu_items
|
|
364
368
|
* @returns {object[]}
|
|
365
369
|
*/
|
package/routes/tables.js
CHANGED
package/routes/tenant.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* Tenant(s) Route
|
|
2
3
|
* @category server
|
|
3
4
|
* @module routes/tenant
|
|
4
5
|
* @subcategory routes
|
|
@@ -36,22 +37,23 @@ const {
|
|
|
36
37
|
code,
|
|
37
38
|
} = require("@saltcorn/markup/tags");
|
|
38
39
|
const db = require("@saltcorn/data/db");
|
|
39
|
-
const url = require("url");
|
|
40
|
+
//const url = require("url");
|
|
40
41
|
const { loadAllPlugins, loadAndSaveNewPlugin } = require("../load_plugins");
|
|
41
42
|
const { isAdmin, error_catcher } = require("./utils.js");
|
|
42
43
|
const User = require("@saltcorn/data/models/user");
|
|
43
44
|
const File = require("@saltcorn/data/models/file");
|
|
44
45
|
const {
|
|
45
46
|
send_infoarch_page,
|
|
46
|
-
send_admin_page,
|
|
47
|
+
//send_admin_page,
|
|
47
48
|
config_fields_form,
|
|
48
49
|
save_config_from_form,
|
|
49
50
|
} = require("../markup/admin.js");
|
|
50
51
|
const { getConfig } = require("@saltcorn/data/models/config");
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
// todo add button backup / restore for particular tenant (available in admin tenants screens)
|
|
53
|
+
//const {
|
|
54
|
+
// create_backup,
|
|
55
|
+
// restore,
|
|
56
|
+
//} = require("@saltcorn/admin-models/models/backup");
|
|
55
57
|
|
|
56
58
|
/**
|
|
57
59
|
* @type {object}
|
|
@@ -116,6 +118,7 @@ const is_ip_address = (hostname) => {
|
|
|
116
118
|
};
|
|
117
119
|
|
|
118
120
|
/**
|
|
121
|
+
* Create tenant screen runnning
|
|
119
122
|
* @name get/create
|
|
120
123
|
* @function
|
|
121
124
|
* @memberof module:routes/tenant~tenantRouter
|
|
@@ -146,6 +149,7 @@ router.get(
|
|
|
146
149
|
)
|
|
147
150
|
);
|
|
148
151
|
let create_tenant_warning = "";
|
|
152
|
+
// todo add custom create tenant warning message
|
|
149
153
|
if (getState().getConfig("create_tenant_warning"))
|
|
150
154
|
create_tenant_warning = div(
|
|
151
155
|
{
|
|
@@ -200,9 +204,8 @@ const getNewURL = (req, subdomain) => {
|
|
|
200
204
|
if (hosts.length > 1) ports = `:${hosts[1]}`;
|
|
201
205
|
}
|
|
202
206
|
const hostname = req.hostname;
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
return newurl;
|
|
207
|
+
// return newurl
|
|
208
|
+
return `${req.protocol}://${subdomain}.${hostname}${ports}/`;
|
|
206
209
|
};
|
|
207
210
|
|
|
208
211
|
/**
|
|
@@ -307,7 +310,7 @@ router.post(
|
|
|
307
310
|
);
|
|
308
311
|
|
|
309
312
|
/**
|
|
310
|
-
* List tenants
|
|
313
|
+
* List tenants ( on /tenant/list)
|
|
311
314
|
* @name get/list
|
|
312
315
|
* @function
|
|
313
316
|
* @memberof module:routes/tenant~tenantRouter
|
package/routes/viewedit.js
CHANGED
|
@@ -586,11 +586,11 @@ router.get(
|
|
|
586
586
|
view.configuration && Object.keys(view.configuration).length > 0;
|
|
587
587
|
const wfres = await configFlow.run(
|
|
588
588
|
{
|
|
589
|
+
...view.configuration,
|
|
589
590
|
id: hasConfig ? view.id : undefined,
|
|
590
591
|
table_id: view.table_id,
|
|
591
592
|
exttable_name: view.exttable_name,
|
|
592
593
|
viewname: name,
|
|
593
|
-
...view.configuration,
|
|
594
594
|
},
|
|
595
595
|
req
|
|
596
596
|
);
|
package/wrapper.js
CHANGED
|
@@ -3,18 +3,28 @@
|
|
|
3
3
|
* @module wrapper
|
|
4
4
|
*/
|
|
5
5
|
const { getState } = require("@saltcorn/data/db/state");
|
|
6
|
-
const db = require("@saltcorn/data/db");
|
|
7
|
-
const {
|
|
6
|
+
//const db = require("@saltcorn/data/db");
|
|
7
|
+
const { h3, div, small } = require("@saltcorn/markup/tags");
|
|
8
8
|
const { renderForm, link } = require("@saltcorn/markup");
|
|
9
9
|
const renderLayout = require("@saltcorn/markup/layout");
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* get flashes
|
|
12
|
+
* @param req
|
|
13
|
+
* @returns {T[]}
|
|
14
|
+
*/
|
|
11
15
|
const getFlashes = (req) =>
|
|
12
|
-
["error", "success", "danger", "warning"]
|
|
16
|
+
["error", "success", "danger", "warning","information"]
|
|
13
17
|
.map((type) => {
|
|
14
18
|
return { type, msg: req.flash(type) };
|
|
15
19
|
})
|
|
16
20
|
.filter((a) => a.msg && a.msg.length && a.msg.length > 0);
|
|
17
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Get extra menu
|
|
23
|
+
* @param role
|
|
24
|
+
* @param state
|
|
25
|
+
* @param req
|
|
26
|
+
* @returns {*}
|
|
27
|
+
*/
|
|
18
28
|
const get_extra_menu = (role, state, req) => {
|
|
19
29
|
let cfg = getState().getConfig("unrolled_menu_items", []);
|
|
20
30
|
if (!cfg || cfg.length === 0) {
|
|
@@ -43,7 +53,11 @@ const get_extra_menu = (role, state, req) => {
|
|
|
43
53
|
}));
|
|
44
54
|
return transform(cfg);
|
|
45
55
|
};
|
|
46
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Get menu
|
|
58
|
+
* @param req
|
|
59
|
+
* @returns {(false|{section: *, items}|{section: *, items: [{link: string, icon: string, label: *},{link: string, icon: string, label: *},{link: string, icon: string, label: *},{icon: string, subitems: [{link: string, icon: string, label: *},{link: string, icon: string, label: *},{link: string, icon: string, altlinks: string[], label: *},{link: string, altlinks: string[], icon: string, label: *},{link: string, icon: string, label: *},null], label: *}]}|{section: *, isUser: boolean, items: ([{icon: string, subitems: [{label: *},{icon: string, link: string, label: *},{link: string, icon: string, label: *}], label: *, isUser: boolean}]|*[])})[]}
|
|
60
|
+
*/
|
|
47
61
|
const get_menu = (req) => {
|
|
48
62
|
const isAuth = req.user && req.user.id;
|
|
49
63
|
const state = getState();
|
|
@@ -82,8 +96,13 @@ const get_menu = (req) => {
|
|
|
82
96
|
? [{ link: "/auth/login", label: req.__("Login") }]
|
|
83
97
|
: []),
|
|
84
98
|
];
|
|
85
|
-
const schema = db.getTenantSchema();
|
|
99
|
+
// const schema = db.getTenantSchema();
|
|
100
|
+
// Admin role id (todo move to common constants)
|
|
86
101
|
const isAdmin = role === 1;
|
|
102
|
+
/*
|
|
103
|
+
* Admin Menu items
|
|
104
|
+
*
|
|
105
|
+
*/
|
|
87
106
|
const adminItems = [
|
|
88
107
|
{ link: "/table", icon: "fas fa-table", label: req.__("Tables") },
|
|
89
108
|
{ link: "/viewedit", icon: "far fa-eye", label: req.__("Views") },
|
|
@@ -126,7 +145,8 @@ const get_menu = (req) => {
|
|
|
126
145
|
},
|
|
127
146
|
];
|
|
128
147
|
|
|
129
|
-
|
|
148
|
+
// return menu
|
|
149
|
+
return [
|
|
130
150
|
extra_menu.length > 0 && {
|
|
131
151
|
section: req.__("Menu"),
|
|
132
152
|
items: extra_menu,
|
|
@@ -141,9 +161,16 @@ const get_menu = (req) => {
|
|
|
141
161
|
items: authItems,
|
|
142
162
|
},
|
|
143
163
|
].filter((s) => s);
|
|
144
|
-
return menu;
|
|
145
|
-
};
|
|
146
164
|
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Get Headers
|
|
168
|
+
* @param req
|
|
169
|
+
* @param version_tag
|
|
170
|
+
* @param description
|
|
171
|
+
* @param extras
|
|
172
|
+
* @returns {*[]}
|
|
173
|
+
*/
|
|
147
174
|
const get_headers = (req, version_tag, description, extras = []) => {
|
|
148
175
|
const state = getState();
|
|
149
176
|
const favicon = state.getConfig("favicon_id", null);
|
|
@@ -188,6 +215,11 @@ const get_headers = (req, version_tag, description, extras = []) => {
|
|
|
188
215
|
...from_cfg,
|
|
189
216
|
];
|
|
190
217
|
};
|
|
218
|
+
/**
|
|
219
|
+
* Get brand
|
|
220
|
+
* @param state
|
|
221
|
+
* @returns {{name: *, logo: (string|undefined)}}
|
|
222
|
+
*/
|
|
191
223
|
const get_brand = (state) => {
|
|
192
224
|
const logo_id = state.getConfig("site_logo_id", "");
|
|
193
225
|
return {
|
|
@@ -196,6 +228,12 @@ const get_brand = (state) => {
|
|
|
196
228
|
};
|
|
197
229
|
};
|
|
198
230
|
module.exports = (version_tag) =>
|
|
231
|
+
/**
|
|
232
|
+
*
|
|
233
|
+
* @param req
|
|
234
|
+
* @param res
|
|
235
|
+
* @param next
|
|
236
|
+
*/
|
|
199
237
|
function (req, res, next) {
|
|
200
238
|
const role = (req.user || {}).role_id || 10;
|
|
201
239
|
|
|
@@ -220,7 +258,7 @@ module.exports = (version_tag) =>
|
|
|
220
258
|
})
|
|
221
259
|
);
|
|
222
260
|
} else {
|
|
223
|
-
|
|
261
|
+
let links = [];
|
|
224
262
|
if (authLinks.login)
|
|
225
263
|
links.push(
|
|
226
264
|
link(authLinks.login, req.__("Already have an account? Login"))
|
|
@@ -301,7 +339,12 @@ module.exports = (version_tag) =>
|
|
|
301
339
|
};
|
|
302
340
|
next();
|
|
303
341
|
};
|
|
304
|
-
|
|
342
|
+
/**
|
|
343
|
+
* Default render to HTML
|
|
344
|
+
* @param s
|
|
345
|
+
* @param role
|
|
346
|
+
* @returns {string|string|*}
|
|
347
|
+
*/
|
|
305
348
|
const defaultRenderToHtml = (s, role) =>
|
|
306
349
|
typeof s === "string"
|
|
307
350
|
? s
|