@saltcorn/server 0.8.6-beta.1 → 0.8.6-beta.11
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 +3 -3
- package/auth/admin.js +4 -0
- package/auth/roleadmin.js +7 -4
- package/auth/routes.js +1 -1
- package/errors.js +1 -1
- package/locales/en.json +16 -2
- package/locales/pl.json +1 -1
- package/locales/ru.json +38 -2
- package/locales/uk.json +1170 -0
- package/package.json +8 -8
- package/public/dayjs.min.js +1 -0
- package/public/saltcorn-common.js +97 -69
- package/public/saltcorn.css +17 -0
- package/public/saltcorn.js +3 -3
- package/routes/admin.js +26 -0
- package/routes/api.js +27 -48
- package/routes/common_lists.js +4 -1
- package/routes/delete.js +3 -3
- package/routes/edit.js +1 -1
- package/routes/fields.js +32 -12
- package/routes/files.js +7 -7
- package/routes/homepage.js +3 -3
- package/routes/index.js +4 -41
- package/routes/menu.js +1 -1
- package/routes/page.js +2 -2
- package/routes/pageedit.js +2 -2
- package/routes/scapi.js +1 -1
- package/routes/search.js +4 -5
- package/routes/sync.js +84 -0
- package/routes/tables.js +5 -5
- package/routes/tenant.js +74 -27
- package/routes/view.js +3 -3
- package/routes/viewedit.js +43 -15
- package/tests/admin.test.js +8 -8
- package/tests/auth.test.js +13 -13
- package/tests/crud.test.js +2 -2
- package/tests/files.test.js +6 -6
- package/tests/kittens.test.js +11 -11
- package/tests/page.test.js +4 -5
- package/tests/sync.test.js +108 -0
- package/tests/table.test.js +6 -6
- package/tests/tenant.test.js +3 -3
- package/tests/view.test.js +128 -1
- package/tests/viewedit.test.js +4 -4
- package/wrapper.js +3 -2
package/routes/view.js
CHANGED
|
@@ -42,7 +42,7 @@ router.get(
|
|
|
42
42
|
const { viewname } = req.params;
|
|
43
43
|
const query = { ...req.query };
|
|
44
44
|
const view = await View.findOne({ name: viewname });
|
|
45
|
-
const role = req.user && req.user.id ? req.user.role_id :
|
|
45
|
+
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
46
46
|
const state = getState();
|
|
47
47
|
state.log(3, `Route /view/${viewname} user=${req.user?.id}`);
|
|
48
48
|
if (!view) {
|
|
@@ -157,7 +157,7 @@ router.post(
|
|
|
157
157
|
"/:viewname/:route",
|
|
158
158
|
error_catcher(async (req, res) => {
|
|
159
159
|
const { viewname, route } = req.params;
|
|
160
|
-
const role = req.user && req.user.id ? req.user.role_id :
|
|
160
|
+
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
161
161
|
const state = getState();
|
|
162
162
|
state.log(
|
|
163
163
|
3,
|
|
@@ -191,7 +191,7 @@ router.post(
|
|
|
191
191
|
setTenant,
|
|
192
192
|
error_catcher(async (req, res) => {
|
|
193
193
|
const { viewname } = req.params;
|
|
194
|
-
const role = req.user && req.user.id ? req.user.role_id :
|
|
194
|
+
const role = req.user && req.user.id ? req.user.role_id : 100;
|
|
195
195
|
const query = { ...req.query };
|
|
196
196
|
const state = getState();
|
|
197
197
|
state.log(3, `Route /view/${viewname} POST user=${req.user?.id}`);
|
package/routes/viewedit.js
CHANGED
|
@@ -8,16 +8,9 @@
|
|
|
8
8
|
const Router = require("express-promise-router");
|
|
9
9
|
|
|
10
10
|
const { renderForm, renderBuilder, alert } = require("@saltcorn/markup");
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
div,
|
|
15
|
-
script,
|
|
16
|
-
text,
|
|
17
|
-
domReady,
|
|
18
|
-
code,
|
|
19
|
-
pre,
|
|
20
|
-
} = require("@saltcorn/markup/tags");
|
|
11
|
+
const tags = require("@saltcorn/markup/tags");
|
|
12
|
+
const { p, a, div, script, text, domReady, code, pre, tbody, tr, th, td } =
|
|
13
|
+
tags;
|
|
21
14
|
|
|
22
15
|
const { getState } = require("@saltcorn/data/db/state");
|
|
23
16
|
const { isAdmin, error_catcher, addOnDoneRedirect } = require("./utils.js");
|
|
@@ -30,6 +23,7 @@ const Workflow = require("@saltcorn/data/models/workflow");
|
|
|
30
23
|
const User = require("@saltcorn/data/models/user");
|
|
31
24
|
const Page = require("@saltcorn/data/models/page");
|
|
32
25
|
const db = require("@saltcorn/data/db");
|
|
26
|
+
const { sleep } = require("@saltcorn/data/utils");
|
|
33
27
|
|
|
34
28
|
const { add_to_menu } = require("@saltcorn/admin-models/models/pack");
|
|
35
29
|
|
|
@@ -305,6 +299,7 @@ router.get(
|
|
|
305
299
|
const roles = await User.get_roles();
|
|
306
300
|
const pages = await Page.find();
|
|
307
301
|
const form = await viewForm(req, tableOptions, roles, pages, viewrow);
|
|
302
|
+
const inbound_connected = await viewrow.inbound_connected_objects();
|
|
308
303
|
form.hidden("id");
|
|
309
304
|
res.sendWrap(req.__(`Edit view`), {
|
|
310
305
|
above: [
|
|
@@ -328,7 +323,6 @@ router.get(
|
|
|
328
323
|
},
|
|
329
324
|
{
|
|
330
325
|
type: "card",
|
|
331
|
-
|
|
332
326
|
title: req.__("View configuration"),
|
|
333
327
|
contents: {
|
|
334
328
|
type: "tabs",
|
|
@@ -340,6 +334,24 @@ router.get(
|
|
|
340
334
|
titles: [req.__("Show configuration object")],
|
|
341
335
|
},
|
|
342
336
|
},
|
|
337
|
+
{
|
|
338
|
+
type: "card",
|
|
339
|
+
title: req.__("Connected views"),
|
|
340
|
+
contents: tags.table(
|
|
341
|
+
tbody(
|
|
342
|
+
tr(
|
|
343
|
+
th({ class: "me-2" }, req.__("Embedded in")),
|
|
344
|
+
td(
|
|
345
|
+
inbound_connected.embeddedViews.map((v) => v.name).join(", ")
|
|
346
|
+
)
|
|
347
|
+
),
|
|
348
|
+
tr(
|
|
349
|
+
th({ class: "me-2" }, req.__("Linked from")),
|
|
350
|
+
td(inbound_connected.linkedViews.map((v) => v.name).join(", "))
|
|
351
|
+
)
|
|
352
|
+
)
|
|
353
|
+
),
|
|
354
|
+
},
|
|
343
355
|
],
|
|
344
356
|
});
|
|
345
357
|
})
|
|
@@ -458,6 +470,7 @@ router.post(
|
|
|
458
470
|
else v.configuration = {};
|
|
459
471
|
//console.log(v);
|
|
460
472
|
await View.create(v);
|
|
473
|
+
await sleep(500); // Allow other workers to load this view
|
|
461
474
|
}
|
|
462
475
|
res.redirect(
|
|
463
476
|
addOnDoneRedirect(
|
|
@@ -480,14 +493,22 @@ router.post(
|
|
|
480
493
|
* @param {object} res
|
|
481
494
|
* @returns {void}
|
|
482
495
|
*/
|
|
483
|
-
const respondWorkflow = (view, wf, wfres, req, res) => {
|
|
496
|
+
const respondWorkflow = (view, wf, wfres, req, res, table) => {
|
|
484
497
|
const wrap = (contents, noCard, previewURL) => ({
|
|
485
498
|
above: [
|
|
486
499
|
{
|
|
487
500
|
type: "breadcrumbs",
|
|
488
501
|
crumbs: [
|
|
489
502
|
{ text: req.__("Views"), href: "/viewedit" },
|
|
490
|
-
{
|
|
503
|
+
{
|
|
504
|
+
href: `/view/${view.name}`,
|
|
505
|
+
text: view.name,
|
|
506
|
+
postLinkText: `[${view.viewtemplate}${
|
|
507
|
+
table
|
|
508
|
+
? ` on ${a({ href: `/table/` + table.name }, table.name)}`
|
|
509
|
+
: ""
|
|
510
|
+
}]`,
|
|
511
|
+
},
|
|
491
512
|
{ workflow: wf, step: wfres },
|
|
492
513
|
],
|
|
493
514
|
},
|
|
@@ -571,6 +592,9 @@ router.get(
|
|
|
571
592
|
(view.configuration?.columns || []).forEach((c) => {
|
|
572
593
|
c._columndef = JSON.stringify(c);
|
|
573
594
|
});
|
|
595
|
+
let table;
|
|
596
|
+
if (view.table_id) table = Table.findOne({ id: view.table_id });
|
|
597
|
+
if (view.exttable_name) table = Table.findOne({ name: view.exttable_name });
|
|
574
598
|
const configFlow = await view.get_config_flow(req);
|
|
575
599
|
const hasConfig =
|
|
576
600
|
view.configuration && Object.keys(view.configuration).length > 0;
|
|
@@ -585,7 +609,7 @@ router.get(
|
|
|
585
609
|
},
|
|
586
610
|
req
|
|
587
611
|
);
|
|
588
|
-
respondWorkflow(view, configFlow, wfres, req, res);
|
|
612
|
+
respondWorkflow(view, configFlow, wfres, req, res, table);
|
|
589
613
|
})
|
|
590
614
|
);
|
|
591
615
|
|
|
@@ -604,7 +628,11 @@ router.post(
|
|
|
604
628
|
const view = await View.findOne({ name });
|
|
605
629
|
const configFlow = await view.get_config_flow(req);
|
|
606
630
|
const wfres = await configFlow.run(req.body, req);
|
|
607
|
-
|
|
631
|
+
|
|
632
|
+
let table;
|
|
633
|
+
if (view.table_id) table = Table.findOne({ id: view.table_id });
|
|
634
|
+
if (view.exttable_name) table = Table.findOne({ name: view.exttable_name });
|
|
635
|
+
respondWorkflow(view, configFlow, wfres, req, res, table);
|
|
608
636
|
})
|
|
609
637
|
);
|
|
610
638
|
|
package/tests/admin.test.js
CHANGED
|
@@ -29,7 +29,7 @@ beforeAll(async () => {
|
|
|
29
29
|
await File.from_req_files(
|
|
30
30
|
{ mimetype: "image/png", name: "rick.png", mv, size: 245752 },
|
|
31
31
|
1,
|
|
32
|
-
|
|
32
|
+
40
|
|
33
33
|
);
|
|
34
34
|
});
|
|
35
35
|
|
|
@@ -272,7 +272,7 @@ describe("menu editor", () => {
|
|
|
272
272
|
url: "",
|
|
273
273
|
type: "View",
|
|
274
274
|
label: "BarMenu",
|
|
275
|
-
min_role: "
|
|
275
|
+
min_role: "100",
|
|
276
276
|
pagename: null,
|
|
277
277
|
viewname: "dqwdw",
|
|
278
278
|
},
|
|
@@ -321,32 +321,32 @@ describe("roleadmin", () => {
|
|
|
321
321
|
await request(app)
|
|
322
322
|
.post("/roleadmin/edit")
|
|
323
323
|
.set("Cookie", loginCookie)
|
|
324
|
-
.send("id=
|
|
324
|
+
.send("id=50")
|
|
325
325
|
.send("role=muppets")
|
|
326
326
|
.expect(toRedirect("/roleadmin"));
|
|
327
327
|
const roles = await User.get_roles();
|
|
328
|
-
expect(roles).toContainEqual({ id:
|
|
328
|
+
expect(roles).toContainEqual({ id: 50, role: "muppets" });
|
|
329
329
|
});
|
|
330
330
|
it("show set layout for role", async () => {
|
|
331
331
|
const app = await getApp({ disableCsrf: true });
|
|
332
332
|
const loginCookie = await getAdminLoginCookie();
|
|
333
333
|
await request(app)
|
|
334
|
-
.post("/roleadmin/setrolelayout/
|
|
334
|
+
.post("/roleadmin/setrolelayout/50")
|
|
335
335
|
.set("Cookie", loginCookie)
|
|
336
336
|
.send("layout=tabler")
|
|
337
337
|
.expect(toRedirect("/roleadmin"));
|
|
338
338
|
const roles = await User.get_roles();
|
|
339
|
-
expect(roles).toContainEqual({ id:
|
|
339
|
+
expect(roles).toContainEqual({ id: 50, role: "muppets" });
|
|
340
340
|
});
|
|
341
341
|
it("show delete role", async () => {
|
|
342
342
|
const app = await getApp({ disableCsrf: true });
|
|
343
343
|
const loginCookie = await getAdminLoginCookie();
|
|
344
344
|
await request(app)
|
|
345
|
-
.post("/roleadmin/delete/
|
|
345
|
+
.post("/roleadmin/delete/50")
|
|
346
346
|
.set("Cookie", loginCookie)
|
|
347
347
|
.expect(toRedirect("/roleadmin"));
|
|
348
348
|
const roles = await User.get_roles();
|
|
349
|
-
expect(roles).not.toContainEqual({ id:
|
|
349
|
+
expect(roles).not.toContainEqual({ id: 50, role: "muppets" });
|
|
350
350
|
});
|
|
351
351
|
});
|
|
352
352
|
/**
|
package/tests/auth.test.js
CHANGED
|
@@ -205,7 +205,7 @@ describe("user admin", () => {
|
|
|
205
205
|
.post("/useradmin/save")
|
|
206
206
|
.send("email=staff2@foo.com")
|
|
207
207
|
.send("password=fideRGE54lio")
|
|
208
|
-
.send("role_id=
|
|
208
|
+
.send("role_id=80")
|
|
209
209
|
.set("Cookie", loginCookie)
|
|
210
210
|
.expect(toRedirect("/useradmin"));
|
|
211
211
|
});
|
|
@@ -223,7 +223,7 @@ describe("user admin", () => {
|
|
|
223
223
|
const app = await getApp({ disableCsrf: true });
|
|
224
224
|
const loginCookie = await getAdminLoginCookie();
|
|
225
225
|
const user = await User.findOne({ email: "staff2@foo.com" });
|
|
226
|
-
expect(user.role_id).toBe(
|
|
226
|
+
expect(user.role_id).toBe(80);
|
|
227
227
|
await request(app)
|
|
228
228
|
.get(`/useradmin/${user.id}`)
|
|
229
229
|
.set("Cookie", loginCookie)
|
|
@@ -238,11 +238,11 @@ describe("user admin", () => {
|
|
|
238
238
|
.post("/useradmin/save")
|
|
239
239
|
.send("email=staff2@foo.com")
|
|
240
240
|
.send(`id=${user.id}`)
|
|
241
|
-
.send("role_id=
|
|
241
|
+
.send("role_id=40")
|
|
242
242
|
.set("Cookie", loginCookie)
|
|
243
243
|
.expect(toRedirect("/useradmin"));
|
|
244
244
|
const edituser = await User.findOne({ email: "staff2@foo.com" });
|
|
245
|
-
expect(edituser.role_id).toBe(
|
|
245
|
+
expect(edituser.role_id).toBe(40);
|
|
246
246
|
});
|
|
247
247
|
it("tries to create new user with existing email", async () => {
|
|
248
248
|
const app = await getApp({ disableCsrf: true });
|
|
@@ -251,7 +251,7 @@ describe("user admin", () => {
|
|
|
251
251
|
.post("/useradmin/save")
|
|
252
252
|
.send("email=staff2@foo.com")
|
|
253
253
|
.send("password=fideRGE54lio")
|
|
254
|
-
.send("role_id=
|
|
254
|
+
.send("role_id=80")
|
|
255
255
|
.set("Cookie", loginCookie)
|
|
256
256
|
.expect(toRedirect("/useradmin"));
|
|
257
257
|
const editusers = await User.find({ email: "staff2@foo.com" });
|
|
@@ -342,7 +342,7 @@ describe("User fields", () => {
|
|
|
342
342
|
configuration: {
|
|
343
343
|
columns: [
|
|
344
344
|
{ type: "Field", fieldview: "edit", field_name: "height" },
|
|
345
|
-
{ type: "Action", minRole:
|
|
345
|
+
{ type: "Action", minRole: 100, action_name: "Save" },
|
|
346
346
|
],
|
|
347
347
|
layout: {
|
|
348
348
|
above: [
|
|
@@ -368,7 +368,7 @@ describe("User fields", () => {
|
|
|
368
368
|
],
|
|
369
369
|
},
|
|
370
370
|
{ type: "line_break" },
|
|
371
|
-
{ type: "action", minRole:
|
|
371
|
+
{ type: "action", minRole: 100, action_name: "Save" },
|
|
372
372
|
],
|
|
373
373
|
},
|
|
374
374
|
},
|
|
@@ -466,7 +466,7 @@ describe("signup with custom login form", () => {
|
|
|
466
466
|
{
|
|
467
467
|
type: "action",
|
|
468
468
|
rndid: "63f01b",
|
|
469
|
-
minRole:
|
|
469
|
+
minRole: 100,
|
|
470
470
|
isFormula: {},
|
|
471
471
|
action_name: "Login",
|
|
472
472
|
action_label: "Login",
|
|
@@ -476,7 +476,7 @@ describe("signup with custom login form", () => {
|
|
|
476
476
|
{
|
|
477
477
|
type: "action",
|
|
478
478
|
rndid: "45dd57",
|
|
479
|
-
minRole:
|
|
479
|
+
minRole: 100,
|
|
480
480
|
isFormula: {},
|
|
481
481
|
action_name: "Login with github",
|
|
482
482
|
configuration: {},
|
|
@@ -489,7 +489,7 @@ describe("signup with custom login form", () => {
|
|
|
489
489
|
{
|
|
490
490
|
type: "Action",
|
|
491
491
|
rndid: "63f01b",
|
|
492
|
-
minRole:
|
|
492
|
+
minRole: 100,
|
|
493
493
|
isFormula: {},
|
|
494
494
|
action_name: "Login",
|
|
495
495
|
action_label: "Login",
|
|
@@ -499,7 +499,7 @@ describe("signup with custom login form", () => {
|
|
|
499
499
|
{
|
|
500
500
|
type: "Action",
|
|
501
501
|
rndid: "45dd57",
|
|
502
|
-
minRole:
|
|
502
|
+
minRole: 100,
|
|
503
503
|
isFormula: {},
|
|
504
504
|
action_name: "Login with github",
|
|
505
505
|
configuration: {},
|
|
@@ -573,7 +573,7 @@ describe("signup with custom login form", () => {
|
|
|
573
573
|
{
|
|
574
574
|
type: "action",
|
|
575
575
|
rndid: "63f01b",
|
|
576
|
-
minRole:
|
|
576
|
+
minRole: 100,
|
|
577
577
|
isFormula: {},
|
|
578
578
|
action_name: "Sign up",
|
|
579
579
|
action_style: "btn-primary",
|
|
@@ -588,7 +588,7 @@ describe("signup with custom login form", () => {
|
|
|
588
588
|
{
|
|
589
589
|
type: "Action",
|
|
590
590
|
rndid: "63f01b",
|
|
591
|
-
minRole:
|
|
591
|
+
minRole: 100,
|
|
592
592
|
isFormula: {},
|
|
593
593
|
action_name: "Sign up",
|
|
594
594
|
action_style: "btn-primary",
|
package/tests/crud.test.js
CHANGED
|
@@ -61,7 +61,7 @@ describe("notifications", () => {
|
|
|
61
61
|
.expect(succeedJsonWith((n) => n === 0));
|
|
62
62
|
});
|
|
63
63
|
it("add notification", async () => {
|
|
64
|
-
const user = await User.findOne({ role_id:
|
|
64
|
+
const user = await User.findOne({ role_id: 40 });
|
|
65
65
|
await Notification.create({
|
|
66
66
|
user_id: user.id,
|
|
67
67
|
title: "This is a staff announcement",
|
|
@@ -170,7 +170,7 @@ describe("homepage", () => {
|
|
|
170
170
|
name: "anewview",
|
|
171
171
|
viewtemplate: "List",
|
|
172
172
|
configuration: { columns: [], default_state: { foo: "bar" } },
|
|
173
|
-
min_role:
|
|
173
|
+
min_role: 100,
|
|
174
174
|
});
|
|
175
175
|
const loginCookie = await getAdminLoginCookie();
|
|
176
176
|
|
package/tests/files.test.js
CHANGED
|
@@ -33,7 +33,7 @@ beforeAll(async () => {
|
|
|
33
33
|
size: 245752,
|
|
34
34
|
},
|
|
35
35
|
1,
|
|
36
|
-
|
|
36
|
+
40
|
|
37
37
|
);
|
|
38
38
|
await File.from_req_files(
|
|
39
39
|
{
|
|
@@ -45,7 +45,7 @@ beforeAll(async () => {
|
|
|
45
45
|
size: 219422,
|
|
46
46
|
},
|
|
47
47
|
1,
|
|
48
|
-
|
|
48
|
+
100
|
|
49
49
|
);
|
|
50
50
|
});
|
|
51
51
|
afterAll(db.close);
|
|
@@ -121,7 +121,7 @@ describe("files admin", () => {
|
|
|
121
121
|
await request(app)
|
|
122
122
|
.post("/files/setrole/rick.png")
|
|
123
123
|
.set("Cookie", loginCookie)
|
|
124
|
-
.send("role=
|
|
124
|
+
.send("role=100")
|
|
125
125
|
.expect(toRedirect("/files?dir=."));
|
|
126
126
|
});
|
|
127
127
|
it("serve file to public after role change", async () => {
|
|
@@ -150,7 +150,7 @@ describe("files admin", () => {
|
|
|
150
150
|
describe("files edit", () => {
|
|
151
151
|
it("creates table and view", async () => {
|
|
152
152
|
const table = await Table.create("thefiletable");
|
|
153
|
-
await table.update({ min_role_read:
|
|
153
|
+
await table.update({ min_role_read: 80, min_role_write: 80 });
|
|
154
154
|
await Field.create({
|
|
155
155
|
table,
|
|
156
156
|
name: "first_name",
|
|
@@ -171,7 +171,7 @@ describe("files edit", () => {
|
|
|
171
171
|
columns: [
|
|
172
172
|
{ type: "Field", field_name: "mugshot", fieldview: "upload" },
|
|
173
173
|
{ type: "Field", field_name: "first_name", fieldview: "edit" },
|
|
174
|
-
{ type: "Action", action_name: "Save", minRole:
|
|
174
|
+
{ type: "Action", action_name: "Save", minRole: 100 },
|
|
175
175
|
],
|
|
176
176
|
layout: {
|
|
177
177
|
above: [
|
|
@@ -188,7 +188,7 @@ describe("files edit", () => {
|
|
|
188
188
|
],
|
|
189
189
|
},
|
|
190
190
|
},
|
|
191
|
-
min_role:
|
|
191
|
+
min_role: 100,
|
|
192
192
|
});
|
|
193
193
|
});
|
|
194
194
|
it("shows edit view", async () => {
|
package/tests/kittens.test.js
CHANGED
|
@@ -24,8 +24,8 @@ const pack = {
|
|
|
24
24
|
tables: [
|
|
25
25
|
{
|
|
26
26
|
name: "cats",
|
|
27
|
-
min_role_read:
|
|
28
|
-
min_role_write:
|
|
27
|
+
min_role_read: 100,
|
|
28
|
+
min_role_write: 100,
|
|
29
29
|
versioned: false,
|
|
30
30
|
fields: [
|
|
31
31
|
{
|
|
@@ -75,7 +75,7 @@ const pack = {
|
|
|
75
75
|
latitude_field: "lat",
|
|
76
76
|
longtitude_field: "long",
|
|
77
77
|
},
|
|
78
|
-
min_role:
|
|
78
|
+
min_role: 100,
|
|
79
79
|
table: "cats",
|
|
80
80
|
},
|
|
81
81
|
{
|
|
@@ -100,7 +100,7 @@ const pack = {
|
|
|
100
100
|
],
|
|
101
101
|
viewname: "ShowName",
|
|
102
102
|
},
|
|
103
|
-
min_role:
|
|
103
|
+
min_role: 100,
|
|
104
104
|
table: "cats",
|
|
105
105
|
},
|
|
106
106
|
{
|
|
@@ -115,7 +115,7 @@ const pack = {
|
|
|
115
115
|
reload_on_drag: false,
|
|
116
116
|
view_to_create: "",
|
|
117
117
|
},
|
|
118
|
-
min_role:
|
|
118
|
+
min_role: 100,
|
|
119
119
|
table: "cats",
|
|
120
120
|
},
|
|
121
121
|
{
|
|
@@ -130,7 +130,7 @@ const pack = {
|
|
|
130
130
|
reload_on_drag: false,
|
|
131
131
|
view_to_create: "",
|
|
132
132
|
},
|
|
133
|
-
min_role:
|
|
133
|
+
min_role: 100,
|
|
134
134
|
table: "cats",
|
|
135
135
|
},
|
|
136
136
|
{
|
|
@@ -151,7 +151,7 @@ const pack = {
|
|
|
151
151
|
columns: [],
|
|
152
152
|
viewname: "NestedShow",
|
|
153
153
|
},
|
|
154
|
-
min_role:
|
|
154
|
+
min_role: 100,
|
|
155
155
|
table: "cats",
|
|
156
156
|
},
|
|
157
157
|
{
|
|
@@ -165,7 +165,7 @@ const pack = {
|
|
|
165
165
|
latitude_field: "lat",
|
|
166
166
|
longtitude_field: "long",
|
|
167
167
|
},
|
|
168
|
-
min_role:
|
|
168
|
+
min_role: 100,
|
|
169
169
|
table: "cats",
|
|
170
170
|
},
|
|
171
171
|
{
|
|
@@ -180,7 +180,7 @@ const pack = {
|
|
|
180
180
|
reload_on_drag: false,
|
|
181
181
|
view_to_create: "",
|
|
182
182
|
},
|
|
183
|
-
min_role:
|
|
183
|
+
min_role: 100,
|
|
184
184
|
table: "cats",
|
|
185
185
|
},
|
|
186
186
|
{
|
|
@@ -201,7 +201,7 @@ const pack = {
|
|
|
201
201
|
columns: [],
|
|
202
202
|
viewname: "NestedShowNoPop",
|
|
203
203
|
},
|
|
204
|
-
min_role:
|
|
204
|
+
min_role: 100,
|
|
205
205
|
table: "cats",
|
|
206
206
|
},
|
|
207
207
|
{
|
|
@@ -216,7 +216,7 @@ const pack = {
|
|
|
216
216
|
reload_on_drag: false,
|
|
217
217
|
view_to_create: "",
|
|
218
218
|
},
|
|
219
|
-
min_role:
|
|
219
|
+
min_role: 100,
|
|
220
220
|
table: "cats",
|
|
221
221
|
},
|
|
222
222
|
],
|
package/tests/page.test.js
CHANGED
|
@@ -44,7 +44,7 @@ describe("page create", () => {
|
|
|
44
44
|
const loginCookie = await getAdminLoginCookie();
|
|
45
45
|
await request(app)
|
|
46
46
|
.post("/pageedit/edit-properties")
|
|
47
|
-
.send("name=whales&title=Whales&description=about+whales&min_role=
|
|
47
|
+
.send("name=whales&title=Whales&description=about+whales&min_role=100")
|
|
48
48
|
.set("Cookie", loginCookie)
|
|
49
49
|
.expect(toRedirect("/pageedit/edit/whales"));
|
|
50
50
|
});
|
|
@@ -76,7 +76,7 @@ describe("page action", () => {
|
|
|
76
76
|
name: "pagewithaction",
|
|
77
77
|
title: "",
|
|
78
78
|
description: "",
|
|
79
|
-
min_role:
|
|
79
|
+
min_role: 100,
|
|
80
80
|
id: 2,
|
|
81
81
|
layout: {
|
|
82
82
|
widths: [6, 6],
|
|
@@ -85,7 +85,7 @@ describe("page action", () => {
|
|
|
85
85
|
{
|
|
86
86
|
type: "action",
|
|
87
87
|
rndid: "56f3ac",
|
|
88
|
-
minRole:
|
|
88
|
+
minRole: 100,
|
|
89
89
|
isFormula: {},
|
|
90
90
|
action_icon: "far fa-angry",
|
|
91
91
|
action_name: "run_js_code",
|
|
@@ -142,7 +142,7 @@ describe("pageedit", () => {
|
|
|
142
142
|
.send("name=a_page")
|
|
143
143
|
.send("title=mytitle")
|
|
144
144
|
.send("description=mydescript")
|
|
145
|
-
.send("min_role=
|
|
145
|
+
.send("min_role=80")
|
|
146
146
|
.send("id=1")
|
|
147
147
|
.expect(toRedirect("/pageedit/"));
|
|
148
148
|
});
|
|
@@ -153,7 +153,6 @@ describe("pageedit", () => {
|
|
|
153
153
|
.get("/pageedit/edit/a_page")
|
|
154
154
|
.set("Cookie", loginCookie)
|
|
155
155
|
.expect(toInclude("<script>builder.renderBuilder"));
|
|
156
|
-
|
|
157
156
|
});
|
|
158
157
|
|
|
159
158
|
it("sets root page", async () => {
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
const request = require("supertest");
|
|
2
|
+
const getApp = require("../app");
|
|
3
|
+
const {
|
|
4
|
+
getUserLoginCookie,
|
|
5
|
+
getAdminLoginCookie,
|
|
6
|
+
resetToFixtures,
|
|
7
|
+
notAuthorized,
|
|
8
|
+
respondJsonWith,
|
|
9
|
+
} = require("../auth/testhelp");
|
|
10
|
+
const db = require("@saltcorn/data/db");
|
|
11
|
+
|
|
12
|
+
const Table = require("@saltcorn/data/models/table");
|
|
13
|
+
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
await resetToFixtures();
|
|
16
|
+
});
|
|
17
|
+
afterAll(db.close);
|
|
18
|
+
|
|
19
|
+
describe("Synchronise with mobile offline data", () => {
|
|
20
|
+
it("not permitted", async () => {
|
|
21
|
+
if (!db.isSQLite) {
|
|
22
|
+
const patients = Table.findOne({ name: "patients" });
|
|
23
|
+
const books = Table.findOne({ name: "books" });
|
|
24
|
+
const patientsBefore = await patients.countRows();
|
|
25
|
+
const booksBefore = await books.countRows();
|
|
26
|
+
const app = await getApp({ disableCsrf: true });
|
|
27
|
+
const loginCookie = await getUserLoginCookie();
|
|
28
|
+
await request(app)
|
|
29
|
+
.post("/sync/table_data")
|
|
30
|
+
.set("Cookie", loginCookie)
|
|
31
|
+
.send({
|
|
32
|
+
data: {
|
|
33
|
+
patients: [
|
|
34
|
+
{
|
|
35
|
+
name: "Brad Pitt",
|
|
36
|
+
favbook: 2,
|
|
37
|
+
parent: 1,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 84,
|
|
41
|
+
name: "Pitt Brad",
|
|
42
|
+
favbook: 2,
|
|
43
|
+
parent: 1,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
books: [
|
|
47
|
+
{
|
|
48
|
+
id: 3,
|
|
49
|
+
author: "foo",
|
|
50
|
+
pages: 20,
|
|
51
|
+
publisher: 1,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
.expect(notAuthorized);
|
|
57
|
+
const patientsAfter = await patients.countRows();
|
|
58
|
+
const booksAfter = await books.countRows();
|
|
59
|
+
expect(patientsAfter).toBe(patientsBefore);
|
|
60
|
+
expect(booksAfter).toBe(booksBefore);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("upload patients and books", async () => {
|
|
65
|
+
if (!db.isSQLite) {
|
|
66
|
+
const patients = Table.findOne({ name: "patients" });
|
|
67
|
+
const books = Table.findOne({ name: "books" });
|
|
68
|
+
const patientsBefore = await patients.countRows();
|
|
69
|
+
const booksBefore = await books.countRows();
|
|
70
|
+
const app = await getApp({ disableCsrf: true });
|
|
71
|
+
const loginCookie = await getAdminLoginCookie();
|
|
72
|
+
await request(app)
|
|
73
|
+
.post("/sync/table_data")
|
|
74
|
+
.set("Cookie", loginCookie)
|
|
75
|
+
.send({
|
|
76
|
+
data: {
|
|
77
|
+
patients: [
|
|
78
|
+
{
|
|
79
|
+
name: "Brad Pitt",
|
|
80
|
+
favbook: 2,
|
|
81
|
+
parent: 1,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: 84,
|
|
85
|
+
name: "Pitt Brad",
|
|
86
|
+
favbook: 2,
|
|
87
|
+
parent: 1,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
books: [
|
|
91
|
+
{
|
|
92
|
+
id: 3,
|
|
93
|
+
author: "foo",
|
|
94
|
+
pages: 20,
|
|
95
|
+
publisher: 1,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
})
|
|
100
|
+
.expect(respondJsonWith(200, ({ success }) => success));
|
|
101
|
+
const patientsAfter = await patients.countRows();
|
|
102
|
+
const booksAfter = await books.countRows();
|
|
103
|
+
expect(patientsAfter).toBe(patientsBefore + 2);
|
|
104
|
+
expect(booksAfter).toBe(booksBefore + 1);
|
|
105
|
+
expect((await patients.getRows({ id: 84 })).length).toBe(0);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
package/tests/table.test.js
CHANGED
|
@@ -35,7 +35,7 @@ describe("Table Endpoints", () => {
|
|
|
35
35
|
.post("/table/")
|
|
36
36
|
.send("name=mypostedtable")
|
|
37
37
|
.set("Cookie", loginCookie)
|
|
38
|
-
.expect(toRedirect("/table/
|
|
38
|
+
.expect(toRedirect("/table/16"));
|
|
39
39
|
await request(app)
|
|
40
40
|
.get("/table/10")
|
|
41
41
|
.set("Cookie", loginCookie)
|
|
@@ -98,19 +98,19 @@ describe("Table Endpoints", () => {
|
|
|
98
98
|
await request(app)
|
|
99
99
|
.post(`/table`)
|
|
100
100
|
.set("Cookie", loginCookie)
|
|
101
|
-
.send("min_role_read=
|
|
101
|
+
.send("min_role_read=100&min_role_write=1&id=" + tbl.id)
|
|
102
102
|
.expect(toRedirect(`/table/${tbl.id}`));
|
|
103
103
|
await request(app).get(`/table/${tbl.id}`).set("Cookie", loginCookie);
|
|
104
104
|
await request(app)
|
|
105
105
|
.post(`/table`)
|
|
106
106
|
.set("Cookie", loginCookie)
|
|
107
|
-
.send("min_role_read=
|
|
107
|
+
.send("min_role_read=100&min_role_write=1&id=" + tbl.id)
|
|
108
108
|
.expect(toRedirect(`/table/${tbl.id}`));
|
|
109
109
|
await request(app).get(`/table/${tbl.id}`).set("Cookie", loginCookie);
|
|
110
110
|
await request(app)
|
|
111
111
|
.post(`/table`)
|
|
112
112
|
.set("Cookie", loginCookie)
|
|
113
|
-
.send("min_role_read=
|
|
113
|
+
.send("min_role_read=100&min_role_write=1&id=" + tbl.id)
|
|
114
114
|
.expect(toRedirect(`/table/${tbl.id}`));
|
|
115
115
|
await request(app).get(`/table/${tbl.id}`).set("Cookie", loginCookie);
|
|
116
116
|
});
|
|
@@ -121,7 +121,7 @@ describe("Table Endpoints", () => {
|
|
|
121
121
|
await request(app)
|
|
122
122
|
.post(`/table`)
|
|
123
123
|
.set("Cookie", loginCookie)
|
|
124
|
-
.send("min_role_read=
|
|
124
|
+
.send("min_role_read=80&name=exttab&external=on")
|
|
125
125
|
.expect(toRedirect(`/table/exttab`));
|
|
126
126
|
});
|
|
127
127
|
it("should download csv ", async () => {
|
|
@@ -151,7 +151,7 @@ Pencil, 0.5,2, t`;
|
|
|
151
151
|
.set("Cookie", loginCookie)
|
|
152
152
|
.field("name", "expenses")
|
|
153
153
|
.attach("file", Buffer.from(csv, "utf-8"))
|
|
154
|
-
.expect(toRedirect("/table/
|
|
154
|
+
.expect(toRedirect("/table/17"));
|
|
155
155
|
});
|
|
156
156
|
it("should upload csv to existing table", async () => {
|
|
157
157
|
const csv = `author,Pages
|