@saltcorn/server 1.1.2-beta.3 → 1.1.2-beta.5

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 CHANGED
@@ -131,6 +131,7 @@ const getApp = async (opts = {}) => {
131
131
  "cross_domain_iframe",
132
132
  false
133
133
  );
134
+ app.set("query parser", "extended");
134
135
 
135
136
  const helmetOptions = {
136
137
  contentSecurityPolicy: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "1.1.2-beta.3",
3
+ "version": "1.1.2-beta.5",
4
4
  "description": "Server app for Saltcorn, open-source no-code platform",
5
5
  "homepage": "https://saltcorn.com",
6
6
  "main": "index.js",
@@ -8,14 +8,14 @@
8
8
  "dependencies": {
9
9
  "@aws-sdk/client-s3": "^3.735.0",
10
10
  "@dr.pogodin/csurf": "^1.14.1",
11
- "@saltcorn/base-plugin": "1.1.2-beta.3",
12
- "@saltcorn/builder": "1.1.2-beta.3",
13
- "@saltcorn/data": "1.1.2-beta.3",
14
- "@saltcorn/admin-models": "1.1.2-beta.3",
15
- "@saltcorn/filemanager": "1.1.2-beta.3",
16
- "@saltcorn/markup": "1.1.2-beta.3",
17
- "@saltcorn/plugins-loader": "1.1.2-beta.3",
18
- "@saltcorn/sbadmin2": "1.1.2-beta.3",
11
+ "@saltcorn/base-plugin": "1.1.2-beta.5",
12
+ "@saltcorn/builder": "1.1.2-beta.5",
13
+ "@saltcorn/data": "1.1.2-beta.5",
14
+ "@saltcorn/admin-models": "1.1.2-beta.5",
15
+ "@saltcorn/filemanager": "1.1.2-beta.5",
16
+ "@saltcorn/markup": "1.1.2-beta.5",
17
+ "@saltcorn/plugins-loader": "1.1.2-beta.5",
18
+ "@saltcorn/sbadmin2": "1.1.2-beta.5",
19
19
  "@socket.io/cluster-adapter": "^0.2.1",
20
20
  "@socket.io/sticky": "^1.0.1",
21
21
  "adm-zip": "0.5.16",
@@ -103,15 +103,26 @@ function rep_del(e) {
103
103
  var myrep = $(e).closest(".form-repeat");
104
104
  var ix = myrep.index();
105
105
  var parent = myrep.parent();
106
- myrep.remove();
107
106
  parent.children().each(function (childix, element) {
108
107
  if (childix > ix) {
109
108
  reindex(element, childix, childix - 1);
110
109
  }
111
110
  });
111
+ myrep.remove();
112
112
  }
113
113
 
114
114
  function reindex(element, oldix, newix) {
115
+ $(element)
116
+ .find("input,textarea")
117
+ .each(function () {
118
+ $(this).attr("value", $(this).val());
119
+ });
120
+ $(element)
121
+ .find("select")
122
+ .each(function () {
123
+ $(this).find(":selected").attr("selected", "selected");
124
+ });
125
+
115
126
  $(element).html(
116
127
  $(element)
117
128
  .html()
@@ -812,3 +812,11 @@ tr span.add-tag {
812
812
  tr:hover span.add-tag {
813
813
  opacity: 1;
814
814
  }
815
+
816
+ #saltcorn-file-manager .filelist tr {
817
+ cursor: pointer;
818
+ }
819
+
820
+ #saltcorn-file-manager .filelist tr.selected td {
821
+ background-color: var(--bs-secondary-bg-subtle, var(--tblr-secondary-bg-subtle, gray));;
822
+ }
package/routes/admin.js CHANGED
@@ -657,9 +657,11 @@ router.get(
657
657
  {
658
658
  label: req.__("When"),
659
659
  key: (r) =>
660
- `${moment(
661
- r.created
662
- ).fromNow()}<br><small>${localeDateTime(r.created, {}, locale)}</small>`,
660
+ `${moment(r.created).fromNow()}<br><small>${localeDateTime(
661
+ r.created,
662
+ {},
663
+ locale
664
+ )}</small>`,
663
665
  },
664
666
  {
665
667
  label: req.__("Name"),
@@ -1193,10 +1195,10 @@ router.get(
1193
1195
  th({ valign: "top" }, req.__("Saltcorn version")),
1194
1196
  td(
1195
1197
  packagejson.version,
1196
- isRoot && can_update
1198
+ isRoot
1197
1199
  ? post_btn(
1198
1200
  "/admin/upgrade",
1199
- req.__("Upgrade"),
1201
+ req.__("Upgrade") + " (latest)",
1200
1202
  req.csrfToken(),
1201
1203
  {
1202
1204
  btnClass: "btn-primary btn-sm",
@@ -290,7 +290,7 @@ const tagsDropdown = (tags, altHeader) =>
290
290
  )
291
291
  );
292
292
 
293
- const mkAddBtn = (tags, entityType, id, req, myTagIds) =>
293
+ const mkAddBtn = (tags, entityType, id, req, myTagIds, on_done_redirect_str) =>
294
294
  div(
295
295
  { class: "dropdown d-inline ms-1" },
296
296
  span(
@@ -314,7 +314,7 @@ const mkAddBtn = (tags, entityType, id, req, myTagIds) =>
314
314
  post_dropdown_item(
315
315
  `/tag-entries/add-tag-entity/${encodeURIComponent(
316
316
  t.name
317
- )}/${entityType}/${id}`,
317
+ )}/${entityType}/${id}${on_done_redirect_str||""}`,
318
318
  t.name,
319
319
  req
320
320
  )
@@ -345,7 +345,7 @@ const viewsList = async (
345
345
  const tagBadges = (view) => {
346
346
  const myTags = tag_entries.filter((te) => te.view_id === view.id);
347
347
  const myTagIds = new Set(myTags.map((t) => t.tag_id));
348
- const addBtn = mkAddBtn(tags, "views", view.id, req, myTagIds);
348
+ const addBtn = mkAddBtn(tags, "views", view.id, req, myTagIds, on_done_redirect_str);
349
349
  return (
350
350
  myTags.map((te) => tagBadge(tagsById[te.tag_id], "views")).join(nbsp) +
351
351
  addBtn
@@ -709,7 +709,7 @@ const getTriggerList = async (
709
709
  const myTagIds = new Set(myTags.map((t) => t.tag_id));
710
710
  return (
711
711
  myTags.map((te) => tagBadge(tagsById[te.tag_id], "triggers")).join(nbsp) +
712
- mkAddBtn(tags, "triggers", trigger.id, req, myTagIds)
712
+ mkAddBtn(tags, "triggers", trigger.id, req, myTagIds, on_done_redirect_str)
713
713
  );
714
714
  };
715
715
  return mkTable(
package/routes/fields.js CHANGED
@@ -1378,6 +1378,7 @@ router.post(
1378
1378
  agg_outcome_type,
1379
1379
  agg_fieldview,
1380
1380
  agg_field,
1381
+ mode,
1381
1382
  _columndef,
1382
1383
  } = req.body || {};
1383
1384
  const table = Table.findOne({ name: tableName });
@@ -1389,7 +1390,9 @@ router.post(
1389
1390
  return;
1390
1391
  }
1391
1392
  const field = table.getField(agg_field);
1392
- const cfgfields = await applyAsync(fv.configFields, field || { table });
1393
+ const cfgfields = await applyAsync(fv.configFields, field || { table }, {
1394
+ mode,
1395
+ });
1393
1396
  res.json(cfgfields);
1394
1397
  return;
1395
1398
  }
@@ -1412,7 +1415,12 @@ router.post(
1412
1415
  res.send(req.query?.accept == "json" ? "[]" : "");
1413
1416
  return;
1414
1417
  }
1415
- const fieldViewConfigForms = await calcfldViewConfig([field], false, 0);
1418
+ const fieldViewConfigForms = await calcfldViewConfig(
1419
+ [field],
1420
+ false,
1421
+ 0,
1422
+ mode
1423
+ );
1416
1424
  const formFields = fieldViewConfigForms[field.name][fv_name];
1417
1425
  if (!formFields) {
1418
1426
  res.send(req.query?.accept == "json" ? "[]" : "");
package/routes/plugins.js CHANGED
@@ -558,6 +558,7 @@ const plugin_store_html = (items, req) => {
558
558
  },
559
559
  {
560
560
  besides: items.map(store_item_html(req)),
561
+ gy:3,
561
562
  widths: items.map(() => 4),
562
563
  },
563
564
  ],
package/routes/tables.js CHANGED
@@ -1582,7 +1582,7 @@ const constraintForm = (req, table, fields, type) => {
1582
1582
  case "Formula":
1583
1583
  return new Form({
1584
1584
  action: `/table/add-constraint/${table.id}/${type}`,
1585
-
1585
+ onSubmit: "press_store_button(this)",
1586
1586
  fields: [
1587
1587
  {
1588
1588
  name: "formula",
@@ -1617,6 +1617,7 @@ const constraintForm = (req, table, fields, type) => {
1617
1617
  blurb: req.__(
1618
1618
  "Tick the boxes for the fields that should be jointly unique"
1619
1619
  ),
1620
+ onSubmit: "press_store_button(this)",
1620
1621
  fields: [
1621
1622
  ...fields.map((f) => ({
1622
1623
  name: f.name,
@@ -1641,7 +1642,7 @@ const constraintForm = (req, table, fields, type) => {
1641
1642
  blurb: req.__(
1642
1643
  "Choose the field to be indexed. This make searching the table faster."
1643
1644
  ),
1644
-
1645
+ onSubmit: "press_store_button(this)",
1645
1646
  fields: [
1646
1647
  {
1647
1648
  type: "String",
@@ -18,6 +18,7 @@ const {
18
18
  csrfField,
19
19
  isAdminOrHasConfigMinRole,
20
20
  checkEditPermission,
21
+ is_relative_url,
21
22
  } = require("./utils");
22
23
 
23
24
  const Table = require("@saltcorn/data/models/table");
@@ -192,18 +193,23 @@ router.post(
192
193
  const auth = checkEditPermission(entitytype, req.user);
193
194
  if (!auth) req.flash("error", "Not authorized");
194
195
  else await tag.addEntry({ [fieldName]: +entityid });
196
+ let redirectTarget =
197
+ req.query.on_done_redirect &&
198
+ is_relative_url("/" + req.query.on_done_redirect)
199
+ ? `/${req.query.on_done_redirect}`
200
+ : null;
195
201
  switch (entitytype) {
196
202
  case "views":
197
- res.redirect(`/viewedit`);
203
+ res.redirect(redirectTarget || `/viewedit`);
198
204
  break;
199
205
  case "pages":
200
- res.redirect(`/pageedit`);
206
+ res.redirect(redirectTarget || `/pageedit`);
201
207
  break;
202
208
  case "tables":
203
- res.redirect(`/table`);
209
+ res.redirect(redirectTarget || `/table`);
204
210
  break;
205
211
  case "triggers":
206
- res.redirect(`/actions`);
212
+ res.redirect(redirectTarget || `/actions`);
207
213
  break;
208
214
 
209
215
  default: