@saltcorn/data 1.3.0-beta.1 → 1.3.0-beta.11
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/dist/base-plugin/actions.d.ts +18 -1
- package/dist/base-plugin/actions.d.ts.map +1 -1
- package/dist/base-plugin/actions.js +12 -2
- package/dist/base-plugin/actions.js.map +1 -1
- package/dist/base-plugin/index.d.ts +25 -0
- package/dist/base-plugin/index.d.ts.map +1 -1
- package/dist/base-plugin/types.d.ts.map +1 -1
- package/dist/base-plugin/types.js +3 -2
- package/dist/base-plugin/types.js.map +1 -1
- package/dist/base-plugin/viewtemplates/edit.d.ts +7 -0
- package/dist/base-plugin/viewtemplates/edit.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/edit.js +149 -18
- package/dist/base-plugin/viewtemplates/edit.js.map +1 -1
- package/dist/base-plugin/viewtemplates/filter.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/filter.js +4 -2
- package/dist/base-plugin/viewtemplates/filter.js.map +1 -1
- package/dist/base-plugin/viewtemplates/list.d.ts +7 -0
- package/dist/base-plugin/viewtemplates/list.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/list.js +129 -0
- package/dist/base-plugin/viewtemplates/list.js.map +1 -1
- package/dist/base-plugin/viewtemplates/show.d.ts +7 -0
- package/dist/base-plugin/viewtemplates/show.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/show.js +65 -287
- package/dist/base-plugin/viewtemplates/show.js.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts +24 -0
- package/dist/base-plugin/viewtemplates/viewable_fields.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/viewable_fields.js +335 -7
- package/dist/base-plugin/viewtemplates/viewable_fields.js.map +1 -1
- package/dist/base-plugin/viewtemplates/workflow-room.d.ts +5 -0
- package/dist/base-plugin/viewtemplates/workflow-room.d.ts.map +1 -1
- package/dist/base-plugin/viewtemplates/workflow-room.js +15 -3
- package/dist/base-plugin/viewtemplates/workflow-room.js.map +1 -1
- package/dist/db/state.d.ts +5 -0
- package/dist/db/state.d.ts.map +1 -1
- package/dist/db/state.js +26 -1
- package/dist/db/state.js.map +1 -1
- package/dist/migrations/202506050958.d.ts +2 -0
- package/dist/migrations/202506050958.d.ts.map +1 -0
- package/dist/migrations/202506050958.js +12 -0
- package/dist/migrations/202506050958.js.map +1 -0
- package/dist/model-helper.d.ts.map +1 -1
- package/dist/model-helper.js +10 -0
- package/dist/model-helper.js.map +1 -1
- package/dist/models/config.d.ts.map +1 -1
- package/dist/models/config.js +96 -19
- package/dist/models/config.js.map +1 -1
- package/dist/models/expression.d.ts +5 -2
- package/dist/models/expression.d.ts.map +1 -1
- package/dist/models/expression.js +29 -0
- package/dist/models/expression.js.map +1 -1
- package/dist/models/field.d.ts +7 -0
- package/dist/models/field.d.ts.map +1 -1
- package/dist/models/field.js +22 -6
- package/dist/models/field.js.map +1 -1
- package/dist/models/form.d.ts +2 -0
- package/dist/models/form.d.ts.map +1 -1
- package/dist/models/form.js +1 -0
- package/dist/models/form.js.map +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/layout.d.ts +6 -0
- package/dist/models/layout.d.ts.map +1 -1
- package/dist/models/layout.js +64 -0
- package/dist/models/layout.js.map +1 -1
- package/dist/models/metadata.d.ts +60 -0
- package/dist/models/metadata.d.ts.map +1 -0
- package/dist/models/metadata.js +81 -0
- package/dist/models/metadata.js.map +1 -0
- package/dist/models/table.d.ts +1 -0
- package/dist/models/table.d.ts.map +1 -1
- package/dist/models/table.js +44 -20
- package/dist/models/table.js.map +1 -1
- package/dist/models/trigger.d.ts +3 -3
- package/dist/models/trigger.d.ts.map +1 -1
- package/dist/models/trigger.js +12 -5
- package/dist/models/trigger.js.map +1 -1
- package/dist/models/view.d.ts +16 -0
- package/dist/models/view.d.ts.map +1 -1
- package/dist/models/view.js +25 -0
- package/dist/models/view.js.map +1 -1
- package/dist/plugin-helper.d.ts.map +1 -1
- package/dist/plugin-helper.js +11 -2
- package/dist/plugin-helper.js.map +1 -1
- package/dist/tests/edit.test.js +6 -3
- package/dist/tests/edit.test.js.map +1 -1
- package/dist/tests/exact_views.test.js +14 -14
- package/dist/tests/exact_views.test.js.map +1 -1
- package/dist/tests/field.test.js +5 -0
- package/dist/tests/field.test.js.map +1 -1
- package/dist/tests/list.test.js +40 -0
- package/dist/tests/list.test.js.map +1 -1
- package/dist/tests/mocks.d.ts.map +1 -1
- package/dist/tests/mocks.js +5 -1
- package/dist/tests/mocks.js.map +1 -1
- package/dist/tests/models.test.js +32 -0
- package/dist/tests/models.test.js.map +1 -1
- package/dist/tests/table.test.js +120 -1
- package/dist/tests/table.test.js.map +1 -1
- package/package.json +8 -8
- package/webpack.config.js +1 -0
package/dist/models/table.js
CHANGED
|
@@ -1263,6 +1263,7 @@ class Table {
|
|
|
1263
1263
|
[pk_name]: id,
|
|
1264
1264
|
_version: {
|
|
1265
1265
|
next_version_by_id: id,
|
|
1266
|
+
pk_name,
|
|
1266
1267
|
},
|
|
1267
1268
|
_time: new Date(),
|
|
1268
1269
|
_userid: user?.id,
|
|
@@ -1336,6 +1337,7 @@ class Table {
|
|
|
1336
1337
|
this.stringify_json_fields(v1);
|
|
1337
1338
|
const id = await db_1.default.insert(this.name + "__history", v1, {
|
|
1338
1339
|
onConflictDoNothing: true,
|
|
1340
|
+
pk_name: this.pk_name,
|
|
1339
1341
|
});
|
|
1340
1342
|
if (!id && retry <= 3)
|
|
1341
1343
|
await this.insert_history_row(v1, retry + 1);
|
|
@@ -1598,6 +1600,7 @@ class Table {
|
|
|
1598
1600
|
[pk_name]: id,
|
|
1599
1601
|
_version: {
|
|
1600
1602
|
next_version_by_id: id,
|
|
1603
|
+
pk_name,
|
|
1601
1604
|
},
|
|
1602
1605
|
_userid: user?.id,
|
|
1603
1606
|
_time: new Date(),
|
|
@@ -1646,7 +1649,7 @@ class Table {
|
|
|
1646
1649
|
let v = v0;
|
|
1647
1650
|
if (refetch && (calc_agg_fields.length || calc_join_agg_fields.length)) {
|
|
1648
1651
|
v = (await this.getJoinedRow({
|
|
1649
|
-
where: { [pk_name]: v0
|
|
1652
|
+
where: { [pk_name]: v0[pk_name] },
|
|
1650
1653
|
}));
|
|
1651
1654
|
}
|
|
1652
1655
|
//track which rows in which tables are updated
|
|
@@ -1722,7 +1725,7 @@ class Table {
|
|
|
1722
1725
|
[matching.field]: {
|
|
1723
1726
|
inSelect: {
|
|
1724
1727
|
table: matching.throughTable[0],
|
|
1725
|
-
field: "id",
|
|
1728
|
+
field: Table.findOne(matching.throughTable[0])?.pk_name || "id",
|
|
1726
1729
|
tenant: db_1.default.isSQLite ? undefined : db_1.default.getTenantSchema(),
|
|
1727
1730
|
where: { [matching.through[0]]: v[this.pk_name] },
|
|
1728
1731
|
},
|
|
@@ -1923,7 +1926,7 @@ class Table {
|
|
|
1923
1926
|
*/
|
|
1924
1927
|
async restore_row_version(id, version, user) {
|
|
1925
1928
|
const row = await db_1.default.selectOne(`${db_1.default.sqlsanitize(this.name)}__history`, {
|
|
1926
|
-
id,
|
|
1929
|
+
[this.pk_name]: id,
|
|
1927
1930
|
_version: version,
|
|
1928
1931
|
});
|
|
1929
1932
|
var r = {};
|
|
@@ -1940,10 +1943,10 @@ class Table {
|
|
|
1940
1943
|
* @param user
|
|
1941
1944
|
*/
|
|
1942
1945
|
async undo_row_changes(id, user) {
|
|
1943
|
-
const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { id }, { orderBy: "_version", orderDesc: true, limit: 1 });
|
|
1946
|
+
const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { [this.pk_name]: id }, { orderBy: "_version", orderDesc: true, limit: 1 });
|
|
1944
1947
|
//get max that is not a restore
|
|
1945
1948
|
const last_non_restore = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, {
|
|
1946
|
-
id,
|
|
1949
|
+
[this.pk_name]: id,
|
|
1947
1950
|
_version: {
|
|
1948
1951
|
lt: current_version_row._restore_of_version
|
|
1949
1952
|
? current_version_row._restore_of_version
|
|
@@ -1960,10 +1963,10 @@ class Table {
|
|
|
1960
1963
|
* @param user
|
|
1961
1964
|
*/
|
|
1962
1965
|
async redo_row_changes(id, user) {
|
|
1963
|
-
const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { id }, { orderBy: "_version", orderDesc: true, limit: 1 });
|
|
1966
|
+
const current_version_row = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, { [this.pk_name]: id }, { orderBy: "_version", orderDesc: true, limit: 1 });
|
|
1964
1967
|
if (current_version_row._restore_of_version) {
|
|
1965
1968
|
const next_version = await db_1.default.selectMaybeOne(`${(0, internal_1.sqlsanitize)(this.name)}__history`, {
|
|
1966
|
-
id,
|
|
1969
|
+
[this.pk_name]: id,
|
|
1967
1970
|
_version: {
|
|
1968
1971
|
gt: current_version_row._restore_of_version,
|
|
1969
1972
|
},
|
|
@@ -1984,10 +1987,10 @@ class Table {
|
|
|
1984
1987
|
if (typeof interval_secs === "number" && interval_secs > 0.199) {
|
|
1985
1988
|
await db_1.default.query(`
|
|
1986
1989
|
delete from ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history"
|
|
1987
|
-
where (${(0, internal_1.sqlsanitize)(pk)}, _version) in (
|
|
1990
|
+
where ("${(0, internal_1.sqlsanitize)(pk)}", _version) in (
|
|
1988
1991
|
select h1."${(0, internal_1.sqlsanitize)(pk)}", h1._version
|
|
1989
1992
|
FROM ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history" h1
|
|
1990
|
-
JOIN ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history" h2 ON h1
|
|
1993
|
+
JOIN ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history" h2 ON h1."${(0, internal_1.sqlsanitize)(pk)}" = h2."${(0, internal_1.sqlsanitize)(pk)}"
|
|
1991
1994
|
AND h1._version < h2._version
|
|
1992
1995
|
AND h1._time < h2._time
|
|
1993
1996
|
AND h2._time - h1._time <= INTERVAL '${+interval_secs} seconds'
|
|
@@ -2015,7 +2018,7 @@ class Table {
|
|
|
2015
2018
|
ON curr.rn = prev.rn + 1 AND curr."${pk}" = prev."${pk}"
|
|
2016
2019
|
)
|
|
2017
2020
|
DELETE FROM ${schemaPrefix}"${(0, internal_1.sqlsanitize)(this.name)}__history"
|
|
2018
|
-
where (${(0, internal_1.sqlsanitize)(pk)}, _version) in (select id, this_version from paired where not is_changed);`);
|
|
2021
|
+
where ("${(0, internal_1.sqlsanitize)(pk)}", _version) in (select id, this_version from paired where not is_changed);`);
|
|
2019
2022
|
}
|
|
2020
2023
|
}
|
|
2021
2024
|
/**
|
|
@@ -2151,8 +2154,10 @@ class Table {
|
|
|
2151
2154
|
isBools.includes(v && v.toLowerCase && v.toLowerCase())))
|
|
2152
2155
|
type = "Bool";
|
|
2153
2156
|
else if (nonEmpties.every((v) => !isNaN(v)))
|
|
2154
|
-
if (nonEmpties.every((v) => Number.isSafeInteger(+v)))
|
|
2157
|
+
if (nonEmpties.every((v) => Number.isSafeInteger(+v) && v <= 2147483647 && v > -2147483648))
|
|
2155
2158
|
type = "Integer";
|
|
2159
|
+
else if (nonEmpties.every((v) => Number.isSafeInteger(+v)))
|
|
2160
|
+
type = "String";
|
|
2156
2161
|
else
|
|
2157
2162
|
type = "Float";
|
|
2158
2163
|
else if (nonEmpties.every((v) => isDate(v)))
|
|
@@ -2360,11 +2365,12 @@ class Table {
|
|
|
2360
2365
|
let i = 1;
|
|
2361
2366
|
let rejects = 0;
|
|
2362
2367
|
let rejectDetails = "";
|
|
2363
|
-
const client = db_1.default.isSQLite ? db_1.default : await db_1.default.getClient();
|
|
2368
|
+
const client = db_1.default.isSQLite || options?.no_transaction ? db_1.default : await db_1.default.getClient();
|
|
2364
2369
|
const stats = await (0, promises_1.stat)(filePath);
|
|
2365
2370
|
const fileSizeInMegabytes = stats.size / (1024 * 1024);
|
|
2366
2371
|
// start sql transaction
|
|
2367
|
-
|
|
2372
|
+
if (!options?.no_transaction)
|
|
2373
|
+
await client.query("BEGIN");
|
|
2368
2374
|
const readStream = (0, fs_1.createReadStream)(filePath);
|
|
2369
2375
|
const returnedRows = [];
|
|
2370
2376
|
try {
|
|
@@ -2455,6 +2461,7 @@ class Table {
|
|
|
2455
2461
|
const existing = await db_1.default.selectMaybeOne(this.name, {
|
|
2456
2462
|
[this.pk_name]: rec[this.pk_name],
|
|
2457
2463
|
});
|
|
2464
|
+
this.stringify_json_fields(rec);
|
|
2458
2465
|
if (options?.no_table_write) {
|
|
2459
2466
|
if (existing) {
|
|
2460
2467
|
Object.entries(existing).forEach(([k, v]) => {
|
|
@@ -2479,6 +2486,7 @@ class Table {
|
|
|
2479
2486
|
});
|
|
2480
2487
|
}
|
|
2481
2488
|
catch (e) {
|
|
2489
|
+
console.log(e);
|
|
2482
2490
|
if (!(e?.message || "").includes("current transaction is aborted, commands ignored until end of transaction"))
|
|
2483
2491
|
rejectDetails += `Reject row ${i} because: ${e?.message}\n`;
|
|
2484
2492
|
rejects += 1;
|
|
@@ -2507,8 +2515,9 @@ class Table {
|
|
|
2507
2515
|
}
|
|
2508
2516
|
}
|
|
2509
2517
|
catch (e) {
|
|
2510
|
-
|
|
2511
|
-
|
|
2518
|
+
if (!options?.no_transaction)
|
|
2519
|
+
await client.query("ROLLBACK");
|
|
2520
|
+
if (!db_1.default.isSQLite && !options?.no_transaction)
|
|
2512
2521
|
await client.release(true);
|
|
2513
2522
|
if (e instanceof Error)
|
|
2514
2523
|
reject({ error: `${e.message} in row ${i}` });
|
|
@@ -2531,8 +2540,9 @@ ${rejectDetails}`,
|
|
|
2531
2540
|
if (rejectDetails)
|
|
2532
2541
|
state.log(6, `CSV import rejectDetails: ` + rejectDetails);
|
|
2533
2542
|
// stop sql transaction
|
|
2534
|
-
|
|
2535
|
-
|
|
2543
|
+
if (!options?.no_transaction)
|
|
2544
|
+
await client.query("COMMIT");
|
|
2545
|
+
if (!db_1.default.isSQLite && !options?.no_transaction)
|
|
2536
2546
|
await client.release(true);
|
|
2537
2547
|
if (options?.no_table_write) {
|
|
2538
2548
|
return {
|
|
@@ -3039,7 +3049,8 @@ ${rejectDetails}`,
|
|
|
3039
3049
|
fldNms.push("a.*");
|
|
3040
3050
|
else
|
|
3041
3051
|
for (const f of fields.filter((f) => !f.calculated || f.stored)) {
|
|
3042
|
-
|
|
3052
|
+
if (!opts.fields || opts.fields.includes(f.name))
|
|
3053
|
+
fldNms.push(`a."${(0, internal_1.sqlsanitize)(f.name)}"`);
|
|
3043
3054
|
}
|
|
3044
3055
|
const whereObj = prefixFieldsInWhere(opts.where, "a");
|
|
3045
3056
|
const { where, values } = (0, internal_1.mkWhere)(whereObj, db_1.default.isSQLite);
|
|
@@ -3130,9 +3141,22 @@ ${rejectDetails}`,
|
|
|
3130
3141
|
}
|
|
3131
3142
|
});
|
|
3132
3143
|
}
|
|
3133
|
-
//rename joinfields
|
|
3134
|
-
if (Object.values(joinFields || {}).some((jf) => jf.rename_object)
|
|
3144
|
+
//rename aggregations and joinfields
|
|
3145
|
+
if (Object.values(joinFields || {}).some((jf) => jf.rename_object) ||
|
|
3146
|
+
Object.values(aggregations || {}).some((jf) => jf.rename_to)) {
|
|
3135
3147
|
let f = (x) => x;
|
|
3148
|
+
Object.entries(aggregations || {}).forEach(([k, v]) => {
|
|
3149
|
+
if (v.rename_to) {
|
|
3150
|
+
const oldf = f;
|
|
3151
|
+
f = (x) => {
|
|
3152
|
+
if (typeof x[k] !== "undefined") {
|
|
3153
|
+
x[v.rename_to] = x[k];
|
|
3154
|
+
delete x[k];
|
|
3155
|
+
}
|
|
3156
|
+
return oldf(x);
|
|
3157
|
+
};
|
|
3158
|
+
}
|
|
3159
|
+
});
|
|
3136
3160
|
Object.entries(joinFields || {}).forEach(([k, v]) => {
|
|
3137
3161
|
if (v.rename_object) {
|
|
3138
3162
|
if (v.rename_object.length === 2) {
|