@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
@@ -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 style="margin: 0;padding: 0;">
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
+ // /pageVersion/:pageId/latest
17
+
18
+ axios.get(`/service/api/page/pageVersion/${params.get("pageId")}/latest/`).then(function (response) {
19
+ let schema = response.data.schema;
20
+ if (typeof schema === "string") {
21
+ schema = JSON.parse(schema)
22
+ }
23
+ const data = {
24
+ AmisSchema: schema || {}
25
+ };
26
+ console.log("record data", data)
27
+ comp.data = data;
28
+ }).catch(function (error) {
29
+ // handle error
30
+ console.log(error);
31
+ }).then(function () {
32
+ // always executed
33
+ });
34
+
35
+ const onWindowMessage = function (event) {
36
+ const { data } = event;
37
+ if (data) {
38
+ if (data.type === 'builder.saveContent') {
39
+ axios.put(`/service/api/page/pageVersion/${params.get("pageId")}`, {
40
+ schema: JSON.stringify(data.data.AmisSchema) //直接存储json格式会导致react form异常。
41
+ }).then(function (response) {
42
+ window.postMessage(
43
+ {
44
+ type: 'builder.contentSaved',
45
+ },
46
+ '*'
47
+ );
48
+ }).catch(function (error) {
49
+ // handle error
50
+ console.log(error);
51
+ }).then(function () {
52
+ // always executed
53
+ })
54
+ }
55
+ }
56
+ }
57
+
58
+ window.addEventListener('message', onWindowMessage);
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;
@@ -0,0 +1,32 @@
1
+ const express = require("express");
2
+ const router = express.Router();
3
+ const objectql = require('@steedos/objectql');
4
+ const core = require('@steedos/core');
5
+
6
+ router.get('/api/pageSchema/:type', core.requireAuthentication, async function (req, res) {
7
+ try {
8
+
9
+ const userSession = req.user;
10
+
11
+ const { app, objectApiName, recordId, formFactor} = req.query;
12
+ const { type } = req.params;
13
+
14
+ const pageSchema = await objectql.getSteedosSchema().broker.call(`page.getMeSchema`, {
15
+ type,
16
+ app,
17
+ objectApiName,
18
+ recordId,
19
+ formFactor
20
+ }, {
21
+ meta: {
22
+ user: userSession
23
+ }
24
+ });
25
+
26
+ res.send(pageSchema || {});
27
+ } catch (error) {
28
+ res.status(500).send({ message: error.message });
29
+ }
30
+
31
+ });
32
+ exports.default = router;
@@ -0,0 +1,264 @@
1
+ const objectql = require('@steedos/objectql');
2
+
3
+ const _ = require('lodash');
4
+
5
+ module.exports = {
6
+ name: "page",
7
+ mixins: [],
8
+ /**
9
+ * Settings
10
+ */
11
+ settings: {
12
+
13
+ },
14
+
15
+ /**
16
+ * Dependencies
17
+ */
18
+ dependencies: [],
19
+
20
+ /**
21
+ * Actions
22
+ */
23
+ actions: {
24
+ getMeSchema: {
25
+ async handler(ctx) {
26
+ const userSession = ctx.meta.user;
27
+ const { type, app, objectApiName, recordId, formFactor } = ctx.params;
28
+ return await this.getMeSchema(type, app, objectApiName, recordId, formFactor, userSession);
29
+ }
30
+ },
31
+ // enablePageVersion:{
32
+ // rest: {
33
+ // method: "GET",
34
+ // path: "/pageSchema/enable/:pageVersionId"
35
+ // },
36
+ // params: {
37
+ // pageVersionId: { type: "any" }
38
+ // },
39
+ // async handler(ctx) {
40
+ // const userSession = ctx.meta.user;
41
+ // const { pageVersionId } = ctx.params;
42
+ // return await this.enablePageVersion(pageVersionId, userSession);
43
+ // }
44
+ // },
45
+ getLatestPageVersion:{
46
+ rest: {
47
+ method: "GET",
48
+ path: "/pageVersion/:pageId/latest"
49
+ },
50
+ params: {
51
+ pageId: { type: "any" }
52
+ },
53
+ async handler(ctx){
54
+ const userSession = ctx.meta.user;
55
+ const { pageId } = ctx.params;
56
+ return await this.getLatestPageVersion(pageId, userSession);
57
+ }
58
+ },
59
+ changePageVersion:{
60
+ rest: {
61
+ method: "PUT",
62
+ path: "/pageVersion/:pageId"
63
+ },
64
+ params: {
65
+ pageId: { type: "any" },
66
+ schema: { type: "any" }
67
+ },
68
+ async handler(ctx){
69
+ const userSession = ctx.meta.user;
70
+ const { pageId, schema } = ctx.params;
71
+ return await this.changePageVersion(pageId, schema, userSession);
72
+ }
73
+ }
74
+ },
75
+
76
+ /**
77
+ * Events
78
+ */
79
+ events: {
80
+
81
+ },
82
+
83
+ /**
84
+ * Methods
85
+ */
86
+ methods: {
87
+ getDefaultSchema: {
88
+ async handler(type, app, objectApiName, formFactor, recordId, userSession) {
89
+ if (process.env.DEFAULT_PAGE_RENDER) {
90
+ return await this.broker.call(`${process.env.DEFAULT_PAGE_RENDER}.getDefaultSchema`, {type, app, objectApiName, recordId, formFactor}, {
91
+ meta: {
92
+ user: userSession
93
+ }
94
+ })
95
+ }
96
+ return;
97
+ }
98
+ },
99
+ getTypePages: {
100
+ async handler(type, objectApiName, userSession) {
101
+ const filters = [['type', '=', type], ['is_archived', '=', true]];
102
+ if (type === 'list' || type === 'record' || type === 'form') {
103
+ filters.push(['object_name', '=', objectApiName]);
104
+ }
105
+ return await objectql.getObject('pages').find({ filters: filters });
106
+ }
107
+ },
108
+ getAssignments: {
109
+ async handler(formFactor, typePages) {
110
+ if(!typePages || typePages.length < 1){
111
+ return ;
112
+ }
113
+ const filters = [['page', 'in', _.map(typePages, '_id')]];
114
+ if(formFactor === 'SMALL'){
115
+ filters.push(['mobile','=', true])
116
+ }else{
117
+ filters.push(['desktop','=', true])
118
+ }
119
+ return await objectql.getObject("page_assignments").find({ filters: filters });
120
+ }
121
+ },
122
+ getAppProfileAssignment: {
123
+ async handler(app, assignments, userSession) {
124
+ return _.filter(assignments, (assignment) => {
125
+ //TODO Record Type
126
+ return assignment.app === app && arguments.profile === userSession.profile;
127
+ });
128
+ }
129
+ },
130
+ getAppDefaultAssignment: {
131
+ async handler(app, assignments) {
132
+ return _.filter(assignments, (assignment) => {
133
+ return assignment.app === app;
134
+ });
135
+ }
136
+ },
137
+ getOrgDefaultAssignment: {
138
+ async handler(assignments) {
139
+ return _.filter(assignments, (assignment) => {
140
+ return !assignment.app && !assignment.profile
141
+ })
142
+ }
143
+ },
144
+ getAssignmentPage: {
145
+ async handler(assignment, typePages) {
146
+ const page = _.find(typePages, (typePage) => {
147
+ return typePage.name == assignment.page || typePage._id == assignment.page
148
+ })
149
+ if (page) {
150
+ return page;
151
+ }
152
+ // else {
153
+ // throw new Error(`not find assignment page ${assignment.desktop}`)
154
+ // }
155
+ }
156
+ },
157
+ getUserPage: {
158
+ /**
159
+ * 自定义记录页面可在不同层面上分配:
160
+ * 1 组织默认设置 记录页面会为对象显示,除非已进行更多特定分配。
161
+ * 2 如果已指定,则应用程序默认设置 页面分配会覆盖组织默认设置。
162
+ * 3 应用程序、记录类型和简档, 分配会覆盖组织和应用程序默认设置。
163
+ *
164
+ * TODO form factors "LARGE","SMALL"
165
+ * TODO 页面分配有多条时的优先级处理(始终是最新的分配生效)。
166
+ */
167
+ async handler(type, app, objectApiName, recordId, formFactor, userSession) {
168
+
169
+ try {
170
+ const typePages = await this.getTypePages(type, objectApiName, userSession);
171
+ const assignments = await this.getAssignments(formFactor, typePages);
172
+
173
+ const appProfileassignment = await this.getAppProfileAssignment(app, assignments, userSession);
174
+ if (appProfileassignment && appProfileassignment.length > 0) {
175
+ return await this.getAssignmentPage(appProfileassignment[0], typePages)
176
+ }
177
+
178
+ const appDefaultAssignment = await this.getAppDefaultAssignment(app, assignments);
179
+ if (appDefaultAssignment && appDefaultAssignment.length > 0) {
180
+ return await this.getAssignmentPage(appDefaultAssignment[0], typePages)
181
+ }
182
+
183
+ const orgDefaultAssignment = await this.getOrgDefaultAssignment(assignments);
184
+ if (orgDefaultAssignment && orgDefaultAssignment.length > 0) {
185
+ return await this.getAssignmentPage(orgDefaultAssignment[0], typePages)
186
+ }
187
+ } catch (error) {
188
+ console.error(`error`, error);
189
+ return ;
190
+ }
191
+ }
192
+ },
193
+ getMeSchema: {
194
+ async handler(type, app, objectApiName, recordId, formFactor, userSession) {
195
+ // 计算 userSchema
196
+ const userPage = await this.getUserPage(type, app, objectApiName, recordId, formFactor, userSession);
197
+ if (userPage) {
198
+ const pageVersion = await this.getLatestPageVersion(userPage._id, true);
199
+ if(pageVersion && pageVersion.schema){
200
+ return Object.assign({}, userPage, {schema: pageVersion.schema});
201
+ }
202
+ }
203
+ const defaultSchema = await this.getDefaultSchema(type, app, objectApiName, recordId, formFactor, userSession);
204
+ if(defaultSchema){
205
+ return {schema: defaultSchema}
206
+ }
207
+ }
208
+ },
209
+ getLatestPageVersion:{
210
+ async handler(pageId, isArchived) {
211
+ const filters = [['page', '=', pageId]];
212
+ if(isArchived){
213
+ filters.push(['is_archived','=',true])
214
+ }
215
+ // 根据pageId 获取 page version
216
+ const pageVersions = await objectql.getObject('page_versions').find({filters: filters, sort: 'version desc', top: 1});
217
+ if(pageVersions.length === 1){
218
+ return pageVersions[0]
219
+ }
220
+ }
221
+ },
222
+ changePageVersion: {
223
+ async handler(pageId, schema, userSession) {
224
+ // 根据pageId 获取 pageversions
225
+ const pageVersion = await this.getLatestPageVersion(pageId);
226
+ let version = pageVersion ? pageVersion.version :0;
227
+ if(pageVersion && !pageVersion.is_archived){
228
+ return await objectql.getObject('page_versions').update(pageVersion._id, {
229
+ schema: schema
230
+ }, userSession);
231
+ }else{
232
+ return await objectql.getObject('page_versions').insert({
233
+ page: pageId,
234
+ is_archived: false,
235
+ schema: schema,
236
+ version: ++version,
237
+ space: userSession.spaceId
238
+ }, userSession)
239
+ }
240
+ }
241
+ },
242
+ },
243
+
244
+ /**
245
+ * Service created lifecycle event handler
246
+ */
247
+ async created() {
248
+
249
+ },
250
+
251
+ /**
252
+ * Service started lifecycle event handler
253
+ */
254
+ async started() {
255
+
256
+ },
257
+
258
+ /**
259
+ * Service stopped lifecycle event handler
260
+ */
261
+ async stopped() {
262
+
263
+ }
264
+ };
@@ -0,0 +1,15 @@
1
+ const objectql = require('@steedos/objectql');
2
+ const _ = require('underscore');
3
+
4
+ module.exports = {
5
+ listenTo: 'page_versions',
6
+ afterUpdate: async function(){
7
+ const {id, doc, previousDoc} = this;
8
+ if(_.has(doc, 'is_archived') && doc.is_archived && previousDoc.is_archived != doc.is_archived ){
9
+ const record = await objectql.getObject('page_versions').findOne(id)
10
+ await objectql.getObject('pages').directUpdate(record.page, {
11
+ is_archived: true
12
+ })
13
+ }
14
+ }
15
+ }
@@ -24,52 +24,17 @@ module.exports = {
24
24
  listenTo: 'pages',
25
25
 
26
26
  afterFind: async function(){
27
- let filters = objectql.parserFilters(this.query.filters)
28
- let dataList = []
29
- if(filters._id && !filters._id.$ne){
30
- let id = filters._id
31
- id = id.replace(/\\/g, '');
32
- let data = await get(id);
33
- if(data){
34
- dataList = [data]
35
- }
36
- }else{
37
- dataList = await getAll();
38
- if(filters.name){
39
- dataList = _.filter(dataList, (item)=>{
40
- return item.name == filters.name
41
- })
42
- }
43
- }
27
+ let spaceId = this.spaceId;
28
+ this.data.values = this.data.values.concat(await getAll());
29
+
30
+ this.data.values = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, spaceId);
44
31
 
45
- if(dataList){
46
- const dbRecrodsName = _.pluck(this.data.values, 'name');
47
- this.data.values = this.data.values.concat(_.filter(dataList, function(data){return data._id == data.name && !_.include(dbRecrodsName, data.name) }))
48
- }
49
32
  },
50
33
  afterAggregate: async function(){
51
- let filters = objectql.parserFilters(this.query.filters)
52
- let dataList = []
53
- if(filters._id && !filters._id.$ne){
54
- let id = filters._id
55
- id = id.replace(/\\/g, '');
56
- let data = await get(id);
57
- if(data){
58
- dataList = [data]
59
- }
60
- }else{
61
- dataList = await getAll();
62
- if(filters.name){
63
- dataList = _.filter(dataList, (item)=>{
64
- return item.name == filters.name
65
- })
66
- }
67
- }
34
+ let spaceId = this.spaceId;
35
+ this.data.values = this.data.values.concat(await getAll());
68
36
 
69
- if(dataList){
70
- const dbRecrodsName = _.pluck(this.data.values, 'name');
71
- this.data.values = this.data.values.concat(_.filter(dataList, function(data){return data._id == data.name && !_.include(dbRecrodsName, data.name) }))
72
- }
37
+ this.data.values = objectql.getSteedosSchema().metadataDriver.find(this.data.values, this.query, spaceId);
73
38
  },
74
39
  afterCount: async function(){
75
40
  let result = await objectql.getObject(this.object_name).find(this.query, await auth.getSessionByUserId(this.userId, this.spaceId))
@@ -77,11 +42,11 @@ module.exports = {
77
42
  },
78
43
  afterFindOne: async function(){
79
44
  if(_.isEmpty(this.data.values)){
80
- let id = this.id
81
- let data = await get(id);
82
- if(data){
83
- this.data.values = data;
84
- }
45
+ const all = await getAll();
46
+ const id = this.id;
47
+ this.data.values = _.find(all, function(item){
48
+ return item._id === id
49
+ });
85
50
  }
86
51
  }
87
52
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos/service-pages",
3
- "version": "2.1.92",
3
+ "version": "2.2.4",
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": "b4f200efd338673eabbcccc0cc23f0f9c662eee2"
11
+ "dependencies": {
12
+ "@builder.io/react": "^1.1.50"
13
+ },
14
+ "gitHead": "a0c0e8d900f7f4fd2045d976b36c9bef465a6ce3"
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
  /**