소스 검색

fix: 合并冲突

sun-chaochao 3 년 전
부모
커밋
b618a097f0

+ 25 - 9
src/app.tsx

@@ -15,6 +15,7 @@ import SystemConst from '@/utils/const';
 import { service as MenuService } from '@/pages/system/Menu';
 import getRoutes, { extraRouteArr, getMenus, handleRoutes, saveMenusCache } from '@/utils/menu';
 import { AIcon } from '@/components';
+import React from 'react';
 
 const isDev = process.env.NODE_ENV === 'development';
 const loginPath = '/user/login';
@@ -198,6 +199,23 @@ export const request: RequestConfig = {
   requestInterceptors: [requestInterceptor],
 };
 
+const MenuItemIcon = (
+  menuItemProps: any,
+  defaultDom: React.ReactNode,
+  props: any,
+): React.ReactNode => {
+  if (defaultDom) {
+    // @ts-ignore
+    const menuItem = React.cloneElement(defaultDom, {
+      // @ts-ignore
+      children: [<AIcon type={menuItemProps.icon as string} />, defaultDom.props.children[1]],
+      ...props,
+    });
+    return menuItem;
+  }
+  return defaultDom;
+};
+
 // ProLayout 支持的api https://procomponents.ant.design/components/layout
 export const layout: RunTimeLayoutConfig = ({ initialState }) => {
   // console.log({ ...initialState });
@@ -224,15 +242,13 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => {
     menuDataRender: () => {
       return getMenus(extraRoutes);
     },
-    menuItemRender: (menuItemProps) => {
-      return (
-        <Link to={menuItemProps.path}>
-          <span className={`antd-pro-menu-item`}>
-            {menuItemProps.icon && <AIcon type={menuItemProps.icon as string} />}
-            <span className={`antd-pro-menu-item-title`}>{menuItemProps.name}</span>
-          </span>
-        </Link>
-      );
+    subMenuItemRender: MenuItemIcon,
+    menuItemRender: (menuItemProps, defaultDom) => {
+      return MenuItemIcon(menuItemProps, defaultDom, {
+        onClick: () => {
+          history.push(menuItemProps.path!);
+        },
+      });
     },
     links: isDev
       ? [

+ 2 - 16
src/pages/Log/Access/index.tsx

@@ -72,7 +72,6 @@ const Access = () => {
       valueType: 'dateTime',
       defaultSortOrder: 'descend',
       ellipsis: true,
-      width: 200,
       renderText: (text: string) => moment(text).format('YYYY-MM-DD HH:mm:ss'),
     },
     {
@@ -80,7 +79,7 @@ const Access = () => {
         id: 'pages.log.access.requestTimeConsuming',
         defaultMessage: '请求耗时',
       }),
-      width: 80,
+      width: 100,
       renderText: (record: AccessLogItem) => (
         <Tag color="purple">{record.responseTime - record.requestTime}ms</Tag>
       ),
@@ -91,20 +90,7 @@ const Access = () => {
         defaultMessage: '请求用户',
       }),
       dataIndex: 'username',
-      render: (text, record: any) => (
-        <Tag color="geekblue">{record?.context?.username || '--'}</Tag>
-      ),
-    },
-    {
-      title: intl.formatMessage({
-        id: 'pages.table.description',
-        defaultMessage: '说明',
-      }),
-      dataIndex: 'describe',
-      ellipsis: true,
-      // render: (text, record) => {
-      //   return `${record.action}-${record.describe}`;
-      // },
+      render: (text, record: any) => <Tag color="geekblue">{record?.context?.username || ''}</Tag>,
     },
     {
       title: intl.formatMessage({

+ 21 - 4
src/pages/account/NotificationSubscription/save/index.tsx

@@ -6,6 +6,7 @@ import type { ISchema } from '@formily/react';
 import { createSchemaField } from '@formily/react';
 import { useAsyncDataSource } from '@/utils/util';
 import { service } from '@/pages/account/NotificationSubscription';
+import _ from 'lodash';
 
 interface Props {
   data: Partial<NotifitionSubscriptionItem>;
@@ -14,11 +15,19 @@ interface Props {
 }
 
 const Save = (props: Props) => {
-  const [data, setDada] = useState<Partial<NotifitionSubscriptionItem>>(props.data || {});
+  const [data, setDada] = useState<any>(props.data || {});
   const [dataList, setDataList] = useState<any[]>([]);
 
   useEffect(() => {
-    setDada(props.data);
+    if (props.data?.topicConfig) {
+      setDada({
+        ...props.data,
+        topicConfig: {
+          alarmConfigId: props.data?.topicConfig?.alarmConfigId.split(','),
+          alarmConfigName: props.data?.topicConfig?.alarmConfigName.split(','),
+        },
+      });
+    }
   }, [props.data]);
 
   const form = useMemo(
@@ -97,6 +106,7 @@ const Save = (props: Props) => {
           },
           'topicConfig.alarmConfigId': {
             title: '告警规则',
+            type: 'array',
             'x-component': 'Select',
             'x-decorator': 'FormItem',
             required: true,
@@ -106,7 +116,11 @@ const Save = (props: Props) => {
               layout: 'vertical',
             },
             'x-component-props': {
+              mode: 'multiple',
+              showArrow: true,
               placeholder: '请选择告警规则',
+              filterOption: (input: string, option: any) =>
+                option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
             },
             'x-reactions': ['{{useAsyncDataSource(queryAlarmConfigList)}}'],
             'x-validator': [
@@ -168,13 +182,16 @@ const Save = (props: Props) => {
   const handleSave = async () => {
     let param: any = await form.submit();
     delete param.notice;
-    const config = dataList.find((item) => item?.value === param?.topicConfig?.alarmConfigId);
+    const config = dataList.filter((item) =>
+      param?.topicConfig?.alarmConfigId.includes(item?.value),
+    );
     param = {
       ...data,
       ...param,
       topicConfig: {
         ...param?.topicConfig,
-        alarmConfigName: config.label || '',
+        alarmConfigId: param?.topicConfig.alarmConfigId.join(','),
+        alarmConfigName: _.map(config, 'label').join(','),
       },
     };
     const response: any = await service.saveData(param);

+ 29 - 15
src/pages/device/Instance/Detail/Running/index.tsx

@@ -1,5 +1,5 @@
 import { InstanceModel } from '@/pages/device/Instance';
-import { Card, Input, Tabs } from 'antd';
+import { Card, Empty, Input, Tabs } from 'antd';
 import type { DeviceMetadata } from '@/pages/device/Product/typings';
 import Property from '@/pages/device/Instance/Detail/Running/Property';
 import Event from '@/pages/device/Instance/Detail/Running/Event';
@@ -33,21 +33,35 @@ const Running = () => {
 
   return (
     <Card>
-      <Tabs
-        defaultActiveKey="1"
-        tabPosition="left"
-        style={{ minHeight: 600 }}
-        tabBarExtraContent={{ left: operations() }}
-      >
-        <Tabs.TabPane tab="属性" key="1">
-          <Property data={metadata?.properties || []} />
-        </Tabs.TabPane>
-        {list?.map((item) => (
-          <Tabs.TabPane tab={item.name} key={item.id}>
-            <Event data={item} />
+      {list?.length === 0 && (metadata?.properties || [])?.length === 0 ? (
+        <div
+          style={{
+            height: 480,
+            display: 'flex',
+            alignItems: 'center',
+            width: '100%',
+            justifyContent: 'center',
+          }}
+        >
+          <Empty />
+        </div>
+      ) : (
+        <Tabs
+          defaultActiveKey="1"
+          tabPosition="left"
+          style={{ minHeight: 600 }}
+          tabBarExtraContent={{ left: operations() }}
+        >
+          <Tabs.TabPane tab="属性" key="1">
+            <Property data={metadata?.properties || []} />
           </Tabs.TabPane>
-        ))}
-      </Tabs>
+          {list?.map((item) => (
+            <Tabs.TabPane tab={item.name} key={item.id}>
+              <Event data={item} />
+            </Tabs.TabPane>
+          ))}
+        </Tabs>
+      )}
     </Card>
   );
 };

+ 14 - 9
src/pages/device/Product/Detail/Access/index.tsx

@@ -25,6 +25,7 @@ const Access = () => {
   const [config, setConfig] = useState<any>();
   const [access, setAccess] = useState<any>();
   const { permission } = usePermissions('link/AccessConfig');
+  const [dataSource, setDataSource] = useState<any[]>([]);
 
   const MetworkTypeMapping = new Map();
   MetworkTypeMapping.set('websocket-server', 'WEB_SOCKET_SERVER');
@@ -204,6 +205,11 @@ const Access = () => {
         productModel.current?.messageProtocol || '',
         productModel.current?.transportProtocol || '',
       );
+      service.getProviders().then((resp) => {
+        if (resp.status === 200) {
+          setDataSource(resp.result);
+        }
+      });
     }
   }, [productModel.current]);
 
@@ -386,16 +392,19 @@ const Access = () => {
                     </span>
                   }
                 />
-                <div className={styles.context}>{access?.name || '--'}</div>
-                <div className={styles.context}>{access?.description || '--'}</div>
+                <div className={styles.context}>{access?.name}</div>
+                <div className={styles.context}>
+                  {access?.description ||
+                    dataSource.find((item) => item?.id === access?.provider)?.description}
+                </div>
               </div>
 
               <div className={styles.item}>
                 <TitleComponent data={'消息协议'} />
-                <div className={styles.context}>{access?.protocolDetail?.name || '--'}</div>
+                <div className={styles.context}>{access?.protocolDetail?.name}</div>
                 {config?.document && (
                   <div className={styles.context}>
-                    <ReactMarkdown>{config?.document || '--'}</ReactMarkdown>
+                    <ReactMarkdown>{config?.document}</ReactMarkdown>
                   </div>
                 )}
               </div>
@@ -404,11 +413,7 @@ const Access = () => {
                 {(access?.channelInfo?.addresses || []).length > 0
                   ? (access?.channelInfo?.addresses || []).map((item: any) => (
                       <div key={item.address}>
-                        <Badge
-                          color={item.health === -1 ? 'red' : 'green'}
-                          text={item.address}
-                          style={{ marginLeft: '20px' }}
-                        />
+                        <Badge color={item.health === -1 ? 'red' : 'green'} text={item.address} />
                       </div>
                     ))
                   : '暂无连接信息'}

+ 4 - 7
src/pages/device/Product/Detail/index.tsx

@@ -208,6 +208,10 @@ const ProductDetail = observer(() => {
   ];
 
   useEffect(() => {
+    const { state } = location;
+    if (state && state?.tab) {
+      setMode(state?.tab);
+    }
     if ((location as any).query?.key) {
       setMode((location as any).query?.key || 'base');
     }
@@ -218,13 +222,6 @@ const ProductDetail = observer(() => {
       }
     });
     return () => subscription.unsubscribe();
-  }, []);
-
-  useEffect(() => {
-    const { state } = location;
-    if (state && state?.tab) {
-      setMode(state?.tab);
-    }
   }, [location]);
 
   return (

+ 1 - 1
src/pages/system/DataSource/Save/index.tsx

@@ -159,7 +159,7 @@ const Save = (props: Props) => {
               gridSpan: 2,
             },
             'x-component-props': {
-              placeholder: '请输入接地址,示例:localhost:5672',
+              placeholder: '请输入接地址,示例:localhost:5672',
             },
             'x-validator': [
               {

+ 10 - 2
src/pages/system/DataSource/index.tsx

@@ -189,8 +189,16 @@ const DataSource = observer(() => {
         >
           <Popconfirm
             onConfirm={async () => {
-              await service.remove(record.id);
-              actionRef.current?.reload();
+              const resp: any = await service.remove(record.id);
+              if (resp.status === 200) {
+                message.success(
+                  intl.formatMessage({
+                    id: 'pages.data.option.success',
+                    defaultMessage: '操作成功!',
+                  }),
+                );
+                actionRef.current?.reload();
+              }
             }}
             title="确认删除?"
           >