@saltcorn/server 1.0.0-rc.2 → 1.0.0-rc.3

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/help/index.js CHANGED
@@ -13,7 +13,8 @@ const { getState } = require("@saltcorn/data/db/state");
13
13
  const { oneOf } = require("@saltcorn/types/generators");
14
14
  const get_md_file = async (topic) => {
15
15
  try {
16
- const fp = path.join(__dirname, `${File.normalise(topic)}.tmd`);
16
+ const fp = File.normalise_in_base(__dirname, `${topic}.tmd`);
17
+ if (!fp) return false;
17
18
  const fileBuf = await fs.readFile(fp);
18
19
  return fileBuf.toString();
19
20
  } catch (e) {
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "1.0.0-rc.2",
3
+ "version": "1.0.0-rc.3",
4
4
  "description": "Server app for Saltcorn, open-source no-code platform",
5
5
  "homepage": "https://saltcorn.com",
6
6
  "main": "index.js",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
9
  "@aws-sdk/client-s3": "^3.451.0",
10
- "@saltcorn/base-plugin": "1.0.0-rc.2",
11
- "@saltcorn/builder": "1.0.0-rc.2",
12
- "@saltcorn/data": "1.0.0-rc.2",
13
- "@saltcorn/admin-models": "1.0.0-rc.2",
14
- "@saltcorn/filemanager": "1.0.0-rc.2",
15
- "@saltcorn/markup": "1.0.0-rc.2",
16
- "@saltcorn/plugins-loader": "1.0.0-rc.2",
17
- "@saltcorn/sbadmin2": "1.0.0-rc.2",
10
+ "@saltcorn/base-plugin": "1.0.0-rc.3",
11
+ "@saltcorn/builder": "1.0.0-rc.3",
12
+ "@saltcorn/data": "1.0.0-rc.3",
13
+ "@saltcorn/admin-models": "1.0.0-rc.3",
14
+ "@saltcorn/filemanager": "1.0.0-rc.3",
15
+ "@saltcorn/markup": "1.0.0-rc.3",
16
+ "@saltcorn/plugins-loader": "1.0.0-rc.3",
17
+ "@saltcorn/sbadmin2": "1.0.0-rc.3",
18
18
  "@socket.io/cluster-adapter": "^0.2.1",
19
19
  "@socket.io/sticky": "^1.0.1",
20
20
  "adm-zip": "0.5.10",
@@ -432,6 +432,20 @@ function saveAndContinue(e, k, event) {
432
432
  )
433
433
  return;
434
434
  var form = $(e).closest("form");
435
+ let focusedEl = null;
436
+ if (!event || !event.srcElement) {
437
+ const el = form.find("select[sc-received-focus]")[0];
438
+ if (el) {
439
+ el.removeAttribute("sc-received-focus");
440
+ if (el.getAttribute("previous-val") === el.value) return;
441
+ }
442
+ } else if (
443
+ event.srcElement.tagName === "SELECT" &&
444
+ event.srcElement.getAttribute("previous-val") !== undefined
445
+ ) {
446
+ focusedEl = event.srcElement;
447
+ }
448
+
435
449
  const valres = form[0].reportValidity();
436
450
  if (!valres) return;
437
451
  submitWithEmptyAction(form[0]);
@@ -454,6 +468,7 @@ function saveAndContinue(e, k, event) {
454
468
  reloadEmbeddedEditOwnViews(form, res.id);
455
469
  }
456
470
  common_done(res, form.attr("data-viewname"));
471
+ if (focusedEl) focusedEl.setAttribute("previous-val", focusedEl.value);
457
472
  },
458
473
  error: function (request) {
459
474
  var ct = request.getResponseHeader("content-type") || "";
package/routes/api.js CHANGED
@@ -294,11 +294,12 @@ router.get(
294
294
  } else {
295
295
  const tbl_fields = table.getFields();
296
296
  readState(req_query, tbl_fields, req);
297
- const qstate = await stateFieldsToWhere({
297
+ const qstate = stateFieldsToWhere({
298
298
  fields: tbl_fields,
299
299
  approximate: !!approximate,
300
300
  state: req_query,
301
301
  table,
302
+ prefix: "a.",
302
303
  });
303
304
  const joinFields = {};
304
305
  const derefs = Array.isArray(dereference)
package/routes/files.js CHANGED
@@ -94,11 +94,15 @@ router.get(
94
94
  const { dir, no_subdirs } = req.query;
95
95
  const noSubdirs = no_subdirs === "true";
96
96
  const safeDir = File.normalise(dir || "/");
97
- const absFolder = path.join(
97
+ const absFolder = File.normalise_in_base(
98
98
  db.connectObj.file_store,
99
99
  db.getTenantSchema(),
100
- safeDir
100
+ dir || "/"
101
101
  );
102
+ if (absFolder === null) {
103
+ res.json({ error: "Invalid path" });
104
+ return;
105
+ }
102
106
  const dirOnDisk = await File.from_file_on_disk(
103
107
  path.basename(absFolder),
104
108
  path.dirname(absFolder)
package/routes/sync.js CHANGED
@@ -335,16 +335,15 @@ router.post(
335
335
  "/clean_sync_dir",
336
336
  error_catcher(async (req, res) => {
337
337
  const { dir_name } = req.body;
338
- const safe_dir_name = File.normalise(dir_name);
339
338
  try {
340
339
  const rootFolder = await File.rootFolder();
341
- const syncDir = path.join(
340
+ const syncDir = File.normalise_in_base(
342
341
  rootFolder.location,
343
342
  "mobile_app",
344
343
  "sync",
345
- safe_dir_name
344
+ dir_name
346
345
  );
347
- await fs.rm(syncDir, { recursive: true, force: true });
346
+ if (syncDir) await fs.rm(syncDir, { recursive: true, force: true });
348
347
  res.status(200).send("");
349
348
  } catch (error) {
350
349
  getState().log(2, `POST /sync/clean_sync_dir: '${error.message}'`);