@steedos/service-pages 2.1.92 → 2.2.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.
Files changed (45) hide show
  1. package/docs/amis.md +53 -0
  2. package/main/default/applications/app_charts.app.yml +13 -1
  3. package/main/default/client/builder.client.js +10 -0
  4. package/main/default/client/page.render.client.js +213 -0
  5. package/main/default/objects/page_assignments/fields/app.field.yml +6 -0
  6. package/main/default/objects/page_assignments/fields/desktop.field.yml +5 -0
  7. package/main/default/objects/page_assignments/fields/is_system.field.yml +6 -0
  8. package/main/default/objects/page_assignments/fields/mobile.field.yml +5 -0
  9. package/main/default/objects/page_assignments/fields/page.field.yml +5 -0
  10. package/main/default/objects/page_assignments/fields/profile.field.yml +8 -0
  11. package/main/default/objects/page_assignments/fields/record_type.field.yml +4 -0
  12. package/main/default/objects/page_assignments/listviews/all.listview.yml +15 -0
  13. package/main/default/objects/page_assignments/listviews/recent.listview.yml +15 -0
  14. package/main/default/objects/page_assignments/page_assignments.object.yml +20 -0
  15. package/main/default/objects/page_assignments/permissions/admin.permission.yml +10 -0
  16. package/main/default/objects/page_assignments/permissions/user.permission.yml +10 -0
  17. package/main/default/objects/page_versions/fields/is_archived.field.yml +4 -0
  18. package/main/default/objects/page_versions/fields/page.field.yml +4 -0
  19. package/main/default/objects/page_versions/fields/schema.field.yml +7 -0
  20. package/main/default/objects/page_versions/fields/version.field.yml +5 -0
  21. package/main/default/objects/page_versions/listviews/all.listview.yml +18 -0
  22. package/main/default/objects/page_versions/listviews/recent.listview.yml +15 -0
  23. package/main/default/objects/page_versions/page_versions.object.yml +20 -0
  24. package/main/default/objects/page_versions/permissions/admin.permission.yml +10 -0
  25. package/main/default/objects/page_versions/permissions/user.permission.yml +10 -0
  26. package/main/default/objects/pages/buttons/showDesign.button.js +19 -0
  27. package/main/default/objects/pages/buttons/showDesign.button.yml +5 -0
  28. package/main/default/objects/pages/fields/is_archived.field.yml +2 -2
  29. package/main/default/objects/pages/fields/object_name.field.yml +13 -0
  30. package/main/default/objects/pages/fields/render_engine.field.yml +11 -0
  31. package/main/default/objects/pages/fields/schema.field.yml +7 -0
  32. package/main/default/objects/pages/fields/type.field.yml +16 -0
  33. package/main/default/objects/pages/listviews/all.listview.yml +1 -0
  34. package/main/default/objects/pages/listviews/recent.listview.yml +1 -0
  35. package/main/default/objects/pages/pages.object.yml +2 -1
  36. package/main/default/routes/design.html +63 -0
  37. package/main/default/routes/page_design.router.js +13 -0
  38. package/main/default/routes/page_schema.router.js +32 -0
  39. package/main/default/services/page.service.js +264 -0
  40. package/main/default/triggers/page_versions.enable.trigger.js +15 -0
  41. package/main/default/triggers/pages_metadata.trigger.js +12 -47
  42. package/package.json +5 -2
  43. package/package.service.js +30 -4
  44. package/public/builder.io/react/dist/builder-react.browser.js +21 -0
  45. package/main/default/client/style.client.js +0 -12
package/docs/amis.md ADDED
@@ -0,0 +1,53 @@
1
+ ## 集成 Amis
2
+ - 集成Amis 设计器
3
+ - 集成Amis 渲染器
4
+
5
+ ## 新增对象
6
+ - 新增对象Pages,用于保存 amis schema
7
+ - 详细页面添加按钮:设计器,点击后打开Amis设计器
8
+ - 新增对象Page assignments, 用于记录page分配。
9
+
10
+
11
+ ## 调整页面渲染引擎
12
+
13
+ - 自定义应用
14
+
15
+ - 列表页面
16
+
17
+ - 详细页面
18
+
19
+ - 表单页面
20
+
21
+ ## 将 Steedos React 组件 整合到 Amis
22
+ - 列表组件:
23
+ - 没有react组件:切换列表视图
24
+ - 没有react组件:列表按钮
25
+ - 没有react组件:下载列表数据
26
+ - 没有react组件:自定义列表
27
+ - 没有react组件:过滤器
28
+ - 数据展示:
29
+ - Table
30
+ - Tree Table
31
+ - 记录详细
32
+ - 各种字段类型
33
+ - 相关表
34
+ - 是否显示总数
35
+ - 按钮
36
+ - 快速编辑
37
+ - 相关表快速链接
38
+ - 相关表名称
39
+ - 相关表记录总数
40
+
41
+ ## 页面布局设计器(无法使用Amis 实现)
42
+ - 分组
43
+ - 选对象字段
44
+ - 根据对象的定义,将对象的字段转化为Amis的自定义组件,供用户使用。
45
+ - 选对象按钮
46
+ - 选子表
47
+
48
+ ## 服务端
49
+ - amis service
50
+ - actions
51
+ - getDefaultSchema(type, app, objectApiName, recordId): 获取默认Schema
52
+ - API:getMeSchema(type, app, objectApiName, recordId): 获取分配的Schema
53
+ - amis的配套接口
@@ -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,10 @@
1
+ // ;(function() {
2
+ // Builder.registryChange.subscribe(function(registry){
3
+ // _.each(registry, function(value, key){
4
+ // _.each(value, function(item){
5
+ // const {component, ...options} = item
6
+ // Builder.registerComponent(component, options)
7
+ // })
8
+ // })
9
+ // })
10
+ // })();
@@ -0,0 +1,213 @@
1
+ Steedos.Page = {
2
+ App: {},
3
+ Record: {},
4
+ Listview: {},
5
+ RelatedListview: {},
6
+ Form:{
7
+ StandardNew: {},
8
+ StandardEdit: {}
9
+ }
10
+ };
11
+
12
+ function upperFirst(str) {
13
+ return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
14
+ };
15
+
16
+ Steedos.Page.getPage = function(type, appId, objectApiName, recordId){
17
+ if(objectApiName){
18
+ const objectInfo = Creator.getObject(Session.get("object_name"));
19
+ if(objectInfo.version < 2){
20
+ return ;
21
+ }
22
+ }
23
+ const formFactor = Steedos.isMobile() ? "SMALL" : "LARGE";
24
+ const page = Steedos.authRequest(`/api/pageSchema/${type}?app=${appId}&objectApiName=${objectApiName}&recordId=${recordId}&formFactor=${formFactor}`, {async:false});
25
+ if(page && page.schema){
26
+ return page;
27
+ }
28
+ }
29
+
30
+ Steedos.Page.render = function (root, page, data) {
31
+ console.log(`render======>data`, data)
32
+ if (page.render_engine && page.render_engine != 'redash') {
33
+ return SteedosUI.render(BuilderComponent, {
34
+ model: "page", content: {
35
+ "data": {
36
+ "blocks": [
37
+ {
38
+ "@type": "@builder.io/sdk:Element",
39
+ "@version": 2,
40
+ "id": `builder-${page._id}`,
41
+ "component": {
42
+ "name": upperFirst(page.render_engine),
43
+ "options": {
44
+ "schema": typeof page.schema === 'string' ? JSON.parse(page.schema) : page.schema,
45
+ "data": Object.assign({}, data,{
46
+ rootUrl: __meteor_runtime_config__.ROOT_URL,
47
+ userSession: Creator.USER_CONTEXT.user
48
+ })
49
+ }
50
+ },
51
+ }
52
+ ],
53
+ "inputs": [
54
+ ]
55
+ }
56
+ }
57
+ }, root);
58
+ }
59
+ };
60
+
61
+ Steedos.Page.App.render = function (template, pageName, app_id) {
62
+ if(!pageName){
63
+ return ;
64
+ }
65
+ var rootId = "steedosPageRoot";
66
+ var modalRoot = document.getElementById(rootId);
67
+ // if(modalRoot){
68
+ // modalRoot.remove();
69
+ // }
70
+ if (!modalRoot) {
71
+ modalRoot = document.createElement('div');
72
+ modalRoot.setAttribute('id', rootId);
73
+ $(".page-template-root")[0].appendChild(modalRoot);
74
+ }
75
+
76
+ const page = Steedos.Page.getPage('app', app_id);
77
+ if(page){
78
+ if(page.render_engine && page.render_engine != 'redash'){
79
+ return Steedos.Page.render($("#" + rootId)[0], page, {
80
+ appId: app_id
81
+ });
82
+ }
83
+ }
84
+
85
+ SteedosUI.render(stores.ComponentRegistry.components.PublicPage, {
86
+ token: pageName
87
+ }, $("#" + rootId)[0]);
88
+ };
89
+
90
+ Steedos.Page.Listview.render = function(template, objectApiName){
91
+ try {
92
+ if(!template.data.regions || !objectApiName){
93
+ return ;
94
+ }
95
+ const page = template.data.regions().page;
96
+
97
+ var rootId = "steedosPageRecordRoot";
98
+ var modalRoot = document.getElementById(rootId);
99
+ // if(modalRoot){
100
+ // modalRoot.remove();
101
+ // }
102
+ if (!modalRoot) {
103
+ modalRoot = document.createElement('div');
104
+ modalRoot.setAttribute('id', rootId);
105
+ $(".page-list-view-root")[0].appendChild(modalRoot);
106
+ }
107
+
108
+ if(page.render_engine && page.render_engine != 'redash'){
109
+ return Steedos.Page.render($("#" + rootId)[0], page, template.data.regions());
110
+ }
111
+ } catch (error) {
112
+
113
+ }
114
+ };
115
+
116
+ Steedos.Page.Record.render = function(template, objectApiName, recordId){
117
+ try {
118
+ if(!template.data.regions || !objectApiName || !recordId){
119
+ return ;
120
+ }
121
+ console.log(`Steedos.Page.Record.render...`, template.data.regions(), objectApiName, recordId);
122
+ const page = template.data.regions().page;
123
+
124
+ var rootId = "steedosPageRecordRoot";
125
+ var modalRoot = document.getElementById(rootId);
126
+ // if(modalRoot){
127
+ // modalRoot.remove();
128
+ // }
129
+ if (!modalRoot) {
130
+ modalRoot = document.createElement('div');
131
+ modalRoot.setAttribute('id', rootId);
132
+ $(".page-record-view-root")[0].appendChild(modalRoot);
133
+ }
134
+
135
+ if(page.render_engine && page.render_engine != 'redash'){
136
+ return Steedos.Page.render($("#" + rootId)[0], page, template.data.regions());
137
+ }
138
+ } catch (error) {
139
+
140
+ }
141
+ };
142
+
143
+ Steedos.Page.RelatedListview.render = function(template, objectApiName){
144
+ try {
145
+ if(!template.data.regions || !objectApiName){
146
+ return ;
147
+ }
148
+ const page = template.data.regions().page;
149
+
150
+ var rootId = "steedosPageRecordRoot";
151
+ var modalRoot = document.getElementById(rootId);
152
+ // if(modalRoot){
153
+ // modalRoot.remove();
154
+ // }
155
+ if (!modalRoot) {
156
+ modalRoot = document.createElement('div');
157
+ modalRoot.setAttribute('id', rootId);
158
+ $(".page-related-list-view-root")[0].appendChild(modalRoot);
159
+ }
160
+
161
+ if(page.render_engine && page.render_engine != 'redash'){
162
+ return Steedos.Page.render($("#" + rootId)[0], page, template.data.regions());
163
+ }
164
+ } catch (error) {
165
+
166
+ }
167
+ };
168
+
169
+ Steedos.Page.Form.StandardNew.render = function(appId, objectApiName, tilte, initialValues){
170
+ SteedosUI.showModal(stores.ComponentRegistry.components.ObjectForm, {
171
+ name: `${objectApiName}_standard_new_form`,
172
+ objectApiName: objectApiName,
173
+ title: tilte,
174
+ initialValues: initialValues,
175
+ afterInsert: function(result){
176
+ if(result.length > 0){
177
+ var record = result[0];
178
+ setTimeout(function(){
179
+ var url = `/app/${appId}/${objectApiName}/view/${record._id}`
180
+ FlowRouter.go(url)
181
+ }
182
+ , 1);
183
+ return true;
184
+ }
185
+ }
186
+ }, null, {iconPath: '/assets/icons'});
187
+ };
188
+
189
+ Steedos.Page.Form.StandardEdit.render = function(appId, objectApiName, tilte, recordId){
190
+ return SteedosUI.showModal(stores.ComponentRegistry.components.ObjectForm, {
191
+ name: `${objectApiName}_standard_edit_form`,
192
+ objectApiName: objectApiName,
193
+ recordId: recordId,
194
+ title: tilte,
195
+ afterUpdate: function(){
196
+ setTimeout(function(){
197
+ if(FlowRouter.current().route.path.endsWith("/:record_id")){
198
+ FlowRouter.reload()
199
+ // ObjectForm有缓存,修改子表记录可能会有主表记录的汇总字段变更,需要刷新表单数据
200
+ SteedosUI.reloadRecord(objectApiName, recordId)
201
+ }else{
202
+ window.refreshDxSchedulerInstance()
203
+ window.refreshGrid();
204
+ }
205
+ }, 1);
206
+ return true;
207
+ }
208
+ }, null, {iconPath: '/assets/icons'})
209
+ };
210
+
211
+ // Steedos.Page.Form.StandardDelete.render = function(){
212
+
213
+ // };
@@ -0,0 +1,6 @@
1
+ name: app
2
+ label: 应用
3
+ type: lookup
4
+ reference_to: apps
5
+ reference_to_field: code
6
+ sort_no: 120
@@ -0,0 +1,5 @@
1
+ name: desktop
2
+ type: boolean
3
+ label: 台式机
4
+ sort_no: 130
5
+ defaultValue: true
@@ -0,0 +1,6 @@
1
+ name: is_system
2
+ type: boolean
3
+ label: System
4
+ omit: true
5
+ hidden: true
6
+ disabled: true
@@ -0,0 +1,5 @@
1
+ name: mobile
2
+ type: boolean
3
+ label: 手机
4
+ sort_no: 140
5
+ defaultValue: true
@@ -0,0 +1,5 @@
1
+ name: page
2
+ label: 页面
3
+ type: master_detail
4
+ reference_to: pages
5
+ sort_no: 110
@@ -0,0 +1,8 @@
1
+ name: profile
2
+ type: lookup
3
+ label: 简档
4
+ reference_to: permission_set
5
+ filters:
6
+ - ["type","=","profile"]
7
+ visible_on: "{{formData.app ? true: false}}"
8
+ sort_no: 125
@@ -0,0 +1,4 @@
1
+ name: record_type
2
+ type: text
3
+ label: 记录类型
4
+ hidden: true
@@ -0,0 +1,15 @@
1
+ name: all
2
+ columns:
3
+ - field: app
4
+ - field: profile
5
+ - field: record_type
6
+ - field: mobile
7
+ - field: desktop
8
+ - field: is_system
9
+ filter_scope: space
10
+ filters: []
11
+ label: 所有
12
+ scrolling_mode: standard
13
+ shared: true
14
+ sort_no: 100
15
+ type: grid
@@ -0,0 +1,15 @@
1
+ name: recent
2
+ columns:
3
+ - field: app
4
+ - field: profile
5
+ - field: record_type
6
+ - field: mobile
7
+ - field: desktop
8
+ - field: is_system
9
+ filter_scope: space
10
+ filters: []
11
+ label: 最近查看
12
+ scrolling_mode: standard
13
+ shared: true
14
+ sort_no: 100
15
+ type: grid
@@ -0,0 +1,20 @@
1
+ name: page_assignments
2
+ label: 页面分配
3
+ custom: true
4
+ enable_api: true
5
+ enable_audit: false
6
+ enable_chatter: false
7
+ enable_enhanced_lookup: false
8
+ enable_events: false
9
+ enable_files: false
10
+ enable_inline_edit: true
11
+ enable_instances: false
12
+ enable_notes: false
13
+ enable_search: false
14
+ enable_share: false
15
+ enable_tasks: false
16
+ enable_workflow: false
17
+ hidden: true
18
+ icon: contract
19
+ is_enable: true
20
+ version: 2
@@ -0,0 +1,10 @@
1
+ name: 管理员
2
+ allowCreate: true
3
+ allowDelete: true
4
+ allowEdit: true
5
+ allowRead: true
6
+ modifyAllRecords: true
7
+ modifyCompanyRecords: true
8
+ permission_set_id: admin
9
+ viewAllRecords: true
10
+ viewCompanyRecords: true
@@ -0,0 +1,10 @@
1
+ name: 用户
2
+ allowCreate: false
3
+ allowDelete: false
4
+ allowEdit: false
5
+ allowRead: true
6
+ modifyAllRecords: false
7
+ modifyCompanyRecords: false
8
+ permission_set_id: user
9
+ viewAllRecords: true
10
+ viewCompanyRecords: true
@@ -0,0 +1,4 @@
1
+ name: is_archived
2
+ label: 启用
3
+ sort_no: 130
4
+ type: toggle
@@ -0,0 +1,4 @@
1
+ name: page
2
+ label: 页面
3
+ type: master_detail
4
+ reference_to: pages
@@ -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,5 @@
1
+ name: version
2
+ type: number
3
+ label: 版本号
4
+ scale: 0
5
+ omit: true
@@ -0,0 +1,18 @@
1
+ name: all
2
+ columns:
3
+ - field: page
4
+ - field: version
5
+ - field: is_archived
6
+ - field: created
7
+ - field: modified
8
+ - field: is_system
9
+ filter_scope: space
10
+ filters: []
11
+ label: 所有
12
+ scrolling_mode: standard
13
+ shared: true
14
+ sort_no: 100
15
+ type: grid
16
+ sort:
17
+ - field_name: 'version'
18
+ order: desc
@@ -0,0 +1,15 @@
1
+ name: recent
2
+ columns:
3
+ - field: page
4
+ - field: version
5
+ - field: is_archived
6
+ - field: created
7
+ - field: modified
8
+ - field: is_system
9
+ filter_scope: space
10
+ filters: []
11
+ label: 最近查看
12
+ scrolling_mode: standard
13
+ shared: true
14
+ sort_no: 100
15
+ type: grid
@@ -0,0 +1,20 @@
1
+ name: page_versions
2
+ label: 页面版本
3
+ custom: true
4
+ enable_api: true
5
+ enable_audit: false
6
+ enable_chatter: false
7
+ enable_enhanced_lookup: false
8
+ enable_events: false
9
+ enable_files: false
10
+ enable_inline_edit: true
11
+ enable_instances: false
12
+ enable_notes: false
13
+ enable_search: false
14
+ enable_share: false
15
+ enable_tasks: false
16
+ enable_workflow: false
17
+ hidden: false
18
+ icon: contract
19
+ is_enable: true
20
+ version: 2
@@ -0,0 +1,10 @@
1
+ name: 管理员
2
+ allowCreate: true
3
+ allowDelete: true
4
+ allowEdit: true
5
+ allowRead: true
6
+ modifyAllRecords: true
7
+ modifyCompanyRecords: true
8
+ permission_set_id: admin
9
+ viewAllRecords: true
10
+ viewCompanyRecords: true
@@ -0,0 +1,10 @@
1
+ name: 用户
2
+ allowCreate: false
3
+ allowDelete: false
4
+ allowEdit: false
5
+ allowRead: true
6
+ modifyAllRecords: false
7
+ modifyCompanyRecords: false
8
+ permission_set_id: user
9
+ viewAllRecords: true
10
+ viewCompanyRecords: true
@@ -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
@@ -1,5 +1,5 @@
1
1
  name: is_archived
2
- label: is_archived
2
+ label: 启用
3
3
  sort_no: 130
4
4
  type: toggle
5
- hidden: true
5
+ visible_on: "{{'redash' != formData.render_engine ? true: false}}"
@@ -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,8 @@ version: 2
21
21
  form:
22
22
  afterView: !!js/function |
23
23
  function(){
24
- if(this.doc.name){
24
+ console.log(`afterView`, this.doc)
25
+ if(this.doc.name && (this.doc.render_engine === 'redash' || !this.doc.render_engine)){
25
26
  SteedosUI.render(stores.ComponentRegistry.components.Page, { pageId: this.doc.name }, $(".slds-template__container")[0])
26
27
  }
27
28
  }