Przeglądaj źródła

Merge branch 'next' into next-xyh

Lind 3 lat temu
rodzic
commit
4d6e811c2b

+ 2 - 2
package.json

@@ -70,10 +70,10 @@
     "@formily/reactive-react": "2.0.0-rc.17",
     "@formily/shared": "2.0.0-rc.17",
     "@jetlinks/pro-list": "^1.10.8",
-    "@jetlinks/pro-table": "^2.63.9",
+    "@jetlinks/pro-table": "^2.63.10",
     "@umijs/route-utils": "^1.0.36",
     "ahooks": "^2.10.9",
-    "antd": "^4.17.0-alpha.9",
+    "antd": "^4.18.8",
     "braft-editor": "^2.3.9",
     "classnames": "^2.2.6",
     "dexie": "^3.0.3",

+ 23 - 12
src/components/BaseCrud/index.tsx

@@ -1,5 +1,5 @@
 import { useIntl } from '@@/plugin-locale/localeExports';
-import { Button, Card, Divider, Dropdown } from 'antd';
+import { Button, Dropdown } from 'antd';
 import ProTable from '@jetlinks/pro-table';
 import type { ProColumns, ActionType, RequestData } from '@jetlinks/pro-table';
 
@@ -73,23 +73,34 @@ const BaseCrud = <T extends Record<string, any>>(props: Props<T>) => {
   const [param, setParam] = useState({});
   return (
     <>
-      <Card>
-        <SearchComponent<T>
-          field={columns}
-          onSearch={async (data) => {
-            setParam({ terms: data });
-          }}
-          target={moduleName}
-        />
-      </Card>
-      <Divider />
+      <SearchComponent<T>
+        field={columns}
+        onSearch={async (data) => {
+          // actionRef.current?.reset?.();
+          actionRef.current?.setPageInfo?.({ pageSize: 10 });
+          setParam(data);
+        }}
+        target={moduleName}
+        onReset={() => {
+          // 重置分页及搜索参数
+          actionRef.current?.reset?.();
+          setParam({});
+        }}
+      />
       <ProTable<T>
         params={param}
         formRef={ref}
         columns={columns}
         actionRef={actionRef}
         options={{ fullScreen: true }}
-        request={request || (async (params = {}) => service.query(params))}
+        request={
+          request ||
+          (async (params = {}) =>
+            service.query({
+              ...params,
+              sorts: [{ name: 'createTime', order: 'desc' }], // 默认排序
+            }))
+        }
         editable={{
           type: 'multiple',
         }}

+ 22 - 0
src/components/SearchComponent/index.less

@@ -3,6 +3,28 @@
   align-items: center;
 }
 
+.simple {
+  display: flex;
+  flex-direction: row;
+
+  :global {
+    .ant-formily-grid-layout {
+      width: 550px;
+      height: 40px;
+    }
+  }
+}
+
+.history {
+  width: 176px;
+  .list {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 148px;
+  }
+}
+
 .saveLog {
   width: 100%;
   margin-top: 5px;

+ 146 - 84
src/components/SearchComponent/index.tsx

@@ -8,15 +8,27 @@ import {
   FormItem,
   FormTab,
   Input,
+  NumberPicker,
   PreviewText,
   Select,
+  Space,
 } from '@formily/antd';
 import type { Field } from '@formily/core';
 import { createForm, onFieldReact } from '@formily/core';
 import GroupNameControl from '@/components/SearchComponent/GroupNameControl';
 import { DeleteOutlined, DoubleRightOutlined } from '@ant-design/icons';
-import { Button, Dropdown, Empty, Menu, message, Popconfirm, Popover, Typography } from 'antd';
-import { useState } from 'react';
+import {
+  Button,
+  Card,
+  Dropdown,
+  Empty,
+  Menu,
+  message,
+  Popconfirm,
+  Popover,
+  Typography,
+} from 'antd';
+import { useEffect, useMemo, useState } from 'react';
 import type { ProColumns } from '@jetlinks/pro-table';
 import type { EnumData } from '@/utils/typings';
 import styles from './index.less';
@@ -31,15 +43,19 @@ const ui2Server = (source: SearchTermsUI): SearchTermsServer => [
 
 const server2Ui = (source: SearchTermsServer): SearchTermsUI => ({
   terms1: source[0].terms,
-  terms2: source[1].terms,
-  type: source[0].type || 'and',
+  terms2: source[1]?.terms,
+  type: source[0]?.type || 'and',
 });
 
 interface Props<T> {
+  /** @name 搜索条件 */
   field: ProColumns<T>[];
-  onSearch: (params: any) => void;
+  onSearch: (params: { terms: SearchTermsServer }) => void;
   target?: string;
   onReset?: () => void;
+  /** @name 固定查询参数*/
+  defaultParam?: Term[];
+  pattern?: 'simple' | 'advance';
 }
 
 const termType = [
@@ -56,48 +72,78 @@ const termType = [
 ];
 
 const service = new Service();
-const defaultTerm = { termType: 'like' };
+const initTerm = { termType: 'like' };
+const SchemaField = createSchemaField({
+  components: {
+    FormItem,
+    FormTab,
+    Input,
+    Select,
+    NumberPicker,
+    FormGrid,
+    ArrayItems,
+    PreviewText,
+    GroupNameControl,
+    Space,
+  },
+});
 
-const SearchComponent = <T extends Record<string, any>>({
-  field,
-  onSearch,
-  target,
-  onReset,
-}: Props<T>) => {
+const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
+  const { field, target, onReset, onSearch, defaultParam, pattern = 'advance' } = props;
   const intl = useIntl();
   const [expand, setExpand] = useState<boolean>(true);
-  const initForm = server2Ui([{ terms: [defaultTerm], type: 'and' }, { terms: [defaultTerm] }]);
+  const initForm = server2Ui(
+    pattern === 'advance'
+      ? [
+          {
+            terms: [initTerm],
+            type: 'and',
+          },
+          { terms: [initTerm] },
+        ]
+      : [{ terms: [initTerm] }],
+  );
   const [logVisible, setLogVisible] = useState<boolean>(false);
   const [aliasVisible, setAliasVisible] = useState<boolean>(false);
   const [initParams, setInitParams] = useState<SearchTermsUI>(initForm);
   const [history, setHistory] = useState([]);
 
-  const form = createForm<SearchTermsUI>({
-    validateFirst: true,
-    initialValues: initParams,
-    effects() {
-      onFieldReact('*.*.column', (typeFiled, f) => {
-        const _column = (typeFiled as Field).value;
-        const _field = field.find((item) => item.dataIndex === _column);
-        if (_field?.valueType === 'select') {
-          const option = Object.values(_field?.valueEnum || {}).map((item) => ({
-            label: item.text,
-            value: item.status,
-          }));
-
-          f.setFieldState(typeFiled.query('.termType'), async (state) => {
-            state.value = 'eq';
+  const form = useMemo(
+    () =>
+      createForm<SearchTermsUI>({
+        validateFirst: true,
+        initialValues: initParams,
+        effects() {
+          onFieldReact('*.*.column', (typeFiled, f) => {
+            const _column = (typeFiled as Field).value;
+            const _field = field.find((item) => item.dataIndex === _column);
+            if (_field?.valueType === 'select') {
+              const option = Object.values(_field?.valueEnum || {}).map((item) => ({
+                label: item.text,
+                value: item.status,
+              }));
+              f.setFieldState(typeFiled.query('.termType'), async (state) => {
+                state.value = 'eq';
+              });
+              f.setFieldState(typeFiled.query('.value'), async (state) => {
+                state.componentType = 'Select';
+                state.loading = true;
+                state.dataSource = option;
+                state.loading = false;
+              });
+            } else if (_field?.valueType === 'digit') {
+              f.setFieldState(typeFiled.query('.value'), async (state) => {
+                state.componentType = 'NumberPicker';
+              });
+              f.setFieldState(typeFiled.query('.termType'), async (state) => {
+                state.value = 'eq';
+              });
+            }
           });
-          f.setFieldState(typeFiled.query('.value'), async (state) => {
-            state.componentType = 'Select';
-            state.loading = true;
-            state.dataSource = option;
-            state.loading = false;
-          });
-        }
-      });
-    },
-  });
+        },
+      }),
+    [expand],
+  );
 
   const historyForm = createForm();
 
@@ -114,24 +160,12 @@ const SearchComponent = <T extends Record<string, any>>({
       value.terms1.splice(1, 2);
       value.terms2.splice(1, 2);
     } else {
-      value.terms2.push(defaultTerm, defaultTerm);
-      value.terms1.push(defaultTerm, defaultTerm);
+      value.terms2.push(initTerm, initTerm);
+      value.terms1.push(initTerm, initTerm);
     }
     setInitParams(value);
     setExpand(!expand);
   };
-  const SchemaField = createSchemaField({
-    components: {
-      FormItem,
-      FormTab,
-      Input,
-      Select,
-      FormGrid,
-      ArrayItems,
-      PreviewText,
-      GroupNameControl,
-    },
-  });
 
   const filterSearchTerm = (): EnumData[] =>
     field
@@ -164,6 +198,7 @@ const SearchComponent = <T extends Record<string, any>>({
           'x-component-props': {
             name: name,
           },
+          'x-visible': pattern === 'advance',
         },
         column: {
           type: 'string',
@@ -234,28 +269,28 @@ const SearchComponent = <T extends Record<string, any>>({
     },
   };
 
+  const simpleSchema: ISchema = {
+    type: 'object',
+    properties: {
+      terms1: createGroup('第一组'),
+    },
+  };
   const handleHistory = (item: SearchHistory) => {
     const log = JSON.parse(item.content) as SearchTermsUI;
     form.setValues(log);
     setExpand(!(log.terms1?.length > 1 || log.terms2?.length > 1));
-    setInitParams(log);
   };
+
   const historyDom = (
-    <Menu style={{ width: '176px' }}>
+    <Menu className={styles.history}>
       {history.length > 0 ? (
         history.map((item: SearchHistory) => (
           <Menu.Item onClick={() => handleHistory(item)} key={item.id}>
-            <div
-              style={{
-                display: 'flex',
-                justifyContent: 'space-between',
-                alignItems: 'center',
-                width: '148px',
-              }}
-            >
+            <div className={styles.list}>
               <Typography.Text ellipsis={{ tooltip: item.name }}>{item.name}</Typography.Text>
               <Popconfirm
-                onConfirm={async () => {
+                onConfirm={async (e) => {
+                  e?.stopPropagation();
                   const response = await service.history.remove(`${target}-search`, item.key);
                   if (response.status === 200) {
                     message.success('操作成功');
@@ -265,7 +300,7 @@ const SearchComponent = <T extends Record<string, any>>({
                 }}
                 title={'确认删除吗?'}
               >
-                <DeleteOutlined />
+                <DeleteOutlined onClick={(e) => e.stopPropagation()} />
               </Popconfirm>
             </div>
           </Menu.Item>
@@ -289,7 +324,7 @@ const SearchComponent = <T extends Record<string, any>>({
 
   const formatValue = (value: SearchTermsUI): SearchTermsServer =>
     ui2Server(value).map((term) => {
-      term.terms.map((item) => {
+      term.terms?.map((item) => {
         if (item.termType === 'like') {
           item.value = `%${item.value}%`;
           return item;
@@ -301,15 +336,23 @@ const SearchComponent = <T extends Record<string, any>>({
 
   const handleSearch = async () => {
     const value = form.values;
-    setInitParams(value);
     const filterTerms = (data: Partial<Term>[]) =>
-      data.filter((item) => item.column != null).filter((item) => item.value != null);
-    const temp = _.cloneDeep(value);
-    temp.terms1 = filterTerms(temp.terms1);
-    temp.terms2 = filterTerms(temp.terms2);
-    onSearch(formatValue(temp));
+      data && data.filter((item) => item.column != null).filter((item) => item.value != null);
+    const _terms = _.cloneDeep(value);
+    _terms.terms1 = filterTerms(_terms.terms1);
+    _terms.terms2 = filterTerms(_terms.terms2);
+    if (defaultParam) {
+      _terms.terms1 = _terms.terms1.concat(defaultParam);
+    }
+    onSearch({ terms: formatValue(_terms) });
   };
 
+  useEffect(() => {
+    if (defaultParam) {
+      handleSearch();
+    }
+  }, []);
+
   const handleSaveLog = async () => {
     const value = await form.submit<SearchTermsUI>();
     const value2 = await historyForm.submit<{ alias: string }>();
@@ -327,15 +370,17 @@ const SearchComponent = <T extends Record<string, any>>({
 
   const resetForm = async () => {
     const temp = initForm;
-    temp.terms1 = temp.terms1.map(() => defaultTerm);
-    temp.terms2 = temp.terms2.map(() => defaultTerm);
-    setInitParams(temp);
+    const expandData = Array(expand ? 1 : 3).fill(initTerm);
+    temp.terms1 = expandData;
+    temp.terms2 = expandData;
+    // setInitParams(temp);
     await form.reset();
     onReset?.();
   };
-  return (
-    <div>
-      <Form form={form} labelCol={4} wrapperCol={18}>
+
+  const renderAdvance = () => {
+    return (
+      <>
         <SchemaField schema={schema} />
         <div className={styles.action}>
           <FormButtonGroup.FormItem labelCol={10} wrapperCol={14}>
@@ -346,8 +391,6 @@ const SearchComponent = <T extends Record<string, any>>({
               visible={logVisible}
               onVisibleChange={async (visible) => {
                 setLogVisible(visible);
-                const value = form.values;
-                setInitParams(value);
                 if (visible) {
                   await queryHistory();
                 }
@@ -378,10 +421,7 @@ const SearchComponent = <T extends Record<string, any>>({
                 </Form>
               }
               visible={aliasVisible}
-              onVisibleChange={(visible) => {
-                setInitParams(form.values);
-                setAliasVisible(visible);
-              }}
+              onVisibleChange={setAliasVisible}
               title="搜索名称"
               trigger="click"
             >
@@ -404,8 +444,30 @@ const SearchComponent = <T extends Record<string, any>>({
             />
           </div>
         </div>
+      </>
+    );
+  };
+  const renderSimple = () => {
+    return (
+      <div className={styles.simple}>
+        <SchemaField schema={simpleSchema} />
+        <FormButtonGroup.FormItem labelCol={0} wrapperCol={14}>
+          <Button onClick={handleSearch} type="primary">
+            搜索
+          </Button>
+          <Button block onClick={resetForm}>
+            重置
+          </Button>
+        </FormButtonGroup.FormItem>
+      </div>
+    );
+  };
+  return (
+    <Card style={{ marginBottom: '20px' }}>
+      <Form form={form} className={styles.form} labelCol={4} wrapperCol={18}>
+        {pattern === 'advance' ? renderAdvance() : renderSimple()}
       </Form>
-    </div>
+    </Card>
   );
 };
 export default SearchComponent;

+ 1 - 1
src/pages/system/Department/Assets/deivce/bind.tsx

@@ -73,7 +73,7 @@ const Bind = observer((props: Props) => {
     if (Models.bindKeys.length) {
       setPerVisible(true);
     } else {
-      message.warn('请先勾选数据')
+      message.warn('请先勾选数据');
       // props.onCancel();
     }
   };

+ 1 - 1
src/pages/system/Department/Assets/permissionModal.tsx

@@ -84,7 +84,7 @@ export default (props: PerModalProps) => {
           { label: '编辑', value: 'save' },
           { label: '删除', value: 'delete' },
         ],
-        'x-value': ['read']
+        'x-value': ['read'],
       },
     },
   };

+ 1 - 1
src/pages/system/Department/Assets/product/bind.tsx

@@ -55,7 +55,7 @@ const Bind = observer((props: Props) => {
     if (Models.bindKeys.length) {
       setPerVisible(true);
     } else {
-      message.warn('请先勾选数据')
+      message.warn('请先勾选数据');
       // props.onCancel();
     }
   };

+ 1 - 1
src/pages/system/Department/Assets/productCategory/bind.tsx

@@ -53,7 +53,7 @@ const Bind = observer((props: Props) => {
     if (Models.bindKeys.length) {
       setPerVisible(true);
     } else {
-      message.warn('请先勾选数据')
+      message.warn('请先勾选数据');
       // props.onCancel();
     }
   };

+ 31 - 19
src/pages/system/Department/index.tsx

@@ -4,7 +4,7 @@ import ProTable from '@jetlinks/pro-table';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { useEffect, useRef, useState } from 'react';
 import { useIntl } from 'umi';
-import { Button, message, Popconfirm, Tooltip, Card, Divider } from 'antd';
+import { Button, message, Popconfirm, Tooltip } from 'antd';
 import {
   EditOutlined,
   PlusOutlined,
@@ -38,9 +38,7 @@ export const State = model<ModelType>({
 export default observer(() => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
-  const [param, setParam] = useState({
-    terms: [{ column: 'typeId', value: 'org' }],
-  });
+  const [param, setParam] = useState({});
 
   /**
    * 根据部门ID删除数据
@@ -73,6 +71,7 @@ export default observer(() => {
         defaultMessage: '排序',
       }),
       search: false,
+      valueType: 'digit',
       dataIndex: 'sortIndex',
     },
     {
@@ -209,21 +208,30 @@ export default observer(() => {
 
   return (
     <PageContainer>
-      <Card>
-        <SearchComponent<DepartmentItem>
-          field={columns}
-          onSearch={async (data) => {
-            setParam({ terms: [...data, { column: 'typeId', value: 'org' }] });
-          }}
-          target="department"
-        />
-      </Card>
-      <Divider />
+      <SearchComponent<DepartmentItem>
+        field={columns}
+        defaultParam={[{ column: 'typeId', value: 'org', termType: 'eq' }]}
+        onSearch={async (data) => {
+          // 重置分页数据
+          actionRef.current?.reset?.();
+          setParam(data);
+        }}
+        onReset={() => {
+          // 重置分页及搜索参数
+          actionRef.current?.reset?.();
+          setParam({});
+        }}
+        target="department"
+      />
       <ProTable<DepartmentItem>
         columns={columns}
         actionRef={actionRef}
         request={async (params) => {
-          const response = await service.queryOrgThree({ paging: false, ...params });
+          const response = await service.queryOrgThree({
+            paging: false,
+            ...params,
+            sorts: [{ name: 'createTime', order: 'desc' }],
+          });
           return {
             code: response.message,
             result: {
@@ -258,10 +266,14 @@ export default observer(() => {
         })}
       />
       <Save<DepartmentItem>
-        title={State.current.parentId ? intl.formatMessage({
-          id: 'pages.system.department.option.add',
-          defaultMessage: '新增子部门'
-        }) : undefined}
+        title={
+          State.current.parentId
+            ? intl.formatMessage({
+                id: 'pages.system.department.option.add',
+                defaultMessage: '新增子部门',
+              })
+            : undefined
+        }
         service={service}
         onCancel={(type) => {
           if (type) {

+ 8 - 4
src/pages/system/Department/save.tsx

@@ -101,10 +101,14 @@ const Save = <T extends object>(props: SaveModalProps<T>) => {
 
   return (
     <Modal
-      title={props.title ? props.title : intl.formatMessage({
-        id: `pages.data.option.${data && 'id' in data ? 'edit' : 'add'}`,
-        defaultMessage: '新增',
-      })}
+      title={
+        props.title
+          ? props.title
+          : intl.formatMessage({
+              id: `pages.data.option.${data && 'id' in data ? 'edit' : 'add'}`,
+              defaultMessage: '新增',
+            })
+      }
       visible={props.visible}
       onOk={saveData}
       onCancel={() => {

+ 2 - 41
src/pages/system/Permission/index.tsx

@@ -121,11 +121,6 @@ const Permission: React.FC = observer(() => {
 
   const columns: ProColumns<PermissionItem>[] = [
     {
-      dataIndex: 'index',
-      valueType: 'indexBorder',
-      width: 48,
-    },
-    {
       title: intl.formatMessage({
         id: 'pages.system.permission.id',
         defaultMessage: '标识',
@@ -134,19 +129,8 @@ const Permission: React.FC = observer(() => {
       copyable: true,
       ellipsis: true,
       align: 'center',
-      sorter: true,
+      // sorter: true,
       defaultSortOrder: 'ascend',
-      formItemProps: {
-        rules: [
-          {
-            required: true,
-            message: '此项为必填项',
-          },
-        ],
-      },
-      search: {
-        transform: (value) => ({ id$LIKE: value }),
-      },
     },
     {
       title: intl.formatMessage({
@@ -157,21 +141,6 @@ const Permission: React.FC = observer(() => {
       copyable: true,
       ellipsis: true,
       align: 'center',
-      tip: intl.formatMessage({
-        id: 'pages.system.permission.name.tip',
-        defaultMessage: '名称过长会自动收缩',
-      }),
-      formItemProps: {
-        rules: [
-          {
-            required: true,
-            message: '此项为必填项',
-          },
-        ],
-      },
-      search: {
-        transform: (value) => ({ name$LIKE: value }),
-      },
     },
     {
       title: intl.formatMessage({
@@ -179,18 +148,10 @@ const Permission: React.FC = observer(() => {
         defaultMessage: '状态',
       }),
       dataIndex: 'status',
-      filters: true,
+      // filters: true,
       align: 'center',
-      onFilter: true,
       valueType: 'select',
       valueEnum: {
-        all: {
-          text: intl.formatMessage({
-            id: 'pages.searchTable.titleStatus.all',
-            defaultMessage: '全部',
-          }),
-          status: 'Default',
-        },
         1: {
           text: intl.formatMessage({
             id: 'pages.searchTable.titleStatus.normal',

+ 12 - 46
src/pages/system/Role/index.tsx

@@ -7,10 +7,6 @@ import BaseCrud from '@/components/BaseCrud';
 import BaseService from '@/utils/BaseService';
 import { useIntl } from '@@/plugin-locale/localeExports';
 import { observer } from '@formily/react';
-// import autzModel from '@/components/Authorization/autz';
-// import Authorization from '@/components/Authorization';
-// import { BindModel } from '@/components/BindUser/model';
-// import BindUser from '@/components/BindUser';
 import { Link, useLocation } from 'umi';
 import { Store } from 'jetlinks-store';
 import SystemConst from '@/utils/const';
@@ -23,11 +19,11 @@ const Role: React.FC = observer(() => {
   const actionRef = useRef<ActionType>();
 
   const columns: ProColumns<RoleItem>[] = [
-    {
-      dataIndex: 'index',
-      valueType: 'indexBorder',
-      width: 48,
-    },
+    // {
+    //   dataIndex: 'index',
+    //   valueType: 'indexBorder',
+    //   width: 48,
+    // },
     {
       title: intl.formatMessage({
         id: 'pages.system.role.id',
@@ -36,8 +32,8 @@ const Role: React.FC = observer(() => {
       dataIndex: 'id',
       copyable: true,
       ellipsis: true,
-      sorter: true,
-      defaultSortOrder: 'ascend',
+      // sorter: true,
+      // defaultSortOrder: 'ascend',
       formItemProps: {
         rules: [
           {
@@ -55,10 +51,10 @@ const Role: React.FC = observer(() => {
       dataIndex: 'name',
       copyable: true,
       ellipsis: true,
-      tip: intl.formatMessage({
-        id: 'pages.system.userName.tips',
-        defaultMessage: '用户名过长会自动收缩',
-      }),
+      // tip: intl.formatMessage({
+      //   id: 'pages.system.userName.tips',
+      //   defaultMessage: '用户名过长会自动收缩',
+      // }),
       formItemProps: {
         rules: [
           {
@@ -186,40 +182,10 @@ const Role: React.FC = observer(() => {
         search={false}
         title={intl.formatMessage({
           id: 'pages.system.role',
-          defaultMessage: '角色管理',
+          defaultMessage: '角色列表',
         })}
         schema={schema}
-        // defaultParams={{ typeId: 'role' }}
       />
-      {/* <Modal
-        visible={BindModel.visible}
-        closable={false}
-        onCancel={() => {
-          BindModel.visible = false;
-          BindModel.bind = false;
-        }}
-        width={BindModel.bind ? '90vw' : '60vw'}
-      >
-        <BindUser />
-      </Modal> */}
-      {/* <Drawer
-        title={intl.formatMessage({
-          id: 'pages.data.option.authorize',
-          defaultMessage: '授权',
-        })}
-        width="70vw"
-        visible={autzModel.visible}
-        onClose={() => {
-          autzModel.visible = false;
-        }}
-      >
-        <Authorization
-          close={() => {
-            autzModel.visible = false;
-          }}
-          target={autzModel.autzTarget}
-        />
-      </Drawer> */}
     </PageContainer>
   );
 });

+ 11 - 6
src/pages/system/User/Save/index.tsx

@@ -5,7 +5,7 @@ import { createForm } from '@formily/core';
 import { createSchemaField } from '@formily/react';
 import React, { useEffect, useState } from 'react';
 import * as ICONS from '@ant-design/icons';
-import { Form, FormItem, Input, Password, Select, Switch } from '@formily/antd';
+import { Form, FormItem, Input, Password, Select, Switch, TreeSelect } from '@formily/antd';
 import type { ISchema } from '@formily/json-schema';
 import { PlusOutlined } from '@ant-design/icons';
 import { action } from '@formily/reactive';
@@ -33,6 +33,7 @@ const Save = (props: Props) => {
     api(field).then(
       action.bound!((resp: Response<any>) => {
         field.dataSource = resp.result?.map((item: Record<string, unknown>) => ({
+          ...item,
           label: item.name,
           value: item.id,
         }));
@@ -43,7 +44,6 @@ const Save = (props: Props) => {
 
   const getUser = async () => {
     if (props.data.id) {
-      console.log('id');
       const response: Response<UserItem> = await service.queryDetail(props.data?.id);
       if (response.status === 200) {
         const temp = response.result as UserItem;
@@ -73,6 +73,7 @@ const Save = (props: Props) => {
       Password,
       Switch,
       Select,
+      TreeSelect,
     },
     scope: {
       icon(name: any) {
@@ -245,12 +246,17 @@ const Save = (props: Props) => {
       orgIdList: {
         title: '部门',
         'x-decorator': 'FormItem',
-        'x-component': 'Select',
+        'x-component': 'TreeSelect',
         'x-component-props': {
-          mode: 'multiple',
+          multiple: true,
           showArrow: true,
           filterOption: (input: string, option: any) =>
             option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
+          fieldNames: {
+            label: 'name',
+            value: 'id',
+          },
+          treeNodeFilterProp: 'name',
         },
         'x-decorator-props': {
           addonAfter: (
@@ -259,7 +265,6 @@ const Save = (props: Props) => {
                 const tab: any = window.open(`${origin}/#/system/department?save=true`);
                 tab!.onTabSaveSuccess = (value: any) => {
                   form.setFieldState('orgIdList', (state) => {
-                    console.log(value, 'value');
                     state.dataSource = state.dataSource?.concat([
                       { label: value.name, value: value.id },
                     ]);
@@ -307,7 +312,7 @@ const Save = (props: Props) => {
       visible={model !== 'query'}
       onCancel={props.close}
       onOk={save}
-      width="30vw"
+      width="35vw"
     >
       <Form form={form} labelCol={4} wrapperCol={18}>
         <SchemaField schema={schema} scope={{ useAsyncDataSource, getRole, getOrg }} />

+ 17 - 12
src/pages/system/User/index.tsx

@@ -3,7 +3,7 @@ import { PageContainer } from '@ant-design/pro-layout';
 import SearchComponent from '@/components/SearchComponent';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import ProTable from '@jetlinks/pro-table';
-import { Button, Card, message, Popconfirm, Tooltip } from 'antd';
+import { Button, message, Popconfirm, Tooltip } from 'antd';
 import {
   CloseCircleOutlined,
   DeleteOutlined,
@@ -176,24 +176,29 @@ const User = observer(() => {
   ];
 
   const [param, setParam] = useState({});
+
   return (
     <PageContainer>
-      <Card style={{ marginBottom: '20px' }}>
-        <SearchComponent
-          field={columns}
-          onSearch={(data) => setParam({ terms: data, total: null })}
-          target="user"
-          onReset={() => {
-            setParam({});
-            actionRef.current?.reset?.();
-          }}
-        />
-      </Card>
+      <SearchComponent<UserItem>
+        field={columns}
+        target="user"
+        onSearch={(data) => {
+          // 重置分页数据
+          actionRef.current?.reset?.();
+          setParam(data);
+        }}
+        // onReset={() => {
+        //   // 重置分页及搜索参数
+        //   actionRef.current?.reset?.();
+        //   setParam({});
+        // }}
+      />
       <ProTable<UserItem>
         actionRef={actionRef}
         params={param}
         columns={columns}
         search={false}
+        headerTitle={'用户列表'}
         request={async (params) =>
           service.query({ ...params, sorts: [{ name: 'createTime', order: 'desc' }] })
         }