@steedos/service-pages 2.1.89 → 2.2.1

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.
@@ -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: analysis
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,5 @@
1
+ ;(function() {
2
+ import("/builder.io/react/dist/builder-react.browser.js").then(()=>{
3
+ BuilderReact.builder.init("builder-token");
4
+ });
5
+ })();
@@ -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,5 @@
1
+ name: showDesign
2
+ is_enable: true
3
+ label: 设计器
4
+ 'on': record_only
5
+ visible: true
@@ -0,0 +1,5 @@
1
+ name: is_default
2
+ type: toggle
3
+ label: 默认
4
+ sort_no: 200
5
+ hidden: true
@@ -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,11 @@
1
+ name: render_engine
2
+ type: select
3
+ label: 渲染器
4
+ defaultValue: amis
5
+ options:
6
+ - label: Amis
7
+ value: amis
8
+ - label: Redash
9
+ value: redash
10
+ required: true
11
+ sort_no: 125
@@ -0,0 +1,7 @@
1
+ name: schema
2
+ type: code
3
+ language: json
4
+ is_wide: true
5
+ sort_no: 300
6
+ omit: true
7
+ hidden: true
@@ -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}}"
@@ -2,6 +2,7 @@ name: all
2
2
  columns:
3
3
  - field: name
4
4
  - field: label
5
+ - field: type
5
6
  - field: is_system
6
7
  wrap: false
7
8
  filter_scope: space
@@ -2,6 +2,7 @@ name: recent
2
2
  columns:
3
3
  - field: name
4
4
  - field: label
5
+ - field: type
5
6
  - field: is_system
6
7
  wrap: false
7
8
  filter_scope: space
@@ -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.1.89",
3
+ "version": "2.2.1",
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
- "gitHead": "4b2cd15644d673357382176b925003df5d03ba31"
11
+ "dependencies": {
12
+ "@builder.io/react": "^1.1.50"
13
+ },
14
+ "gitHead": "0f747034edce2560dd1f39e2259c8e4d20528be2"
12
15
  }
@@ -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
+ }