@saltcorn/server 0.7.4-beta.1 → 0.7.4-beta.2
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/auth/routes.js +64 -86
- package/locales/en.json +20 -2
- package/markup/admin.js +15 -1
- package/package.json +7 -7
- package/public/saltcorn.css +24 -1
- package/public/saltcorn.js +9 -7
- package/routes/actions.js +2 -39
- package/routes/common_lists.js +419 -0
- package/routes/fields.js +23 -6
- package/routes/index.js +4 -0
- package/routes/pageedit.js +12 -105
- package/routes/tables.js +4 -39
- package/routes/tag_entries.js +173 -0
- package/routes/tags.js +266 -0
- package/routes/viewedit.js +19 -136
package/routes/viewedit.js
CHANGED
|
@@ -31,6 +31,7 @@ const {
|
|
|
31
31
|
|
|
32
32
|
const { getState } = require("@saltcorn/data/db/state");
|
|
33
33
|
const { isAdmin, error_catcher } = require("./utils.js");
|
|
34
|
+
const { setTableRefs, viewsList } = require("./common_lists");
|
|
34
35
|
const Form = require("@saltcorn/data/models/form");
|
|
35
36
|
const Field = require("@saltcorn/data/models/field");
|
|
36
37
|
const Table = require("@saltcorn/data/models/table");
|
|
@@ -38,10 +39,10 @@ const View = require("@saltcorn/data/models/view");
|
|
|
38
39
|
const Workflow = require("@saltcorn/data/models/workflow");
|
|
39
40
|
const User = require("@saltcorn/data/models/user");
|
|
40
41
|
const Page = require("@saltcorn/data/models/page");
|
|
42
|
+
const Tag = require("@saltcorn/data/models/tag");
|
|
41
43
|
const db = require("@saltcorn/data/db");
|
|
42
44
|
|
|
43
45
|
const { add_to_menu } = require("@saltcorn/admin-models/models/pack");
|
|
44
|
-
const { editRoleForm } = require("../markup/forms.js");
|
|
45
46
|
|
|
46
47
|
/**
|
|
47
48
|
* @type {object}
|
|
@@ -53,68 +54,6 @@ const { editRoleForm } = require("../markup/forms.js");
|
|
|
53
54
|
const router = new Router();
|
|
54
55
|
module.exports = router;
|
|
55
56
|
|
|
56
|
-
/**
|
|
57
|
-
* @param {object} view
|
|
58
|
-
* @param {object[]} roles
|
|
59
|
-
* @param {object} req
|
|
60
|
-
* @returns {Form}
|
|
61
|
-
*/
|
|
62
|
-
const editViewRoleForm = (view, roles, req) =>
|
|
63
|
-
editRoleForm({
|
|
64
|
-
url: `/viewedit/setrole/${view.id}`,
|
|
65
|
-
current_role: view.min_role,
|
|
66
|
-
roles,
|
|
67
|
-
req,
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* @param {object} view
|
|
72
|
-
* @param {object} req
|
|
73
|
-
* @returns {div}
|
|
74
|
-
*/
|
|
75
|
-
const view_dropdown = (view, req) =>
|
|
76
|
-
settingsDropdown(`dropdownMenuButton${view.id}`, [
|
|
77
|
-
a(
|
|
78
|
-
{
|
|
79
|
-
class: "dropdown-item",
|
|
80
|
-
href: `/view/${encodeURIComponent(view.name)}`,
|
|
81
|
-
},
|
|
82
|
-
'<i class="fas fa-running"></i> ' + req.__("Run")
|
|
83
|
-
),
|
|
84
|
-
a(
|
|
85
|
-
{
|
|
86
|
-
class: "dropdown-item",
|
|
87
|
-
href: `/viewedit/edit/${encodeURIComponent(view.name)}`,
|
|
88
|
-
},
|
|
89
|
-
'<i class="fas fa-edit"></i> ' + req.__("Edit")
|
|
90
|
-
),
|
|
91
|
-
post_dropdown_item(
|
|
92
|
-
`/viewedit/add-to-menu/${view.id}`,
|
|
93
|
-
'<i class="fas fa-bars"></i> ' + req.__("Add to menu"),
|
|
94
|
-
req
|
|
95
|
-
),
|
|
96
|
-
post_dropdown_item(
|
|
97
|
-
`/viewedit/clone/${view.id}`,
|
|
98
|
-
'<i class="far fa-copy"></i> ' + req.__("Duplicate"),
|
|
99
|
-
req
|
|
100
|
-
),
|
|
101
|
-
a(
|
|
102
|
-
{
|
|
103
|
-
class: "dropdown-item",
|
|
104
|
-
href: `javascript:ajax_modal('/admin/snapshot-restore/view/${view.name}')`,
|
|
105
|
-
},
|
|
106
|
-
'<i class="fas fa-undo-alt"></i> ' + req.__("Restore")
|
|
107
|
-
),
|
|
108
|
-
div({ class: "dropdown-divider" }),
|
|
109
|
-
post_dropdown_item(
|
|
110
|
-
`/viewedit/delete/${view.id}`,
|
|
111
|
-
'<i class="far fa-trash-alt"></i> ' + req.__("Delete"),
|
|
112
|
-
req,
|
|
113
|
-
true,
|
|
114
|
-
view.name
|
|
115
|
-
),
|
|
116
|
-
]);
|
|
117
|
-
|
|
118
57
|
/**
|
|
119
58
|
* @name get
|
|
120
59
|
* @function
|
|
@@ -125,77 +64,18 @@ router.get(
|
|
|
125
64
|
"/",
|
|
126
65
|
isAdmin,
|
|
127
66
|
error_catcher(async (req, res) => {
|
|
128
|
-
|
|
67
|
+
let orderBy = "name";
|
|
129
68
|
if (req.query._sortby === "viewtemplate") orderBy = "viewtemplate";
|
|
69
|
+
const views = await View.find({}, { orderBy, nocase: true });
|
|
70
|
+
await setTableRefs(views);
|
|
130
71
|
|
|
131
|
-
var views = await View.find({}, { orderBy, nocase: true });
|
|
132
|
-
const tables = await Table.find();
|
|
133
|
-
const getTable = (tid) => tables.find((t) => t.id === tid).name;
|
|
134
|
-
views.forEach((v) => {
|
|
135
|
-
if (v.table_id) v.table = getTable(v.table_id);
|
|
136
|
-
else if (v.exttable_name) v.table = v.exttable_name;
|
|
137
|
-
else v.table = "";
|
|
138
|
-
});
|
|
139
72
|
if (req.query._sortby === "table")
|
|
140
73
|
views.sort((a, b) =>
|
|
141
74
|
a.table.toLowerCase() > b.table.toLowerCase() ? 1 : -1
|
|
142
75
|
);
|
|
143
|
-
const roles = await User.get_roles();
|
|
144
76
|
|
|
145
|
-
const viewMarkup =
|
|
146
|
-
|
|
147
|
-
? mkTable(
|
|
148
|
-
[
|
|
149
|
-
{
|
|
150
|
-
label: req.__("Name"),
|
|
151
|
-
key: (r) => link(`/view/${encodeURIComponent(r.name)}`, r.name),
|
|
152
|
-
sortlink: `javascript:set_state_field('_sortby', 'name')`,
|
|
153
|
-
},
|
|
154
|
-
// description - currently I dont want to show description in view list
|
|
155
|
-
// because description can be long
|
|
156
|
-
/*
|
|
157
|
-
{
|
|
158
|
-
label: req.__("Description"),
|
|
159
|
-
key: "description",
|
|
160
|
-
// this is sorting by column
|
|
161
|
-
sortlink: `javascript:set_state_field('_sortby', 'description')`,
|
|
162
|
-
},
|
|
163
|
-
*/
|
|
164
|
-
// template
|
|
165
|
-
{
|
|
166
|
-
label: req.__("Pattern"),
|
|
167
|
-
key: "viewtemplate",
|
|
168
|
-
sortlink: `javascript:set_state_field('_sortby', 'viewtemplate')`,
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
label: req.__("Table"),
|
|
172
|
-
key: (r) => link(`/table/${r.table}`, r.table),
|
|
173
|
-
sortlink: `javascript:set_state_field('_sortby', 'table')`,
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
label: req.__("Role to access"),
|
|
177
|
-
key: (row) => editViewRoleForm(row, roles, req),
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
label: "",
|
|
181
|
-
key: (r) =>
|
|
182
|
-
link(
|
|
183
|
-
`/viewedit/config/${encodeURIComponent(r.name)}`,
|
|
184
|
-
req.__("Configure")
|
|
185
|
-
),
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
label: "",
|
|
189
|
-
key: (r) => view_dropdown(r, req),
|
|
190
|
-
},
|
|
191
|
-
],
|
|
192
|
-
views,
|
|
193
|
-
{ hover: true }
|
|
194
|
-
)
|
|
195
|
-
: div(
|
|
196
|
-
h4(req.__("No views defined")),
|
|
197
|
-
p(req.__("Views define how table rows are displayed to the user"))
|
|
198
|
-
);
|
|
77
|
+
const viewMarkup = await viewsList(views, req);
|
|
78
|
+
const tables = await Table.find();
|
|
199
79
|
res.sendWrap(req.__(`Views`), {
|
|
200
80
|
above: [
|
|
201
81
|
{
|
|
@@ -210,14 +90,14 @@ router.get(
|
|
|
210
90
|
viewMarkup,
|
|
211
91
|
tables.length > 0
|
|
212
92
|
? a(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
)
|
|
216
|
-
: p(
|
|
217
|
-
req.__(
|
|
218
|
-
"You must create at least one table before you can create views."
|
|
93
|
+
{ href: `/viewedit/new`, class: "btn btn-primary" },
|
|
94
|
+
req.__("Create view")
|
|
219
95
|
)
|
|
220
|
-
|
|
96
|
+
: p(
|
|
97
|
+
req.__(
|
|
98
|
+
"You must create at least one table before you can create views."
|
|
99
|
+
)
|
|
100
|
+
),
|
|
221
101
|
],
|
|
222
102
|
},
|
|
223
103
|
],
|
|
@@ -273,7 +153,9 @@ const viewForm = async (req, tableOptions, roles, pages, values) => {
|
|
|
273
153
|
label: req.__("View pattern"),
|
|
274
154
|
name: "viewtemplate",
|
|
275
155
|
input_type: "select",
|
|
276
|
-
sublabel: req.__(
|
|
156
|
+
sublabel: req.__(
|
|
157
|
+
"The view pattern sets the foundation of how the view relates to the table and the behaviour of the view"
|
|
158
|
+
),
|
|
277
159
|
options: Object.keys(getState().viewtemplates),
|
|
278
160
|
attributes: {
|
|
279
161
|
explainers: mapObjectValues(
|
|
@@ -362,7 +244,8 @@ router.get(
|
|
|
362
244
|
}
|
|
363
245
|
const tables = await Table.find_with_external();
|
|
364
246
|
const currentTable = tables.find(
|
|
365
|
-
(t) =>
|
|
247
|
+
(t) =>
|
|
248
|
+
(t.id && t.id === viewrow.table_id) || t.name === viewrow.exttable_name
|
|
366
249
|
);
|
|
367
250
|
viewrow.table_name = currentTable && currentTable.name;
|
|
368
251
|
if (viewrow.slug && currentTable) {
|