diff --git a/packages/plugin-collections/src/collections/collections.ts b/packages/plugin-collections/src/collections/collections.ts
index 29279d4fe..23dbe2148 100644
--- a/packages/plugin-collections/src/collections/collections.ts
+++ b/packages/plugin-collections/src/collections/collections.ts
@@ -11,18 +11,18 @@ export default {
createdAt: 'createdTime',
updatedAt: 'updatedTime',
fields: [
- {
- interface: 'sort',
- type: 'sort',
- name: 'sort',
- title: '排序',
- component: {
- type: 'sort',
- className: 'drag-visible',
- width: 60,
- showInTable: true,
- },
- },
+ // {
+ // interface: 'sort',
+ // type: 'sort',
+ // name: 'sort',
+ // title: '排序',
+ // component: {
+ // type: 'sort',
+ // className: 'drag-visible',
+ // width: 60,
+ // showInTable: true,
+ // },
+ // },
{
interface: 'string',
type: 'string',
@@ -31,10 +31,6 @@ export default {
required: true,
component: {
type: 'string',
- className: 'drag-visible',
- showInTable: true,
- showInForm: true,
- showInDetail: true,
},
},
{
@@ -48,128 +44,43 @@ export default {
developerMode: true,
component: {
type: 'string',
- showInTable: true,
- showInForm: true,
- showInDetail: true,
},
},
{
- interface: 'icon',
- type: 'virtual',
- name: 'icon',
- title: '图标',
+ interface: 'textarea',
+ type: 'text',
+ name: 'description',
+ title: '数据表描述',
component: {
- type: 'icon',
- showInTable: true,
- showInForm: true,
- showInDetail: true,
+ type: 'textarea',
},
},
// {
- // interface: 'radio',
+ // interface: 'boolean',
// type: 'virtual',
- // name: 'defaultView',
- // title: '默认视图',
- // defaultValue: 'table',
- // dataSource: [
- // {label: '表格', value: 'table'},
- // {label: '看板', value: 'kanban', disabled: true},
- // {label: '日历', value: 'calendar', disabled: true},
- // ],
+ // name: 'createdAt',
+ // title: '记录创建时间',
+ // developerMode: true,
+ // defaultValue: true,
// component: {
- // type: 'radio',
- // showInTable: true,
+ // type: 'checkbox',
+ // default: true,
// showInForm: true,
- // showInDetail: true,
- // },
- // },
- // {
- // interface: 'radio',
- // type: 'virtual',
- // name: 'mode',
- // title: '表格模式',
- // defaultValue: 'default',
- // dataSource: [
- // {label: '常规模式', value: 'default'},
- // {label: '简易模式', value: 'simple'},
- // ],
- // component: {
- // type: 'radio',
- // tooltip: `
- //
常规模式:点击数据进入详情页进行各项查看和操作;
简易模式:点击数据直接打开编辑表单
- // `,
- // showInForm: true,
- // showInDetail: true,
- // },
- // },
- // {
- // interface: 'radio',
- // type: 'virtual',
- // name: 'defaultPerPage',
- // title: '每页显示几行数据',
- // defaultValue: 50,
- // dataSource: [
- // {label: '20', value: 20},
- // {label: '50', value: 50},
- // {label: '100', value: 100},
- // ],
- // component: {
- // type: 'radio',
- // showInForm: true,
- // showInDetail: true,
// },
// },
// {
// interface: 'boolean',
// type: 'virtual',
- // name: 'draggable',
- // title: '支持拖拽数据排序',
- // showInForm: true,
- // showInDetail: true,
+ // name: 'updatedAt',
+ // title: '记录修改时间',
+ // developerMode: true,
+ // defaultValue: true,
// component: {
// type: 'checkbox',
+ // default: true,
// showInForm: true,
- // showInDetail: true,
// },
// },
- {
- interface: 'boolean',
- type: 'boolean',
- name: 'showInDataMenu',
- title: '显示在“数据”菜单里',
- component: {
- type: 'checkbox',
- showInTable: true,
- showInForm: true,
- showInDetail: true,
- },
- },
- {
- interface: 'boolean',
- type: 'virtual',
- name: 'createdAt',
- title: '记录创建时间',
- developerMode: true,
- defaultValue: true,
- component: {
- type: 'checkbox',
- default: true,
- showInForm: true,
- },
- },
- {
- interface: 'boolean',
- type: 'virtual',
- name: 'updatedAt',
- title: '记录修改时间',
- developerMode: true,
- defaultValue: true,
- component: {
- type: 'checkbox',
- default: true,
- showInForm: true,
- },
- },
{
interface: 'boolean',
type: 'virtual',
@@ -263,48 +174,6 @@ export default {
type: 'drawerSelect',
},
},
- {
- interface: 'linkTo',
- type: 'hasMany',
- name: 'tabs',
- title: '标签页',
- sourceKey: 'name',
- draggable: true,
- actions: {
- list: {
- sort: 'sort',
- },
- destroy: {
- filter: {
- default: false
- }
- }
- },
- component: {
- type: 'drawerSelect',
- },
- },
- {
- interface: 'linkTo',
- type: 'hasMany',
- name: 'views',
- title: '视图',
- sourceKey: 'name',
- draggable: true,
- actions: {
- list: {
- sort: 'sort',
- },
- destroy: {
- filter: {
- default: false
- }
- }
- },
- component: {
- type: 'drawerSelect',
- },
- },
{
interface: 'linkTo',
type: 'hasMany',
@@ -398,10 +267,32 @@ export default {
title: '删除',
},
],
- fields: ['sort', 'title'],
+ fields: ['title', 'description'],
detailsOpenMode: 'window', // window
details: ['descriptions', 'fields', 'views'],
- sort: ['sort'],
+ sort: ['id'],
+ },
+ {
+ developerMode: true,
+ type: 'form',
+ name: 'form',
+ title: '表单',
+ fields: ['title', 'description'],
+ },
+ {
+ developerMode: true,
+ type: 'descriptions',
+ name: 'descriptions',
+ title: '详情',
+ fields: ['title', 'description'],
+ actions: [
+ {
+ name: 'update',
+ type: 'update',
+ title: '编辑',
+ viewName: 'form',
+ },
+ ],
},
{
developerMode: true,
@@ -466,28 +357,6 @@ export default {
},
],
},
- {
- developerMode: true,
- type: 'form',
- name: 'form',
- title: '表单',
- fields: ['title'],
- },
- {
- developerMode: true,
- type: 'descriptions',
- name: 'descriptions',
- title: '详情',
- fields: ['title'],
- actions: [
- {
- name: 'update',
- type: 'update',
- title: '编辑',
- viewName: 'form',
- },
- ],
- },
{
developerMode: true,
type: 'table',
diff --git a/packages/plugin-pages/src/collections/menus_views_v2.ts b/packages/plugin-pages/src/collections/menus_views_v2.ts
index ecf6fffac..3a7654dbd 100644
--- a/packages/plugin-pages/src/collections/menus_views_v2.ts
+++ b/packages/plugin-pages/src/collections/menus_views_v2.ts
@@ -186,6 +186,16 @@ export default {
labelField: 'title',
draggable: true,
actions: [
+ {
+ name: 'create',
+ type: 'create',
+ title: '新增',
+ transform: {
+ 'data': 'view',
+ 'data.title': 'title',
+ },
+ viewName: 'views_v2.form',
+ },
{
name: 'add',
type: 'add',
diff --git a/packages/plugin-pages/src/collections/views_details_v2.ts b/packages/plugin-pages/src/collections/views_details_v2.ts
index 3bd861c47..b59da0859 100644
--- a/packages/plugin-pages/src/collections/views_details_v2.ts
+++ b/packages/plugin-pages/src/collections/views_details_v2.ts
@@ -49,6 +49,16 @@ export default {
labelField: 'title',
draggable: true,
actions: [
+ {
+ name: 'create',
+ type: 'create',
+ title: '新增',
+ transform: {
+ 'data': 'view',
+ 'data.title': 'title',
+ },
+ viewName: 'collections.views_v2.form',
+ },
{
name: 'add',
type: 'add',
diff --git a/packages/plugin-pages/src/collections/views_fields_v2.ts b/packages/plugin-pages/src/collections/views_fields_v2.ts
index 663a68d22..f66f4568c 100644
--- a/packages/plugin-pages/src/collections/views_fields_v2.ts
+++ b/packages/plugin-pages/src/collections/views_fields_v2.ts
@@ -75,6 +75,9 @@ export default {
'data.title': 'title',
},
viewName: 'collections.fields.table',
+ componentProps: {
+ type: 'primary',
+ },
},
{
name: 'destroy',
@@ -118,6 +121,9 @@ export default {
'data.title': 'title',
},
viewName: 'collections.fields.table',
+ componentProps: {
+ type: 'primary',
+ },
},
{
name: 'destroy',
diff --git a/packages/plugin-pages/src/server.ts b/packages/plugin-pages/src/server.ts
index 89896a5ab..e96a0e0a8 100644
--- a/packages/plugin-pages/src/server.ts
+++ b/packages/plugin-pages/src/server.ts
@@ -15,6 +15,7 @@ import { RANDOMSTRING } from './fields/randomString';
import { registerFields, registerModels } from '@nocobase/database';
import { BaseModel } from './models/BaseModel'
import * as rolesMenusActions from './actions/roles.menus';
+import _ from 'lodash';
export default async function (options = {}) {
const database: Database = this.database;
@@ -50,6 +51,7 @@ export default async function (options = {}) {
resourcer.use(async (ctx, next) => {
const { actionName, resourceName, values } = ctx.action.params;
if (resourceName === 'menus' && ['create', 'update'].includes(actionName)) {
+ console.log({values});
if (values.parent) {
delete values.parent.children;
ctx.action.mergeParams({
@@ -81,148 +83,113 @@ export default async function (options = {}) {
resourcer.registerActionHandler(`roles.menus:${actionName}`, rolesMenusActions[actionName]);
});
- database.getModel('menus').addHook('beforeSave', async (model) => {
- console.log(model.get('pageName'));
- });
+ const createDetailsViews = async (model, options) => {
+ const data = model.get();
+ const View = database.getModel('views_v2');
+ const tableDetials = _.get(data, 'x-table-props.details') || [];
+ if (tableDetials.length) {
+ const details = [];
+ for (const item of tableDetials) {
+ if (item.view) {
+ if (!item.view.id) {
+ const view = await View.create(item.view);
+ await view.updateAssociations(item.view);
+ item.view.id = view.id;
+ } else {
+ const view = await View.findByPk(item.view.id);
+ await view.update(item.view);
+ await view.updateAssociations(item.view);
+ }
+ const view = await View.findOne(View.parseApiJson({
+ filter: {
+ id: item.view.id,
+ },
+ fields: {
+ appends: ['collection', 'targetField', 'targetView'],
+ },
+ }));
+ if (view) {
+ console.log({view});
+ item.view = view.toJSON();
+ }
+ }
+ details.push(item);
+ }
+ model.set('options.x-table-props.details', details);
+ }
+ const calendarDetials = _.get(data, 'x-calendar-props.details') || [];
+ if (calendarDetials.length) {
+ const details = [];
+ for (const item of calendarDetials) {
+ if (item.view) {
+ if (!item.view.id) {
+ const view = await View.create(item.view);
+ await view.updateAssociations(item.view);
+ item.view.id = view.id;
+ } else {
+ const view = await View.findByPk(item.view.id);
+ await view.update(item.view);
+ await view.updateAssociations(item.view);
+ }
+ const view = await View.findOne(View.parseApiJson({
+ filter: {
+ id: item.view.id,
+ },
+ fields: {
+ appends: ['collection', 'targetField', 'targetView'],
+ },
+ }));
+ if (view) {
+ console.log({view});
+ item.view = view.toJSON();
+ }
+ }
+ details.push(item);
+ }
+ model.set('options.x-calendar-props.details', details);
+ }
+ };
- // database.getModel('pages_v2').addHook('beforeValidate', async (model) => {
- // const collectionName = model.get('collection_name');
- // const name = model.get('name');
- // if (!model.get('path')) {
- // model.set('path', `${collectionName||'global'}.${name}`);
- // }
- // });
+ database.getModel('views_v2').addHook('beforeCreate', createDetailsViews);
+ database.getModel('views_v2').addHook('beforeUpdate', createDetailsViews);
- // database.getModel('views_v2').addHook('beforeValidate', async (model) => {
- // const collectionName = model.get('collection_name');
- // const name = model.get('name');
- // if (!model.get('path')) {
- // model.set('path', `${collectionName||'global'}.${name}`);
- // }
- // });
-/*
- const [Collection, Page, View] = database.getModels(['collections', 'pages', 'views']);
-
- async function createCollectionPage(model, options) {
- // const {
- // transaction = await database.sequelize.transaction(),
- // } = options;
- if (model.get('internal')) {
+ database.getModel('menus').addHook('beforeSave', async (model, options) => {
+ const { transaction } = options;
+ // console.log('beforeSave', model.get('views'));
+ const items = model.get('views');
+ if (!Array.isArray(items)) {
return;
}
- const transaction = await database.sequelize.transaction();
- const parent = await Page.findOne({
- transaction,
- where: {
- path: '/collections',
+ const View = database.getModel('views_v2');
+ const views = [];
+ for (const item of items) {
+ if (item.view) {
+ if (!item.view.id) {
+ const view = await View.create(item.view);
+ await view.updateAssociations(item.view);
+ item.view.id = view.id;
+ } else {
+ const view = await View.findByPk(item.view.id);
+ await view.update(item.view);
+ await view.updateAssociations(item.view);
+ }
+ const view = await View.findOne(View.parseApiJson({
+ filter: {
+ id: item.view.id,
+ },
+ fields: {
+ appends: ['collection', 'targetField', 'targetView'],
+ },
+ }));
+ if (view) {
+ console.log({view});
+ item.view = view.toJSON();
+ }
}
- });
- let page = await Page.findOne({
- transaction,
- where: {
- collection: model.get('name'),
- path: `/collections/${model.get('name')}`,
- },
- });
- if (!page) {
- page = await Page.create({
- type: 'collection',
- collection: model.get('name'),
- path: `/collections/${model.get('name')}`,
- sort: 100,
- parent_id: parent.id,
- }, {
- transaction,
- });
+ views.push(item);
}
- page.set({
- title: model.get('title'),
- icon: model.get('icon'),
- showInMenu: !!model.get('showInDataMenu'),
- });
- await page.save({
- transaction,
- });
- await Page.collectionPagesResort({transaction});
- await transaction.commit();
- }
-
- Collection.addHook('afterCreate', createCollectionPage);
- Collection.addHook('afterUpdate', createCollectionPage);
- Collection.addHook('afterDestroy', async (model, options) => {
- const { transaction } = options;
- // console.log('afterDestroy', model);
- await Page.destroy({
- transaction,
- where: {
- path: `/collections/${model.get('name')}`,
- },
- });
- await Page.collectionPagesResort({transaction});
+ model.set('views', views);
+ // @ts-ignore
+ model.changed('views', true);
});
-
- async function syncViewCollectionPage(model, options) {
- const transaction = await database.sequelize.transaction();
- const parentPath = `/collections/${model.get('collection_name')}`;
- const currentPath = `${parentPath}/views/${model.get('name')}`;
- try {
- const parent = await Page.findOne({
- transaction,
- where: {
- path: parentPath,
- },
- });
- if (!parent) {
- await transaction.rollback();
- return;
- }
- let page = await Page.findOne({
- transaction,
- where: {
- collection: model.get('collection_name'),
- path: currentPath,
- },
- });
- if (!page) {
- page = await Page.create({
- type: 'collection',
- collection: model.get('collection_name'),
- path: currentPath,
- sort: 100,
- parent_id: parent.id,
- }, {
- transaction,
- });
- }
- page.set({
- title: model.get('title'),
- viewName: model.get('name'),
- viewId: model.get('id'),
- // icon: model.get('icon'),
- showInMenu: !!model.get('showInDataMenu'),
- });
- await page.save({
- transaction,
- });
- } catch (error) {
- await transaction.rollback();
- console.error(error);
- }
- await transaction.commit();
- }
- View.addHook('beforeValidate', (model) => {
- if (model.get('default')) {
- model.set('showInDataMenu', true);
- }
- });
- View.addHook('afterCreate', syncViewCollectionPage);
- View.addHook('afterUpdate', syncViewCollectionPage);
- View.addHook('afterDestroy', async (model, options) => {
- await Page.destroy({
- where: {
- viewId: model.get('id'),
- },
- });
- });
-*/
}
diff --git a/packages/plugin-pages/src/views/types.ts b/packages/plugin-pages/src/views/types.ts
index 120c135aa..d0a845d65 100644
--- a/packages/plugin-pages/src/views/types.ts
+++ b/packages/plugin-pages/src/views/types.ts
@@ -61,6 +61,7 @@ export const form = {
},
fields: {
...fields,
+ viewName: 'tableForForm',
title: '显示在表单里的字段'
},
},
@@ -346,11 +347,11 @@ export const wysiwyg = {
target: 'dataSourceType',
condition: `{{ $self.value && $self.value !== 'wysiwyg' }}`,
},
- {
- type: "value:visible",
- target: 'targetField',
- condition: `{{ $self.value && $self.value !== 'wysiwyg' }}`,
- },
+ // {
+ // type: "value:visible",
+ // target: 'targetField',
+ // condition: `{{ $self.value && $self.value !== 'wysiwyg' }}`,
+ // },
],
},
};