Wzyyy98 3 лет назад
Родитель
Сommit
f7a800d288
32 измененных файлов с 168 добавлено и 129 удалено
  1. 1 1
      src/components/AMapComponent/amap.tsx
  2. 1 1
      src/components/Empty/index.tsx
  3. 2 1
      src/components/FTermArrayCards/index.tsx
  4. 2 1
      src/components/Player/ScreenPlayer.tsx
  5. 2 1
      src/components/ProTableCard/index.tsx
  6. 10 7
      src/components/SearchComponent/index.less
  7. 51 46
      src/components/SearchComponent/index.tsx
  8. 12 1
      src/pages/device/Instance/Detail/ChildDevice/index.tsx
  9. 3 1
      src/pages/device/Instance/Detail/Diagnose/Message/index.tsx
  10. 1 1
      src/pages/device/Instance/Detail/Diagnose/Status/DiagnosticAdvice.tsx
  11. 2 1
      src/pages/device/Instance/Detail/EdgeMap/index.tsx
  12. 2 1
      src/pages/device/Instance/Detail/MapChannel/index.tsx
  13. 1 1
      src/pages/device/Instance/Detail/MetadataLog/Property/Charts.tsx
  14. 2 1
      src/pages/device/Instance/Detail/Modbus/index.tsx
  15. 2 1
      src/pages/device/Instance/Detail/Opcua/index.tsx
  16. 2 1
      src/pages/device/Instance/Detail/Running/Property/index.tsx
  17. 2 1
      src/pages/device/Instance/Detail/Running/index.tsx
  18. 2 2
      src/pages/device/Instance/Save/index.tsx
  19. 2 1
      src/pages/device/Product/Detail/Access/index.tsx
  20. 2 1
      src/pages/iot-card/Dashboard/index.tsx
  21. 2 1
      src/pages/link/AccessConfig/Detail/components/Network/index.tsx
  22. 2 1
      src/pages/link/AccessConfig/Detail/components/Protocol/index.tsx
  23. 2 1
      src/pages/media/DashBoard/index.tsx
  24. 3 1
      src/pages/media/Device/Playback/index.tsx
  25. 2 1
      src/pages/media/Device/Save/ProviderSelect.tsx
  26. 2 1
      src/pages/media/Stream/index.tsx
  27. 2 13
      src/pages/notice/Config/SyncUser/index.tsx
  28. 7 5
      src/pages/rule-engine/Alarm/Log/TabComponent/index.tsx
  29. 3 1
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx
  30. 18 16
      src/pages/rule-engine/Scene/Save/action/ListItem/FilterGroup.tsx
  31. 2 0
      src/pages/rule-engine/Scene/Save/terms/branchItem.tsx
  32. 19 16
      src/pages/rule-engine/Scene/Save/terms/term.tsx

+ 1 - 1
src/components/AMapComponent/amap.tsx

@@ -3,7 +3,7 @@ import type { MapProps } from 'react-amap';
 import { Map } from 'react-amap';
 import { getAMapUiPromise } from './APILoader';
 import SystemConst from '@/utils/const';
-import { Empty } from 'antd';
+import { Empty } from '@/components';
 
 interface AMapProps extends Omit<MapProps, 'amapkey' | 'useAMapUI'> {
   style?: React.CSSProperties;

+ 1 - 1
src/components/Empty/index.tsx

@@ -5,7 +5,7 @@ import type { EmptyProps } from 'antd';
 export default (props: EmptyProps) => {
   return (
     <div className={'empty-body'}>
-      <Empty {...props} />
+      <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={'暂无数据'} {...props} />
     </div>
   );
 };

+ 2 - 1
src/components/FTermArrayCards/index.tsx

@@ -1,5 +1,5 @@
 import React from 'react';
-import { Card, Empty } from 'antd';
+import { Card } from 'antd';
 import { CardProps } from 'antd/lib/card';
 import { ArrayField } from '@formily/core';
 import { observer, RecursionField, useField, useFieldSchema } from '@formily/react';
@@ -7,6 +7,7 @@ import cls from 'classnames';
 import { ISchema } from '@formily/json-schema';
 import { usePrefixCls } from '@formily/antd/lib/__builtins__';
 import { ArrayBase, ArrayBaseMixins } from '@formily/antd';
+import { Empty } from '@/components';
 
 type ComposedArrayCards = React.FC<CardProps> & ArrayBaseMixins;
 

+ 2 - 1
src/components/Player/ScreenPlayer.tsx

@@ -1,7 +1,7 @@
 import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
 import classNames from 'classnames';
 import LivePlayer from './index';
-import { Button, Dropdown, Empty, Menu, Popconfirm, Popover, Radio, Tooltip } from 'antd';
+import { Button, Dropdown, Menu, Popconfirm, Popover, Radio, Tooltip } from 'antd';
 import { createSchemaField } from '@formily/react';
 import { Form, FormItem, Input } from '@formily/antd';
 import { useFullscreen } from 'ahooks';
@@ -11,6 +11,7 @@ import Service from './service';
 import MediaTool from '@/components/Player/mediaTool';
 import { createForm } from '@formily/core';
 import { onlyMessage } from '@/utils/util';
+import { Empty } from '@/components';
 
 type Player = {
   id?: string;

+ 2 - 1
src/components/ProTableCard/index.tsx

@@ -3,12 +3,13 @@ import ProTable from '@jetlinks/pro-table';
 import type { ParamsType } from '@ant-design/pro-provider';
 import React, { Key, useCallback, useEffect, useRef, useState } from 'react';
 import { isFunction } from 'lodash';
-import { Empty, Pagination, Space } from 'antd';
+import { Pagination, Space } from 'antd';
 import { AppstoreOutlined, BarsOutlined } from '@ant-design/icons';
 import classNames from 'classnames';
 import LoadingComponent from '@ant-design/pro-layout/es/PageLoading';
 import './index.less';
 import { useDomFullHeight } from '@/hooks';
+import { Empty } from '@/components';
 
 enum ModelEnum {
   TABLE = 'TABLE',

+ 10 - 7
src/components/SearchComponent/index.less

@@ -53,16 +53,19 @@
 
   .history {
     width: 176px;
-
-    .list {
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      width: 148px;
-    }
   }
 }
+.list {
+  display: flex;
+  gap: 4px;
+  align-items: center;
+  justify-content: space-between;
+  width: 148px;
+}
 
+.list-text {
+  flex: 1 1 auto;
+}
 .saveLog {
   width: 100%;
   margin-top: 5px;

+ 51 - 46
src/components/SearchComponent/index.tsx

@@ -24,7 +24,7 @@ import {
   SaveOutlined,
   SearchOutlined,
 } from '@ant-design/icons';
-import { Button, Card, Dropdown, Empty, Menu, Popconfirm, Popover, Typography } from 'antd';
+import { Button, Card, Dropdown, Menu, Popconfirm, Popover, Typography } from 'antd';
 import { useEffect, useMemo, useRef, useState } from 'react';
 import type { ProColumns } from '@jetlinks/pro-table';
 import type { EnumData } from '@/utils/typings';
@@ -35,6 +35,7 @@ import { useIntl } from '@@/plugin-locale/localeExports';
 import classnames from 'classnames';
 import { onlyMessage, randomString } from '@/utils/util';
 import { useHistory, useLocation } from 'umi';
+import { Empty } from '@/components';
 
 const ui2Server = (source: SearchTermsUI): SearchTermsServer => [
   { terms: source.terms1 },
@@ -509,51 +510,6 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
     handleForm(_expand);
   };
 
-  const historyDom = (
-    <Menu className={styles.history}>
-      {history.length > 0 ? (
-        history.map((item: SearchHistory) => (
-          <Menu.Item key={item.id || randomString(9)}>
-            <div className={styles.list}>
-              <Typography.Text
-                ellipsis={{ tooltip: item.name }}
-                onClick={() => handleHistory(item)}
-              >
-                {item.name}
-              </Typography.Text>
-              <Popconfirm
-                title="确定删除嘛"
-                onConfirm={async () => {
-                  const response = await service.history.remove(`${target}-search`, item.key);
-                  if (response.status === 200) {
-                    onlyMessage('操作成功');
-                    const temp = history.filter((h: any) => h.key !== item.key);
-                    setHistory(temp);
-                  }
-                }}
-              >
-                <DeleteOutlined />
-              </Popconfirm>
-            </div>
-          </Menu.Item>
-        ))
-      ) : (
-        <Menu.Item>
-          <div
-            style={{
-              display: 'flex',
-              justifyContent: 'center',
-              alignItems: 'center',
-              width: '148px',
-            }}
-          >
-            <Empty />
-          </div>
-        </Menu.Item>
-      )}
-    </Menu>
-  );
-
   const formatValue = (value: SearchTermsUI): SearchTermsServer => {
     let _value = ui2Server(value);
     // 处理默认查询参数
@@ -678,6 +634,55 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
     }
   }, []);
 
+  const historyDom = (
+    <Menu className={styles.history}>
+      {history.length > 0 ? (
+        history.map((item: SearchHistory) => (
+          <Menu.Item
+            key={item.id || randomString(9)}
+            onClick={() => {
+              handleHistory(item);
+              handleSearch();
+            }}
+          >
+            <div className={styles.list}>
+              <Typography.Text className={styles['list-text']} ellipsis={{ tooltip: item.name }}>
+                {item.name}
+              </Typography.Text>
+              <Popconfirm
+                title="确定删除嘛"
+                onConfirm={async (e) => {
+                  e?.stopPropagation();
+                  const response = await service.history.remove(`${target}-search`, item.key);
+                  if (response.status === 200) {
+                    onlyMessage('操作成功');
+                    const temp = history.filter((h: any) => h.key !== item.key);
+                    setHistory(temp);
+                  }
+                }}
+              >
+                <DeleteOutlined />
+              </Popconfirm>
+            </div>
+          </Menu.Item>
+        ))
+      ) : (
+        <Menu.Item>
+          <div
+            style={{
+              display: 'flex',
+              justifyContent: 'center',
+              alignItems: 'center',
+              width: '148px',
+            }}
+          >
+            <Empty />
+          </div>
+        </Menu.Item>
+      )}
+    </Menu>
+  );
+
   const handleSaveLog = async () => {
     const value = await form.submit<SearchTermsUI>();
     const value2 = await historyForm.submit<{ alias: string }>();

+ 12 - 1
src/pages/device/Instance/Detail/ChildDevice/index.tsx

@@ -105,6 +105,16 @@ const ChildDevice = (props: Props) => {
     },
     {
       title: intl.formatMessage({
+        id: 'pages.table.description',
+        defaultMessage: '说明',
+      }),
+      dataIndex: 'describe',
+      width: '15%',
+      ellipsis: true,
+      // hideInSearch: true,
+    },
+    {
+      title: intl.formatMessage({
         id: 'pages.data.option',
         defaultMessage: '操作',
       }),
@@ -190,7 +200,7 @@ const ChildDevice = (props: Props) => {
           <ProTable<LogItem>
             search={false}
             columns={columns}
-            size="small"
+            // size="small"
             scroll={{ x: 1366 }}
             actionRef={actionRef}
             params={searchParams}
@@ -231,6 +241,7 @@ const ChildDevice = (props: Props) => {
               <Popconfirm
                 key="unbind"
                 onConfirm={async () => {
+                  if (bindKeys.length === 0) return onlyMessage('请先勾选数据!', 'error');
                   const resp = await service.unbindBatchDevice(InstanceModel.detail.id!, bindKeys);
                   if (resp.status === 200) {
                     onlyMessage('操作成功!');

+ 3 - 1
src/pages/device/Instance/Detail/Diagnose/Message/index.tsx

@@ -1,7 +1,7 @@
 import TitleComponent from '@/components/TitleComponent';
 import './index.less';
 import Dialog from './Dialog';
-import { Badge, Button, Col, Empty, Row } from 'antd';
+import { Badge, Button, Col, Row } from 'antd';
 import { useEffect, useMemo, useRef } from 'react';
 import { InstanceModel, service } from '@/pages/device/Instance';
 import useSendWebsocketMessage from '@/hooks/websocket/useSendWebsocketMessage';
@@ -25,6 +25,7 @@ import { DiagnoseStatusModel, messageStatusMap, messageStyleMap } from '../Statu
 import { observer } from '@formily/reactive-react';
 import DiagnoseForm from './form';
 import { model } from '@formily/reactive';
+import { Empty } from '@/components';
 
 export const DiagnoseMessageModel = model<{
   input: any;
@@ -126,6 +127,7 @@ const Message = observer(() => {
 
   useEffect(() => {
     if (DiagnoseStatusModel.state === 'success') {
+      DiagnoseStatusModel.dialogList = [];
       subscribeLog();
     }
   }, [DiagnoseStatusModel.state]);

+ 1 - 1
src/pages/device/Instance/Detail/Diagnose/Status/DiagnosticAdvice.tsx

@@ -29,7 +29,7 @@ const DiagnosticAdvice = (props: Props) => {
         <div className={styles.advice}>
           <div className={styles.alert}>
             <InfoCircleOutlined style={{ marginRight: 10 }} />
-            所有诊断均无异常但设备未上线,请检查以下内容
+            所有诊断均无异常但设备未上线,请检查以下内容
           </div>
           <div style={{ marginLeft: 10 }}>
             {(data?.list || []).map((item: any) => (

+ 2 - 1
src/pages/device/Instance/Detail/EdgeMap/index.tsx

@@ -1,8 +1,9 @@
 import useDomFullHeight from '@/hooks/document/useDomFullHeight';
-import { Card, Empty } from 'antd';
+import { Card } from 'antd';
 import { useEffect, useState } from 'react';
 import MapTable from './mapTable';
 import Service from './service';
+import { Empty } from '@/components';
 
 interface Props {
   data: any;

+ 2 - 1
src/pages/device/Instance/Detail/MapChannel/index.tsx

@@ -1,7 +1,7 @@
 import useDomFullHeight from '@/hooks/document/useDomFullHeight';
 import { createForm, Field, FormPath, onFieldReact } from '@formily/core';
 import { FormProvider, createSchemaField } from '@formily/react';
-import { Badge, Button, Card, Empty, Tooltip } from 'antd';
+import { Badge, Button, Card, Tooltip } from 'antd';
 import { useEffect, useState } from 'react';
 import { FormItem, ArrayTable, Editable, Select } from '@formily/antd';
 import PermissionButton from '@/components/PermissionButton';
@@ -12,6 +12,7 @@ import type { Response } from '@/utils/typings';
 import './index.less';
 import { onlyMessage } from '@/utils/util';
 import ChannelTree from './Tree';
+import { Empty } from '@/components';
 
 interface Props {
   type: 'MODBUS_TCP' | 'OPC_UA';

+ 1 - 1
src/pages/device/Instance/Detail/MetadataLog/Property/Charts.tsx

@@ -1,4 +1,4 @@
-import { Empty } from 'antd';
+import { Empty } from '@/components';
 import * as echarts from 'echarts';
 import _ from 'lodash';
 import { useEffect, useRef } from 'react';

+ 2 - 1
src/pages/device/Instance/Detail/Modbus/index.tsx

@@ -1,7 +1,7 @@
 import { FormItem, ArrayTable, Editable, Select, NumberPicker } from '@formily/antd';
 import { createForm, Field, onFieldReact, FormPath, onFieldChange } from '@formily/core';
 import { FormProvider, createSchemaField } from '@formily/react';
-import { Badge, Card, Empty, Input, Tooltip } from 'antd';
+import { Badge, Card, Input, Tooltip } from 'antd';
 import { action } from '@formily/reactive';
 import type { Response } from '@/utils/typings';
 import './index.less';
@@ -11,6 +11,7 @@ import { service } from '@/pages/link/Channel/Modbus';
 import { useEffect, useState } from 'react';
 import { DisconnectOutlined, QuestionCircleOutlined } from '@ant-design/icons';
 import { onlyMessage } from '@/utils/util';
+import { Empty } from '@/components';
 
 interface Props {
   data: any;

+ 2 - 1
src/pages/device/Instance/Detail/Opcua/index.tsx

@@ -1,7 +1,7 @@
 import { FormItem, ArrayTable, Editable, Select, NumberPicker } from '@formily/antd';
 import { createForm, Field, onFieldReact, FormPath } from '@formily/core';
 import { FormProvider, createSchemaField } from '@formily/react';
-import { Badge, Card, Empty, Input, Tooltip } from 'antd';
+import { Badge, Card, Input, Tooltip } from 'antd';
 import { action } from '@formily/reactive';
 import type { Response } from '@/utils/typings';
 import './index.less';
@@ -11,6 +11,7 @@ import { service } from '@/pages/link/Channel/Opcua';
 import { useEffect, useState } from 'react';
 import { DisconnectOutlined, QuestionCircleOutlined } from '@ant-design/icons';
 import { onlyMessage } from '@/utils/util';
+import { Empty } from '@/components';
 
 interface Props {
   data: any;

+ 2 - 1
src/pages/device/Instance/Detail/Running/Property/index.tsx

@@ -1,4 +1,4 @@
-import { Col, Empty, Input, Pagination, Row, Space, Spin, Table, Tooltip } from 'antd';
+import { Col, Input, Pagination, Row, Space, Spin, Table, Tooltip } from 'antd';
 import CheckButton from '@/components/CheckButton';
 import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
 import type { PropertyMetadata } from '@/pages/device/Product/typings';
@@ -20,6 +20,7 @@ import { groupBy, throttle, toArray } from 'lodash';
 import PropertyTable from './PropertyTable';
 import { onlyMessage } from '@/utils/util';
 import Indicators from './Indicators';
+import { Empty } from '@/components';
 
 interface Props {
   data: Partial<PropertyMetadata>[];

+ 2 - 1
src/pages/device/Instance/Detail/Running/index.tsx

@@ -1,11 +1,12 @@
 import { InstanceModel } from '@/pages/device/Instance';
-import { Card, Empty, Input, Tabs } from 'antd';
+import { Card, 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';
 import { useEffect, useState } from 'react';
 import Emptys from '@/pages/device/components/Empty';
 import { useDomFullHeight } from '@/hooks';
+import { Empty } from '@/components';
 
 const Running = () => {
   const metadata = JSON.parse((InstanceModel.detail?.metadata || '{}') as string) as DeviceMetadata;

+ 2 - 2
src/pages/device/Instance/Save/index.tsx

@@ -245,11 +245,11 @@ const Save = (props: Props) => {
         </Row>
         <Row>
           <Col span={24}>
-            <Form.Item label={intlFormat('pages.table.description', '说明')} name={'description'}>
+            <Form.Item label={intlFormat('pages.table.description', '说明')} name={'describe'}>
               <Input.TextArea
                 placeholder={
                   intlFormat('pages.form.tip.input', '请输入') +
-                  intlFormat('pages.table.description', '说明')
+                  intlFormat('pages.table.describe', '说明')
                 }
                 rows={4}
                 style={{ width: '100%' }}

+ 2 - 1
src/pages/device/Product/Detail/Access/index.tsx

@@ -1,4 +1,4 @@
-import { Badge, Button, Col, Empty, Row, Table, Tooltip } from 'antd';
+import { Badge, Button, Col, Row, Table, Tooltip } from 'antd';
 import { service } from '@/pages/link/AccessConfig';
 import { productModel, service as productService } from '@/pages/device/Product';
 import styles from './index.less';
@@ -28,6 +28,7 @@ import Driver from 'driver.js';
 import 'driver.js/dist/driver.min.css';
 import './index.less';
 import { Ellipsis, PermissionButton } from '@/components';
+import { Empty } from '@/components';
 
 const componentMap = {
   string: 'Input',

+ 2 - 1
src/pages/iot-card/Dashboard/index.tsx

@@ -1,6 +1,6 @@
 import DashBoard, { DashBoardTopCard } from '@/components/DashBoard';
 import Echarts from '@/components/DashBoard/echarts';
-import { DatePicker, Progress, Empty } from 'antd';
+import { DatePicker, Progress } from 'antd';
 import moment from 'moment';
 import styles from './index.less';
 import { PageContainer } from '@ant-design/pro-layout';
@@ -8,6 +8,7 @@ import { useEffect, useRef, useState } from 'react';
 import { service } from '@/pages/iot-card/CardManagement';
 import type { EChartsOption } from 'echarts';
 import classNames from 'classnames';
+import { Empty } from '@/components';
 
 const DefaultEchartsOptions: any = {
   yAxis: {

+ 2 - 1
src/pages/link/AccessConfig/Detail/components/Network/index.tsx

@@ -1,6 +1,6 @@
 import styles from './index.less';
 import { CheckOutlined, InfoCircleOutlined } from '@ant-design/icons';
-import { Badge, Button, Card, Col, Empty, Input, Row, Tooltip } from 'antd';
+import { Badge, Button, Card, Col, Input, Row, Tooltip } from 'antd';
 import encodeQuery from '@/utils/encodeQuery';
 import { Ellipsis, PermissionButton } from '@/components';
 import { getButtonPermission, getMenuPathByCode, MENUS_CODE } from '@/utils/menu';
@@ -10,6 +10,7 @@ import { service } from '@/pages/link/AccessConfig';
 import { NetworkTypeMapping, descriptionList } from '@/pages/link/AccessConfig/Detail/data';
 import { onlyMessage } from '@/utils/util';
 import { Store } from 'jetlinks-store';
+import { Empty } from '@/components';
 
 interface Props {
   next: (data: string) => void;

+ 2 - 1
src/pages/link/AccessConfig/Detail/components/Protocol/index.tsx

@@ -1,5 +1,5 @@
 import { getButtonPermission, getMenuPathByCode, MENUS_CODE } from '@/utils/menu';
-import { Button, Card, Col, Empty, Input, Row, Space, Tooltip } from 'antd';
+import { Button, Card, Col, Input, Row, Space, Tooltip } from 'antd';
 import { useEffect, useState } from 'react';
 import { service } from '@/pages/link/AccessConfig';
 import styles from './index.less';
@@ -10,6 +10,7 @@ import { CheckOutlined, InfoCircleOutlined } from '@ant-design/icons';
 import classNames from 'classnames';
 import { Store } from 'jetlinks-store';
 import encodeQuery from '@/utils/encodeQuery';
+import { Empty } from '@/components';
 
 interface Props {
   provider: any;

+ 2 - 1
src/pages/media/DashBoard/index.tsx

@@ -144,9 +144,10 @@ export default () => {
           // minInterval: 1,
         },
         grid: {
-          left: '80px',
+          left: 50,
           right: 0,
           top: '2%',
+          bottom: 20,
         },
         color: ['#2F54EB'],
         series: [

+ 3 - 1
src/pages/media/Device/Playback/index.tsx

@@ -2,7 +2,7 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import LivePlayer from '@/components/Player';
 import { useCallback, useEffect, useRef, useState } from 'react';
-import { Calendar, Empty, List, Spin, Tooltip } from 'antd';
+import { Calendar, List, Spin, Tooltip } from 'antd';
 import { useLocation } from 'umi';
 import Service from './service';
 import './index.less';
@@ -10,6 +10,8 @@ import { recordsItemType } from '@/pages/media/Device/Playback/typings';
 import type { Moment } from 'moment';
 import * as moment from 'moment';
 import classNames from 'classnames';
+import { Empty } from '@/components';
+
 import {
   CloudDownloadOutlined,
   DownloadOutlined,

+ 2 - 1
src/pages/media/Device/Save/ProviderSelect.tsx

@@ -1,5 +1,5 @@
 import classNames from 'classnames';
-import { Badge, Button, Empty } from 'antd';
+import { Badge, Button } from 'antd';
 import { StatusColorEnum } from '@/components/BadgeStatus';
 import styles from '@/pages/link/AccessConfig/index.less';
 import { TableCard } from '@/components';
@@ -11,6 +11,7 @@ import { useCallback, useEffect, useRef, useState } from 'react';
 import { getMenuPathByCode, MENUS_CODE } from '@/utils/menu';
 import { useRequest } from '@@/plugin-request/request';
 import { CheckOutlined } from '@ant-design/icons';
+import { Empty } from '@/components';
 
 interface ProviderProps {
   value?: string;

+ 2 - 1
src/pages/media/Stream/index.tsx

@@ -1,7 +1,7 @@
 import { PageContainer } from '@ant-design/pro-layout';
 import SearchComponent from '@/components/SearchComponent';
 import type { ProColumns } from '@jetlinks/pro-table';
-import { Card, Col, Empty, Pagination, Row } from 'antd';
+import { Card, Col, Pagination, Row } from 'antd';
 import { useEffect, useState } from 'react';
 import Service from '@/pages/media/Stream/service';
 import { getMenuPathByParams, MENUS_CODE } from '@/utils/menu';
@@ -19,6 +19,7 @@ import { PermissionButton } from '@/components';
 import { useDomFullHeight } from '@/hooks';
 import StreamCard from '@/components/ProTableCard/CardItems/Stream';
 import { onlyMessage } from '@/utils/util';
+import { Empty } from '@/components';
 
 export const service = new Service('media/server');
 

+ 2 - 13
src/pages/notice/Config/SyncUser/index.tsx

@@ -1,16 +1,4 @@
-import {
-  Badge,
-  Button,
-  Col,
-  Empty,
-  Input,
-  Modal,
-  Popconfirm,
-  Row,
-  Spin,
-  Tooltip,
-  Tree,
-} from 'antd';
+import { Badge, Button, Col, Input, Modal, Popconfirm, Row, Spin, Tooltip, Tree } from 'antd';
 import { observer } from '@formily/react';
 import { service, state } from '..';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
@@ -20,6 +8,7 @@ import { history, useLocation } from 'umi';
 import { DisconnectOutlined, EditOutlined } from '@ant-design/icons';
 import BindUser from '../BindUser';
 import { onlyMessage } from '@/utils/util';
+import { Empty } from '@/components';
 
 const SyncUser = observer(() => {
   const [dept, setDept] = useState<string>();

+ 7 - 5
src/pages/rule-engine/Alarm/Log/TabComponent/index.tsx

@@ -1,7 +1,7 @@
 import SearchComponent from '@/components/SearchComponent';
 import { FileFilled, FileTextFilled, ToolFilled } from '@ant-design/icons';
 import type { ProColumns } from '@jetlinks/pro-table';
-import { Badge, Button, Card, Col, Empty, Pagination, Row, Tooltip } from 'antd';
+import { Badge, Button, Card, Col, Pagination, Row, Tooltip } from 'antd';
 import { useEffect, useState } from 'react';
 import './index.less';
 import SolveComponent from '../SolveComponent';
@@ -15,7 +15,7 @@ import { useHistory } from 'umi';
 import classNames from 'classnames';
 import { useDomFullHeight } from '@/hooks';
 import PermissionButton from '@/components/PermissionButton';
-import { Ellipsis } from '@/components';
+import { Ellipsis, Empty } from '@/components';
 import { Store } from 'jetlinks-store';
 
 interface Props {
@@ -334,8 +334,8 @@ const TabComponent = observer((props: Props) => {
         />
       )}
 
-      <Card bordered={false}>
-        <div className="alarm-log-card" style={{ minHeight, position: 'relative' }}>
+      <Card bordered={false} style={{ minHeight, position: 'relative' }} className={'alarmLog'}>
+        <div className="alarm-log-card">
           <div style={{ height: '100%', paddingBottom: 48 }}>
             {dataSource?.data.length ? (
               <>
@@ -456,7 +456,9 @@ const TabComponent = observer((props: Props) => {
                 </div>
               </>
             ) : (
-              <Empty style={{ marginTop: '10%' }} />
+              <div style={{ height: minHeight - 150 }}>
+                <Empty />
+              </div>
             )}
           </div>
         </div>

+ 3 - 1
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx

@@ -1,6 +1,6 @@
 import ParamsSelect, { ItemProps } from '@/pages/rule-engine/Scene/Save/components/ParamsSelect';
 import { useEffect, useState } from 'react';
-import { Empty, Input, InputNumber, Select, Tree } from 'antd';
+import { Input, InputNumber, Select, Tree } from 'antd';
 import MTimePicker from '../../../components/ParamsSelect/components/MTimePicker';
 import moment from 'moment';
 import { EditOutlined, EnvironmentOutlined } from '@ant-design/icons';
@@ -11,6 +11,8 @@ import { BuiltInParamsHandleTreeData } from '@/pages/rule-engine/Scene/Save/comp
 import { queryBuiltInParams } from '@/pages/rule-engine/Scene/Save/action/service';
 import { observer } from '@formily/reactive-react';
 import DeviceModel from '../model';
+import { Empty } from '@/components';
+
 interface Props {
   value: any;
   type: string;

+ 18 - 16
src/pages/rule-engine/Scene/Save/action/ListItem/FilterGroup.tsx

@@ -16,6 +16,7 @@ interface TermsProps {
   branchesName: number;
   branchGroup: number;
   isLast: boolean;
+  isFirst: boolean;
   label?: any;
   paramsOptions: any[];
   actionColumns: any[];
@@ -53,6 +54,22 @@ export default observer((props: TermsProps) => {
   return (
     <div className="terms-params">
       <div className="terms-params-warp">
+        {!props.isFirst && (
+          <div className="term-type-warp">
+            <DropdownButton
+              options={[
+                { title: '并且', key: 'and' },
+                { title: '或者', key: 'or' },
+              ]}
+              isTree={false}
+              type="type"
+              value={props.data.type}
+              onChange={(v) => {
+                props.data.type = v;
+              }}
+            />
+          </div>
+        )}
         <div
           className="terms-params-content"
           onMouseOver={() => {
@@ -187,22 +204,7 @@ export default observer((props: TermsProps) => {
             </div>
           </Popconfirm>
         </div>
-        {!props.isLast ? (
-          <div className="term-type-warp">
-            <DropdownButton
-              options={[
-                { title: '并且', key: 'and' },
-                { title: '或者', key: 'or' },
-              ]}
-              isTree={false}
-              type="type"
-              value={props.data.type}
-              onChange={(v) => {
-                props.data.type = v;
-              }}
-            />
-          </div>
-        ) : (
+        {!props.isLast && (
           <div className="terms-group-add" onClick={props.onAddGroup}>
             <div className="terms-content">
               <PlusOutlined style={{ fontSize: 12, paddingRight: 4 }} />

+ 2 - 0
src/pages/rule-engine/Scene/Save/terms/branchItem.tsx

@@ -106,6 +106,7 @@ export default observer((props: BranchesItemProps) => {
                       name={dIndex}
                       data={item}
                       key={item.key}
+                      isFirst={dIndex === 0}
                       paramsOptions={props.paramsOptions}
                       isLast={dIndex === when!.length - 1}
                       onValueChange={(data) => {
@@ -116,6 +117,7 @@ export default observer((props: BranchesItemProps) => {
                       }}
                       onDelete={() => {
                         FormModel.current.branches![props.name].when.splice(dIndex, 1);
+                        FormModel.current.options?.when[props.name].terms?.splice(dIndex, 1);
                       }}
                     />
                   ))

+ 19 - 16
src/pages/rule-engine/Scene/Save/terms/term.tsx

@@ -20,6 +20,7 @@ interface TermsProps {
   onValueChange: (data: TermsType) => void;
   onLabelChange: (label: any) => void;
   onDelete: () => void;
+  isFirst: boolean;
 }
 
 export default observer((props: TermsProps) => {
@@ -52,6 +53,22 @@ export default observer((props: TermsProps) => {
   return (
     <div className="terms-params">
       <div className="terms-params-warp">
+        {!props.isFirst && (
+          <div className="term-type-warp">
+            <DropdownButton
+              options={[
+                { title: '并且', key: 'and' },
+                { title: '或者', key: 'or' },
+              ]}
+              isTree={false}
+              type="type"
+              value={props.data.type}
+              onChange={(v) => {
+                props.data.type = v;
+              }}
+            />
+          </div>
+        )}
         <div
           className="terms-params-content"
           onMouseOver={() => {
@@ -126,6 +143,7 @@ export default observer((props: TermsProps) => {
                     }
                     onDelete={() => {
                       terms.splice(index, 1);
+                      FormModel.current.options?.when[props.whenName]?.terms?.splice(index, 1);
                       // setTerms([...terms]);
                       // props.onValueChange({
                       //   terms: terms,
@@ -177,22 +195,7 @@ export default observer((props: TermsProps) => {
             </div>
           </Popconfirm>
         </div>
-        {!props.isLast ? (
-          <div className="term-type-warp">
-            <DropdownButton
-              options={[
-                { title: '并且', key: 'and' },
-                { title: '或者', key: 'or' },
-              ]}
-              isTree={false}
-              type="type"
-              value={props.data.type}
-              onChange={(v) => {
-                props.data.type = v;
-              }}
-            />
-          </div>
-        ) : (
+        {props.isLast && (
           <div className="terms-group-add" onClick={addTerms}>
             <div className="terms-content">
               <PlusOutlined style={{ fontSize: 12, paddingRight: 4 }} />