fix: custom request role list (#4074)

* fix: custom request role list

* fix: custom request body users

* fix: support external data sources

* fix: record data

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
This commit is contained in:
jack zhang 2024-04-17 23:45:04 +08:00 committed by GitHub
parent 27962ab283
commit c9171a7117
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 42 additions and 25 deletions

View File

@ -23,6 +23,7 @@ export type RemoteSelectProps<P = any> = SelectProps<P, any> & {
mapOptions?: (data: any) => RemoteSelectProps['fieldNames'];
targetField?: any;
service: ResourceActionOptions<P>;
dataSource?: string;
CustomDropdownRender?: (v: any) => any;
optionFilter?: (option: any) => boolean;
};
@ -41,10 +42,11 @@ const InternalRemoteSelect = connect(
targetField: _targetField,
CustomDropdownRender,
optionFilter,
dataSource: propsDataSource,
...others
} = props;
const dataSource = useDataSourceKey();
const headers = useDataSourceHeaders(dataSource);
const headers = useDataSourceHeaders(propsDataSource || dataSource);
const [open, setOpen] = useState(false);
const firstRun = useRef(false);
const fieldSchema = useFieldSchema();

View File

@ -17,6 +17,10 @@ export class DataSourceManager {
this.middlewares = [];
}
get(dataSourceKey: string) {
return this.dataSources.get(dataSourceKey);
}
async add(dataSource: DataSource, options: any = {}) {
await dataSource.load(options);
this.dataSources.set(dataSource.name, dataSource);

View File

@ -6,6 +6,7 @@ import {
SchemaSettingsActionModalItem,
actionSettingsItems,
useCollection_deprecated,
useDataSourceKey,
useRequest,
} from '@nocobase/client';
import { App } from 'antd';
@ -19,6 +20,7 @@ import { CustomRequestACLSchema, CustomRequestConfigurationFieldsSchema } from '
export function CustomRequestSettingsItem() {
const { t } = useTranslation();
const { name } = useCollection_deprecated();
const dataSourceKey = useDataSourceKey();
const fieldSchema = useFieldSchema();
const customRequestsResource = useCustomRequestsResource();
const { message } = App.useApp();
@ -45,6 +47,7 @@ export function CustomRequestSettingsItem() {
options: {
...requestSettings,
collectionName: name,
dataSourceKey,
},
},
filterKeys: ['key'],

View File

@ -1,4 +1,9 @@
import { useCollection_deprecated, useCollectionFilterOptions, useCompile } from '@nocobase/client';
import {
DEFAULT_DATA_SOURCE_KEY,
useCollection_deprecated,
useCollectionFilterOptions,
useCompile,
} from '@nocobase/client';
import { useMemo } from 'react';
import { useTranslation } from '../locale';
@ -6,7 +11,7 @@ export const useCustomRequestVariableOptions = () => {
const collection = useCollection_deprecated();
const { t } = useTranslation();
const fieldsOptions = useCollectionFilterOptions(collection);
const userFieldOptions = useCollectionFilterOptions('users');
const userFieldOptions = useCollectionFilterOptions('users', DEFAULT_DATA_SOURCE_KEY);
const compile = useCompile();
const [fields, userFields] = useMemo(() => {

View File

@ -1,15 +1,7 @@
import { useField, useFieldSchema, useForm } from '@formily/react';
import {
TableFieldResource,
useAPIClient,
useActionContext,
useBlockRequestContext,
useCollection_deprecated,
useCompile,
useRecord,
} from '@nocobase/client';
import { App } from 'antd';
import { useAPIClient, useActionContext, useCompile, useDataSourceKey, useRecord } from '@nocobase/client';
import { isURL } from '@nocobase/utils/client';
import { App } from 'antd';
import { useNavigate } from 'react-router-dom';
export const useCustomizeRequestActionProps = () => {
@ -18,13 +10,13 @@ export const useCustomizeRequestActionProps = () => {
const actionSchema = useFieldSchema();
const compile = useCompile();
const form = useForm();
const { getPrimaryKey } = useCollection_deprecated();
const { resource, __parent, service } = useBlockRequestContext();
// const { getPrimaryKey } = useCollection_deprecated();
const record = useRecord();
const fieldSchema = useFieldSchema();
const actionField = useField();
const { setVisible } = useActionContext();
const { modal, message } = App.useApp();
const dataSourceKey = useDataSourceKey();
return {
async onClick(e?, callBack?) {
const { skipValidator, onSuccess } = actionSchema?.['x-action-settings'] ?? {};
@ -33,7 +25,7 @@ export const useCustomizeRequestActionProps = () => {
await form.submit();
}
let formValues = {};
let formValues = { ...record };
if (xAction === 'customize:form:request') {
formValues = form.values;
}
@ -46,16 +38,14 @@ export const useCustomizeRequestActionProps = () => {
method: 'POST',
data: {
currentRecord: {
id: record[getPrimaryKey()],
appends: service.params[0]?.appends,
// id: record[getPrimaryKey()],
// appends: result.params[0]?.appends,
dataSourceKey,
data: formValues,
},
},
});
actionField.data.loading = false;
if (!(resource instanceof TableFieldResource)) {
__parent?.service?.refresh?.();
}
// service?.refresh?.();
if (callBack) {
callBack?.();

View File

@ -1,3 +1,4 @@
import { DEFAULT_DATA_SOURCE_KEY } from '@nocobase/client';
import { generateNTemplate } from '../locale';
export const CustomRequestACLSchema = {
@ -14,6 +15,7 @@ export const CustomRequestACLSchema = {
'x-component-props': {
multiple: true,
objectValue: true,
dataSource: DEFAULT_DATA_SOURCE_KEY,
service: {
resource: 'roles',
},

View File

@ -2,6 +2,7 @@ import { Context, Next } from '@nocobase/actions';
import { parse } from '@nocobase/utils';
import { appendArrayColumn } from '@nocobase/evaluators';
import Application from '@nocobase/server';
import axios from 'axios';
import CustomRequestPlugin from '../plugin';
@ -46,7 +47,8 @@ const getCurrentUserAppends = (str: string, user) => {
};
export async function send(this: CustomRequestPlugin, ctx: Context, next: Next) {
const { filterByTk, resourceName, values = {} } = ctx.action.params;
const resourceName = ctx.action.resourceName;
const { filterByTk, values = {} } = ctx.action.params;
const {
currentRecord = {
id: 0,
@ -70,7 +72,6 @@ export async function send(this: CustomRequestPlugin, ctx: Context, next: Next)
}
}
}
const repo = ctx.db.getRepository(resourceName);
const requestConfig = await repo.findOne({
filter: {
@ -84,13 +85,23 @@ export async function send(this: CustomRequestPlugin, ctx: Context, next: Next)
ctx.withoutDataWrapping = true;
const { collectionName, url, headers = [], params = [], data = {}, ...options } = requestConfig.options || {};
const {
dataSourceKey,
collectionName,
url,
headers = [],
params = [],
data = {},
...options
} = requestConfig.options || {};
if (!url) {
return ctx.throw(400, ctx.t('Please configure the request settings first', { ns: 'custom-request' }));
}
let currentRecordValues = {};
if (collectionName && typeof currentRecord.id !== 'undefined') {
const recordRepo = ctx.db.getRepository(collectionName);
const app = ctx.app as Application;
const dataSource = app.dataSourceManager.get(dataSourceKey || currentRecord.dataSourceKey || 'main');
const recordRepo = dataSource.collectionManager.getRepository(collectionName);
currentRecordValues =
(
await recordRepo.findOne({