Browse Source

fix: bug#10264、10420、10476、10913

xieyonghong 2 years atrás
parent
commit
44062ca8d2

+ 1 - 0
package.json

@@ -96,6 +96,7 @@
     "react-json-view": "^1.21.3",
     "react-markdown": "^8.0.0",
     "react-monaco-editor": "^0.46.0",
+    "resize-observer-polyfill": "^1.5.1",
     "rxjs": "^7.2.0",
     "rxjs-websockets": "8",
     "umi": "^3.5.0",

+ 2 - 2
src/components/FRuleEditor/Advance/index.tsx

@@ -4,7 +4,7 @@ import Operator from '../Operator';
 import styles from './index.less';
 import Editor from '@/components/FRuleEditor/Editor';
 import { useRef, useState } from 'react';
-import { Store } from 'jetlinks-store';
+import {EventEmitter} from "@/components/FRuleEditor/util";
 
 interface Props {
   model: 'advance' | 'simple';
@@ -26,7 +26,7 @@ const Advance = (props: Props) => {
       title="设置属性规则"
       onCancel={() => onChange('simple')}
       onOk={() => {
-        Store.set('rule-editor-value', cacheRef.current);
+        EventEmitter.set('rule-editor-value', cacheRef.current);
         onChange('simple');
       }}
       // okButtonProps={{

+ 6 - 4
src/components/FRuleEditor/Editor/index.tsx

@@ -5,8 +5,8 @@ import { monaco } from 'react-monaco-editor';
 import { JMonacoEditor } from '@/components/FMonacoEditor';
 import { useCallback, useEffect, useRef, useState } from 'react';
 import type * as monacoEditor from 'monaco-editor';
-import { Store } from 'jetlinks-store';
 import { State } from '@/components/FRuleEditor';
+import {EventEmitter} from "@/components/FRuleEditor/util";
 
 const symbolList = [
   {
@@ -102,11 +102,13 @@ const Editor = (props: Props) => {
   };
 
   useEffect(() => {
+    console.log('props.value', props.value)
     setValue(props.value);
   }, [props.value]);
 
   const handleInsertCode = useCallback(
     (_value: string) => {
+      console.log(_value)
       const editor = editorRef.current;
       if (!editor || !_value) return;
       const position = editor.getPosition()!;
@@ -129,9 +131,9 @@ const Editor = (props: Props) => {
   useEffect(() => {
     let subscription: any = null;
     if (props.mode === 'advance') {
-      subscription = Store.subscribe('add-operator-value', handleInsertCode);
+      subscription = EventEmitter.subscribe('add-operator-value', handleInsertCode);
     }
-    return () => subscription?.unsubscribe();
+    return () => subscription?.unsubscribe('add-operator-value', handleInsertCode);
   }, [props.mode]);
 
   return (
@@ -208,7 +210,7 @@ const Editor = (props: Props) => {
             setValue(c);
             if (props.mode !== 'advance') {
               State.code = c;
-              Store.set('rule-editor-value', State.code);
+              EventEmitter.set('rule-editor-value', State.code);
             }
             props.onValueChange?.(c);
           }}

+ 5 - 3
src/components/FRuleEditor/index.tsx

@@ -3,7 +3,7 @@ import Editor from '@/components/FRuleEditor/Editor';
 import { model } from '@formily/reactive';
 import { observer } from '@formily/react';
 import { useEffect } from 'react';
-import { Store } from 'jetlinks-store';
+import {EventEmitter} from "@/components/FRuleEditor/util";
 
 export const State = model<{
   model: 'simple' | 'advance';
@@ -29,14 +29,16 @@ interface Props {
 
 const FRuleEditor = observer((props: Props) => {
   const { value, onChange, property, virtualRule } = props;
+  console.log(virtualRule)
   useEffect(() => {
     // console.log(value, 111111111);
     State.property = property;
-    const subscription = Store.subscribe('rule-editor-value', onChange);
+    const subscription = EventEmitter.subscribe('rule-editor-value', onChange);
     State.code = value;
     return () => {
+      console.log('unsubscribe')
+      subscription.unsubscribe('rule-editor-value', onChange);
       State.code = '';
-      subscription.unsubscribe();
     };
   }, []);
   return (

+ 41 - 0
src/components/FRuleEditor/util.ts

@@ -0,0 +1,41 @@
+import {isArray} from "lodash";
+
+export const EventEmitter = {
+  list: {},
+  subscribe: function(events: string[] | string, fn: Function) {
+    const list = this.list
+    const _events = isArray(events) ? events : [events]
+    _events.forEach(event => {
+      (list[event] || (list[event] = [])).push(fn)
+    })
+    return this
+  },
+  set: function(events:string, data?: any) {
+    const list = this.list
+    const fns: Function[] = list[events] ? [...list[events]] : []
+    console.log(events, fns)
+    if (!fns.length) return false;
+
+    fns.forEach(fn => {
+      fn(data)
+    })
+
+    return this
+  },
+  unsubscribe: function(events: string[] |string, fn: Function) {
+    const list = this.list
+    const _events = isArray(events) ? events : [events]
+    _events.forEach(key => {
+      if (key in list) {
+        const fns = list[key]
+        for (let i = 0; i < fns.length; i++) {
+          if (fns[i] === fn) {
+            fns.splice(i, 1)
+            break;
+          }
+        }
+      }
+    })
+    return this
+  }
+}

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

@@ -12,6 +12,7 @@ interface Props {
   onChange: (value: any) => void;
   placeholder: string;
   beforeUpload: any;
+  showUploadList: boolean
 }
 
 const FUpload = connect((props: Props) => {
@@ -46,7 +47,7 @@ const FUpload = connect((props: Props) => {
       progress={{
         format: (percent) => percent && `${parseFloat(percent.toFixed(2))}%`,
       }}
-      showUploadList={{
+      showUploadList={props.showUploadList !== undefined ? props.showUploadList : {
         removeIcon: (
           <DeleteOutlined
             onClick={() => {

+ 22 - 16
src/hooks/document/useDomFullHeight.tsx

@@ -1,5 +1,6 @@
 import type { MutableRefObject } from 'react';
-import { useEffect, useState } from 'react';
+import {useEffect, useRef, useState} from 'react';
+import ResizeObserver from 'resize-observer-polyfill';
 
 type TargetValue<T> = T | undefined | null;
 
@@ -29,30 +30,35 @@ const getTargetElement = <T extends TargetType>(target: BasicTarget<T> | string)
 
 const useDomFullHeight = (target: BasicTarget | string, extraHeight: number = 0) => {
   const [state, setState] = useState(100);
+  const resizeObserver = useRef<ResizeObserver | undefined>()
+
+  const cleanup = () => {
+    if (resizeObserver.current) {
+      resizeObserver.current?.disconnect()
+      resizeObserver.current = undefined
+    }
+  }
 
   useEffect(() => {
     const el = getTargetElement(target);
-    let resizeObserver: ResizeObserver | undefined;
+    cleanup()
     if (el) {
-      resizeObserver = new ResizeObserver((entries) => {
-        entries.forEach((entry) => {
-          const bodyClient = document.body.getBoundingClientRect();
-          const domClient = entry.target.getBoundingClientRect();
-          if (domClient.y < 50) {
-            setState(100);
-          } else {
-            setState(bodyClient.height - domClient.y - 24 - extraHeight);
-          }
-        });
+      resizeObserver.current = new ResizeObserver((entries) => {
+        const bodyClient = document.body.getBoundingClientRect();
+        const domClient = el.getBoundingClientRect();
+
+        if (domClient.y < 50) {
+          setState(100);
+        } else {
+          setState(bodyClient.height - domClient.y - 24 - extraHeight);
+        }
       });
 
-      resizeObserver.observe(el);
+      resizeObserver.current.observe(el);
     }
 
     return () => {
-      if (resizeObserver) {
-        resizeObserver.disconnect();
-      }
+      cleanup()
     };
   }, [target]);
 

+ 3 - 3
src/pages/DataCollect/Collector/components/Point/Save/modbus.tsx

@@ -163,7 +163,7 @@ export default (props: Props) => {
       if (!(Number(value) % 1 === 0)) {
         return {
           type: 'error',
-          message: '请输入0~255之间的正整数',
+          message: '请输入0~999999999之间的正整数',
         };
       }
       return '';
@@ -241,8 +241,8 @@ export default (props: Props) => {
                 message: '请输入地址',
               },
               {
-                max: 255,
-                message: '请输入0-255之间的正整数',
+                max: 999999999,
+                message: '请输入0-999999999之间的正整数',
               },
               {
                 min: 0,

+ 1 - 1
src/pages/device/Category/index.tsx

@@ -206,7 +206,7 @@ const Category = observer(() => {
           if (sorter.order) {
             setSortParam({ name: sorter.columnKey, order: sorter.order.replace('end', '') });
           } else {
-            setSortParam({ name: 'sortIndex', value: 'asc' });
+            setSortParam({ name: 'sortIndex', order: 'asc' });
           }
         }}
         headerTitle={

+ 1 - 0
src/pages/device/Firmware/Save/index.tsx

@@ -313,6 +313,7 @@ const Save = (props: Props) => {
             'x-component-props': {
               type: 'file',
               placeholder: '请上传文件',
+              showUploadList: false,
             },
             'x-decorator-props': {
               gridSpan: 2,

+ 8 - 13
src/pages/device/Instance/Detail/Info/index.tsx

@@ -93,19 +93,14 @@ const Info = observer(() => {
             {/*  </div>*/}
             {/*</Tooltip>*/}
           </Descriptions.Item>
-          <Descriptions.Item label={'产品分类'}>
-            <Ellipsis
-              title={InstanceModel.detail?.classifiedName}
-              tooltip={{ placement: 'topLeft' }}
-              style={{ maxWidth: 250 }}
-              limitWidth={250}
-            />
-            {/*<Tooltip placement="topLeft" title={InstanceModel.detail?.classifiedName}>*/}
-            {/*  <div className="ellipsis" style={{ maxWidth: 250 }}>*/}
-            {/*    {InstanceModel.detail?.classifiedName}*/}
-            {/*  </div>*/}
-            {/*</Tooltip>*/}
-          </Descriptions.Item>
+          {/*<Descriptions.Item label={'产品分类'}>*/}
+          {/*  <Ellipsis*/}
+          {/*    title={InstanceModel.detail?.classifiedName}*/}
+          {/*    tooltip={{ placement: 'topLeft' }}*/}
+          {/*    style={{ maxWidth: 250 }}*/}
+          {/*    limitWidth={250}*/}
+          {/*  />*/}
+          {/*</Descriptions.Item>*/}
           <Descriptions.Item
             label={intl.formatMessage({
               id: 'pages.device.instanceDetail.deviceType',

+ 1 - 1
src/pages/link/AccessConfig/Detail/Access/index.tsx

@@ -60,7 +60,7 @@ const Access = (props: Props) => {
             dt={props.data}
             data={protocol}
             provider={props.provider}
-            prev={prev}
+            prev={props.provider?.id !== 'child-device' ? prev : undefined}
             next={(param) => {
               setProtocol(param);
               next();

+ 7 - 4
src/pages/link/AccessConfig/Detail/components/Protocol/index.tsx

@@ -15,7 +15,7 @@ import { Empty } from '@/components';
 interface Props {
   provider: any;
   data: string;
-  prev: () => void;
+  prev?: () => void;
   next: (data: string) => void;
   view?: boolean;
   dt?: any;
@@ -173,9 +173,12 @@ const Protocol = (props: Props) => {
       </div>
       <div className={styles.action}>
         <Space style={{ marginTop: 20 }}>
-          <Button style={{ margin: '0 8px' }} onClick={() => props.prev()}>
-            上一步
-          </Button>
+          {
+            props.prev !== undefined ?
+            <Button style={{ margin: '0 8px' }} onClick={() => props.prev!()}>
+              上一步
+            </Button> : null
+          }
           <Button
             type="primary"
             onClick={() => {

+ 3 - 0
src/pages/link/DashBoard/index.tsx

@@ -258,6 +258,9 @@ export default () => {
       },
       yAxis: {
         type: 'value',
+        axisLabel: {
+          formatter: (_value: any) => networkValueRender(_value),
+        },
       },
       grid: {
         left: 70,

+ 3 - 3
src/pages/notice/Config/SyncUser/index.tsx

@@ -108,7 +108,7 @@ const SyncUser = observer(() => {
                 );
               }
               setTreeData(_data);
-              setDept(resp.result[0].id);
+              setDept(resp.result?.[0]?.id);
             }
           })
           .finally(() => setLoading(false));
@@ -124,7 +124,7 @@ const SyncUser = observer(() => {
                 );
               }
               setTreeData(__data);
-              setDept(resp.result[0].id);
+              setDept(resp.result?.[0]?.id);
             }
           })
           .finally(() => setLoading(false));
@@ -190,7 +190,7 @@ const SyncUser = observer(() => {
                 request={(params) =>
                   service
                     .queryZipSyncUser(
-                      id === 'dingTalk' ? 'dingTalk' : 'wechat',
+                      id === 'dingTalk' ? 'dingtalk' : 'wechat',
                       id,
                       state.current?.provider || '',
                       state.current?.id || '',

+ 2 - 2
src/pages/notice/Config/service.ts

@@ -42,7 +42,7 @@ class Service extends BaseService<ConfigItem> {
       request(`${SystemConst.API_BASE}/notifier/dingtalk/corp/${configId}/${departmentId}/users`),
     wechatDept: (configId: string) =>
       request(`${SystemConst.API_BASE}/notifier/wechat/corp/${configId}/departments`),
-    getDeptUser: (type: 'wechat' | 'dingTalk', configId: string, departmentId: string) =>
+    getDeptUser: (type: 'wechat' | 'dingtalk', configId: string, departmentId: string) =>
       request(`${SystemConst.API_BASE}/notifier/${type}/corp/${configId}/${departmentId}/users`, {
         method: 'GET',
       }),
@@ -79,7 +79,7 @@ class Service extends BaseService<ConfigItem> {
   };
 
   public queryZipSyncUser = (
-    type: 'wechat' | 'dingTalk',
+    type: 'wechat' | 'dingtalk',
     _type: string,
     provider: string,
     configId: string,

+ 16 - 8
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx

@@ -114,7 +114,8 @@ export default observer((props: Props) => {
             min={0}
             precision={type === 'double' || type === 'float' ? 2 : 0}
             onChange={(e: any) => {
-              onChange(e);
+              setValue(e)
+              setLabelValue(e);
             }}
             style={{ width: '100%' }}
             placeholder={'请输入'}
@@ -229,9 +230,9 @@ export default observer((props: Props) => {
             onChange={(e) => {
               setValue(e.target.value);
               setLabelValue(e.target.value);
-              if (props.onChange) {
-                props.onChange(e.target.value, source);
-              }
+              // if (props.onChange) {
+              //   props.onChange(e.target.value, source);
+              // }
             }}
           />
         );
@@ -291,12 +292,17 @@ export default observer((props: Props) => {
           // setOpen(false)
           setValue(val);
           setSource(tabKey);
-          if (props.onChange) {
-            props.onChange(val, tabKey);
-          }
+          // if (props.onChange) {
+          //   props.onChange(val, tabKey);
+          // }
         }}
         open={open}
-        openChange={setOpen}
+        openChange={(val) => {
+          setOpen(val)
+          if (!val) {
+            props.onChange?.(value, source);
+          }
+        }}
         type={props.type}
         labelValue={labelValue}
       />
@@ -311,6 +317,7 @@ export default observer((props: Props) => {
               props.onChange(param);
             }
             setValue(param);
+            setLabelValue(param)
             setVisible(false);
           }}
         />
@@ -328,6 +335,7 @@ export default observer((props: Props) => {
               props.onChange(JSON.parse(param));
             }
             setValue(param);
+            setLabelValue(JSON.parse(param))
             setObjVisable(false);
           }}
         />

+ 5 - 6
src/pages/rule-engine/Scene/Save/terms/index.tsx

@@ -148,12 +148,11 @@ export default observer((props: Props) => {
                     FormModel.current.options?.when?.splice(index, 1);
                   }}
                   onDeleteAll={() => {
-                    const newBranches: any[] =
-                      FormModel.current.branches?.filter((bItem, bIndex) => {
-                        return bIndex === 0 || (bItem && bItem.key === item.key);
-                      }) || [];
-                    newBranches.push(null);
-                    console.log(FormModel.current.options?.when);
+                    const newBranches: any[] = FormModel.current.branches || []
+                    newBranches.splice(index, FormModel.current.branches?.length - index);
+                    if (FormModel.current.branches?.every(item => item !== null)) {
+                      newBranches.push(null);
+                    }
                     FormModel.current.branches = newBranches;
                     if (FormModel.current.options?.when) {
                       FormModel.current.options.when = [

+ 3 - 2
src/pages/system/DataSource/Management/DataTable.tsx

@@ -3,6 +3,7 @@ import { createForm, registerValidateRules } from '@formily/core';
 import type { ISchema } from '@formily/react';
 import { createSchemaField } from '@formily/react';
 import { Modal } from 'antd';
+import {useMemo} from "react";
 
 interface Props {
   close: () => void;
@@ -11,10 +12,10 @@ interface Props {
 }
 
 const DataTable = (props: Props) => {
-  const form = createForm({
+  const form = useMemo(() => createForm({
     validateFirst: true,
     initialValues: props.data,
-  });
+  }), [props.data])
 
   const SchemaField = createSchemaField({
     components: {

+ 3 - 2
src/pages/system/DataSource/Management/EditTable.tsx

@@ -4,6 +4,7 @@ import { createForm } from '@formily/core';
 import { createSchemaField } from '@formily/react';
 import { Button } from 'antd';
 import RemoveData from './RemoveData';
+import {useMemo} from "react";
 
 interface Props {
   onChange: (data: any) => void;
@@ -28,11 +29,11 @@ const EditTable = (props: Props) => {
     },
   });
 
-  const form = createForm({
+  const form = useMemo( () => createForm({
     initialValues: {
       array: _data,
     },
-  });
+  }), [props?.data]);
 
   const schema = {
     type: 'object',

+ 0 - 1
src/pages/system/DataSource/Management/index.less

@@ -1,7 +1,6 @@
 .datasourceBox {
   display: flex;
   width: 100%;
-  min-height: 500px;
   overflow: hidden;
 
   .left {

+ 4 - 3
src/pages/system/DataSource/Management/index.tsx

@@ -24,7 +24,7 @@ const Management = () => {
   const [tableList, setTableList] = useState<any[]>([]);
   const [param, setParam] = useState<string | undefined>(undefined);
   const [loading, setLoading] = useState<boolean>(true);
-  const { minHeight } = useDomFullHeight(`.management`);
+  const { minHeight } = useDomFullHeight(`.management`, 52);
 
   const queryTables = (key: string) => {
     setLoading(true);
@@ -35,6 +35,7 @@ const Management = () => {
       setLoading(false);
     });
   };
+  console.log(minHeight)
 
   const handleSearch = (refresh: boolean) => {
     service.rdbTree(id).then((resp) => {
@@ -91,8 +92,8 @@ const Management = () => {
   return (
     <PageContainer>
       <Spin spinning={loading}>
-        <Card className="management" style={{ minHeight }}>
-          <div className={styles.datasourceBox}>
+        <Card className="management">
+          <div className={styles.datasourceBox} style={{ minHeight }}>
             <div className={styles.left}>
               <Input.Search
                 placeholder="请输入"

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

@@ -94,7 +94,7 @@ const Save = (props: Props) => {
             triggerType: 'onBlur',
             validator: (value: string) => {
               return new Promise((resolve) => {
-                if (!value) resolve('');
+                if (!value) return resolve('');
                 service
                   .validateField({ id: value })
                   .then((resp) => {

+ 6 - 1
yarn.lock

@@ -16589,11 +16589,16 @@ reserved-words@^0.1.2:
   resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
   integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=
 
-resize-observer-polyfill@^1.5.0, resize-observer-polyfill@^1.5.1:
+resize-observer-polyfill@^1.5.0:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
   integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
 
+resize-observer-polyfill@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+  integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
 resolve-cwd@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"