@saltcorn/server 0.6.1-beta.0 → 0.6.1

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.
Files changed (53) hide show
  1. package/app.js +7 -0
  2. package/auth/admin.js +120 -5
  3. package/auth/index.js +7 -0
  4. package/auth/resetpw.js +22 -0
  5. package/auth/roleadmin.js +52 -0
  6. package/auth/routes.js +211 -2
  7. package/auth/testhelp.js +69 -0
  8. package/errors.js +14 -1
  9. package/fixture_persons.js +14 -0
  10. package/index.js +6 -0
  11. package/load_plugins.js +4 -3
  12. package/locales/en.json +7 -1
  13. package/markup/admin.js +97 -1
  14. package/markup/blockly.js +15 -0
  15. package/markup/expression_blurb.js +45 -0
  16. package/markup/forms.js +24 -0
  17. package/markup/index.js +7 -0
  18. package/markup/plugin-store.js +36 -0
  19. package/package.json +6 -6
  20. package/public/saltcorn-builder.css +1 -0
  21. package/public/saltcorn.js +5 -1
  22. package/routes/actions.js +53 -1
  23. package/routes/admin.js +97 -1
  24. package/routes/api.js +45 -10
  25. package/routes/config.js +18 -0
  26. package/routes/crashlog.js +31 -0
  27. package/routes/delete.js +19 -0
  28. package/routes/edit.js +19 -0
  29. package/routes/eventlog.js +65 -1
  30. package/routes/events.js +19 -0
  31. package/routes/fields.js +88 -0
  32. package/routes/files.js +62 -0
  33. package/routes/homepage.js +175 -80
  34. package/routes/index.js +7 -1
  35. package/routes/infoarch.js +56 -0
  36. package/routes/library.js +32 -0
  37. package/routes/list.js +28 -1
  38. package/routes/menu.js +45 -0
  39. package/routes/packs.js +53 -0
  40. package/routes/page.js +26 -0
  41. package/routes/pageedit.js +129 -3
  42. package/routes/plugins.js +156 -5
  43. package/routes/scapi.js +79 -23
  44. package/routes/search.js +51 -0
  45. package/routes/settings.js +27 -0
  46. package/routes/tables.js +148 -19
  47. package/routes/tenant.js +123 -31
  48. package/routes/utils.js +60 -1
  49. package/routes/view.js +37 -0
  50. package/routes/viewedit.js +114 -1
  51. package/serve.js +138 -88
  52. package/systemd.js +18 -1
  53. package/wrapper.js +4 -0
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @category server
3
+ * @module routes/pageedit
4
+ * @subcategory routes
5
+ */
1
6
  const Router = require("express-promise-router");
2
7
 
3
8
  const View = require("@saltcorn/data/models/view");
@@ -30,9 +35,22 @@ const { getActionConfigFields } = require("@saltcorn/data/plugin-helper");
30
35
  const { editRoleForm, wizardCardTitle } = require("../markup/forms.js");
31
36
  const Library = require("@saltcorn/data/models/library");
32
37
 
38
+ /**
39
+ * @type {object}
40
+ * @const
41
+ * @namespace pageeditRouter
42
+ * @category server
43
+ * @subcategory routes
44
+ */
33
45
  const router = new Router();
34
46
  module.exports = router;
35
47
 
48
+ /**
49
+ * @param {object} page
50
+ * @param {*} roles
51
+ * @param {object} req
52
+ * @returns {Form}
53
+ */
36
54
  const editPageRoleForm = (page, roles, req) =>
37
55
  editRoleForm({
38
56
  url: `/pageedit/setrole/${page.id}`,
@@ -41,6 +59,11 @@ const editPageRoleForm = (page, roles, req) =>
41
59
  req,
42
60
  });
43
61
 
62
+ /**
63
+ * @param {object} page
64
+ * @param {object} req
65
+ * @returns {string}
66
+ */
44
67
  const page_dropdown = (page, req) =>
45
68
  settingsDropdown(`dropdownMenuButton${page.id}`, [
46
69
  a(
@@ -77,6 +100,11 @@ const page_dropdown = (page, req) =>
77
100
  ),
78
101
  ]);
79
102
 
103
+ /**
104
+ *
105
+ * @param {object} req
106
+ * @returns {Promise<Form>}
107
+ */
80
108
  const pagePropertiesForm = async (req) => {
81
109
  const roles = await User.get_roles();
82
110
 
@@ -117,6 +145,12 @@ const pagePropertiesForm = async (req) => {
117
145
  return form;
118
146
  };
119
147
 
148
+ /**
149
+ *
150
+ * @param {object} req
151
+ * @param {object} context
152
+ * @returns {Promise<object>}
153
+ */
120
154
  const pageBuilderData = async (req, context) => {
121
155
  const views = await View.find();
122
156
  const pages = await Page.find();
@@ -190,6 +224,12 @@ const pageBuilderData = async (req, context) => {
190
224
  };
191
225
  };
192
226
 
227
+ /**
228
+ * @param {*} rows
229
+ * @param {*} roles
230
+ * @param {object} req
231
+ * @returns {div}
232
+ */
193
233
  const getPageList = (rows, roles, req) => {
194
234
  return div(
195
235
  mkTable(
@@ -223,12 +263,13 @@ const getPageList = (rows, roles, req) => {
223
263
  )
224
264
  );
225
265
  };
266
+
226
267
  /**
227
268
  * Root pages configuration Form
228
269
  * Allows to configure root page for each role
229
- * @param pages - list of pages
230
- * @param roles - list of roles
231
- * @param req - request
270
+ * @param {object[]} pages list of pages
271
+ * @param {object[]} roles - list of roles
272
+ * @param {object} req - request
232
273
  * @returns {Form} return Form
233
274
  */
234
275
  const getRootPageForm = (pages, roles, req) => {
@@ -258,6 +299,13 @@ const getRootPageForm = (pages, roles, req) => {
258
299
  }
259
300
  return form;
260
301
  };
302
+
303
+ /**
304
+ * @name get
305
+ * @function
306
+ * @memberof module:routes/pageedit~pageeditRouter
307
+ * @function
308
+ */
261
309
  router.get(
262
310
  "/",
263
311
  setTenant,
@@ -289,6 +337,14 @@ router.get(
289
337
  });
290
338
  })
291
339
  );
340
+
341
+ /**
342
+ * @param {*} contents
343
+ * @param {*} noCard
344
+ * @param {object} req
345
+ * @param {*} page
346
+ * @returns {*}
347
+ */
292
348
  const wrap = (contents, noCard, req, page) => ({
293
349
  above: [
294
350
  {
@@ -308,6 +364,12 @@ const wrap = (contents, noCard, req, page) => ({
308
364
  ],
309
365
  });
310
366
 
367
+ /**
368
+ * @name get/edit-properties/:pagename
369
+ * @function
370
+ * @memberof module:routes/pageedit~pageeditRouter
371
+ * @function
372
+ */
311
373
  router.get(
312
374
  "/edit-properties/:pagename",
313
375
  setTenant,
@@ -330,6 +392,13 @@ router.get(
330
392
  }
331
393
  })
332
394
  );
395
+
396
+ /**
397
+ * @name get/new
398
+ * @function
399
+ * @memberof module:routes/pageedit~pageeditRouter
400
+ * @function
401
+ */
333
402
  router.get(
334
403
  "/new",
335
404
  setTenant,
@@ -343,6 +412,12 @@ router.get(
343
412
  })
344
413
  );
345
414
 
415
+ /**
416
+ * @name post/edit-properties
417
+ * @function
418
+ * @memberof module:routes/pageedit~pageeditRouter
419
+ * @function
420
+ */
346
421
  router.post(
347
422
  "/edit-properties",
348
423
  setTenant,
@@ -373,6 +448,12 @@ router.post(
373
448
  })
374
449
  );
375
450
 
451
+ /**
452
+ * @name get/edit/:pagename
453
+ * @function
454
+ * @memberof module:routes/pageedit~pageeditRouter
455
+ * @function
456
+ */
376
457
  router.get(
377
458
  "/edit/:pagename",
378
459
  setTenant,
@@ -408,6 +489,13 @@ router.get(
408
489
  }
409
490
  })
410
491
  );
492
+
493
+ /**
494
+ * @name post/edit/:pagename
495
+ * @function
496
+ * @memberof module:routes/pageedit~pageeditRouter
497
+ * @function
498
+ */
411
499
  router.post(
412
500
  "/edit/:pagename",
413
501
  setTenant,
@@ -433,6 +521,12 @@ router.post(
433
521
  })
434
522
  );
435
523
 
524
+ /**
525
+ * @name post/savebuilder/:id
526
+ * @function
527
+ * @memberof module:routes/pageedit~pageeditRouter
528
+ * @function
529
+ */
436
530
  router.post(
437
531
  "/savebuilder/:id",
438
532
  setTenant,
@@ -449,6 +543,12 @@ router.post(
449
543
  })
450
544
  );
451
545
 
546
+ /**
547
+ * @name post/delete/:id
548
+ * @function
549
+ * @memberof module:routes/pageedit~pageeditRouter
550
+ * @function
551
+ */
452
552
  router.post(
453
553
  "/delete/:id",
454
554
  setTenant,
@@ -462,6 +562,12 @@ router.post(
462
562
  })
463
563
  );
464
564
 
565
+ /**
566
+ * @name post/set_root_page
567
+ * @function
568
+ * @memberof module:routes/pageedit~pageeditRouter
569
+ * @function
570
+ */
465
571
  router.post(
466
572
  "/set_root_page",
467
573
  setTenant,
@@ -484,6 +590,12 @@ router.post(
484
590
  })
485
591
  );
486
592
 
593
+ /**
594
+ * @name post/add-to-menu/:id
595
+ * @function
596
+ * @memberof module:routes/pageedit~pageeditRouter
597
+ * @function
598
+ */
487
599
  router.post(
488
600
  "/add-to-menu/:id",
489
601
  setTenant,
@@ -507,6 +619,13 @@ router.post(
507
619
  res.redirect(`/pageedit`);
508
620
  })
509
621
  );
622
+
623
+ /**
624
+ * @name post/clone/:id
625
+ * @function
626
+ * @memberof module:routes/pageedit~pageeditRouter
627
+ * @function
628
+ */
510
629
  router.post(
511
630
  "/clone/:id",
512
631
  setTenant,
@@ -522,6 +641,13 @@ router.post(
522
641
  res.redirect(`/pageedit`);
523
642
  })
524
643
  );
644
+
645
+ /**
646
+ * @name post/setrole/:id
647
+ * @function
648
+ * @memberof module:routes/pageedit~pageeditRouter
649
+ * @function
650
+ */
525
651
  router.post(
526
652
  "/setrole/:id",
527
653
  setTenant,
package/routes/plugins.js CHANGED
@@ -1,5 +1,8 @@
1
1
  /**
2
2
  * Plugin Handler for Admin zone
3
+ * @category server
4
+ * @module routes/plugins
5
+ * @subcategory routes
3
6
  */
4
7
 
5
8
  const Router = require("express-promise-router");
@@ -49,12 +52,20 @@ const path = require("path");
49
52
  const { get_latest_npm_version } = require("@saltcorn/data/models/config");
50
53
  const { flash_restart } = require("../markup/admin.js");
51
54
 
55
+ /**
56
+ * @type {object}
57
+ * @const
58
+ * @namespace pluginsRouter
59
+ * @category server
60
+ * @subcategory routes
61
+ */
52
62
  const router = new Router();
53
63
  module.exports = router;
64
+
54
65
  /**
55
66
  * Plugin Form Creation
56
- * @param req
57
- * @param plugin
67
+ * @param {object} req
68
+ * @param {object} plugin
58
69
  * @returns {Form}
59
70
  */
60
71
  const pluginForm = (req, plugin) => {
@@ -119,18 +130,20 @@ const pluginForm = (req, plugin) => {
119
130
  }
120
131
  return form;
121
132
  };
133
+
122
134
  /**
123
135
  * Returns true if plugin has own theme
124
- * @param name -plugin name
136
+ * @param {string} name plugin name
125
137
  * @returns {*|boolean}
126
138
  */
127
139
  const local_has_theme = (name) => {
128
140
  const mod = getState().plugins[name];
129
141
  return mod ? mod.layout : false;
130
142
  };
143
+
131
144
  /**
132
145
  * Get Pluging store itmes
133
- * @returns {Promise<*[]>}
146
+ * @returns {Promise<Object[]>}
134
147
  */
135
148
  const get_store_items = async () => {
136
149
  const installed_plugins = await Plugin.find({});
@@ -175,6 +188,11 @@ const get_store_items = async () => {
175
188
  );
176
189
  };
177
190
 
191
+ /**
192
+ * @param {object} req
193
+ * @param {object} row
194
+ * @returns {a|string}
195
+ */
178
196
  const cfg_link = (req, row) => {
179
197
  let plugin = getState().plugins[row.name];
180
198
  let linknm = row.name;
@@ -200,6 +218,11 @@ const cfg_link = (req, row) => {
200
218
  else return "";
201
219
  };
202
220
 
221
+ /**
222
+ * @param {object} req
223
+ * @param {object} row
224
+ * @returns {a}
225
+ */
203
226
  const info_link = (req, row) =>
204
227
  a(
205
228
  {
@@ -211,9 +234,18 @@ const info_link = (req, row) =>
211
234
  '<i class="far fa-question-circle"></i>'
212
235
  );
213
236
 
214
- const badge = (title) =>
237
+ /**
238
+ * @param {string} title
239
+ * @returns {span}
240
+ */
241
+ const badge = (title) =>
215
242
  span({ class: "badge badge-secondary plugin-store" }, title);
216
243
 
244
+ /**
245
+ *
246
+ * @param {object} req
247
+ * @returns {function}
248
+ */
217
249
  const store_item_html = (req) => (item) => ({
218
250
  type: "card",
219
251
  title: item.name,
@@ -300,6 +332,11 @@ const store_item_html = (req) => (item) => ({
300
332
  )
301
333
  ),
302
334
  });
335
+
336
+ /**
337
+ * @param {object} req
338
+ * @returns {ul}
339
+ */
303
340
  const storeNavPills = (req) => {
304
341
  const link = (txt) =>
305
342
  li(
@@ -327,20 +364,41 @@ const storeNavPills = (req) => {
327
364
  );
328
365
  };
329
366
 
367
+ /**
368
+ * @param {object[]} items
369
+ * @param {object} query
370
+ * @returns {object[]}
371
+ */
330
372
  const filter_items = (items, query) => {
331
373
  const in_set = filter_items_set(items, query);
332
374
  if (!query.q) return in_set;
333
375
  return in_set.filter((p) => satisfy_q(p, query.q.toLowerCase()));
334
376
  };
335
377
 
378
+ /**
379
+ * @param {string} s
380
+ * @param {string} q
381
+ * @returns {boolean}
382
+ */
336
383
  const match_string = (s, q) => {
337
384
  if (!s || !q) return false;
338
385
  return s.toLowerCase().includes(q);
339
386
  };
340
387
 
388
+ /**
389
+ * @param {string} p
390
+ * @param {string} q
391
+ * @returns {boolean}
392
+ */
341
393
  const satisfy_q = (p, q) => {
342
394
  return match_string(p.name, q) || match_string(p.description, q);
343
395
  };
396
+
397
+ /**
398
+ * @param {object[]} items
399
+ * @param {object} query
400
+ * @returns {object[]}
401
+ */
344
402
  const filter_items_set = (items, query) => {
345
403
  switch (query.set) {
346
404
  case "plugins":
@@ -355,6 +413,11 @@ const filter_items_set = (items, query) => {
355
413
  return items;
356
414
  }
357
415
  };
416
+
417
+ /**
418
+ * @param {object} req
419
+ * @returns {div}
420
+ */
358
421
  const store_actions_dropdown = (req) =>
359
422
  div(
360
423
  { class: "dropdown" },
@@ -418,6 +481,12 @@ const store_actions_dropdown = (req) =>
418
481
  //create pack
419
482
  )
420
483
  );
484
+
485
+ /**
486
+ * @param {object[]} items
487
+ * @param {object} req
488
+ * @returns {object}
489
+ */
421
490
  const plugin_store_html = (items, req) => {
422
491
  return {
423
492
  above: [
@@ -448,6 +517,12 @@ const plugin_store_html = (items, req) => {
448
517
  };
449
518
  };
450
519
 
520
+ /**
521
+ * @name get
522
+ * @function
523
+ * @memberof module:routes/plugins~pluginsRouter
524
+ * @function
525
+ */
451
526
  router.get(
452
527
  "/",
453
528
  setTenant,
@@ -459,6 +534,12 @@ router.get(
459
534
  })
460
535
  );
461
536
 
537
+ /**
538
+ * @name get/configure/:name
539
+ * @function
540
+ * @memberof module:routes/plugins~pluginsRouter
541
+ * @function
542
+ */
462
543
  router.get(
463
544
  "/configure/:name",
464
545
  setTenant,
@@ -485,6 +566,13 @@ router.get(
485
566
  );
486
567
  })
487
568
  );
569
+
570
+ /**
571
+ * @name post/configure/:name
572
+ * @function
573
+ * @memberof module:routes/plugins~pluginsRouter
574
+ * @function
575
+ */
488
576
  router.post(
489
577
  "/configure/:name",
490
578
  setTenant,
@@ -520,6 +608,13 @@ router.post(
520
608
  }
521
609
  })
522
610
  );
611
+
612
+ /**
613
+ * @name get/new
614
+ * @function
615
+ * @memberof module:routes/plugins~pluginsRouter
616
+ * @function
617
+ */
523
618
  router.get(
524
619
  "/new",
525
620
  setTenant,
@@ -544,6 +639,13 @@ router.get(
544
639
  });
545
640
  })
546
641
  );
642
+
643
+ /**
644
+ * @name get/public/:plugin/*
645
+ * @function
646
+ * @memberof module:routes/plugins~pluginsRouter
647
+ * @function
648
+ */
547
649
  router.get(
548
650
  "/public/:plugin/*",
549
651
  setTenant,
@@ -564,6 +666,12 @@ router.get(
564
666
  })
565
667
  );
566
668
 
669
+ /**
670
+ * @name get/pubdeps/:plugin/:dependency/:version/*
671
+ * @function
672
+ * @memberof module:routes/plugins~pluginsRouter
673
+ * @function
674
+ */
567
675
  router.get(
568
676
  "/pubdeps/:plugin/:dependency/:version/*",
569
677
  setTenant,
@@ -591,6 +699,12 @@ router.get(
591
699
  })
592
700
  );
593
701
 
702
+ /**
703
+ * @name get/info/:name
704
+ * @function
705
+ * @memberof module:routes/plugins~pluginsRouter
706
+ * @function
707
+ */
594
708
  router.get(
595
709
  "/info/:name",
596
710
  setTenant,
@@ -694,6 +808,12 @@ router.get(
694
808
  })
695
809
  );
696
810
 
811
+ /**
812
+ * @name get/refresh
813
+ * @function
814
+ * @memberof module:routes/plugins~pluginsRouter
815
+ * @function
816
+ */
697
817
  router.get(
698
818
  "/refresh",
699
819
  setTenant,
@@ -712,6 +832,12 @@ router.get(
712
832
  })
713
833
  );
714
834
 
835
+ /**
836
+ * @name get/upgrade
837
+ * @function
838
+ * @memberof module:routes/plugins~pluginsRouter
839
+ * @function
840
+ */
715
841
  router.get(
716
842
  "/upgrade",
717
843
  setTenant,
@@ -727,6 +853,12 @@ router.get(
727
853
  })
728
854
  );
729
855
 
856
+ /**
857
+ * @name get/upgrade-plugin/:name
858
+ * @function
859
+ * @memberof module:routes/plugins~pluginsRouter
860
+ * @function
861
+ */
730
862
  router.get(
731
863
  "/upgrade-plugin/:name",
732
864
  setTenant,
@@ -741,6 +873,13 @@ router.get(
741
873
  res.redirect(`/plugins/info/${plugin.name}`);
742
874
  })
743
875
  );
876
+
877
+ /**
878
+ * @name post
879
+ * @function
880
+ * @memberof module:routes/plugins~pluginsRouter
881
+ * @function
882
+ */
744
883
  router.post(
745
884
  "/",
746
885
  setTenant,
@@ -771,6 +910,12 @@ router.post(
771
910
  })
772
911
  );
773
912
 
913
+ /**
914
+ * @name post/delete/:name
915
+ * @function
916
+ * @memberof module:routes/plugins~pluginsRouter
917
+ * @function
918
+ */
774
919
  router.post(
775
920
  "/delete/:name",
776
921
  setTenant,
@@ -801,6 +946,12 @@ router.post(
801
946
  })
802
947
  );
803
948
 
949
+ /**
950
+ * @name post/install/:name
951
+ * @function
952
+ * @memberof module:routes/plugins~pluginsRouter
953
+ * @function
954
+ */
804
955
  router.post(
805
956
  "/install/:name",
806
957
  setTenant,