@steedos/service-pages 2.1.90 → 2.2.3
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/main/default/applications/app_charts.app.yml +13 -1
- package/main/default/client/amis.client.js +47 -0
- package/main/default/client/builder.client.js +5 -0
- package/main/default/client/page.render.client.js +52 -0
- package/main/default/objects/pages/buttons/showDesign.button.js +19 -0
- package/main/default/objects/pages/buttons/showDesign.button.yml +5 -0
- package/main/default/objects/pages/fields/is_default.field.yml +5 -0
- package/main/default/objects/pages/fields/object_name.field.yml +13 -0
- package/main/default/objects/pages/fields/render_engine.field.yml +11 -0
- package/main/default/objects/pages/fields/schema.field.yml +7 -0
- package/main/default/objects/pages/fields/type.field.yml +16 -0
- package/main/default/objects/pages/listviews/all.listview.yml +1 -0
- package/main/default/objects/pages/listviews/recent.listview.yml +1 -0
- package/main/default/objects/pages/pages.object.yml +1 -1
- package/main/default/routes/design.html +63 -0
- package/main/default/routes/page_design.router.js +13 -0
- package/package.json +5 -2
- package/package.service.js +30 -4
- package/public/amis/amis.css +29 -0
- package/public/amis/sdk/sdk.css +48783 -0
- package/public/amis/sdk/sdk.js +3467 -0
- package/public/builder.io/react/dist/builder-react.browser.js +21 -0
|
@@ -6,13 +6,25 @@ admin_menus:
|
|
|
6
6
|
# sort: 450
|
|
7
7
|
# permission_sets:
|
|
8
8
|
# - admin
|
|
9
|
+
- _id: user_interface
|
|
10
|
+
name: 用户页面
|
|
11
|
+
sort: 350
|
|
12
|
+
permission_sets:
|
|
13
|
+
- admin
|
|
9
14
|
- _id: pages
|
|
10
15
|
name: 页面
|
|
11
16
|
object_name: pages
|
|
12
|
-
parent:
|
|
17
|
+
parent: user_interface
|
|
13
18
|
sort: 300
|
|
14
19
|
permission_sets:
|
|
15
20
|
- admin
|
|
21
|
+
- _id: tabs
|
|
22
|
+
name: Tabs
|
|
23
|
+
object_name: tabs
|
|
24
|
+
parent: user_interface
|
|
25
|
+
sort: 500
|
|
26
|
+
permission_sets:
|
|
27
|
+
- admin
|
|
16
28
|
# - _id: word_templates
|
|
17
29
|
# name: Word Templates
|
|
18
30
|
# permission_sets:
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
; (function () {
|
|
2
|
+
try {
|
|
3
|
+
let amisStyle = document.createElement("link");
|
|
4
|
+
amisStyle.setAttribute("rel", "stylesheet");
|
|
5
|
+
amisStyle.setAttribute("type", "text/css");
|
|
6
|
+
amisStyle.setAttribute("href", "/amis/amis.css");
|
|
7
|
+
document.getElementsByTagName("head")[0].appendChild(amisStyle);
|
|
8
|
+
} catch (error) {
|
|
9
|
+
console.error(error)
|
|
10
|
+
}
|
|
11
|
+
import('/amis/sdk/sdk.js').then(() => {
|
|
12
|
+
//处理mobx多个实例问题
|
|
13
|
+
try {
|
|
14
|
+
let mobx = amisRequire('mobx');
|
|
15
|
+
mobx.configure({ isolateGlobalState: true })
|
|
16
|
+
} catch (error) {
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
21
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
22
|
+
};
|
|
23
|
+
var react_1 = __importDefault(require("react"));
|
|
24
|
+
// Register amis render
|
|
25
|
+
var Amis = function (props) {
|
|
26
|
+
var schema = props.schema, data = props.data;
|
|
27
|
+
return react_1.default.createElement(react_1.default.Fragment, null,
|
|
28
|
+
react_1.default.createElement("div", { id: "amis-root" }),
|
|
29
|
+
// amisRequire('amis').render(schema, data),
|
|
30
|
+
function () {
|
|
31
|
+
setTimeout(function () {
|
|
32
|
+
amisRequire('amis/embed').embed('#amis-root', schema, data)
|
|
33
|
+
}, 100)
|
|
34
|
+
}()
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
BuilderReact.Builder.registerComponent(Amis, {
|
|
40
|
+
name: 'Amis',
|
|
41
|
+
inputs: [
|
|
42
|
+
{ name: 'schema', type: 'object' },
|
|
43
|
+
{ name: 'data', type: 'object' }
|
|
44
|
+
]
|
|
45
|
+
})
|
|
46
|
+
});
|
|
47
|
+
})();
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
Steedos.Pages = {};
|
|
2
|
+
|
|
3
|
+
function upperFirst(str) {
|
|
4
|
+
return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
Steedos.Pages.Render = function (pageName) {
|
|
8
|
+
if(!pageName){
|
|
9
|
+
return ;
|
|
10
|
+
}
|
|
11
|
+
var rootId = "steedosPageRoot";
|
|
12
|
+
var modalRoot = document.getElementById(rootId);
|
|
13
|
+
// if(modalRoot){
|
|
14
|
+
// modalRoot.remove();
|
|
15
|
+
// }
|
|
16
|
+
if (!modalRoot) {
|
|
17
|
+
modalRoot = document.createElement('div');
|
|
18
|
+
modalRoot.setAttribute('id', rootId);
|
|
19
|
+
$(".page-template-root")[0].appendChild(modalRoot);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const pages = Creator.odata.query("pages", {$filter:`(name eq '${pageName}')`}, true);
|
|
23
|
+
if(pages.length > 0){
|
|
24
|
+
const page = pages[0];
|
|
25
|
+
if(page.render_engine && page.render_engine != 'redash'){
|
|
26
|
+
return SteedosUI.render(BuilderReact.BuilderComponent, {model:"page",content:{
|
|
27
|
+
"data":{
|
|
28
|
+
"blocks":[
|
|
29
|
+
{
|
|
30
|
+
"@type":"@builder.io/sdk:Element",
|
|
31
|
+
"@version":2,
|
|
32
|
+
"id":"builder-2b290abc4e4042498645863f53ee6815",
|
|
33
|
+
"component":{
|
|
34
|
+
"name": upperFirst(page.render_engine), //_.upperFirst
|
|
35
|
+
"options":{
|
|
36
|
+
"schema": typeof page.schema === 'string' ? JSON.parse(page.schema) : page.schema
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"inputs":[
|
|
42
|
+
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
}}, $("#" + rootId)[0]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
SteedosUI.render(stores.ComponentRegistry.components.PublicPage, {
|
|
50
|
+
token: pageName
|
|
51
|
+
}, $("#" + rootId)[0]);
|
|
52
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
showDesign: function (object_name, record_id) {
|
|
3
|
+
Steedos.openWindow(Steedos.absoluteUrl(`/api/pageDesign?pageId=${record_id}`));
|
|
4
|
+
},
|
|
5
|
+
showDesignVisible: function (object_name, record_id, record_permissions) {
|
|
6
|
+
var perms, record;
|
|
7
|
+
perms = {};
|
|
8
|
+
if (record_permissions) {
|
|
9
|
+
perms = record_permissions;
|
|
10
|
+
} else {
|
|
11
|
+
record = Creator.getObjectRecord(object_name, record_id);
|
|
12
|
+
record_permissions = Creator.getRecordPermissions(object_name, record, Meteor.userId());
|
|
13
|
+
if (record_permissions) {
|
|
14
|
+
perms = record_permissions;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return perms["allowEdit"];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
name: object_name
|
|
2
|
+
label: 对象
|
|
3
|
+
type: lookup
|
|
4
|
+
sort_no: 135
|
|
5
|
+
reference_to: objects
|
|
6
|
+
reference_to_field: name
|
|
7
|
+
optionsFunction: !!js/function |
|
|
8
|
+
function () {
|
|
9
|
+
return Steedos.getObjectsOptions()
|
|
10
|
+
}
|
|
11
|
+
filterable: true
|
|
12
|
+
required: "{{'record' == formData.type && 'list' == formData.type && 'form' == formData.type ? true: false}}"
|
|
13
|
+
visible_on: "{{'record' == formData.type && 'list' == formData.type && 'form' == formData.type ? true: false}}"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: type
|
|
2
|
+
label: 类型
|
|
3
|
+
type: select
|
|
4
|
+
defaultValue: app
|
|
5
|
+
required: true
|
|
6
|
+
options:
|
|
7
|
+
- label: 自定义页面
|
|
8
|
+
value: app
|
|
9
|
+
- label: 记录详细
|
|
10
|
+
value: record
|
|
11
|
+
- label: 自定义列表
|
|
12
|
+
value: list
|
|
13
|
+
- label: 新建、编辑页面
|
|
14
|
+
value: form
|
|
15
|
+
sort_no: 130
|
|
16
|
+
visible_on: "{{'redash' != formData.render_engine ? true: false}}"
|
|
@@ -21,7 +21,7 @@ version: 2
|
|
|
21
21
|
form:
|
|
22
22
|
afterView: !!js/function |
|
|
23
23
|
function(){
|
|
24
|
-
if(this.doc.name){
|
|
24
|
+
if(this.doc.name && (this.doc.render_engine === 'redash' || !this.doc.render_engine)){
|
|
25
25
|
SteedosUI.render(stores.ComponentRegistry.components.Page, { pageId: this.doc.name }, $(".slds-template__container")[0])
|
|
26
26
|
}
|
|
27
27
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
|
|
3
|
+
<head>
|
|
4
|
+
<script src="https://builder.steedos.com/js/axios/axios.min.js"></script>
|
|
5
|
+
<script src="https://builder.steedos.com/js/builder-fiddle/builder-fiddle.umd.js"></script>
|
|
6
|
+
</head>
|
|
7
|
+
|
|
8
|
+
<body>
|
|
9
|
+
|
|
10
|
+
<builder-fiddle host="https://builder.steedos.com/amis"></builder-fiddle>
|
|
11
|
+
|
|
12
|
+
<script>
|
|
13
|
+
let comp = document.querySelector('builder-fiddle')
|
|
14
|
+
var params = new URLSearchParams(location.search);
|
|
15
|
+
var pageId = params.get("pageId");
|
|
16
|
+
axios.get("/api/v4/pages/" + params.get("pageId")).then(function (response) {
|
|
17
|
+
let schema = response.data.schema;
|
|
18
|
+
if (typeof schema === "string") {
|
|
19
|
+
schema = JSON.parse(schema)
|
|
20
|
+
}
|
|
21
|
+
const data = {
|
|
22
|
+
AmisSchema: schema || {}
|
|
23
|
+
};
|
|
24
|
+
console.log("record data", data)
|
|
25
|
+
comp.data = data;
|
|
26
|
+
}).catch(function (error) {
|
|
27
|
+
// handle error
|
|
28
|
+
console.log(error);
|
|
29
|
+
}).then(function () {
|
|
30
|
+
// always executed
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const onWindowMessage = function (event) {
|
|
34
|
+
const { data } = event;
|
|
35
|
+
if (data) {
|
|
36
|
+
if (data.type === 'builder.saveContent') {
|
|
37
|
+
axios.put("/api/v4/pages/" + params.get("pageId"), {
|
|
38
|
+
schema: JSON.stringify(data.data.AmisSchema) //直接存储json格式会导致react form异常。
|
|
39
|
+
}).then(function (response) {
|
|
40
|
+
window.postMessage(
|
|
41
|
+
{
|
|
42
|
+
type: 'builder.contentSaved',
|
|
43
|
+
},
|
|
44
|
+
'*'
|
|
45
|
+
);
|
|
46
|
+
}).catch(function (error) {
|
|
47
|
+
// handle error
|
|
48
|
+
console.log(error);
|
|
49
|
+
}).then(function () {
|
|
50
|
+
// always executed
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
window.addEventListener('message', onWindowMessage);
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
</script>
|
|
61
|
+
</body>
|
|
62
|
+
|
|
63
|
+
</html>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const express = require("express");
|
|
2
|
+
const router = express.Router();
|
|
3
|
+
|
|
4
|
+
router.get('/api/pageDesign', async function (req, res) {
|
|
5
|
+
try {
|
|
6
|
+
res.set('Content-Type', 'text/html');
|
|
7
|
+
res.sendFile(__dirname+'/design.html')
|
|
8
|
+
} catch (error) {
|
|
9
|
+
res.status(500).send({ message: error.message });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
});
|
|
13
|
+
exports.default = router;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos/service-pages",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.3",
|
|
4
4
|
"main": "package.service.js",
|
|
5
5
|
"scripts": {},
|
|
6
6
|
"license": "MIT",
|
|
@@ -8,5 +8,8 @@
|
|
|
8
8
|
"publishConfig": {
|
|
9
9
|
"access": "public"
|
|
10
10
|
},
|
|
11
|
-
"
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@builder.io/react": "^1.1.50"
|
|
13
|
+
},
|
|
14
|
+
"gitHead": "57dfca5cd66528b2fbe6878f73f2e84b915d5e32"
|
|
12
15
|
}
|
package/package.service.js
CHANGED
|
@@ -4,6 +4,8 @@ const packageName = project.name;
|
|
|
4
4
|
const packageLoader = require('@steedos/service-package-loader');
|
|
5
5
|
const objectql = require('@steedos/objectql');
|
|
6
6
|
const _ = require(`lodash`);
|
|
7
|
+
const express = require('express');
|
|
8
|
+
const path = require('path');
|
|
7
9
|
|
|
8
10
|
const getCharts = async(apiName)=>{
|
|
9
11
|
const charts = await objectql.getObject('charts').find({ filters: [['name', '=', apiName]] });
|
|
@@ -35,7 +37,8 @@ module.exports = {
|
|
|
35
37
|
path: __dirname,
|
|
36
38
|
name: this.name,
|
|
37
39
|
isPackage: false
|
|
38
|
-
}
|
|
40
|
+
},
|
|
41
|
+
initBuilderRouter: false
|
|
39
42
|
},
|
|
40
43
|
|
|
41
44
|
/**
|
|
@@ -144,14 +147,37 @@ module.exports = {
|
|
|
144
147
|
* Events
|
|
145
148
|
*/
|
|
146
149
|
events: {
|
|
147
|
-
|
|
150
|
+
'steedos-server.started': async function (ctx) {
|
|
151
|
+
this.initBuilderRouter();
|
|
152
|
+
}
|
|
148
153
|
},
|
|
149
154
|
|
|
150
155
|
/**
|
|
151
156
|
* Methods
|
|
152
157
|
*/
|
|
153
158
|
methods: {
|
|
154
|
-
|
|
159
|
+
initBuilderRouter: {
|
|
160
|
+
handler() {
|
|
161
|
+
if (this.settings.initBuilderRouter) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
this.settings.initBuilderRouter = true;
|
|
165
|
+
try {
|
|
166
|
+
const router = express.Router();
|
|
167
|
+
let publicPath = path.join(__dirname, 'public');
|
|
168
|
+
let routerPath = "";
|
|
169
|
+
if (__meteor_runtime_config__.ROOT_URL_PATH_PREFIX) {
|
|
170
|
+
routerPath = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX;
|
|
171
|
+
}
|
|
172
|
+
const cacheTime = 86400000 * 1; // one day
|
|
173
|
+
router.use(routerPath, express.static(publicPath, { maxAge: cacheTime }));
|
|
174
|
+
WebApp.rawConnectHandlers.use(router);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
console.error(error)
|
|
177
|
+
this.settings.initBuilderRouter = false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
},
|
|
155
181
|
},
|
|
156
182
|
|
|
157
183
|
/**
|
|
@@ -165,7 +191,7 @@ module.exports = {
|
|
|
165
191
|
* Service started lifecycle event handler
|
|
166
192
|
*/
|
|
167
193
|
async started() {
|
|
168
|
-
|
|
194
|
+
this.initBuilderRouter();
|
|
169
195
|
},
|
|
170
196
|
|
|
171
197
|
/**
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
@import '/amis/sdk/sdk.css';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
/* .amis-routes-wrapper{
|
|
5
|
+
width: 100%;
|
|
6
|
+
} */
|
|
7
|
+
|
|
8
|
+
.amis-scope{
|
|
9
|
+
background: none;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.amis-scope svg {
|
|
13
|
+
display: inline !important;
|
|
14
|
+
vertical-align: initial !important;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* .row-main{
|
|
18
|
+
border-radius: 0.25rem
|
|
19
|
+
} */
|
|
20
|
+
|
|
21
|
+
.amis-scope .a-Form-item--horizontal.col-span-2 .a-Form-itemColumn--2 {
|
|
22
|
+
flex: 0 0 calc(8.33333333335% - 2px);
|
|
23
|
+
max-width: calc(8.33333333335% - 2px);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.a-Table svg {
|
|
27
|
+
display: inline !important;
|
|
28
|
+
vertical-align: initial !important;
|
|
29
|
+
}
|