Feature: filter for linkTo field (#64)
* feat: add scope select for relation field * fix: add associatedKey support for drawerSelect component * refactor: use 'component.x-component-props.filter' as filter type * fix: remove user group field Co-authored-by: chenos <chenlinxh@gmail.com>
This commit is contained in:
parent
cef64bb7f5
commit
df2137da79
@ -5,12 +5,12 @@ import Database from '@nocobase/database';
|
|||||||
await api.loadPlugins();
|
await api.loadPlugins();
|
||||||
const database: Database = api.database;
|
const database: Database = api.database;
|
||||||
await api.database.sync({
|
await api.database.sync({
|
||||||
tables: ['actions_scopes'],
|
tables: ['scopes'],
|
||||||
});
|
});
|
||||||
|
|
||||||
const [Collection, User, Role] = database.getModels(['collections', 'users', 'roles']);
|
const [Collection, User, Role] = database.getModels(['collections', 'users', 'roles']);
|
||||||
|
|
||||||
const tables = database.getTables(['actions_scopes']);
|
const tables = database.getTables(['scopes']);
|
||||||
|
|
||||||
for (let table of tables) {
|
for (let table of tables) {
|
||||||
console.log(table.getName());
|
console.log(table.getName());
|
||||||
|
@ -38,7 +38,7 @@ import Database from '@nocobase/database';
|
|||||||
parent_id: parent.id,
|
parent_id: parent.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
const Scope = database.getModel('actions_scopes');
|
const Scope = database.getModel('scopes');
|
||||||
|
|
||||||
const collections = await Collection.findAll();
|
const collections = await Collection.findAll();
|
||||||
|
|
||||||
|
@ -5,12 +5,12 @@ import Database from '@nocobase/database';
|
|||||||
await api.loadPlugins();
|
await api.loadPlugins();
|
||||||
const database: Database = api.database;
|
const database: Database = api.database;
|
||||||
await api.database.sync({
|
await api.database.sync({
|
||||||
tables: ['actions_scopes', 'action_logs', 'action_changes'],
|
tables: ['scopes', 'action_logs', 'action_changes'],
|
||||||
});
|
});
|
||||||
|
|
||||||
const [Collection, Page] = database.getModels(['collections', 'pages']);
|
const [Collection, Page] = database.getModels(['collections', 'pages']);
|
||||||
|
|
||||||
const tables = database.getTables(['actions_scopes', 'action_logs', 'action_changes']);
|
const tables = database.getTables(['scopes', 'action_logs', 'action_changes']);
|
||||||
|
|
||||||
for (let table of tables) {
|
for (let table of tables) {
|
||||||
console.log(table.getName());
|
console.log(table.getName());
|
||||||
|
@ -72,7 +72,7 @@ Permissions.Actions = connect({
|
|||||||
const index = findIndex(values, (item: any) => item && item.name === `${resourceKey}:${record.name}`);
|
const index = findIndex(values, (item: any) => item && item.name === `${resourceKey}:${record.name}`);
|
||||||
return (
|
return (
|
||||||
<Scope
|
<Scope
|
||||||
resourceTarget={'actions_scopes'}
|
resourceTarget={'scopes'}
|
||||||
associatedName={'collections'}
|
associatedName={'collections'}
|
||||||
associatedKey={resourceKey}
|
associatedKey={resourceKey}
|
||||||
target={'scopes'}
|
target={'scopes'}
|
||||||
|
@ -305,6 +305,32 @@ export default {
|
|||||||
type: 'drawerSelect',
|
type: 'drawerSelect',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
interface: 'linkTo',
|
||||||
|
type: 'hasMany',
|
||||||
|
name: 'scopes',
|
||||||
|
target: 'scopes',
|
||||||
|
title: '数据范围',
|
||||||
|
sourceKey: 'name',
|
||||||
|
actions: {
|
||||||
|
list: {
|
||||||
|
sort: 'id',
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
filter: {
|
||||||
|
locked: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
destroy: {
|
||||||
|
filter: {
|
||||||
|
locked: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
component: {
|
||||||
|
type: 'drawerSelect',
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
actions: [
|
actions: [
|
||||||
{
|
{
|
||||||
|
@ -304,6 +304,20 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: 'value:visible',
|
||||||
|
target: 'component.x-component-props.filter',
|
||||||
|
condition: '{{ !!$self.value }}'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "value:schema",
|
||||||
|
target: "component.x-component-props.filter",
|
||||||
|
schema: {
|
||||||
|
"x-component-props": {
|
||||||
|
"associatedKey": "{{ $self.value }}"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -337,6 +351,19 @@ export default {
|
|||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'component.x-component-props.filter',
|
||||||
|
interface: 'json',
|
||||||
|
type: 'virtual',
|
||||||
|
title: '数据范围',
|
||||||
|
component: {
|
||||||
|
type: 'filter',
|
||||||
|
'x-component-props': {
|
||||||
|
resourceName: 'collections.fields',
|
||||||
|
},
|
||||||
|
showInForm: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
interface: 'boolean',
|
interface: 'boolean',
|
||||||
type: 'virtual',
|
type: 'virtual',
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { TableOptions } from '@nocobase/database';
|
import { TableOptions } from '@nocobase/database';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'actions_scopes',
|
name: 'scopes',
|
||||||
title: '表操作范围',
|
title: '表操作范围',
|
||||||
developerMode: true,
|
developerMode: true,
|
||||||
internal: true,
|
internal: true,
|
@ -32,7 +32,7 @@ function getActionPermissions(permissions) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 以 or 关心合并两个 scope 中的 filter
|
// 以 or 关系合并两个 scope 中的 filter
|
||||||
existedScope.set('filter', { 'or': [existedScope.get('filter'), newScope.get('filter')] });
|
existedScope.set('filter', { 'or': [existedScope.get('filter'), newScope.get('filter')] });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -17,6 +17,11 @@ export default async function(db) {
|
|||||||
{ title: '管理员', type: ROLE_TYPE_ROOT },
|
{ title: '管理员', type: ROLE_TYPE_ROOT },
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
const Scope = db.getModel('scopes');
|
||||||
|
const scopePublished = await Scope.create({ collection_name: 'posts', filter: { status: 'published' } }, { logging: true });
|
||||||
|
// TODO(bug): 字段应使用 'created_by' 名称,通过程序映射成外键
|
||||||
|
const scopeCreatedBy = await Scope.create({ collection_name: 'posts', filter: { status: 'draft', 'created_by_id.$currentUser': true } });
|
||||||
|
|
||||||
const Field = db.getModel('fields');
|
const Field = db.getModel('fields');
|
||||||
const postTitleField = await Field.findOne({
|
const postTitleField = await Field.findOne({
|
||||||
where: {
|
where: {
|
||||||
@ -45,7 +50,7 @@ export default async function(db) {
|
|||||||
actions: [
|
actions: [
|
||||||
{
|
{
|
||||||
name: 'posts:list',
|
name: 'posts:list',
|
||||||
scope: { filter: { status: 'published' }, collection_name: 'posts' },
|
scope: scopePublished,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
fields_permissions: [
|
fields_permissions: [
|
||||||
@ -73,12 +78,11 @@ export default async function(db) {
|
|||||||
actions: [
|
actions: [
|
||||||
{
|
{
|
||||||
name: 'posts:list',
|
name: 'posts:list',
|
||||||
// TODO(bug): 字段应使用 'created_by' 名称,通过程序映射成外键
|
scope: scopeCreatedBy,
|
||||||
scope: { filter: { status: 'draft', 'created_by_id.$currentUser': true }, collection_name: 'posts' },
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'posts:update',
|
name: 'posts:update',
|
||||||
scope: { filter: { status: 'draft', 'created_by_id.$currentUser': true }, collection_name: 'posts' },
|
scope: scopeCreatedBy,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
fields: [
|
fields: [
|
||||||
|
@ -15,7 +15,7 @@ export default {
|
|||||||
comment: '操作范围',
|
comment: '操作范围',
|
||||||
type: 'belongsTo',
|
type: 'belongsTo',
|
||||||
name: 'scope',
|
name: 'scope',
|
||||||
target: 'actions_scopes'
|
target: 'scopes'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'belongsTo',
|
type: 'belongsTo',
|
||||||
|
@ -3,32 +3,6 @@ import { extend } from '@nocobase/database';
|
|||||||
export default extend({
|
export default extend({
|
||||||
name: 'collections',
|
name: 'collections',
|
||||||
fields: [
|
fields: [
|
||||||
{
|
|
||||||
interface: 'linkTo',
|
|
||||||
type: 'hasMany',
|
|
||||||
name: 'scopes',
|
|
||||||
target: 'actions_scopes',
|
|
||||||
title: '数据范围',
|
|
||||||
sourceKey: 'name',
|
|
||||||
actions: {
|
|
||||||
list: {
|
|
||||||
sort: 'id',
|
|
||||||
},
|
|
||||||
update: {
|
|
||||||
filter: {
|
|
||||||
locked: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
destroy: {
|
|
||||||
filter: {
|
|
||||||
locked: false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
component: {
|
|
||||||
type: 'drawerSelect',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
interface: 'linkTo',
|
interface: 'linkTo',
|
||||||
title: '权限',
|
title: '权限',
|
||||||
|
Loading…
Reference in New Issue
Block a user