@steedos/service-pages 2.2.5 → 2.2.6
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/docs//350/207/252/345/256/232/344/271/211form/347/273/204/344/273/266.md +39 -0
- package/main/default/client/builder.client.js +11 -10
- package/main/default/client/onWindowMessage.client.js +39 -0
- package/main/default/client/page.render.client.js +86 -80
- package/main/default/objects/page_assignments/fields/app.field.yml +2 -0
- package/main/default/objects/page_assignments/fields/desktop.field.yml +1 -1
- package/main/default/objects/page_assignments/fields/mobile.field.yml +1 -1
- package/main/default/objects/page_assignments/permissions/user.permission.yml +2 -2
- package/main/default/objects/page_versions/buttons/standard_delete.button.js +5 -0
- package/main/default/objects/page_versions/buttons/standard_delete.button.yml +4 -0
- package/main/default/objects/page_versions/buttons/standard_delete_many.button.js +5 -0
- package/main/default/objects/page_versions/buttons/standard_delete_many.button.yml +4 -0
- package/main/default/objects/page_versions/buttons/standard_new.button.js +5 -0
- package/main/default/objects/page_versions/buttons/standard_new.button.yml +5 -0
- package/main/default/objects/page_versions/fields/is_active.field.yml +4 -0
- package/main/default/objects/page_versions/fields/page.field.yml +2 -1
- package/main/default/objects/page_versions/fields/schema.field.yml +2 -2
- package/main/default/objects/page_versions/fields/version.field.yml +2 -1
- package/main/default/objects/page_versions/listviews/all.listview.yml +1 -1
- package/main/default/objects/page_versions/listviews/recent.listview.yml +1 -1
- package/main/default/objects/page_versions/permissions/admin.permission.yml +1 -1
- package/main/default/objects/page_versions/permissions/user.permission.yml +2 -2
- package/main/default/objects/pages/fields/is_active.field.yml +5 -0
- package/main/default/objects/pages/fields/is_archived.field.yml +2 -2
- package/main/default/objects/pages/fields/type.field.yml +2 -2
- 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 +5 -2
- package/main/default/objects/pages/permissions/user.permission.yml +2 -2
- package/main/default/routes/design.html +10 -1
- package/main/default/routes/page_design.router.js +10 -1
- package/main/default/routes/page_schema.router.js +2 -1
- package/main/default/services/page.service.js +28 -9
- package/main/default/triggers/page_assignments_check.trigger.js +23 -0
- package/main/default/triggers/page_versions_check.trigger.js +21 -0
- package/main/default/triggers/pages_check.trigger.js +30 -0
- package/package.json +2 -2
- package/docs/amis.md +0 -53
- package/main/default/objects/page_versions/fields/is_archived.field.yml +0 -4
- package/public/builder.io/react/dist/builder-react.browser.js +0 -21
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
const express = require("express");
|
|
2
2
|
const router = express.Router();
|
|
3
|
+
const core = require('@steedos/core');
|
|
4
|
+
const fs = require('fs');
|
|
3
5
|
|
|
4
|
-
router.get('/api/pageDesign', async function (req, res) {
|
|
6
|
+
router.get('/api/pageDesign', core.requireAuthentication, async function (req, res) {
|
|
5
7
|
try {
|
|
6
8
|
res.set('Content-Type', 'text/html');
|
|
9
|
+
const userSession = req.user;
|
|
10
|
+
const steedosBuilderHost = `https://builder.steedos.com/amis?assetUrl=https://unpkg.com/@steedos-ui/builder-widgets/dist/assets.js&rootUrl=${__meteor_runtime_config__.ROOT_URL}&authToken=${userSession.authToken}&userId=${userSession.userId}&tenantId=${userSession.spaceId}&__q=`;
|
|
11
|
+
|
|
12
|
+
let data = fs.readFileSync(__dirname+'/design.html', 'utf8');
|
|
13
|
+
res.send(data.replace('SteedosBuilderHost',steedosBuilderHost));
|
|
14
|
+
|
|
15
|
+
|
|
7
16
|
res.sendFile(__dirname+'/design.html')
|
|
8
17
|
} catch (error) {
|
|
9
18
|
res.status(500).send({ message: error.message });
|
|
@@ -8,7 +8,7 @@ router.get('/api/pageSchema/:type', core.requireAuthentication, async function (
|
|
|
8
8
|
|
|
9
9
|
const userSession = req.user;
|
|
10
10
|
|
|
11
|
-
const { app, objectApiName, recordId, formFactor} = req.query;
|
|
11
|
+
const { app, objectApiName, recordId, pageId, formFactor} = req.query;
|
|
12
12
|
const { type } = req.params;
|
|
13
13
|
|
|
14
14
|
const pageSchema = await objectql.getSteedosSchema().broker.call(`page.getMeSchema`, {
|
|
@@ -16,6 +16,7 @@ router.get('/api/pageSchema/:type', core.requireAuthentication, async function (
|
|
|
16
16
|
app,
|
|
17
17
|
objectApiName,
|
|
18
18
|
recordId,
|
|
19
|
+
pageId,
|
|
19
20
|
formFactor
|
|
20
21
|
}, {
|
|
21
22
|
meta: {
|
|
@@ -24,8 +24,8 @@ module.exports = {
|
|
|
24
24
|
getMeSchema: {
|
|
25
25
|
async handler(ctx) {
|
|
26
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);
|
|
27
|
+
const { type, app, objectApiName, recordId, pageId, formFactor } = ctx.params;
|
|
28
|
+
return await this.getMeSchema(type, app, objectApiName, recordId, pageId, formFactor, userSession);
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
31
|
// enablePageVersion:{
|
|
@@ -51,9 +51,9 @@ module.exports = {
|
|
|
51
51
|
pageId: { type: "any" }
|
|
52
52
|
},
|
|
53
53
|
async handler(ctx){
|
|
54
|
-
const userSession = ctx.meta.user;
|
|
54
|
+
// const userSession = ctx.meta.user;
|
|
55
55
|
const { pageId } = ctx.params;
|
|
56
|
-
return await this.getLatestPageVersion(pageId
|
|
56
|
+
return await this.getLatestPageVersion(pageId);
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
changePageVersion:{
|
|
@@ -98,7 +98,7 @@ module.exports = {
|
|
|
98
98
|
},
|
|
99
99
|
getTypePages: {
|
|
100
100
|
async handler(type, objectApiName, userSession) {
|
|
101
|
-
const filters = [['type', '=', type], ['
|
|
101
|
+
const filters = [['type', '=', type], ['is_active', '=', true]];
|
|
102
102
|
if (type === 'list' || type === 'record' || type === 'form') {
|
|
103
103
|
filters.push(['object_name', '=', objectApiName]);
|
|
104
104
|
}
|
|
@@ -166,6 +166,12 @@ module.exports = {
|
|
|
166
166
|
|
|
167
167
|
try {
|
|
168
168
|
const typePages = await this.getTypePages(type, objectApiName, userSession);
|
|
169
|
+
|
|
170
|
+
//如果是app 类型,则直接返回最新的.
|
|
171
|
+
if(type === 'app'){
|
|
172
|
+
return typePages.length > 0 ? typePages[0] : null;
|
|
173
|
+
}
|
|
174
|
+
|
|
169
175
|
const assignments = await this.getAssignments(formFactor, typePages);
|
|
170
176
|
|
|
171
177
|
const appProfileassignment = await this.getAppProfileAssignment(app, assignments, userSession);
|
|
@@ -189,7 +195,20 @@ module.exports = {
|
|
|
189
195
|
}
|
|
190
196
|
},
|
|
191
197
|
getMeSchema: {
|
|
192
|
-
async handler(type, app, objectApiName, recordId, formFactor, userSession) {
|
|
198
|
+
async handler(type, app, objectApiName, recordId, pageId, formFactor, userSession) {
|
|
199
|
+
if(pageId){
|
|
200
|
+
const records = await objectql.getObject('pages').find({filters: [['name', '=', pageId]]});
|
|
201
|
+
let pageInfo = {};
|
|
202
|
+
if(records.length > 0){
|
|
203
|
+
pageInfo = records[0];
|
|
204
|
+
const pageVersion = await this.getLatestPageVersion(pageInfo._id, true);
|
|
205
|
+
if(pageVersion && pageVersion.schema){
|
|
206
|
+
return Object.assign({}, pageInfo, {schema: pageVersion.schema});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return ;
|
|
210
|
+
|
|
211
|
+
}
|
|
193
212
|
// 计算 userSchema
|
|
194
213
|
const userPage = await this.getUserPage(type, app, objectApiName, recordId, formFactor, userSession);
|
|
195
214
|
if (userPage) {
|
|
@@ -208,7 +227,7 @@ module.exports = {
|
|
|
208
227
|
async handler(pageId, isArchived) {
|
|
209
228
|
const filters = [['page', '=', pageId]];
|
|
210
229
|
if(isArchived){
|
|
211
|
-
filters.push(['
|
|
230
|
+
filters.push(['is_active','=',true])
|
|
212
231
|
}
|
|
213
232
|
// 根据pageId 获取 page version
|
|
214
233
|
const pageVersions = await objectql.getObject('page_versions').find({filters: filters, sort: 'version desc', top: 1});
|
|
@@ -222,14 +241,14 @@ module.exports = {
|
|
|
222
241
|
// 根据pageId 获取 pageversions
|
|
223
242
|
const pageVersion = await this.getLatestPageVersion(pageId);
|
|
224
243
|
let version = pageVersion ? pageVersion.version :0;
|
|
225
|
-
if(pageVersion && !pageVersion.
|
|
244
|
+
if(pageVersion && !pageVersion.is_active){
|
|
226
245
|
return await objectql.getObject('page_versions').update(pageVersion._id, {
|
|
227
246
|
schema: schema
|
|
228
247
|
}, userSession);
|
|
229
248
|
}else{
|
|
230
249
|
return await objectql.getObject('page_versions').insert({
|
|
231
250
|
page: pageId,
|
|
232
|
-
|
|
251
|
+
is_active: false,
|
|
233
252
|
schema: schema,
|
|
234
253
|
version: ++version,
|
|
235
254
|
space: userSession.spaceId
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const objectql = require('@steedos/objectql');
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
listenTo: 'page_assignments',
|
|
5
|
+
beforeInsert: async function(){
|
|
6
|
+
const {doc, spaceId} = this;
|
|
7
|
+
if(doc.page){
|
|
8
|
+
const record = await objectql.getObject('pages').findOne(doc.page);
|
|
9
|
+
if(record.type === 'app'){
|
|
10
|
+
throw new Error('禁止给应用程序页面分配权限');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
beforeUpdate: async function(){
|
|
15
|
+
const {object_name, doc, spaceId, id} = this;
|
|
16
|
+
if(doc.page){
|
|
17
|
+
const record = await objectql.getObject('pages').findOne(doc.page);
|
|
18
|
+
if(record.type === 'app'){
|
|
19
|
+
throw new Error('禁止给应用程序页面分配权限');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const objectql = require('@steedos/objectql');
|
|
2
|
+
const _ = require('underscore');
|
|
3
|
+
|
|
4
|
+
module.exports = {
|
|
5
|
+
listenTo: 'page_versions',
|
|
6
|
+
beforeUpdate: async function(){
|
|
7
|
+
const {id, doc} = this;
|
|
8
|
+
const record = await objectql.getObject('page_versions').findOne(id);
|
|
9
|
+
if(record){
|
|
10
|
+
const getLatestPageVersion = await objectql.getSteedosSchema().broker.call('page.getLatestPageVersion', {
|
|
11
|
+
pageId: record.page
|
|
12
|
+
})
|
|
13
|
+
if(getLatestPageVersion._id != id){
|
|
14
|
+
throw new Error('禁止修改非最新版');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// if(_.has(doc, 'is_archived') && !doc.is_archived){
|
|
18
|
+
|
|
19
|
+
// }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const objectql = require('@steedos/objectql');
|
|
2
|
+
const _ = require('lodash');
|
|
3
|
+
module.exports = {
|
|
4
|
+
listenTo: 'pages',
|
|
5
|
+
beforeUpdate: async function(){
|
|
6
|
+
const {object_name, doc, spaceId, id} = this;
|
|
7
|
+
if(_.has(doc, 'type') || _.has(doc, 'render_engine')){
|
|
8
|
+
const record = await objectql.getObject('pages').findOne(id);
|
|
9
|
+
if(_.has(doc, 'type') && doc.type != record.type){
|
|
10
|
+
throw new Error('禁止修改页面类型');
|
|
11
|
+
}
|
|
12
|
+
if(_.has(doc, 'render_engine') && doc.render_engine != record.render_engine){
|
|
13
|
+
throw new Error('禁止修改页面渲染器');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if(_.has(doc, 'is_archived') && !doc.is_archived){
|
|
18
|
+
let type = null;
|
|
19
|
+
if(_.has(doc, 'type')){
|
|
20
|
+
type = doc.type
|
|
21
|
+
}else{
|
|
22
|
+
const record = await objectql.getObject('pages').findOne(id);
|
|
23
|
+
type = record.type;
|
|
24
|
+
}
|
|
25
|
+
if(type === 'app'){
|
|
26
|
+
throw new Error('禁止停用应用程序页面');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@steedos/service-pages",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.6",
|
|
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": "
|
|
14
|
+
"gitHead": "1742aab217ef9d96dc3514cac617db9863956f93"
|
|
15
15
|
}
|
package/docs/amis.md
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
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的配套接口
|