diff --git a/packages/client/src/collection-manager/ResourceActionProvider.tsx b/packages/client/src/collection-manager/ResourceActionProvider.tsx index c443e5dcb..87db3cc8e 100644 --- a/packages/client/src/collection-manager/ResourceActionProvider.tsx +++ b/packages/client/src/collection-manager/ResourceActionProvider.tsx @@ -4,7 +4,9 @@ import { useCollectionManager } from '.'; import { CollectionProvider, useRecord } from '..'; import { useAPIClient, useRequest } from '../api-client'; -export const ResourceActionContext = createContext & { state?: any; setState?: any }>(null); +export const ResourceActionContext = createContext< + Result & { state?: any; setState?: any; defaultRequest?: any } +>(null); interface ResourceActionProviderProps { type?: 'association' | 'collection'; @@ -38,7 +40,7 @@ const CollectionResourceActionProvider = (props) => { const resource = api.resource(request.resource); return ( - + {props.children} @@ -67,7 +69,7 @@ const AssociationResourceActionProvider = (props) => { const resource = api.resource(request.resource, resourceOf); return ( - + {props.children} diff --git a/packages/client/src/collection-manager/action-hooks.ts b/packages/client/src/collection-manager/action-hooks.ts index 313ff9cda..46da3ba54 100644 --- a/packages/client/src/collection-manager/action-hooks.ts +++ b/packages/client/src/collection-manager/action-hooks.ts @@ -85,13 +85,15 @@ export const useFilterDataSource = (options) => { }; export const useFilterAction = () => { - const { run, params } = useResourceActionContext(); + const { run, params, defaultRequest } = useResourceActionContext(); const form = useForm(); const ctx = useActionContext(); const [first, ...others] = params; return { async run() { - run({ ...first, filter: form.values.filter }, ...others); + const prevFilter = defaultRequest?.params?.filter; + const filter = prevFilter ? { $and: [prevFilter, form.values.filter] } : form.values.filter; + run({ ...first, filter }, ...others); ctx.setVisible(false); }, }; diff --git a/packages/client/src/schema-component/antd/action/Action.Designer.tsx b/packages/client/src/schema-component/antd/action/Action.Designer.tsx index 2479bbca9..3d99ba1c7 100644 --- a/packages/client/src/schema-component/antd/action/Action.Designer.tsx +++ b/packages/client/src/schema-component/antd/action/Action.Designer.tsx @@ -57,9 +57,7 @@ export const ActionDesigner = () => { dn.emit('patch', { schema: { 'x-uid': fieldSchema['x-uid'], - 'x-component-props': { - openMode: value, - }, + 'x-component-props': fieldSchema['x-component-props'], }, }); dn.refresh(); diff --git a/packages/client/src/schema-component/antd/calendar/Calendar.Designer.tsx b/packages/client/src/schema-component/antd/calendar/Calendar.Designer.tsx new file mode 100644 index 000000000..7bd8cb779 --- /dev/null +++ b/packages/client/src/schema-component/antd/calendar/Calendar.Designer.tsx @@ -0,0 +1,139 @@ +import { ISchema, useField, useFieldSchema } from '@formily/react'; +import React from 'react'; +import { useCompile, useDesignable } from '../..'; +import { useCollection, useResourceActionContext } from '../../../collection-manager'; +import { useCollectionFilterOptions } from '../../../collection-manager/action-hooks'; +import { GeneralSchemaDesigner, SchemaSettings } from '../../../schema-settings'; + +export const CalendarDesigner = () => { + const field = useField(); + const fieldSchema = useFieldSchema(); + const { name, title, fields } = useCollection(); + const dataSource = useCollectionFilterOptions(name); + const ctx = useResourceActionContext(); + const { dn } = useDesignable(); + const compile = useCompile(); + const defaultFilter = fieldSchema?.['x-decorator-props']?.request?.params?.filter || {}; + const options = fields?.map((field) => { + return { + value: field.name, + label: compile(field?.uiSchema?.title), + }; + }); + const calendarSchema = fieldSchema.properties.calendar; + const fieldNames = calendarSchema?.['x-component-props']?.['fieldNames'] || {}; + return ( + + { + field.query(field.address.concat('calendar')).take((f) => { + f.componentProps.fieldNames = { + ...f.componentProps.fieldNames, + title, + }; + calendarSchema['x-component-props']['fieldNames'] = f.componentProps.fieldNames; + dn.emit('patch', { + schema: { + ['x-uid']: calendarSchema['x-uid'], + 'x-component-props': calendarSchema['x-component-props'], + }, + }); + dn.refresh(); + ctx.refresh(); + }); + }} + /> + { + field.query(field.address.concat('calendar')).take((f) => { + f.componentProps.fieldNames = { + ...f.componentProps.fieldNames, + start, + }; + calendarSchema['x-component-props']['fieldNames'] = f.componentProps.fieldNames; + dn.emit('patch', { + schema: { + ['x-uid']: calendarSchema['x-uid'], + 'x-component-props': calendarSchema['x-component-props'], + }, + }); + dn.refresh(); + ctx.refresh(); + }); + }} + /> + { + field.query(field.address.concat('calendar')).take((f) => { + f.componentProps.fieldNames = { + ...f.componentProps.fieldNames, + end, + }; + calendarSchema['x-component-props']['fieldNames'] = f.componentProps.fieldNames; + dn.emit('patch', { + schema: { + ['x-uid']: calendarSchema['x-uid'], + 'x-component-props': calendarSchema['x-component-props'], + }, + }); + dn.refresh(); + ctx.refresh(); + }); + }} + /> + { + const params = field.decoratorProps.request.params || {}; + params.filter = filter; + field.decoratorProps.request.params = params; + fieldSchema['x-decorator-props']['request']['params'] = params; + ctx.run({ filter }); + dn.emit('patch', { + schema: { + ['x-uid']: fieldSchema['x-uid'], + 'x-decorator-props': field.decoratorProps, + }, + }); + }} + /> + + + + ); +}; diff --git a/packages/client/src/schema-component/antd/calendar/Calendar.tsx b/packages/client/src/schema-component/antd/calendar/Calendar.tsx index c0a98cd13..cd7630661 100644 --- a/packages/client/src/schema-component/antd/calendar/Calendar.tsx +++ b/packages/client/src/schema-component/antd/calendar/Calendar.tsx @@ -9,6 +9,7 @@ import { SchemaComponent } from '../..'; import { AsyncDataProvider, RecordProvider, useRequest } from '../../../'; import { i18n } from '../../../i18n'; import { ActionBar, ActionContext } from '../action'; +import { CalendarDesigner } from './Calendar.Designer'; import { CalendarContext, ToolbarContext } from './context'; import { Event } from './Event'; import { Nav } from './Nav'; @@ -101,6 +102,7 @@ export const Calendar: any = observer((props: any) => { refreshDeps: [props.dataSource], onSuccess(data) { const events = toEvents(data?.data, fieldNames); + console.log('events', events, data); setDataSource(events); }, }, @@ -112,6 +114,7 @@ export const Calendar: any = observer((props: any) => { } return buf; }, null); + console.log('field', field); return ( @@ -180,3 +183,5 @@ Calendar.Today = Today; Calendar.Nav = Nav; Calendar.ViewSelect = ViewSelect; + +Calendar.Designer = CalendarDesigner; diff --git a/packages/client/src/schema-component/antd/table/Table.Designer.tsx b/packages/client/src/schema-component/antd/table/Table.Designer.tsx new file mode 100644 index 000000000..00360cf98 --- /dev/null +++ b/packages/client/src/schema-component/antd/table/Table.Designer.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { useCollection } from '../../../collection-manager'; +import { GeneralSchemaDesigner, SchemaSettings } from '../../../schema-settings'; + +export const TableDesigner = () => { + const { name, title } = useCollection(); + return ( + + + + ); +}; diff --git a/packages/client/src/schema-component/antd/table/Table.Void.Designer.tsx b/packages/client/src/schema-component/antd/table/Table.Void.Designer.tsx index dde65b4c1..5b8059524 100644 --- a/packages/client/src/schema-component/antd/table/Table.Void.Designer.tsx +++ b/packages/client/src/schema-component/antd/table/Table.Void.Designer.tsx @@ -1,11 +1,76 @@ +import { ISchema, useField, useFieldSchema } from '@formily/react'; import React from 'react'; -import { useCollection } from '../../../collection-manager'; +import { useCollection, useResourceActionContext } from '../../../collection-manager'; +import { useCollectionFilterOptions } from '../../../collection-manager/action-hooks'; import { GeneralSchemaDesigner, SchemaSettings } from '../../../schema-settings'; +import { useDesignable } from '../../hooks'; export const TableVoidDesigner = () => { const { name, title } = useCollection(); + const field = useField(); + const fieldSchema = useFieldSchema(); + const dataSource = useCollectionFilterOptions(name); + const ctx = useResourceActionContext(); + const { dn } = useDesignable(); + const defaultFilter = fieldSchema?.['x-decorator-props']?.request?.params?.filter || {}; return ( + { + const params = field.decoratorProps.request.params || {}; + params.filter = filter; + field.decoratorProps.request.params = params; + fieldSchema['x-decorator-props']['request']['params'] = params; + ctx.run({ ...ctx.params?.[0], filter }); + dn.emit('patch', { + schema: { + ['x-uid']: fieldSchema['x-uid'], + 'x-decorator-props': fieldSchema['x-decorator-props'], + }, + }); + }} + /> + { + const params = field.decoratorProps.request.params || {}; + params.pageSize = pageSize; + field.decoratorProps.request.params = params; + fieldSchema['x-decorator-props']['request']['params'] = params; + ctx.run({ ...ctx.params?.[0], pageSize }); + dn.emit('patch', { + schema: { + ['x-uid']: fieldSchema['x-uid'], + 'x-decorator-props': fieldSchema['x-decorator-props'], + }, + }); + }} + /> + { params: {}, }, }, - 'x-designer': 'Form.Designer', + 'x-designer': 'Calendar.Designer', 'x-component': 'CardItem', properties: { calendar: { diff --git a/packages/client/src/schema-settings/SchemaSettings.tsx b/packages/client/src/schema-settings/SchemaSettings.tsx index 1e7ebc71d..3eca0a902 100644 --- a/packages/client/src/schema-settings/SchemaSettings.tsx +++ b/packages/client/src/schema-settings/SchemaSettings.tsx @@ -142,8 +142,10 @@ SchemaSettings.SelectItem = (props) => { const { title, options, value, onChange, ...others } = props; return ( - {title} - + ); };