@steedos/service-pages 2.2.3 → 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 (42) hide show
  1. package/docs/amis.md +53 -0
  2. package/main/default/applications/app_charts.app.yml +1 -1
  3. package/main/default/client/builder.client.js +10 -5
  4. package/main/default/client/page.render.client.js +187 -26
  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/fields/is_archived.field.yml +2 -2
  27. package/main/default/objects/pages/fields/object_name.field.yml +2 -2
  28. package/main/default/objects/pages/fields/type.field.yml +4 -4
  29. package/main/default/objects/pages/pages.object.yml +1 -0
  30. package/main/default/routes/design.html +5 -5
  31. package/main/default/routes/page_schema.router.js +32 -0
  32. package/main/default/services/page.service.js +264 -0
  33. package/main/default/triggers/page_versions.enable.trigger.js +15 -0
  34. package/main/default/triggers/pages_metadata.trigger.js +12 -47
  35. package/package.json +2 -2
  36. package/package.service.js +18 -18
  37. package/main/default/client/amis.client.js +0 -47
  38. package/main/default/client/style.client.js +0 -12
  39. package/main/default/objects/pages/fields/is_default.field.yml +0 -5
  40. package/public/amis/amis.css +0 -29
  41. package/public/amis/sdk/sdk.css +0 -48783
  42. package/public/amis/sdk/sdk.js +0 -3467
@@ -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.2.3",
3
+ "version": "2.2.4",
4
4
  "main": "package.service.js",
5
5
  "scripts": {},
6
6
  "license": "MIT",
@@ -11,5 +11,5 @@
11
11
  "dependencies": {
12
12
  "@builder.io/react": "^1.1.50"
13
13
  },
14
- "gitHead": "57dfca5cd66528b2fbe6878f73f2e84b915d5e32"
14
+ "gitHead": "a0c0e8d900f7f4fd2045d976b36c9bef465a6ce3"
15
15
  }
@@ -158,24 +158,24 @@ module.exports = {
158
158
  methods: {
159
159
  initBuilderRouter: {
160
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
- }
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
179
  }
180
180
  },
181
181
  },
@@ -1,47 +0,0 @@
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
- })();
@@ -1,12 +0,0 @@
1
- (function () {
2
- try {
3
- var styleCss = $(`<style>
4
- .steedos .creator-content-wrapper .steedos-page .page-header-wrapper{
5
- display: none;
6
- }
7
- </style>`);
8
- $("head").append(styleCss);
9
- } catch (error) {
10
- console.log(error);
11
- }
12
- })();
@@ -1,5 +0,0 @@
1
- name: is_default
2
- type: toggle
3
- label: 默认
4
- sort_no: 200
5
- hidden: true
@@ -1,29 +0,0 @@
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
- }