@saltcorn/server 0.6.3 → 0.6.4-beta.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.
package/locales/en.json CHANGED
@@ -859,5 +859,7 @@
859
859
  "Two-factor authentication with Time-based One-Time Password disabled": "Two-factor authentication with Time-based One-Time Password disabled",
860
860
  "Two-factor authentication is disabled": "Two-factor authentication is disabled",
861
861
  "Auto save": "Auto save",
862
- "Save any changes immediately": "Save any changes immediately"
862
+ "Save any changes immediately": "Save any changes immediately",
863
+ "Transpose": "Transpose",
864
+ "Display one column per line": "Display one column per line"
863
865
  }
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@saltcorn/server",
3
- "version": "0.6.3",
3
+ "version": "0.6.4-beta.1",
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
- "@saltcorn/base-plugin": "0.6.3",
10
- "@saltcorn/builder": "0.6.3",
11
- "@saltcorn/data": "0.6.3",
9
+ "@saltcorn/base-plugin": "0.6.4-beta.1",
10
+ "@saltcorn/builder": "0.6.4-beta.1",
11
+ "@saltcorn/data": "0.6.4-beta.1",
12
12
  "greenlock-express": "^4.0.3",
13
- "@saltcorn/markup": "0.6.3",
14
- "@saltcorn/sbadmin2": "0.6.3",
13
+ "@saltcorn/markup": "0.6.4-beta.1",
14
+ "@saltcorn/sbadmin2": "0.6.4-beta.1",
15
15
  "@socket.io/cluster-adapter": "^0.1.0",
16
16
  "@socket.io/sticky": "^1.0.1",
17
17
  "connect-flash": "^0.1.1",
@@ -506,6 +506,7 @@ function ajax_modal(url, opts = {}) {
506
506
  if (title) $("#scmodal .modal-title").html(decodeURIComponent(title));
507
507
  $("#scmodal .modal-body").html(res);
508
508
  $("#scmodal").modal();
509
+ initialize_page();
509
510
  (opts.onOpen || function () {})(res);
510
511
  $("#scmodal").on("hidden.bs.modal", function (e) {
511
512
  (opts.onClose || function () {})(res);
@@ -604,7 +605,33 @@ function ajax_post_btn(e, reload_on_done, reload_delay) {
604
605
 
605
606
  return false;
606
607
  }
607
-
608
+ function make_unique_field(id, table_id, field_name, value) {
609
+ if (!value) return;
610
+ $.ajax(
611
+ `/api/${table_id}?approximate=true&${encodeURIComponent(
612
+ field_name
613
+ )}=${encodeURIComponent(value)}&fields=${encodeURIComponent(field_name)}`,
614
+ {
615
+ type: "GET",
616
+ success: function (res) {
617
+ if (res.success) {
618
+ const vals = res.success
619
+ .map((o) => o[field_name])
620
+ .filter((s) => s.startsWith(value));
621
+ if (vals.includes(value)) {
622
+ for (let i = 1; i < vals.length + 1; i++) {
623
+ const newname = `${value} ${i}`;
624
+ if (!vals.includes(newname)) {
625
+ $("#" + id).val(newname);
626
+ return;
627
+ }
628
+ }
629
+ }
630
+ }
631
+ },
632
+ }
633
+ );
634
+ }
608
635
  function test_formula(tablename, stored) {
609
636
  var formula = $("input[name=expression]").val();
610
637
  ajax_post(`/field/test-formula`, {
package/routes/admin.js CHANGED
@@ -5,7 +5,12 @@
5
5
  */
6
6
  const Router = require("express-promise-router");
7
7
 
8
- const { isAdmin, error_catcher, getGitRevision } = require("./utils.js");
8
+ const {
9
+ isAdmin,
10
+ error_catcher,
11
+ getGitRevision,
12
+ setTenant,
13
+ } = require("./utils.js");
9
14
  const Table = require("@saltcorn/data/models/table");
10
15
  const Plugin = require("@saltcorn/data/models/plugin");
11
16
  const File = require("@saltcorn/data/models/file");
@@ -518,6 +523,7 @@ router.post(
518
523
  */
519
524
  router.post(
520
525
  "/restore",
526
+ setTenant, // TODO why is this needed?????
521
527
  isAdmin,
522
528
  error_catcher(async (req, res) => {
523
529
  const newPath = File.get_new_path();
package/routes/api.js CHANGED
@@ -28,6 +28,7 @@ const passport = require("passport");
28
28
  const {
29
29
  stateFieldsToWhere,
30
30
  readState,
31
+ strictParseInt,
31
32
  } = require("@saltcorn/data/plugin-helper");
32
33
 
33
34
  /**
@@ -121,9 +122,13 @@ router.get(
121
122
  "/:tableName/",
122
123
  //passport.authenticate("api-bearer", { session: false }),
123
124
  error_catcher(async (req, res, next) => {
124
- const { tableName } = req.params;
125
- const { fields, versioncount, ...req_query } = req.query;
126
- const table = await Table.findOne({ name: tableName });
125
+ let { tableName } = req.params;
126
+ const { fields, versioncount, approximate, ...req_query } = req.query;
127
+ const table = await Table.findOne(
128
+ strictParseInt(tableName)
129
+ ? { id: strictParseInt(tableName) }
130
+ : { name: tableName }
131
+ );
127
132
  if (!table) {
128
133
  res.status(404).json({ error: req.__("Not found") });
129
134
  return;
@@ -152,8 +157,8 @@ router.get(
152
157
  const tbl_fields = await table.getFields();
153
158
  const qstate = await stateFieldsToWhere({
154
159
  fields: tbl_fields,
155
- approximate: false,
156
- state: req.query,
160
+ approximate: !!approximate,
161
+ state: req_query,
157
162
  });
158
163
  rows = await table.getRows(qstate);
159
164
  } else {
package/routes/files.js CHANGED
@@ -17,7 +17,7 @@ const {
17
17
  post_btn,
18
18
  post_delete_btn,
19
19
  } = require("@saltcorn/markup");
20
- const { isAdmin, error_catcher } = require("./utils.js");
20
+ const { isAdmin, error_catcher, setTenant } = require("./utils.js");
21
21
  const {
22
22
  span,
23
23
  h5,
@@ -240,6 +240,7 @@ router.post(
240
240
  */
241
241
  router.post(
242
242
  "/upload",
243
+ setTenant, // TODO why is this needed?????
243
244
  error_catcher(async (req, res) => {
244
245
  let jsonResp = {};
245
246
  const min_role_upload = getState().getConfig("min_role_upload", 1);
package/routes/tables.js CHANGED
@@ -22,7 +22,7 @@ const {
22
22
  post_dropdown_item,
23
23
  } = require("@saltcorn/markup");
24
24
  const { recalculate_for_stored } = require("@saltcorn/data/models/expression");
25
- const { isAdmin, error_catcher } = require("./utils.js");
25
+ const { isAdmin, error_catcher, setTenant } = require("./utils.js");
26
26
  const Form = require("@saltcorn/data/models/form");
27
27
  const {
28
28
  span,
@@ -352,6 +352,7 @@ router.get(
352
352
  */
353
353
  router.post(
354
354
  "/create-from-csv",
355
+ setTenant, // TODO why is this needed?????
355
356
  isAdmin,
356
357
  error_catcher(async (req, res) => {
357
358
  if (req.body.name && req.files && req.files.file) {
@@ -1367,6 +1368,7 @@ router.post(
1367
1368
  */
1368
1369
  router.post(
1369
1370
  "/upload_to_table/:name",
1371
+ setTenant, // TODO why is this needed?????
1370
1372
  isAdmin,
1371
1373
  error_catcher(async (req, res) => {
1372
1374
  const { name } = req.params;
package/routes/view.js CHANGED
@@ -16,6 +16,7 @@ const {
16
16
  isAdmin,
17
17
  error_catcher,
18
18
  scan_for_page_title,
19
+ setTenant,
19
20
  } = require("../routes/utils.js");
20
21
  const { add_edit_bar } = require("../markup/admin.js");
21
22
  const { InvalidConfiguration } = require("@saltcorn/data/utils");
@@ -144,6 +145,7 @@ router.post(
144
145
  */
145
146
  router.post(
146
147
  ["/:viewname", "/:viewname/*"],
148
+ setTenant,
147
149
  error_catcher(async (req, res) => {
148
150
  const { viewname } = req.params;
149
151
  const role = req.user && req.user.id ? req.user.role_id : 10;