@saltcorn/server 1.1.0-beta.12 → 1.1.0-beta.14

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.
@@ -81,6 +81,31 @@ const logSettingsForm = async (req) => {
81
81
  input_type: "date",
82
82
  attributes: { minDate: new Date(), maxDate: hoursFuture(24 * 7 * 2) },
83
83
  },
84
+ {
85
+ input_type: "section_header",
86
+ label: req.__("Delete old workflow runs with status after days"),
87
+ },
88
+ {
89
+ name: "delete_finished_workflows_days",
90
+ label: req.__("Finished"),
91
+ type: "Integer",
92
+ },
93
+ {
94
+ name: "delete_error_workflows_days",
95
+ label: req.__("Error"),
96
+ type: "Integer",
97
+ },
98
+ {
99
+ name: "delete_waiting_workflows_days",
100
+ label: req.__("Waiting"),
101
+ type: "Integer",
102
+ },
103
+
104
+ {
105
+ name: "delete_running_workflows_days",
106
+ label: req.__("Running"),
107
+ type: "Integer",
108
+ },
84
109
  {
85
110
  input_type: "section_header",
86
111
  label: req.__("Which events should be logged?"),
@@ -143,6 +168,10 @@ router.get(
143
168
  "next_weekly_event",
144
169
  {}
145
170
  );
171
+ ["error", "finished", "running", "waiting"].forEach((k) => {
172
+ let cfgk = `delete_${k}_workflows_days`;
173
+ form.values[cfgk] = getState().getConfig(cfgk);
174
+ });
146
175
 
147
176
  send_events_page({
148
177
  res,
@@ -348,6 +377,13 @@ router.post(
348
377
  delete form.values[k];
349
378
  }
350
379
  }
380
+ for (const status of ["error", "finished", "running", "waiting"]) {
381
+ let k = `delete_${status}_workflows_days`;
382
+ if (form.values[k]) {
383
+ await getState().setConfig(k, form.values[k]);
384
+ delete form.values[k];
385
+ }
386
+ }
351
387
 
352
388
  await getState().setConfig("event_log_settings", form.values);
353
389
 
package/routes/fields.js CHANGED
@@ -301,6 +301,10 @@ const fieldFlow = (req) =>
301
301
  if (context.id) {
302
302
  const field = await Field.findOne({ id: context.id });
303
303
  try {
304
+ if (fldRow.label && field.label != fldRow.label) {
305
+ fldRow.name = Field.labelToName(fldRow.label);
306
+ }
307
+
304
308
  await field.update(fldRow);
305
309
  } catch (e) {
306
310
  return {
@@ -362,10 +366,12 @@ const fieldFlow = (req) =>
362
366
  name: req.__("Attributes"),
363
367
  contextField: "attributes",
364
368
  onlyWhen: (context) => {
365
- if (context.calculated) return false;
369
+ const type = getState().types[context.type];
370
+ if (context.calculated && !type?.setTypeAttributesForCalculatedFields)
371
+ return false;
372
+
366
373
  if (context.type === "File") return true;
367
374
  if (new Field(context).is_fkey) return false;
368
- const type = getState().types[context.type];
369
375
  if (!type) return false;
370
376
  const attrs = Field.getTypeAttributes(
371
377
  type.attributes,
package/routes/tables.js CHANGED
@@ -757,6 +757,8 @@ router.get(
757
757
  const triggers = table.id ? Trigger.find({ table_id: table.id }) : [];
758
758
  triggers.sort(comparingCaseInsensitive("name"));
759
759
  let fieldCard;
760
+ const nPrimaryKeys = fields.filter((f) => f.primary_key).length;
761
+
760
762
  if (fields.length === 0) {
761
763
  fieldCard = [
762
764
  h4(req.__(`No fields defined in %s table`, table.name)),
@@ -818,6 +820,19 @@ router.get(
818
820
  { hover: true }
819
821
  );
820
822
  fieldCard = [
823
+ nPrimaryKeys > 1 &&
824
+ div(
825
+ { class: "alert alert-danger", role: "alert" },
826
+ i({ class: "fas fa-exclamation-triangle" }),
827
+ "This table has composite primary keys which is not supported in Saltcorn. A procedure to introduce a single autoincrementing primary key is available.",
828
+ post_btn(
829
+ `/table/repair-composite-primary/${table.id}`,
830
+ "Add autoincrementing primary key",
831
+ req.csrfToken(),
832
+ { btnClass: "btn-danger" }
833
+ )
834
+ ),
835
+
821
836
  tableHtml,
822
837
  inbound_refs.length > 0
823
838
  ? req.__("Inbound keys: ") +
@@ -1111,7 +1126,7 @@ router.post(
1111
1126
  const v = req.body;
1112
1127
  if (typeof v.id === "undefined" && typeof v.external === "undefined") {
1113
1128
  // insert
1114
- v.name = v.name.trim()
1129
+ v.name = v.name.trim();
1115
1130
  const { name, ...rest } = v;
1116
1131
  const alltables = await Table.find({});
1117
1132
  const existing_tables = [
@@ -2074,3 +2089,20 @@ router.post(
2074
2089
  respondWorkflow(table, workflow, wfres, req, res);
2075
2090
  })
2076
2091
  );
2092
+
2093
+ router.post(
2094
+ "/repair-composite-primary/:id",
2095
+ isAdmin,
2096
+ error_catcher(async (req, res) => {
2097
+ const { id } = req.params;
2098
+
2099
+ const table = Table.findOne({ id });
2100
+ if (!table) {
2101
+ req.flash("error", `Table not found`);
2102
+ res.redirect(`/table`);
2103
+ return;
2104
+ }
2105
+ await table.repairCompositePrimary();
2106
+ res.redirect(`/table/${table.id}`);
2107
+ })
2108
+ );
package/serve.js CHANGED
@@ -121,11 +121,7 @@ const initMaster = async ({ disableMigrate }, useClusterAdaptor = true) => {
121
121
  if (getState().getConfig("log_sql", false)) db.set_sql_logging();
122
122
  if (db.is_it_multi_tenant()) {
123
123
  const tenants = await getAllTenants();
124
- await init_multi_tenant(
125
- async () => await loadAllPlugins(true),
126
- disableMigrate,
127
- tenants
128
- );
124
+ await init_multi_tenant(loadAllPlugins, disableMigrate, tenants);
129
125
  }
130
126
  eachTenant(async () => {
131
127
  const state = getState();