@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.
- package/load_plugins.js +9 -3
- package/locales/en.json +14 -1
- package/locales/pl.json +19 -2
- package/markup/admin.js +1 -0
- package/package.json +9 -9
- package/public/saltcorn-common.js +53 -38
- package/public/saltcorn.js +31 -11
- package/routes/actions.js +895 -4
- package/routes/eventlog.js +36 -0
- package/routes/fields.js +8 -2
- package/routes/tables.js +33 -1
- package/serve.js +1 -5
package/routes/eventlog.js
CHANGED
|
@@ -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
|
-
|
|
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();
|