@saltcorn/server 0.6.3 → 0.6.4-beta.4
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/app.js +3 -1
- package/auth/resetpw.js +7 -7
- package/auth/routes.js +1 -1
- package/locales/en.json +9 -1
- package/package.json +17 -14
- package/public/gridedit.js +162 -221
- package/public/saltcorn.js +107 -12
- package/public/tabulator.min.js +3 -0
- package/public/tabulator_bootstrap4.min.css +2 -0
- package/restart_watcher.js +1 -1
- package/routes/admin.js +9 -3
- package/routes/api.js +10 -5
- package/routes/fields.js +31 -2
- package/routes/files.js +2 -1
- package/routes/homepage.js +1 -1
- package/routes/list.js +167 -89
- package/routes/packs.js +1 -1
- package/routes/pageedit.js +1 -1
- package/routes/plugins.js +3 -1
- package/routes/scapi.js +1 -1
- package/routes/tables.js +3 -1
- package/routes/tenant.js +19 -9
- package/routes/view.js +2 -0
- package/routes/viewedit.js +1 -1
- package/serve.js +38 -27
- package/wrapper.js +5 -2
package/app.js
CHANGED
|
@@ -28,6 +28,7 @@ const {
|
|
|
28
28
|
getSessionStore,
|
|
29
29
|
setTenant,
|
|
30
30
|
} = require("./routes/utils.js");
|
|
31
|
+
const { getAllTenants } = require("@saltcorn/admin-models/models/tenant");
|
|
31
32
|
const path = require("path");
|
|
32
33
|
const fileUpload = require("express-fileupload");
|
|
33
34
|
const helmet = require("helmet");
|
|
@@ -84,7 +85,8 @@ const getApp = async (opts = {}) => {
|
|
|
84
85
|
app.use(i18n.init);
|
|
85
86
|
// init multitenant mode
|
|
86
87
|
if (db.is_it_multi_tenant()) {
|
|
87
|
-
await
|
|
88
|
+
const tenants = await getAllTenants();
|
|
89
|
+
await init_multi_tenant(loadAllPlugins, opts.disableMigrate, tenants);
|
|
88
90
|
}
|
|
89
91
|
//
|
|
90
92
|
// todo ability to configure session_secret Age
|
package/auth/resetpw.js
CHANGED
|
@@ -8,9 +8,9 @@ const { getMailTransport } = require("@saltcorn/data/models/email");
|
|
|
8
8
|
const { get_base_url } = require("../routes/utils");
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* @param {string} link
|
|
12
|
-
* @param {object} user
|
|
13
|
-
* @param {object} req
|
|
11
|
+
* @param {string} link
|
|
12
|
+
* @param {object} user
|
|
13
|
+
* @param {object} req
|
|
14
14
|
* @returns {void}
|
|
15
15
|
*/
|
|
16
16
|
const generate_email = (link, user, req) => ({
|
|
@@ -48,8 +48,8 @@ ${req.__(
|
|
|
48
48
|
});
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
|
-
* @param {object} user
|
|
52
|
-
* @param {object} req
|
|
51
|
+
* @param {object} user
|
|
52
|
+
* @param {object} req
|
|
53
53
|
* @returns {Promise<void>}
|
|
54
54
|
*/
|
|
55
55
|
const send_reset_email = async (user, req) => {
|
|
@@ -59,8 +59,8 @@ const send_reset_email = async (user, req) => {
|
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* @param {object} user
|
|
63
|
-
* @param {object} req
|
|
62
|
+
* @param {object} user
|
|
63
|
+
* @param {object} req
|
|
64
64
|
* @returns {Promise<string>}
|
|
65
65
|
*/
|
|
66
66
|
const get_reset_link = async (user, req) => {
|
package/auth/routes.js
CHANGED
|
@@ -53,7 +53,7 @@ const Table = require("@saltcorn/data/models/table");
|
|
|
53
53
|
const { InvalidConfiguration } = require("@saltcorn/data/utils");
|
|
54
54
|
const Trigger = require("@saltcorn/data/models/trigger");
|
|
55
55
|
const { restore_backup } = require("../markup/admin.js");
|
|
56
|
-
const { restore } = require("@saltcorn/
|
|
56
|
+
const { restore } = require("@saltcorn/admin-models/models/backup");
|
|
57
57
|
const load_plugins = require("../load_plugins");
|
|
58
58
|
const fs = require("fs");
|
|
59
59
|
const base32 = require("thirty-two");
|
package/locales/en.json
CHANGED
|
@@ -859,5 +859,13 @@
|
|
|
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",
|
|
865
|
+
"Vertical column width": "Vertical column width",
|
|
866
|
+
"Vertical width units": "Vertical width units",
|
|
867
|
+
"Save before going back": "Save before going back",
|
|
868
|
+
"Reload after going back": "Reload after going back",
|
|
869
|
+
"2FA policy": "2FA policy",
|
|
870
|
+
"Steps to go back": "Steps to go back"
|
|
863
871
|
}
|
package/package.json
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@saltcorn/server",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4-beta.4",
|
|
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.
|
|
10
|
-
"@saltcorn/builder": "0.6.
|
|
11
|
-
"@saltcorn/data": "0.6.
|
|
12
|
-
"
|
|
13
|
-
"@saltcorn/markup": "0.6.
|
|
14
|
-
"@saltcorn/sbadmin2": "0.6.
|
|
9
|
+
"@saltcorn/base-plugin": "0.6.4-beta.4",
|
|
10
|
+
"@saltcorn/builder": "0.6.4-beta.4",
|
|
11
|
+
"@saltcorn/data": "0.6.4-beta.4",
|
|
12
|
+
"@saltcorn/admin-models": "0.6.4-beta.4",
|
|
13
|
+
"@saltcorn/markup": "0.6.4-beta.4",
|
|
14
|
+
"@saltcorn/sbadmin2": "0.6.4-beta.4",
|
|
15
15
|
"@socket.io/cluster-adapter": "^0.1.0",
|
|
16
16
|
"@socket.io/sticky": "^1.0.1",
|
|
17
|
+
"aws-sdk": "^2.1037.0",
|
|
17
18
|
"connect-flash": "^0.1.1",
|
|
18
19
|
"connect-pg-simple": "^6.1.0",
|
|
19
20
|
"connect-sqlite3": "^0.9.11",
|
|
21
|
+
"content-disposition": "^0.5.3",
|
|
20
22
|
"contractis": "^0.1.0",
|
|
21
23
|
"cookie-parser": "^1.4.4",
|
|
22
24
|
"cookie-session": "^1.4.0",
|
|
@@ -28,10 +30,13 @@
|
|
|
28
30
|
"express-rate-limit": "^5.1.3",
|
|
29
31
|
"express-session": "^1.17.1",
|
|
30
32
|
"greenlock": "^4.0.4",
|
|
33
|
+
"greenlock-express": "^4.0.3",
|
|
31
34
|
"helmet": "^3.23.3",
|
|
32
35
|
"i18n": "^0.13.2",
|
|
33
36
|
"live-plugin-manager": "^0.16.0",
|
|
34
37
|
"moment": "^2.27.0",
|
|
38
|
+
"multer": "^1.4.3",
|
|
39
|
+
"multer-s3": "^2.10.0",
|
|
35
40
|
"node-fetch": "2.6.2",
|
|
36
41
|
"node-watch": "^0.7.2",
|
|
37
42
|
"notp": "2.0.3",
|
|
@@ -43,13 +48,9 @@
|
|
|
43
48
|
"pluralize": "^8.0.0",
|
|
44
49
|
"qrcode": "1.5.0",
|
|
45
50
|
"socket.io": "4.2.0",
|
|
46
|
-
"tmp-promise": "^3.0.2",
|
|
47
51
|
"thirty-two": "1.0.2",
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"aws-sdk": "^2.1037.0",
|
|
51
|
-
"uuid": "^8.2.0",
|
|
52
|
-
"content-disposition": "^0.5.3"
|
|
52
|
+
"tmp-promise": "^3.0.2",
|
|
53
|
+
"uuid": "^8.2.0"
|
|
53
54
|
},
|
|
54
55
|
"optionalDependencies": {
|
|
55
56
|
"sd-notify": "^2.8.0"
|
|
@@ -81,7 +82,9 @@
|
|
|
81
82
|
"@saltcorn/data/(.*)": "@saltcorn/data/dist/$1",
|
|
82
83
|
"@saltcorn/types/(.*)": "@saltcorn/types/dist/$1",
|
|
83
84
|
"@saltcorn/markup$": "@saltcorn/markup/dist",
|
|
84
|
-
"@saltcorn/markup/(.*)": "@saltcorn/markup/dist/$1"
|
|
85
|
+
"@saltcorn/markup/(.*)": "@saltcorn/markup/dist/$1",
|
|
86
|
+
"@saltcorn/server/(.*)": "@saltcorn/server/dist/$1",
|
|
87
|
+
"@saltcorn/admin-models/(.*)": "@saltcorn/admin-models/dist/$1"
|
|
85
88
|
}
|
|
86
89
|
},
|
|
87
90
|
"publishConfig": {
|
package/public/gridedit.js
CHANGED
|
@@ -1,228 +1,169 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
function showHideCol(nm, e) {
|
|
2
|
+
if (e && e.checked) window.tabulator_table.showColumn(nm);
|
|
3
|
+
else window.tabulator_table.hideColumn(nm);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
function lookupIntToString(cell, formatterParams, onRendered) {
|
|
7
|
+
const val = `${cell.getValue()}`;
|
|
8
|
+
const res = formatterParams.values[val];
|
|
9
|
+
return res;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function flatpickerEditor(cell, onRendered, success, cancel) {
|
|
13
|
+
var input = $("<input type='text'/>");
|
|
14
|
+
|
|
15
|
+
input.flatpickr({
|
|
16
|
+
enableTime: true,
|
|
17
|
+
dateFormat: "Y-m-d H:i",
|
|
18
|
+
time_24hr: true,
|
|
19
|
+
locale: "en", // global variable with locale 'en', 'fr', ...
|
|
20
|
+
defaultDate: cell.getValue(),
|
|
21
|
+
onClose: function (selectedDates, dateStr, instance) {
|
|
22
|
+
evt = window.event;
|
|
23
|
+
var isEscape = false;
|
|
24
|
+
if ("key" in evt) {
|
|
25
|
+
isEscape = evt.key === "Escape" || evt.key === "Esc";
|
|
26
|
+
} else {
|
|
27
|
+
isEscape = evt.keyCode === 27;
|
|
28
|
+
}
|
|
29
|
+
if (isEscape) {
|
|
30
|
+
// user hit escape
|
|
31
|
+
cancel();
|
|
32
|
+
} else {
|
|
33
|
+
success(dateStr);
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
input.css({
|
|
39
|
+
border: "1px",
|
|
40
|
+
background: "transparent",
|
|
41
|
+
padding: "4px",
|
|
42
|
+
width: "100%",
|
|
43
|
+
"box-sizing": "border-box",
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
input.val(cell.getValue());
|
|
47
|
+
|
|
48
|
+
var inputBlur = function (e) {
|
|
49
|
+
if (e.target !== input[0]) {
|
|
50
|
+
if ($(e.target).closest(".flatpicker-input").length === 0) {
|
|
51
|
+
$(document).off("mousedown", inputBlur);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
17
54
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
55
|
+
|
|
56
|
+
$(document).on("mousedown", inputBlur);
|
|
57
|
+
|
|
58
|
+
onRendered(function () {
|
|
59
|
+
input.focus();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return input[0];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function isoDateTimeFormatter(cell, formatterParams, onRendered) {
|
|
66
|
+
const val = cell.getValue();
|
|
67
|
+
if (!val) return "";
|
|
68
|
+
|
|
69
|
+
return new Date(val).toLocaleString(window.detected_locale || "en");
|
|
70
|
+
}
|
|
71
|
+
function colorFormatter(cell, formatterParams, onRendered) {
|
|
72
|
+
const val = cell.getValue();
|
|
73
|
+
if (!val) return "";
|
|
74
|
+
|
|
75
|
+
return $(
|
|
76
|
+
`<div style="height: 15px; width: 30px; background-color: ${val}"></div>`
|
|
77
|
+
)[0];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function jsonFormatter(cell, formatterParams, onRendered) {
|
|
81
|
+
const val = cell.getValue();
|
|
82
|
+
if (val === null) return "";
|
|
83
|
+
return JSON.stringify(val, null, 1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function versionsFormatter(cell, formatterParams, onRendered) {
|
|
87
|
+
const value = cell.getValue();
|
|
88
|
+
const row = cell.getRow().getData();
|
|
89
|
+
return $(`<a href="/list/_versions/${window.tabulator_table_name}/${row.id}">
|
|
90
|
+
${value || 0} <i class="fa-sm fas fa-list"></i></a>`)[0];
|
|
91
|
+
}
|
|
92
|
+
function colorEditor(cell, onRendered, success, cancel) {
|
|
93
|
+
const editor = document.createElement("input");
|
|
94
|
+
|
|
95
|
+
editor.setAttribute("type", "color");
|
|
96
|
+
editor.value = cell.getValue();
|
|
97
|
+
//when the value has been set, trigger the cell to update
|
|
98
|
+
function successFunc() {
|
|
99
|
+
const val = editor.value;
|
|
100
|
+
success(val);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
editor.addEventListener("change", successFunc);
|
|
104
|
+
editor.addEventListener("blur", successFunc);
|
|
105
|
+
|
|
106
|
+
//return the editor element
|
|
107
|
+
return editor;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function jsonEditor(cell, onRendered, success, cancel) {
|
|
111
|
+
const editor = document.createElement("textarea");
|
|
112
|
+
|
|
113
|
+
editor.value = JSON.stringify(cell.getValue());
|
|
114
|
+
//when the value has been set, trigger the cell to update
|
|
115
|
+
function successFunc() {
|
|
116
|
+
const val = editor.value;
|
|
117
|
+
try {
|
|
118
|
+
success(JSON.parse(val));
|
|
119
|
+
} catch (e) {
|
|
120
|
+
if (e) tabulator_show_error(e.message);
|
|
121
|
+
cancel();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
editor.addEventListener("change", successFunc);
|
|
126
|
+
editor.addEventListener("blur", successFunc);
|
|
127
|
+
|
|
128
|
+
//return the editor element
|
|
129
|
+
return editor;
|
|
130
|
+
}
|
|
131
|
+
function add_tabulator_row() {
|
|
132
|
+
window.tabulator_table.addRow({}, true);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function delete_tabulator_row(e, cell) {
|
|
136
|
+
const row = cell.getRow().getData();
|
|
137
|
+
if (!row.id) {
|
|
138
|
+
cell.getRow().delete();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
$.ajax({
|
|
142
|
+
type: "DELETE",
|
|
143
|
+
url: `/api/${window.tabulator_table_name}/${row.id}`,
|
|
144
|
+
data: row, // to process primary keys different from id
|
|
145
|
+
headers: {
|
|
146
|
+
"CSRF-Token": _sc_globalCsrf,
|
|
147
|
+
},
|
|
148
|
+
success: () => cell.getRow().delete(),
|
|
149
|
+
error: tabulator_error_handler,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function tabulator_error_handler(request) {
|
|
154
|
+
let errtxt =
|
|
155
|
+
request.responseJSON && request.responseJSON.error
|
|
156
|
+
? request.responseJSON.error
|
|
157
|
+
: request.responseText;
|
|
158
|
+
if (errtxt) {
|
|
159
|
+
tabulator_show_error(errtxt);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function tabulator_show_error(errtxt) {
|
|
163
|
+
$("#jsGridNotify").html(`<div class="alert alert-danger" role="alert">
|
|
25
164
|
${errtxt}
|
|
26
165
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
|
27
166
|
<span aria-hidden="true">×</span>
|
|
28
167
|
</button>
|
|
29
168
|
</div>`);
|
|
30
|
-
if (prom) prom.reject(errtxt);
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
return {
|
|
34
|
-
// load of data
|
|
35
|
-
loadData: function (filter) {
|
|
36
|
-
var data = $.Deferred();
|
|
37
|
-
$.ajax({
|
|
38
|
-
type: "GET",
|
|
39
|
-
url: url + (vc ? "?versioncount=on" : ""),
|
|
40
|
-
data: filter,
|
|
41
|
-
error: errorHandler(data),
|
|
42
|
-
}).done(function (resp) {
|
|
43
|
-
data.resolve(resp.success);
|
|
44
|
-
});
|
|
45
|
-
return data.promise();
|
|
46
|
-
},
|
|
47
|
-
// insert row
|
|
48
|
-
insertItem: function (item) {
|
|
49
|
-
var data = $.Deferred();
|
|
50
|
-
$.ajax({
|
|
51
|
-
type: "POST",
|
|
52
|
-
url: url,
|
|
53
|
-
data: item,
|
|
54
|
-
headers: {
|
|
55
|
-
"CSRF-Token": _sc_globalCsrf,
|
|
56
|
-
},
|
|
57
|
-
error: errorHandler(data),
|
|
58
|
-
}).done(function (resp) {
|
|
59
|
-
item._versions = 1;
|
|
60
|
-
if (resp.success) {
|
|
61
|
-
item.id = resp.success;
|
|
62
|
-
data.resolve(fixKeys(item));
|
|
63
|
-
} else {
|
|
64
|
-
data.resolve();
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
return data.promise();
|
|
68
|
-
},
|
|
69
|
-
// update row
|
|
70
|
-
updateItem: function (item) {
|
|
71
|
-
var data = $.Deferred();
|
|
72
|
-
$.ajax({
|
|
73
|
-
type: "POST",
|
|
74
|
-
url: url + item.id,
|
|
75
|
-
data: item,
|
|
76
|
-
headers: {
|
|
77
|
-
"CSRF-Token": _sc_globalCsrf,
|
|
78
|
-
},
|
|
79
|
-
error: errorHandler(data),
|
|
80
|
-
}).done(function (resp) {
|
|
81
|
-
if (item._versions) item._versions = +item._versions + 1;
|
|
82
|
-
data.resolve(fixKeys(item));
|
|
83
|
-
});
|
|
84
|
-
return data.promise();
|
|
85
|
-
},
|
|
86
|
-
// delete row
|
|
87
|
-
deleteItem: function (item) {
|
|
88
|
-
return $.ajax({
|
|
89
|
-
type: "DELETE",
|
|
90
|
-
url: url + item.id,
|
|
91
|
-
data: item, // to process primary keys different from id
|
|
92
|
-
headers: {
|
|
93
|
-
"CSRF-Token": _sc_globalCsrf,
|
|
94
|
-
},
|
|
95
|
-
error: errorHandler(),
|
|
96
|
-
});
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
function DecimalField(config) {
|
|
101
|
-
jsGrid.fields.number.call(this, config);
|
|
102
169
|
}
|
|
103
|
-
DecimalField.prototype = new jsGrid.fields.number({
|
|
104
|
-
filterValue: function () {
|
|
105
|
-
return this.filterControl.val()
|
|
106
|
-
? parseFloat(this.filterControl.val() || 0, 10)
|
|
107
|
-
: undefined;
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
insertValue: function () {
|
|
111
|
-
return this.insertControl.val()
|
|
112
|
-
? parseFloat(this.insertControl.val() || 0, 10)
|
|
113
|
-
: undefined;
|
|
114
|
-
},
|
|
115
|
-
|
|
116
|
-
editValue: function () {
|
|
117
|
-
return this.editControl.val()
|
|
118
|
-
? parseFloat(this.editControl.val() || 0, 10)
|
|
119
|
-
: undefined;
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
jsGrid.fields.decimal = jsGrid.DecimalField = DecimalField;
|
|
124
|
-
|
|
125
|
-
var ColorField = function (config) {
|
|
126
|
-
jsGrid.Field.call(this, config);
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
ColorField.prototype = new jsGrid.Field({
|
|
130
|
-
itemTemplate: function (value) {
|
|
131
|
-
return $("<div>").css({
|
|
132
|
-
display: "inline-block",
|
|
133
|
-
background: value,
|
|
134
|
-
width: "50px",
|
|
135
|
-
height: "20px",
|
|
136
|
-
});
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
insertTemplate: function (value) {
|
|
140
|
-
var insertPicker = (this._insertPicker = $("<input>").attr(
|
|
141
|
-
"type",
|
|
142
|
-
"color"
|
|
143
|
-
));
|
|
144
|
-
|
|
145
|
-
return insertPicker;
|
|
146
|
-
},
|
|
147
|
-
|
|
148
|
-
editTemplate: function (value) {
|
|
149
|
-
var editPicker = (this._editPicker = $("<input>")
|
|
150
|
-
.attr("type", "color")
|
|
151
|
-
.val(value));
|
|
152
|
-
|
|
153
|
-
return editPicker;
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
insertValue: function () {
|
|
157
|
-
return this._insertPicker.val();
|
|
158
|
-
},
|
|
159
|
-
|
|
160
|
-
editValue: function () {
|
|
161
|
-
return this._editPicker.val();
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
jsGrid.fields.color = ColorField;
|
|
166
|
-
|
|
167
|
-
var DateField = function (config) {
|
|
168
|
-
jsGrid.Field.call(this, config);
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
DateField.prototype = new jsGrid.Field({
|
|
172
|
-
itemTemplate: function (value) {
|
|
173
|
-
var v = typeof value === "string" && value !== "" ? new Date(value) : value;
|
|
174
|
-
return v && v.toLocaleString ? v.toLocaleString() : v;
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
insertTemplate: function (value) {
|
|
178
|
-
var insertPicker = (this._insertPicker = $("<input>").attr("type", "text"));
|
|
179
|
-
setTimeout(function () {
|
|
180
|
-
flatpickr(insertPicker, {
|
|
181
|
-
enableTime: true,
|
|
182
|
-
dateFormat: "Z",
|
|
183
|
-
altInput: true,
|
|
184
|
-
altFormat: "Y-m-d h:i K",
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
return insertPicker;
|
|
188
|
-
},
|
|
189
|
-
|
|
190
|
-
editTemplate: function (value) {
|
|
191
|
-
var editPicker = (this._editPicker = $("<input>")
|
|
192
|
-
.attr("type", "text")
|
|
193
|
-
.val(value));
|
|
194
|
-
setTimeout(function () {
|
|
195
|
-
flatpickr(editPicker, {
|
|
196
|
-
enableTime: true,
|
|
197
|
-
dateFormat: "Z",
|
|
198
|
-
altInput: true,
|
|
199
|
-
altFormat: "Y-m-d h:i K",
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
return editPicker;
|
|
203
|
-
},
|
|
204
|
-
|
|
205
|
-
insertValue: function () {
|
|
206
|
-
return this._insertPicker.val();
|
|
207
|
-
},
|
|
208
|
-
|
|
209
|
-
editValue: function () {
|
|
210
|
-
return this._editPicker.val();
|
|
211
|
-
},
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
jsGrid.fields.date = DateField;
|
|
215
|
-
|
|
216
|
-
var HtmlField = function (config) {
|
|
217
|
-
jsGrid.Field.call(this, config);
|
|
218
|
-
};
|
|
219
|
-
HtmlField.prototype = new jsGrid.Field({
|
|
220
|
-
align: "left",
|
|
221
|
-
itemTemplate: function (value, item) {
|
|
222
|
-
if (value) {
|
|
223
|
-
//return +value+1;
|
|
224
|
-
return value;
|
|
225
|
-
} else return "";
|
|
226
|
-
},
|
|
227
|
-
});
|
|
228
|
-
jsGrid.fields.html = HtmlField;
|