seeder-st2110-components 1.6.3 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +1537 -1543
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1536 -1542
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { memo, useState, useCallback, useMemo, useEffect, useRef } from 'react';
|
|
2
|
-
import { Tooltip, App, Modal, Form, Input, Alert, message, Dropdown, Spin,
|
|
2
|
+
import { Tooltip, App, Modal, Form, Input, Alert, message, Dropdown, Spin, Divider, Typography, InputNumber, ConfigProvider, Badge, Switch, Select, List, Empty, Button, Space, Flex, Checkbox, Row, Col } from 'antd';
|
|
3
3
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
import { useWebSocket, useInterval } from 'ahooks';
|
|
5
5
|
import { LoadingOutlined, ExclamationCircleFilled, PlusOutlined } from '@ant-design/icons';
|
|
@@ -790,853 +790,258 @@ const useSystemOperations = function () {
|
|
|
790
790
|
};
|
|
791
791
|
var useSystemOperations$1 = useSystemOperations;
|
|
792
792
|
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
793
|
+
const NetworkFieldGroup = _ref => {
|
|
794
|
+
var _fieldConfig$netmask$, _fieldConfig$netmask;
|
|
795
|
+
let {
|
|
796
|
+
prefix,
|
|
797
|
+
interfaces,
|
|
798
|
+
fieldConfig = {}
|
|
799
|
+
} = _ref;
|
|
800
|
+
// 默认字段配置
|
|
801
|
+
const defaultFieldConfig = {
|
|
802
|
+
name: {
|
|
803
|
+
label: "Name",
|
|
804
|
+
enabled: true
|
|
805
|
+
},
|
|
806
|
+
ip: {
|
|
807
|
+
label: "IP Address",
|
|
808
|
+
enabled: true
|
|
809
|
+
},
|
|
810
|
+
netmask: {
|
|
811
|
+
label: "Netmask",
|
|
812
|
+
enabled: true
|
|
813
|
+
}
|
|
814
|
+
};
|
|
815
|
+
const mergedFieldConfig = _objectSpread2(_objectSpread2(_objectSpread2({}, defaultFieldConfig), fieldConfig), {}, {
|
|
816
|
+
netmask: {
|
|
817
|
+
label: "Netmask",
|
|
818
|
+
enabled: (_fieldConfig$netmask$ = (_fieldConfig$netmask = fieldConfig.netmask) === null || _fieldConfig$netmask === void 0 ? void 0 : _fieldConfig$netmask.enabled) !== null && _fieldConfig$netmask$ !== void 0 ? _fieldConfig$netmask$ : defaultFieldConfig.netmask.enabled // 合并 enabled
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
return /*#__PURE__*/jsxs(Fragment, {
|
|
822
|
+
children: [/*#__PURE__*/jsx(Typography.Title, {
|
|
823
|
+
level: 5,
|
|
824
|
+
style: {
|
|
825
|
+
display: 'flex',
|
|
826
|
+
justifyContent: 'space-between',
|
|
827
|
+
alignItems: 'center',
|
|
828
|
+
marginBottom: 16
|
|
829
|
+
},
|
|
830
|
+
children: prefix
|
|
831
|
+
}), interfaces.map((iface, index) => /*#__PURE__*/jsxs("div", {
|
|
832
|
+
children: [mergedFieldConfig.name.enabled && /*#__PURE__*/jsx(Form.Item, {
|
|
833
|
+
label: mergedFieldConfig.name.label,
|
|
834
|
+
name: [prefix, index, "display_name"],
|
|
835
|
+
children: /*#__PURE__*/jsx(Input, {
|
|
836
|
+
disabled: true
|
|
837
|
+
})
|
|
838
|
+
}), mergedFieldConfig.ip.enabled && /*#__PURE__*/jsx(Form.Item, {
|
|
839
|
+
label: mergedFieldConfig.ip.label,
|
|
840
|
+
name: [prefix, index, "ip_address"],
|
|
841
|
+
children: /*#__PURE__*/jsx(Input, {})
|
|
842
|
+
}), mergedFieldConfig.netmask.enabled && /*#__PURE__*/jsx(Form.Item, {
|
|
843
|
+
label: mergedFieldConfig.netmask.label,
|
|
844
|
+
name: [prefix, index, "netmask"],
|
|
845
|
+
children: /*#__PURE__*/jsx(Input, {})
|
|
846
|
+
}), index < interfaces.length - 1 && /*#__PURE__*/jsx(Divider, {
|
|
847
|
+
style: {
|
|
848
|
+
marginBlock: 16
|
|
849
|
+
}
|
|
850
|
+
})]
|
|
851
|
+
}, iface.id || index))]
|
|
852
|
+
});
|
|
818
853
|
};
|
|
854
|
+
const NetworkSettingsModal = _ref2 => {
|
|
855
|
+
let {
|
|
856
|
+
open,
|
|
857
|
+
onClose,
|
|
858
|
+
getLanConfig,
|
|
859
|
+
// 可选 - 单独获取LAN配置的函数
|
|
860
|
+
getSysConfig,
|
|
861
|
+
// 可选 - 单独获取QSFP配置的函数
|
|
862
|
+
getConfig,
|
|
863
|
+
// 可选 - 统一获取配置的函数
|
|
864
|
+
updateLanConfig,
|
|
865
|
+
updateSysConfig,
|
|
866
|
+
restart,
|
|
867
|
+
modalProps = {},
|
|
868
|
+
formProps = {},
|
|
869
|
+
fieldConfig = {},
|
|
870
|
+
sections = ['LAN', 'QSFP'],
|
|
871
|
+
showNetmask = {
|
|
872
|
+
LAN: true,
|
|
873
|
+
QSFP: false
|
|
874
|
+
},
|
|
875
|
+
restartRemark
|
|
876
|
+
} = _ref2;
|
|
877
|
+
const {
|
|
878
|
+
message,
|
|
879
|
+
modal
|
|
880
|
+
} = App.useApp();
|
|
881
|
+
const [form] = Form.useForm();
|
|
882
|
+
const [st2110Interfaces, setSt2110Interfaces] = useState([]);
|
|
883
|
+
const [lanConfigs, setLanConfigs] = useState([]);
|
|
884
|
+
const [submitLoading, setSubmitLoading] = useState(false);
|
|
885
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
886
|
+
const initializationStatus = useRef({
|
|
887
|
+
hasFetched: false,
|
|
888
|
+
hasInitialized: false
|
|
889
|
+
});
|
|
890
|
+
const preparedFieldConfig = useMemo(() => {
|
|
891
|
+
const config = _objectSpread2({}, fieldConfig);
|
|
819
892
|
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
const isFileListInstance = typeof FileList !== 'undefined' ? data instanceof FileList : false;
|
|
828
|
-
if (data instanceof Date) {
|
|
829
|
-
copy = new Date(data);
|
|
893
|
+
// 确保LAN和QSFP的配置存在
|
|
894
|
+
config.LAN = config.LAN || {};
|
|
895
|
+
config.QSFP = config.QSFP || {};
|
|
896
|
+
if (sections.includes('LAN')) {
|
|
897
|
+
config.LAN.netmask = _objectSpread2(_objectSpread2({}, config.LAN.netmask || {}), {}, {
|
|
898
|
+
enabled: showNetmask.LAN
|
|
899
|
+
});
|
|
830
900
|
}
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
901
|
+
if (sections.includes('QSFP')) {
|
|
902
|
+
config.QSFP.netmask = _objectSpread2(_objectSpread2({}, config.QSFP.netmask || {}), {}, {
|
|
903
|
+
enabled: showNetmask.QSFP
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
return config;
|
|
907
|
+
}, [fieldConfig, showNetmask, sections]);
|
|
908
|
+
useEffect(() => {
|
|
909
|
+
if (!open) return;
|
|
910
|
+
const fetchData = async () => {
|
|
911
|
+
if (initializationStatus.current.hasFetched) return;
|
|
912
|
+
try {
|
|
913
|
+
initializationStatus.current.hasFetched = true;
|
|
914
|
+
if (getConfig) {
|
|
915
|
+
// 使用统一接口获取数据
|
|
916
|
+
const config = await getConfig();
|
|
917
|
+
if (sections.includes('LAN') && config.lan_interfaces) {
|
|
918
|
+
setLanConfigs(config.lan_interfaces);
|
|
919
|
+
}
|
|
920
|
+
if (sections.includes('QSFP') && config.interfaces) {
|
|
921
|
+
setSt2110Interfaces(config.interfaces);
|
|
922
|
+
}
|
|
923
|
+
} else {
|
|
924
|
+
const promises = [];
|
|
925
|
+
if (sections.includes('LAN')) {
|
|
926
|
+
promises.push(getLanConfig());
|
|
927
|
+
}
|
|
928
|
+
if (sections.includes('QSFP')) {
|
|
929
|
+
promises.push(getSysConfig());
|
|
930
|
+
}
|
|
931
|
+
const results = await Promise.allSettled(promises);
|
|
932
|
+
if (sections.includes('LAN') && getLanConfig) {
|
|
933
|
+
const lanResult = results[0];
|
|
934
|
+
if (lanResult.status === 'fulfilled') {
|
|
935
|
+
setLanConfigs(lanResult.value || []);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
if (sections.includes('QSFP') && getSysConfig) {
|
|
939
|
+
const sysResult = sections.includes('LAN') ? results[1] : results[0];
|
|
940
|
+
if (sysResult.status === 'fulfilled' && sysResult.value) {
|
|
941
|
+
setSt2110Interfaces(sysResult.value.st2110_interfaces || []);
|
|
842
942
|
}
|
|
943
|
+
}
|
|
843
944
|
}
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
var isUndefined = (val) => val === undefined;
|
|
854
|
-
|
|
855
|
-
var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
|
|
856
|
-
|
|
857
|
-
var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
|
|
945
|
+
setIsInitialized(true);
|
|
946
|
+
} catch (error) {
|
|
947
|
+
console.error('Failed to fetch data:', error);
|
|
948
|
+
initializationStatus.current.hasFetched = false; // 出错时重置
|
|
949
|
+
}
|
|
950
|
+
};
|
|
951
|
+
fetchData();
|
|
952
|
+
}, [open, getLanConfig, getSysConfig, sections]);
|
|
858
953
|
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
954
|
+
// 当模态框关闭时重置状态
|
|
955
|
+
useEffect(() => {
|
|
956
|
+
if (!open) {
|
|
957
|
+
setIsInitialized(false);
|
|
958
|
+
setLanConfigs([]);
|
|
959
|
+
setSt2110Interfaces([]);
|
|
960
|
+
form.resetFields();
|
|
961
|
+
initializationStatus.current = {
|
|
962
|
+
hasFetched: false,
|
|
963
|
+
hasInitialized: false
|
|
964
|
+
};
|
|
862
965
|
}
|
|
863
|
-
|
|
864
|
-
return isUndefined(result) || result === object
|
|
865
|
-
? isUndefined(object[path])
|
|
866
|
-
? defaultValue
|
|
867
|
-
: object[path]
|
|
868
|
-
: result;
|
|
869
|
-
};
|
|
870
|
-
|
|
871
|
-
var isBoolean = (value) => typeof value === 'boolean';
|
|
966
|
+
}, [open, form]);
|
|
872
967
|
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
const
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
isObject(objValue) || Array.isArray(objValue)
|
|
885
|
-
? objValue
|
|
886
|
-
: !isNaN(+tempPath[index + 1])
|
|
887
|
-
? []
|
|
888
|
-
: {};
|
|
889
|
-
}
|
|
890
|
-
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
|
|
891
|
-
return;
|
|
892
|
-
}
|
|
893
|
-
object[key] = newValue;
|
|
894
|
-
object = object[key];
|
|
968
|
+
// 动态初始值配置
|
|
969
|
+
const initialValues = useMemo(() => {
|
|
970
|
+
const values = {};
|
|
971
|
+
if (sections.includes('LAN') && lanConfigs.length > 0) {
|
|
972
|
+
values.LAN = lanConfigs.map(config => _objectSpread2({
|
|
973
|
+
connection_id: config.connection_id,
|
|
974
|
+
display_name: config.display_name,
|
|
975
|
+
ip_address: config.ip_address
|
|
976
|
+
}, showNetmask.LAN ? {
|
|
977
|
+
netmask: config.netmask
|
|
978
|
+
} : {}));
|
|
895
979
|
}
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
onChange: 'onChange',
|
|
906
|
-
onSubmit: 'onSubmit',
|
|
907
|
-
onTouched: 'onTouched',
|
|
908
|
-
all: 'all',
|
|
909
|
-
};
|
|
910
|
-
|
|
911
|
-
const HookFormContext = React.createContext(null);
|
|
912
|
-
HookFormContext.displayName = 'HookFormContext';
|
|
913
|
-
/**
|
|
914
|
-
* This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.
|
|
915
|
-
*
|
|
916
|
-
* @remarks
|
|
917
|
-
* [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
|
|
918
|
-
*
|
|
919
|
-
* @returns return all useForm methods
|
|
920
|
-
*
|
|
921
|
-
* @example
|
|
922
|
-
* ```tsx
|
|
923
|
-
* function App() {
|
|
924
|
-
* const methods = useForm();
|
|
925
|
-
* const onSubmit = data => console.log(data);
|
|
926
|
-
*
|
|
927
|
-
* return (
|
|
928
|
-
* <FormProvider {...methods} >
|
|
929
|
-
* <form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
930
|
-
* <NestedInput />
|
|
931
|
-
* <input type="submit" />
|
|
932
|
-
* </form>
|
|
933
|
-
* </FormProvider>
|
|
934
|
-
* );
|
|
935
|
-
* }
|
|
936
|
-
*
|
|
937
|
-
* function NestedInput() {
|
|
938
|
-
* const { register } = useFormContext(); // retrieve all hook methods
|
|
939
|
-
* return <input {...register("test")} />;
|
|
940
|
-
* }
|
|
941
|
-
* ```
|
|
942
|
-
*/
|
|
943
|
-
const useFormContext = () => React.useContext(HookFormContext);
|
|
944
|
-
|
|
945
|
-
var getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {
|
|
946
|
-
const result = {
|
|
947
|
-
defaultValues: control._defaultValues,
|
|
948
|
-
};
|
|
949
|
-
for (const key in formState) {
|
|
950
|
-
Object.defineProperty(result, key, {
|
|
951
|
-
get: () => {
|
|
952
|
-
const _key = key;
|
|
953
|
-
if (control._proxyFormState[_key] !== VALIDATION_MODE.all) {
|
|
954
|
-
control._proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;
|
|
955
|
-
}
|
|
956
|
-
localProxyFormState && (localProxyFormState[_key] = true);
|
|
957
|
-
return formState[_key];
|
|
958
|
-
},
|
|
959
|
-
});
|
|
980
|
+
if (sections.includes('QSFP') && st2110Interfaces.length > 0) {
|
|
981
|
+
values.QSFP = st2110Interfaces.map(iface => _objectSpread2(_objectSpread2({}, iface.id !== undefined && {
|
|
982
|
+
id: iface.id
|
|
983
|
+
}), {}, {
|
|
984
|
+
display_name: iface.display_name,
|
|
985
|
+
ip_address: iface.ip_address || iface.ip
|
|
986
|
+
}, showNetmask.QSFP ? {
|
|
987
|
+
netmask: iface.netmask
|
|
988
|
+
} : {}));
|
|
960
989
|
}
|
|
961
|
-
return
|
|
962
|
-
};
|
|
963
|
-
|
|
964
|
-
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
|
|
965
|
-
|
|
966
|
-
/**
|
|
967
|
-
* This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.
|
|
968
|
-
*
|
|
969
|
-
* @remarks
|
|
970
|
-
* [API](https://react-hook-form.com/docs/useformstate) • [Demo](https://codesandbox.io/s/useformstate-75xly)
|
|
971
|
-
*
|
|
972
|
-
* @param props - include options on specify fields to subscribe. {@link UseFormStateReturn}
|
|
973
|
-
*
|
|
974
|
-
* @example
|
|
975
|
-
* ```tsx
|
|
976
|
-
* function App() {
|
|
977
|
-
* const { register, handleSubmit, control } = useForm({
|
|
978
|
-
* defaultValues: {
|
|
979
|
-
* firstName: "firstName"
|
|
980
|
-
* }});
|
|
981
|
-
* const { dirtyFields } = useFormState({
|
|
982
|
-
* control
|
|
983
|
-
* });
|
|
984
|
-
* const onSubmit = (data) => console.log(data);
|
|
985
|
-
*
|
|
986
|
-
* return (
|
|
987
|
-
* <form onSubmit={handleSubmit(onSubmit)}>
|
|
988
|
-
* <input {...register("firstName")} placeholder="First Name" />
|
|
989
|
-
* {dirtyFields.firstName && <p>Field is dirty.</p>}
|
|
990
|
-
* <input type="submit" />
|
|
991
|
-
* </form>
|
|
992
|
-
* );
|
|
993
|
-
* }
|
|
994
|
-
* ```
|
|
995
|
-
*/
|
|
996
|
-
function useFormState(props) {
|
|
997
|
-
const methods = useFormContext();
|
|
998
|
-
const { control = methods.control, disabled, name, exact } = props || {};
|
|
999
|
-
const [formState, updateFormState] = React.useState(control._formState);
|
|
1000
|
-
const _localProxyFormState = React.useRef({
|
|
1001
|
-
isDirty: false,
|
|
1002
|
-
isLoading: false,
|
|
1003
|
-
dirtyFields: false,
|
|
1004
|
-
touchedFields: false,
|
|
1005
|
-
validatingFields: false,
|
|
1006
|
-
isValidating: false,
|
|
1007
|
-
isValid: false,
|
|
1008
|
-
errors: false,
|
|
1009
|
-
});
|
|
1010
|
-
useIsomorphicLayoutEffect(() => control._subscribe({
|
|
1011
|
-
name,
|
|
1012
|
-
formState: _localProxyFormState.current,
|
|
1013
|
-
exact,
|
|
1014
|
-
callback: (formState) => {
|
|
1015
|
-
!disabled &&
|
|
1016
|
-
updateFormState({
|
|
1017
|
-
...control._formState,
|
|
1018
|
-
...formState,
|
|
1019
|
-
});
|
|
1020
|
-
},
|
|
1021
|
-
}), [name, disabled, exact]);
|
|
1022
|
-
React.useEffect(() => {
|
|
1023
|
-
_localProxyFormState.current.isValid && control._setValid(true);
|
|
1024
|
-
}, [control]);
|
|
1025
|
-
return React.useMemo(() => getProxyFormState(formState, control, _localProxyFormState.current, false), [formState, control]);
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
var isString = (value) => typeof value === 'string';
|
|
990
|
+
return values;
|
|
991
|
+
}, [lanConfigs, st2110Interfaces, sections, showNetmask]);
|
|
1029
992
|
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
993
|
+
// 当初始值准备好后设置表单值
|
|
994
|
+
useEffect(() => {
|
|
995
|
+
if (isInitialized && !initializationStatus.current.hasInitialized) {
|
|
996
|
+
form.setFieldsValue(initialValues);
|
|
997
|
+
initializationStatus.current.hasInitialized = true;
|
|
1034
998
|
}
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
999
|
+
}, [isInitialized, form, initialValues]);
|
|
1000
|
+
const handleSuccess = useCallback(async function () {
|
|
1001
|
+
let {
|
|
1002
|
+
messageText = 'Success',
|
|
1003
|
+
isPopup = !!restart,
|
|
1004
|
+
refresh = !restart
|
|
1005
|
+
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1006
|
+
message.success(messageText);
|
|
1007
|
+
if (refresh && getConfig) {
|
|
1008
|
+
try {
|
|
1009
|
+
const newConfig = await getConfig();
|
|
1010
|
+
if (sections.includes('LAN') && newConfig.lan_interfaces) {
|
|
1011
|
+
setLanConfigs(newConfig.lan_interfaces);
|
|
1012
|
+
}
|
|
1013
|
+
if (sections.includes('QSFP') && newConfig.interfaces) {
|
|
1014
|
+
setSt2110Interfaces(newConfig.interfaces);
|
|
1015
|
+
}
|
|
1016
|
+
} catch (error) {
|
|
1017
|
+
console.error('Failed to refresh config:', error);
|
|
1018
|
+
}
|
|
1038
1019
|
}
|
|
1039
|
-
isGlobal && (_names.watchAll = true);
|
|
1040
|
-
return formValues;
|
|
1041
|
-
};
|
|
1042
|
-
|
|
1043
|
-
var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
|
|
1044
1020
|
|
|
1045
|
-
|
|
1046
|
-
if (
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
if (_internal_visited.has(object1) || _internal_visited.has(object2)) {
|
|
1058
|
-
return true;
|
|
1059
|
-
}
|
|
1060
|
-
_internal_visited.add(object1);
|
|
1061
|
-
_internal_visited.add(object2);
|
|
1062
|
-
for (const key of keys1) {
|
|
1063
|
-
const val1 = object1[key];
|
|
1064
|
-
if (!keys2.includes(key)) {
|
|
1065
|
-
return false;
|
|
1066
|
-
}
|
|
1067
|
-
if (key !== 'ref') {
|
|
1068
|
-
const val2 = object2[key];
|
|
1069
|
-
if ((isDateObject(val1) && isDateObject(val2)) ||
|
|
1070
|
-
(isObject(val1) && isObject(val2)) ||
|
|
1071
|
-
(Array.isArray(val1) && Array.isArray(val2))
|
|
1072
|
-
? !deepEqual(val1, val2, _internal_visited)
|
|
1073
|
-
: val1 !== val2) {
|
|
1074
|
-
return false;
|
|
1075
|
-
}
|
|
1021
|
+
// 如果有restart函数,则显示重启确认框
|
|
1022
|
+
if (isPopup && restart) {
|
|
1023
|
+
try {
|
|
1024
|
+
const updatedConfig = await getSysConfig();
|
|
1025
|
+
if (updatedConfig && updatedConfig.is_restart_required) {
|
|
1026
|
+
modal.confirm({
|
|
1027
|
+
icon: /*#__PURE__*/jsx(ExclamationCircleFilled, {}),
|
|
1028
|
+
title: "Configuration modified. Restart to apply changes?",
|
|
1029
|
+
cancelText: "No",
|
|
1030
|
+
okText: "Yes",
|
|
1031
|
+
onOk: () => restart()
|
|
1032
|
+
});
|
|
1076
1033
|
}
|
|
1034
|
+
} catch (error) {
|
|
1035
|
+
console.error('Failed to check restart status:', error);
|
|
1036
|
+
}
|
|
1077
1037
|
}
|
|
1078
|
-
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
*
|
|
1086
|
-
* [API](https://react-hook-form.com/docs/usewatch) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-usewatch-h9i5e)
|
|
1087
|
-
*
|
|
1088
|
-
* @example
|
|
1089
|
-
* ```tsx
|
|
1090
|
-
* const { control } = useForm();
|
|
1091
|
-
* const values = useWatch({
|
|
1092
|
-
* name: "fieldName"
|
|
1093
|
-
* control,
|
|
1094
|
-
* })
|
|
1095
|
-
* ```
|
|
1096
|
-
*/
|
|
1097
|
-
function useWatch(props) {
|
|
1098
|
-
const methods = useFormContext();
|
|
1099
|
-
const { control = methods.control, name, defaultValue, disabled, exact, compute, } = props || {};
|
|
1100
|
-
const _defaultValue = React.useRef(defaultValue);
|
|
1101
|
-
const _compute = React.useRef(compute);
|
|
1102
|
-
const _computeFormValues = React.useRef(undefined);
|
|
1103
|
-
_compute.current = compute;
|
|
1104
|
-
const defaultValueMemo = React.useMemo(() => control._getWatch(name, _defaultValue.current), [control, name]);
|
|
1105
|
-
const [value, updateValue] = React.useState(_compute.current ? _compute.current(defaultValueMemo) : defaultValueMemo);
|
|
1106
|
-
useIsomorphicLayoutEffect(() => control._subscribe({
|
|
1107
|
-
name,
|
|
1108
|
-
formState: {
|
|
1109
|
-
values: true,
|
|
1110
|
-
},
|
|
1111
|
-
exact,
|
|
1112
|
-
callback: (formState) => {
|
|
1113
|
-
if (!disabled) {
|
|
1114
|
-
const formValues = generateWatchOutput(name, control._names, formState.values || control._formValues, false, _defaultValue.current);
|
|
1115
|
-
if (_compute.current) {
|
|
1116
|
-
const computedFormValues = _compute.current(formValues);
|
|
1117
|
-
if (!deepEqual(computedFormValues, _computeFormValues.current)) {
|
|
1118
|
-
updateValue(computedFormValues);
|
|
1119
|
-
_computeFormValues.current = computedFormValues;
|
|
1120
|
-
}
|
|
1121
|
-
}
|
|
1122
|
-
else {
|
|
1123
|
-
updateValue(formValues);
|
|
1124
|
-
}
|
|
1125
|
-
}
|
|
1126
|
-
},
|
|
1127
|
-
}), [control, disabled, name, exact]);
|
|
1128
|
-
React.useEffect(() => control._removeUnmounted());
|
|
1129
|
-
return value;
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
|
-
/**
|
|
1133
|
-
* Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.
|
|
1134
|
-
*
|
|
1135
|
-
* @remarks
|
|
1136
|
-
* [API](https://react-hook-form.com/docs/usecontroller) • [Demo](https://codesandbox.io/s/usecontroller-0o8px)
|
|
1137
|
-
*
|
|
1138
|
-
* @param props - the path name to the form field value, and validation rules.
|
|
1139
|
-
*
|
|
1140
|
-
* @returns field properties, field and form state. {@link UseControllerReturn}
|
|
1141
|
-
*
|
|
1142
|
-
* @example
|
|
1143
|
-
* ```tsx
|
|
1144
|
-
* function Input(props) {
|
|
1145
|
-
* const { field, fieldState, formState } = useController(props);
|
|
1146
|
-
* return (
|
|
1147
|
-
* <div>
|
|
1148
|
-
* <input {...field} placeholder={props.name} />
|
|
1149
|
-
* <p>{fieldState.isTouched && "Touched"}</p>
|
|
1150
|
-
* <p>{formState.isSubmitted ? "submitted" : ""}</p>
|
|
1151
|
-
* </div>
|
|
1152
|
-
* );
|
|
1153
|
-
* }
|
|
1154
|
-
* ```
|
|
1155
|
-
*/
|
|
1156
|
-
function useController(props) {
|
|
1157
|
-
const methods = useFormContext();
|
|
1158
|
-
const { name, disabled, control = methods.control, shouldUnregister, defaultValue, } = props;
|
|
1159
|
-
const isArrayField = isNameInFieldArray(control._names.array, name);
|
|
1160
|
-
const defaultValueMemo = React.useMemo(() => get(control._formValues, name, get(control._defaultValues, name, defaultValue)), [control, name, defaultValue]);
|
|
1161
|
-
const value = useWatch({
|
|
1162
|
-
control,
|
|
1163
|
-
name,
|
|
1164
|
-
defaultValue: defaultValueMemo,
|
|
1165
|
-
exact: true,
|
|
1166
|
-
});
|
|
1167
|
-
const formState = useFormState({
|
|
1168
|
-
control,
|
|
1169
|
-
name,
|
|
1170
|
-
exact: true,
|
|
1171
|
-
});
|
|
1172
|
-
const _props = React.useRef(props);
|
|
1173
|
-
const _registerProps = React.useRef(control.register(name, {
|
|
1174
|
-
...props.rules,
|
|
1175
|
-
value,
|
|
1176
|
-
...(isBoolean(props.disabled) ? { disabled: props.disabled } : {}),
|
|
1177
|
-
}));
|
|
1178
|
-
_props.current = props;
|
|
1179
|
-
const fieldState = React.useMemo(() => Object.defineProperties({}, {
|
|
1180
|
-
invalid: {
|
|
1181
|
-
enumerable: true,
|
|
1182
|
-
get: () => !!get(formState.errors, name),
|
|
1183
|
-
},
|
|
1184
|
-
isDirty: {
|
|
1185
|
-
enumerable: true,
|
|
1186
|
-
get: () => !!get(formState.dirtyFields, name),
|
|
1187
|
-
},
|
|
1188
|
-
isTouched: {
|
|
1189
|
-
enumerable: true,
|
|
1190
|
-
get: () => !!get(formState.touchedFields, name),
|
|
1191
|
-
},
|
|
1192
|
-
isValidating: {
|
|
1193
|
-
enumerable: true,
|
|
1194
|
-
get: () => !!get(formState.validatingFields, name),
|
|
1195
|
-
},
|
|
1196
|
-
error: {
|
|
1197
|
-
enumerable: true,
|
|
1198
|
-
get: () => get(formState.errors, name),
|
|
1199
|
-
},
|
|
1200
|
-
}), [formState, name]);
|
|
1201
|
-
const onChange = React.useCallback((event) => _registerProps.current.onChange({
|
|
1202
|
-
target: {
|
|
1203
|
-
value: getEventValue(event),
|
|
1204
|
-
name: name,
|
|
1205
|
-
},
|
|
1206
|
-
type: EVENTS.CHANGE,
|
|
1207
|
-
}), [name]);
|
|
1208
|
-
const onBlur = React.useCallback(() => _registerProps.current.onBlur({
|
|
1209
|
-
target: {
|
|
1210
|
-
value: get(control._formValues, name),
|
|
1211
|
-
name: name,
|
|
1212
|
-
},
|
|
1213
|
-
type: EVENTS.BLUR,
|
|
1214
|
-
}), [name, control._formValues]);
|
|
1215
|
-
const ref = React.useCallback((elm) => {
|
|
1216
|
-
const field = get(control._fields, name);
|
|
1217
|
-
if (field && elm) {
|
|
1218
|
-
field._f.ref = {
|
|
1219
|
-
focus: () => elm.focus && elm.focus(),
|
|
1220
|
-
select: () => elm.select && elm.select(),
|
|
1221
|
-
setCustomValidity: (message) => elm.setCustomValidity(message),
|
|
1222
|
-
reportValidity: () => elm.reportValidity(),
|
|
1223
|
-
};
|
|
1224
|
-
}
|
|
1225
|
-
}, [control._fields, name]);
|
|
1226
|
-
const field = React.useMemo(() => ({
|
|
1227
|
-
name,
|
|
1228
|
-
value,
|
|
1229
|
-
...(isBoolean(disabled) || formState.disabled
|
|
1230
|
-
? { disabled: formState.disabled || disabled }
|
|
1231
|
-
: {}),
|
|
1232
|
-
onChange,
|
|
1233
|
-
onBlur,
|
|
1234
|
-
ref,
|
|
1235
|
-
}), [name, disabled, formState.disabled, onChange, onBlur, ref, value]);
|
|
1236
|
-
React.useEffect(() => {
|
|
1237
|
-
const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
|
|
1238
|
-
control.register(name, {
|
|
1239
|
-
..._props.current.rules,
|
|
1240
|
-
...(isBoolean(_props.current.disabled)
|
|
1241
|
-
? { disabled: _props.current.disabled }
|
|
1242
|
-
: {}),
|
|
1243
|
-
});
|
|
1244
|
-
const updateMounted = (name, value) => {
|
|
1245
|
-
const field = get(control._fields, name);
|
|
1246
|
-
if (field && field._f) {
|
|
1247
|
-
field._f.mount = value;
|
|
1248
|
-
}
|
|
1249
|
-
};
|
|
1250
|
-
updateMounted(name, true);
|
|
1251
|
-
if (_shouldUnregisterField) {
|
|
1252
|
-
const value = cloneObject(get(control._options.defaultValues, name));
|
|
1253
|
-
set(control._defaultValues, name, value);
|
|
1254
|
-
if (isUndefined(get(control._formValues, name))) {
|
|
1255
|
-
set(control._formValues, name, value);
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
!isArrayField && control.register(name);
|
|
1259
|
-
return () => {
|
|
1260
|
-
(isArrayField
|
|
1261
|
-
? _shouldUnregisterField && !control._state.action
|
|
1262
|
-
: _shouldUnregisterField)
|
|
1263
|
-
? control.unregister(name)
|
|
1264
|
-
: updateMounted(name, false);
|
|
1265
|
-
};
|
|
1266
|
-
}, [name, control, isArrayField, shouldUnregister]);
|
|
1267
|
-
React.useEffect(() => {
|
|
1268
|
-
control._setDisabledField({
|
|
1269
|
-
disabled,
|
|
1270
|
-
name,
|
|
1271
|
-
});
|
|
1272
|
-
}, [disabled, name, control]);
|
|
1273
|
-
return React.useMemo(() => ({
|
|
1274
|
-
field,
|
|
1275
|
-
formState,
|
|
1276
|
-
fieldState,
|
|
1277
|
-
}), [field, formState, fieldState]);
|
|
1278
|
-
}
|
|
1279
|
-
|
|
1280
|
-
/**
|
|
1281
|
-
* Component based on `useController` hook to work with controlled component.
|
|
1282
|
-
*
|
|
1283
|
-
* @remarks
|
|
1284
|
-
* [API](https://react-hook-form.com/docs/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)
|
|
1285
|
-
*
|
|
1286
|
-
* @param props - the path name to the form field value, and validation rules.
|
|
1287
|
-
*
|
|
1288
|
-
* @returns provide field handler functions, field and form state.
|
|
1289
|
-
*
|
|
1290
|
-
* @example
|
|
1291
|
-
* ```tsx
|
|
1292
|
-
* function App() {
|
|
1293
|
-
* const { control } = useForm<FormValues>({
|
|
1294
|
-
* defaultValues: {
|
|
1295
|
-
* test: ""
|
|
1296
|
-
* }
|
|
1297
|
-
* });
|
|
1298
|
-
*
|
|
1299
|
-
* return (
|
|
1300
|
-
* <form>
|
|
1301
|
-
* <Controller
|
|
1302
|
-
* control={control}
|
|
1303
|
-
* name="test"
|
|
1304
|
-
* render={({ field: { onChange, onBlur, value, ref }, formState, fieldState }) => (
|
|
1305
|
-
* <>
|
|
1306
|
-
* <input
|
|
1307
|
-
* onChange={onChange} // send value to hook form
|
|
1308
|
-
* onBlur={onBlur} // notify when input is touched
|
|
1309
|
-
* value={value} // return updated value
|
|
1310
|
-
* ref={ref} // set ref for focus management
|
|
1311
|
-
* />
|
|
1312
|
-
* <p>{formState.isSubmitted ? "submitted" : ""}</p>
|
|
1313
|
-
* <p>{fieldState.isTouched ? "touched" : ""}</p>
|
|
1314
|
-
* </>
|
|
1315
|
-
* )}
|
|
1316
|
-
* />
|
|
1317
|
-
* </form>
|
|
1318
|
-
* );
|
|
1319
|
-
* }
|
|
1320
|
-
* ```
|
|
1321
|
-
*/
|
|
1322
|
-
const Controller = (props) => props.render(useController(props));
|
|
1323
|
-
|
|
1324
|
-
// 获取 LSM 中的IP映射列表
|
|
1325
|
-
async function get_lsm_data() {
|
|
1326
|
-
return request('/api/get_lsm_data', {
|
|
1327
|
-
method: 'GET'
|
|
1328
|
-
});
|
|
1329
|
-
}
|
|
1330
|
-
|
|
1331
|
-
const useLSMLabel = function () {
|
|
1332
|
-
let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1333
|
-
const [lsmList, setLsmList] = useState([]);
|
|
1334
|
-
const {
|
|
1335
|
-
name,
|
|
1336
|
-
label = "Label",
|
|
1337
|
-
control,
|
|
1338
|
-
onLsmSelect,
|
|
1339
|
-
fetchLsmData = get_lsm_data,
|
|
1340
|
-
formItemProps = {},
|
|
1341
|
-
selectProps = {},
|
|
1342
|
-
fieldNames = {
|
|
1343
|
-
label: 'label',
|
|
1344
|
-
value: 'label'
|
|
1345
|
-
}
|
|
1346
|
-
} = props;
|
|
1347
|
-
useEffect(() => {
|
|
1348
|
-
const loadLsmData = async () => {
|
|
1349
|
-
try {
|
|
1350
|
-
const res = await fetchLsmData();
|
|
1351
|
-
if (res !== null && res !== void 0 && res.length) {
|
|
1352
|
-
setLsmList(res);
|
|
1353
|
-
}
|
|
1354
|
-
} catch (error) {
|
|
1355
|
-
console.error('Failed to fetch LSM data:', error);
|
|
1356
|
-
}
|
|
1357
|
-
};
|
|
1358
|
-
loadLsmData();
|
|
1359
|
-
}, [fetchLsmData]);
|
|
1360
|
-
const renderLSMField = () => /*#__PURE__*/jsx(Controller, {
|
|
1361
|
-
name: name,
|
|
1362
|
-
control: control,
|
|
1363
|
-
render: _ref => {
|
|
1364
|
-
let {
|
|
1365
|
-
field
|
|
1366
|
-
} = _ref;
|
|
1367
|
-
return /*#__PURE__*/jsx(Form.Item, _objectSpread2(_objectSpread2({
|
|
1368
|
-
label: label
|
|
1369
|
-
}, formItemProps), {}, {
|
|
1370
|
-
children: /*#__PURE__*/jsx(Select, _objectSpread2(_objectSpread2(_objectSpread2({}, field), selectProps), {}, {
|
|
1371
|
-
options: lsmList,
|
|
1372
|
-
fieldNames: fieldNames,
|
|
1373
|
-
allowClear: true,
|
|
1374
|
-
showSearch: true,
|
|
1375
|
-
optionFilterProp: "label",
|
|
1376
|
-
onChange: (value, option) => {
|
|
1377
|
-
field.onChange(value);
|
|
1378
|
-
onLsmSelect === null || onLsmSelect === void 0 || onLsmSelect(value === undefined ? undefined : option);
|
|
1379
|
-
},
|
|
1380
|
-
placeholder: selectProps.placeholder || 'Please select label'
|
|
1381
|
-
}))
|
|
1382
|
-
}));
|
|
1383
|
-
}
|
|
1384
|
-
});
|
|
1385
|
-
return renderLSMField;
|
|
1386
|
-
};
|
|
1387
|
-
|
|
1388
|
-
const NetworkFieldGroup = _ref => {
|
|
1389
|
-
var _fieldConfig$netmask$, _fieldConfig$netmask;
|
|
1390
|
-
let {
|
|
1391
|
-
prefix,
|
|
1392
|
-
interfaces,
|
|
1393
|
-
fieldConfig = {}
|
|
1394
|
-
} = _ref;
|
|
1395
|
-
// 默认字段配置
|
|
1396
|
-
const defaultFieldConfig = {
|
|
1397
|
-
name: {
|
|
1398
|
-
label: "Name",
|
|
1399
|
-
enabled: true
|
|
1400
|
-
},
|
|
1401
|
-
ip: {
|
|
1402
|
-
label: "IP Address",
|
|
1403
|
-
enabled: true
|
|
1404
|
-
},
|
|
1405
|
-
netmask: {
|
|
1406
|
-
label: "Netmask",
|
|
1407
|
-
enabled: true
|
|
1408
|
-
}
|
|
1409
|
-
};
|
|
1410
|
-
const mergedFieldConfig = _objectSpread2(_objectSpread2(_objectSpread2({}, defaultFieldConfig), fieldConfig), {}, {
|
|
1411
|
-
netmask: {
|
|
1412
|
-
label: "Netmask",
|
|
1413
|
-
enabled: (_fieldConfig$netmask$ = (_fieldConfig$netmask = fieldConfig.netmask) === null || _fieldConfig$netmask === void 0 ? void 0 : _fieldConfig$netmask.enabled) !== null && _fieldConfig$netmask$ !== void 0 ? _fieldConfig$netmask$ : defaultFieldConfig.netmask.enabled // 合并 enabled
|
|
1414
|
-
}
|
|
1415
|
-
});
|
|
1416
|
-
return /*#__PURE__*/jsxs(Fragment, {
|
|
1417
|
-
children: [/*#__PURE__*/jsx(Typography.Title, {
|
|
1418
|
-
level: 5,
|
|
1419
|
-
style: {
|
|
1420
|
-
display: 'flex',
|
|
1421
|
-
justifyContent: 'space-between',
|
|
1422
|
-
alignItems: 'center',
|
|
1423
|
-
marginBottom: 16
|
|
1424
|
-
},
|
|
1425
|
-
children: prefix
|
|
1426
|
-
}), interfaces.map((iface, index) => /*#__PURE__*/jsxs("div", {
|
|
1427
|
-
children: [mergedFieldConfig.name.enabled && /*#__PURE__*/jsx(Form.Item, {
|
|
1428
|
-
label: mergedFieldConfig.name.label,
|
|
1429
|
-
name: [prefix, index, "display_name"],
|
|
1430
|
-
children: /*#__PURE__*/jsx(Input, {
|
|
1431
|
-
disabled: true
|
|
1432
|
-
})
|
|
1433
|
-
}), mergedFieldConfig.ip.enabled && /*#__PURE__*/jsx(Form.Item, {
|
|
1434
|
-
label: mergedFieldConfig.ip.label,
|
|
1435
|
-
name: [prefix, index, "ip_address"],
|
|
1436
|
-
children: /*#__PURE__*/jsx(Input, {})
|
|
1437
|
-
}), mergedFieldConfig.netmask.enabled && /*#__PURE__*/jsx(Form.Item, {
|
|
1438
|
-
label: mergedFieldConfig.netmask.label,
|
|
1439
|
-
name: [prefix, index, "netmask"],
|
|
1440
|
-
children: /*#__PURE__*/jsx(Input, {})
|
|
1441
|
-
}), index < interfaces.length - 1 && /*#__PURE__*/jsx(Divider, {
|
|
1442
|
-
style: {
|
|
1443
|
-
marginBlock: 16
|
|
1444
|
-
}
|
|
1445
|
-
})]
|
|
1446
|
-
}, iface.id || index))]
|
|
1447
|
-
});
|
|
1448
|
-
};
|
|
1449
|
-
const NetworkSettingsModal = _ref2 => {
|
|
1450
|
-
let {
|
|
1451
|
-
open,
|
|
1452
|
-
onClose,
|
|
1453
|
-
getLanConfig,
|
|
1454
|
-
// 可选 - 单独获取LAN配置的函数
|
|
1455
|
-
getSysConfig,
|
|
1456
|
-
// 可选 - 单独获取QSFP配置的函数
|
|
1457
|
-
getConfig,
|
|
1458
|
-
// 可选 - 统一获取配置的函数
|
|
1459
|
-
updateLanConfig,
|
|
1460
|
-
updateSysConfig,
|
|
1461
|
-
restart,
|
|
1462
|
-
modalProps = {},
|
|
1463
|
-
formProps = {},
|
|
1464
|
-
fieldConfig = {},
|
|
1465
|
-
sections = ['LAN', 'QSFP'],
|
|
1466
|
-
showNetmask = {
|
|
1467
|
-
LAN: true,
|
|
1468
|
-
QSFP: false
|
|
1469
|
-
},
|
|
1470
|
-
restartRemark
|
|
1471
|
-
} = _ref2;
|
|
1472
|
-
const {
|
|
1473
|
-
message,
|
|
1474
|
-
modal
|
|
1475
|
-
} = App.useApp();
|
|
1476
|
-
const [form] = Form.useForm();
|
|
1477
|
-
const [st2110Interfaces, setSt2110Interfaces] = useState([]);
|
|
1478
|
-
const [lanConfigs, setLanConfigs] = useState([]);
|
|
1479
|
-
const [submitLoading, setSubmitLoading] = useState(false);
|
|
1480
|
-
const [isInitialized, setIsInitialized] = useState(false);
|
|
1481
|
-
const initializationStatus = useRef({
|
|
1482
|
-
hasFetched: false,
|
|
1483
|
-
hasInitialized: false
|
|
1484
|
-
});
|
|
1485
|
-
const preparedFieldConfig = useMemo(() => {
|
|
1486
|
-
const config = _objectSpread2({}, fieldConfig);
|
|
1487
|
-
|
|
1488
|
-
// 确保LAN和QSFP的配置存在
|
|
1489
|
-
config.LAN = config.LAN || {};
|
|
1490
|
-
config.QSFP = config.QSFP || {};
|
|
1491
|
-
if (sections.includes('LAN')) {
|
|
1492
|
-
config.LAN.netmask = _objectSpread2(_objectSpread2({}, config.LAN.netmask || {}), {}, {
|
|
1493
|
-
enabled: showNetmask.LAN
|
|
1494
|
-
});
|
|
1495
|
-
}
|
|
1496
|
-
if (sections.includes('QSFP')) {
|
|
1497
|
-
config.QSFP.netmask = _objectSpread2(_objectSpread2({}, config.QSFP.netmask || {}), {}, {
|
|
1498
|
-
enabled: showNetmask.QSFP
|
|
1499
|
-
});
|
|
1500
|
-
}
|
|
1501
|
-
return config;
|
|
1502
|
-
}, [fieldConfig, showNetmask, sections]);
|
|
1503
|
-
useEffect(() => {
|
|
1504
|
-
if (!open) return;
|
|
1505
|
-
const fetchData = async () => {
|
|
1506
|
-
if (initializationStatus.current.hasFetched) return;
|
|
1507
|
-
try {
|
|
1508
|
-
initializationStatus.current.hasFetched = true;
|
|
1509
|
-
if (getConfig) {
|
|
1510
|
-
// 使用统一接口获取数据
|
|
1511
|
-
const config = await getConfig();
|
|
1512
|
-
if (sections.includes('LAN') && config.lan_interfaces) {
|
|
1513
|
-
setLanConfigs(config.lan_interfaces);
|
|
1514
|
-
}
|
|
1515
|
-
if (sections.includes('QSFP') && config.interfaces) {
|
|
1516
|
-
setSt2110Interfaces(config.interfaces);
|
|
1517
|
-
}
|
|
1518
|
-
} else {
|
|
1519
|
-
const promises = [];
|
|
1520
|
-
if (sections.includes('LAN')) {
|
|
1521
|
-
promises.push(getLanConfig());
|
|
1522
|
-
}
|
|
1523
|
-
if (sections.includes('QSFP')) {
|
|
1524
|
-
promises.push(getSysConfig());
|
|
1525
|
-
}
|
|
1526
|
-
const results = await Promise.allSettled(promises);
|
|
1527
|
-
if (sections.includes('LAN') && getLanConfig) {
|
|
1528
|
-
const lanResult = results[0];
|
|
1529
|
-
if (lanResult.status === 'fulfilled') {
|
|
1530
|
-
setLanConfigs(lanResult.value || []);
|
|
1531
|
-
}
|
|
1532
|
-
}
|
|
1533
|
-
if (sections.includes('QSFP') && getSysConfig) {
|
|
1534
|
-
const sysResult = sections.includes('LAN') ? results[1] : results[0];
|
|
1535
|
-
if (sysResult.status === 'fulfilled' && sysResult.value) {
|
|
1536
|
-
setSt2110Interfaces(sysResult.value.st2110_interfaces || []);
|
|
1537
|
-
}
|
|
1538
|
-
}
|
|
1539
|
-
}
|
|
1540
|
-
setIsInitialized(true);
|
|
1541
|
-
} catch (error) {
|
|
1542
|
-
console.error('Failed to fetch data:', error);
|
|
1543
|
-
initializationStatus.current.hasFetched = false; // 出错时重置
|
|
1544
|
-
}
|
|
1545
|
-
};
|
|
1546
|
-
fetchData();
|
|
1547
|
-
}, [open, getLanConfig, getSysConfig, sections]);
|
|
1548
|
-
|
|
1549
|
-
// 当模态框关闭时重置状态
|
|
1550
|
-
useEffect(() => {
|
|
1551
|
-
if (!open) {
|
|
1552
|
-
setIsInitialized(false);
|
|
1553
|
-
setLanConfigs([]);
|
|
1554
|
-
setSt2110Interfaces([]);
|
|
1555
|
-
form.resetFields();
|
|
1556
|
-
initializationStatus.current = {
|
|
1557
|
-
hasFetched: false,
|
|
1558
|
-
hasInitialized: false
|
|
1559
|
-
};
|
|
1560
|
-
}
|
|
1561
|
-
}, [open, form]);
|
|
1562
|
-
|
|
1563
|
-
// 动态初始值配置
|
|
1564
|
-
const initialValues = useMemo(() => {
|
|
1565
|
-
const values = {};
|
|
1566
|
-
if (sections.includes('LAN') && lanConfigs.length > 0) {
|
|
1567
|
-
values.LAN = lanConfigs.map(config => _objectSpread2({
|
|
1568
|
-
connection_id: config.connection_id,
|
|
1569
|
-
display_name: config.display_name,
|
|
1570
|
-
ip_address: config.ip_address
|
|
1571
|
-
}, showNetmask.LAN ? {
|
|
1572
|
-
netmask: config.netmask
|
|
1573
|
-
} : {}));
|
|
1574
|
-
}
|
|
1575
|
-
if (sections.includes('QSFP') && st2110Interfaces.length > 0) {
|
|
1576
|
-
values.QSFP = st2110Interfaces.map(iface => _objectSpread2(_objectSpread2({}, iface.id !== undefined && {
|
|
1577
|
-
id: iface.id
|
|
1578
|
-
}), {}, {
|
|
1579
|
-
display_name: iface.display_name,
|
|
1580
|
-
ip_address: iface.ip_address || iface.ip
|
|
1581
|
-
}, showNetmask.QSFP ? {
|
|
1582
|
-
netmask: iface.netmask
|
|
1583
|
-
} : {}));
|
|
1584
|
-
}
|
|
1585
|
-
return values;
|
|
1586
|
-
}, [lanConfigs, st2110Interfaces, sections, showNetmask]);
|
|
1587
|
-
|
|
1588
|
-
// 当初始值准备好后设置表单值
|
|
1589
|
-
useEffect(() => {
|
|
1590
|
-
if (isInitialized && !initializationStatus.current.hasInitialized) {
|
|
1591
|
-
form.setFieldsValue(initialValues);
|
|
1592
|
-
initializationStatus.current.hasInitialized = true;
|
|
1593
|
-
}
|
|
1594
|
-
}, [isInitialized, form, initialValues]);
|
|
1595
|
-
const handleSuccess = useCallback(async function () {
|
|
1596
|
-
let {
|
|
1597
|
-
messageText = 'Success',
|
|
1598
|
-
isPopup = !!restart,
|
|
1599
|
-
refresh = !restart
|
|
1600
|
-
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1601
|
-
message.success(messageText);
|
|
1602
|
-
if (refresh && getConfig) {
|
|
1603
|
-
try {
|
|
1604
|
-
const newConfig = await getConfig();
|
|
1605
|
-
if (sections.includes('LAN') && newConfig.lan_interfaces) {
|
|
1606
|
-
setLanConfigs(newConfig.lan_interfaces);
|
|
1607
|
-
}
|
|
1608
|
-
if (sections.includes('QSFP') && newConfig.interfaces) {
|
|
1609
|
-
setSt2110Interfaces(newConfig.interfaces);
|
|
1610
|
-
}
|
|
1611
|
-
} catch (error) {
|
|
1612
|
-
console.error('Failed to refresh config:', error);
|
|
1613
|
-
}
|
|
1614
|
-
}
|
|
1615
|
-
|
|
1616
|
-
// 如果有restart函数,则显示重启确认框
|
|
1617
|
-
if (isPopup && restart) {
|
|
1618
|
-
try {
|
|
1619
|
-
const updatedConfig = await getSysConfig();
|
|
1620
|
-
if (updatedConfig && updatedConfig.is_restart_required) {
|
|
1621
|
-
modal.confirm({
|
|
1622
|
-
icon: /*#__PURE__*/jsx(ExclamationCircleFilled, {}),
|
|
1623
|
-
title: "Configuration modified. Restart to apply changes?",
|
|
1624
|
-
cancelText: "No",
|
|
1625
|
-
okText: "Yes",
|
|
1626
|
-
onOk: () => restart()
|
|
1627
|
-
});
|
|
1628
|
-
}
|
|
1629
|
-
} catch (error) {
|
|
1630
|
-
console.error('Failed to check restart status:', error);
|
|
1631
|
-
}
|
|
1632
|
-
}
|
|
1633
|
-
onClose();
|
|
1634
|
-
}, [message, modal, getSysConfig, restart, getConfig, sections, onClose]);
|
|
1635
|
-
const handleSubmit = useCallback(async () => {
|
|
1636
|
-
setSubmitLoading(true);
|
|
1637
|
-
try {
|
|
1638
|
-
const values = await form.validateFields();
|
|
1639
|
-
const updatePromises = [];
|
|
1038
|
+
onClose();
|
|
1039
|
+
}, [message, modal, getSysConfig, restart, getConfig, sections, onClose]);
|
|
1040
|
+
const handleSubmit = useCallback(async () => {
|
|
1041
|
+
setSubmitLoading(true);
|
|
1042
|
+
try {
|
|
1043
|
+
const values = await form.validateFields();
|
|
1044
|
+
const updatePromises = [];
|
|
1640
1045
|
|
|
1641
1046
|
// 更新LAN配置
|
|
1642
1047
|
if (sections.includes('LAN') && values.LAN) {
|
|
@@ -3257,118 +2662,286 @@ function requireFactoryWithTypeCheckers () {
|
|
|
3257
2662
|
return x !== x && y !== y;
|
|
3258
2663
|
}
|
|
3259
2664
|
}
|
|
3260
|
-
/*eslint-enable no-self-compare*/
|
|
2665
|
+
/*eslint-enable no-self-compare*/
|
|
2666
|
+
|
|
2667
|
+
/**
|
|
2668
|
+
* We use an Error-like object for backward compatibility as people may call
|
|
2669
|
+
* PropTypes directly and inspect their output. However, we don't use real
|
|
2670
|
+
* Errors anymore. We don't inspect their stack anyway, and creating them
|
|
2671
|
+
* is prohibitively expensive if they are created too often, such as what
|
|
2672
|
+
* happens in oneOfType() for any type before the one that matched.
|
|
2673
|
+
*/
|
|
2674
|
+
function PropTypeError(message, data) {
|
|
2675
|
+
this.message = message;
|
|
2676
|
+
this.data = data && typeof data === 'object' ? data: {};
|
|
2677
|
+
this.stack = '';
|
|
2678
|
+
}
|
|
2679
|
+
// Make `instanceof Error` still work for returned errors.
|
|
2680
|
+
PropTypeError.prototype = Error.prototype;
|
|
2681
|
+
|
|
2682
|
+
function createChainableTypeChecker(validate) {
|
|
2683
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
2684
|
+
var manualPropTypeCallCache = {};
|
|
2685
|
+
var manualPropTypeWarningCount = 0;
|
|
2686
|
+
}
|
|
2687
|
+
function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
|
|
2688
|
+
componentName = componentName || ANONYMOUS;
|
|
2689
|
+
propFullName = propFullName || propName;
|
|
2690
|
+
|
|
2691
|
+
if (secret !== ReactPropTypesSecret) {
|
|
2692
|
+
if (throwOnDirectAccess) {
|
|
2693
|
+
// New behavior only for users of `prop-types` package
|
|
2694
|
+
var err = new Error(
|
|
2695
|
+
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
|
|
2696
|
+
'Use `PropTypes.checkPropTypes()` to call them. ' +
|
|
2697
|
+
'Read more at http://fb.me/use-check-prop-types'
|
|
2698
|
+
);
|
|
2699
|
+
err.name = 'Invariant Violation';
|
|
2700
|
+
throw err;
|
|
2701
|
+
} else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {
|
|
2702
|
+
// Old behavior for people using React.PropTypes
|
|
2703
|
+
var cacheKey = componentName + ':' + propName;
|
|
2704
|
+
if (
|
|
2705
|
+
!manualPropTypeCallCache[cacheKey] &&
|
|
2706
|
+
// Avoid spamming the console because they are often not actionable except for lib authors
|
|
2707
|
+
manualPropTypeWarningCount < 3
|
|
2708
|
+
) {
|
|
2709
|
+
printWarning(
|
|
2710
|
+
'You are manually calling a React.PropTypes validation ' +
|
|
2711
|
+
'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +
|
|
2712
|
+
'and will throw in the standalone `prop-types` package. ' +
|
|
2713
|
+
'You may be seeing this warning due to a third-party PropTypes ' +
|
|
2714
|
+
'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
|
|
2715
|
+
);
|
|
2716
|
+
manualPropTypeCallCache[cacheKey] = true;
|
|
2717
|
+
manualPropTypeWarningCount++;
|
|
2718
|
+
}
|
|
2719
|
+
}
|
|
2720
|
+
}
|
|
2721
|
+
if (props[propName] == null) {
|
|
2722
|
+
if (isRequired) {
|
|
2723
|
+
if (props[propName] === null) {
|
|
2724
|
+
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
|
|
2725
|
+
}
|
|
2726
|
+
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
|
|
2727
|
+
}
|
|
2728
|
+
return null;
|
|
2729
|
+
} else {
|
|
2730
|
+
return validate(props, propName, componentName, location, propFullName);
|
|
2731
|
+
}
|
|
2732
|
+
}
|
|
2733
|
+
|
|
2734
|
+
var chainedCheckType = checkType.bind(null, false);
|
|
2735
|
+
chainedCheckType.isRequired = checkType.bind(null, true);
|
|
2736
|
+
|
|
2737
|
+
return chainedCheckType;
|
|
2738
|
+
}
|
|
2739
|
+
|
|
2740
|
+
function createPrimitiveTypeChecker(expectedType) {
|
|
2741
|
+
function validate(props, propName, componentName, location, propFullName, secret) {
|
|
2742
|
+
var propValue = props[propName];
|
|
2743
|
+
var propType = getPropType(propValue);
|
|
2744
|
+
if (propType !== expectedType) {
|
|
2745
|
+
// `propValue` being instance of, say, date/regexp, pass the 'object'
|
|
2746
|
+
// check, but we can offer a more precise error message here rather than
|
|
2747
|
+
// 'of type `object`'.
|
|
2748
|
+
var preciseType = getPreciseType(propValue);
|
|
2749
|
+
|
|
2750
|
+
return new PropTypeError(
|
|
2751
|
+
'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),
|
|
2752
|
+
{expectedType: expectedType}
|
|
2753
|
+
);
|
|
2754
|
+
}
|
|
2755
|
+
return null;
|
|
2756
|
+
}
|
|
2757
|
+
return createChainableTypeChecker(validate);
|
|
2758
|
+
}
|
|
2759
|
+
|
|
2760
|
+
function createAnyTypeChecker() {
|
|
2761
|
+
return createChainableTypeChecker(emptyFunctionThatReturnsNull);
|
|
2762
|
+
}
|
|
2763
|
+
|
|
2764
|
+
function createArrayOfTypeChecker(typeChecker) {
|
|
2765
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2766
|
+
if (typeof typeChecker !== 'function') {
|
|
2767
|
+
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
|
|
2768
|
+
}
|
|
2769
|
+
var propValue = props[propName];
|
|
2770
|
+
if (!Array.isArray(propValue)) {
|
|
2771
|
+
var propType = getPropType(propValue);
|
|
2772
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
|
|
2773
|
+
}
|
|
2774
|
+
for (var i = 0; i < propValue.length; i++) {
|
|
2775
|
+
var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);
|
|
2776
|
+
if (error instanceof Error) {
|
|
2777
|
+
return error;
|
|
2778
|
+
}
|
|
2779
|
+
}
|
|
2780
|
+
return null;
|
|
2781
|
+
}
|
|
2782
|
+
return createChainableTypeChecker(validate);
|
|
2783
|
+
}
|
|
2784
|
+
|
|
2785
|
+
function createElementTypeChecker() {
|
|
2786
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2787
|
+
var propValue = props[propName];
|
|
2788
|
+
if (!isValidElement(propValue)) {
|
|
2789
|
+
var propType = getPropType(propValue);
|
|
2790
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
|
|
2791
|
+
}
|
|
2792
|
+
return null;
|
|
2793
|
+
}
|
|
2794
|
+
return createChainableTypeChecker(validate);
|
|
2795
|
+
}
|
|
2796
|
+
|
|
2797
|
+
function createElementTypeTypeChecker() {
|
|
2798
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2799
|
+
var propValue = props[propName];
|
|
2800
|
+
if (!ReactIs.isValidElementType(propValue)) {
|
|
2801
|
+
var propType = getPropType(propValue);
|
|
2802
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));
|
|
2803
|
+
}
|
|
2804
|
+
return null;
|
|
2805
|
+
}
|
|
2806
|
+
return createChainableTypeChecker(validate);
|
|
2807
|
+
}
|
|
2808
|
+
|
|
2809
|
+
function createInstanceTypeChecker(expectedClass) {
|
|
2810
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2811
|
+
if (!(props[propName] instanceof expectedClass)) {
|
|
2812
|
+
var expectedClassName = expectedClass.name || ANONYMOUS;
|
|
2813
|
+
var actualClassName = getClassName(props[propName]);
|
|
2814
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
|
|
2815
|
+
}
|
|
2816
|
+
return null;
|
|
2817
|
+
}
|
|
2818
|
+
return createChainableTypeChecker(validate);
|
|
2819
|
+
}
|
|
2820
|
+
|
|
2821
|
+
function createEnumTypeChecker(expectedValues) {
|
|
2822
|
+
if (!Array.isArray(expectedValues)) {
|
|
2823
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
2824
|
+
if (arguments.length > 1) {
|
|
2825
|
+
printWarning(
|
|
2826
|
+
'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +
|
|
2827
|
+
'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'
|
|
2828
|
+
);
|
|
2829
|
+
} else {
|
|
2830
|
+
printWarning('Invalid argument supplied to oneOf, expected an array.');
|
|
2831
|
+
}
|
|
2832
|
+
}
|
|
2833
|
+
return emptyFunctionThatReturnsNull;
|
|
2834
|
+
}
|
|
2835
|
+
|
|
2836
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2837
|
+
var propValue = props[propName];
|
|
2838
|
+
for (var i = 0; i < expectedValues.length; i++) {
|
|
2839
|
+
if (is(propValue, expectedValues[i])) {
|
|
2840
|
+
return null;
|
|
2841
|
+
}
|
|
2842
|
+
}
|
|
2843
|
+
|
|
2844
|
+
var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
|
|
2845
|
+
var type = getPreciseType(value);
|
|
2846
|
+
if (type === 'symbol') {
|
|
2847
|
+
return String(value);
|
|
2848
|
+
}
|
|
2849
|
+
return value;
|
|
2850
|
+
});
|
|
2851
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
|
|
2852
|
+
}
|
|
2853
|
+
return createChainableTypeChecker(validate);
|
|
2854
|
+
}
|
|
2855
|
+
|
|
2856
|
+
function createObjectOfTypeChecker(typeChecker) {
|
|
2857
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2858
|
+
if (typeof typeChecker !== 'function') {
|
|
2859
|
+
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
|
|
2860
|
+
}
|
|
2861
|
+
var propValue = props[propName];
|
|
2862
|
+
var propType = getPropType(propValue);
|
|
2863
|
+
if (propType !== 'object') {
|
|
2864
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
|
|
2865
|
+
}
|
|
2866
|
+
for (var key in propValue) {
|
|
2867
|
+
if (has(propValue, key)) {
|
|
2868
|
+
var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
|
|
2869
|
+
if (error instanceof Error) {
|
|
2870
|
+
return error;
|
|
2871
|
+
}
|
|
2872
|
+
}
|
|
2873
|
+
}
|
|
2874
|
+
return null;
|
|
2875
|
+
}
|
|
2876
|
+
return createChainableTypeChecker(validate);
|
|
2877
|
+
}
|
|
3261
2878
|
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
* happens in oneOfType() for any type before the one that matched.
|
|
3268
|
-
*/
|
|
3269
|
-
function PropTypeError(message, data) {
|
|
3270
|
-
this.message = message;
|
|
3271
|
-
this.data = data && typeof data === 'object' ? data: {};
|
|
3272
|
-
this.stack = '';
|
|
3273
|
-
}
|
|
3274
|
-
// Make `instanceof Error` still work for returned errors.
|
|
3275
|
-
PropTypeError.prototype = Error.prototype;
|
|
2879
|
+
function createUnionTypeChecker(arrayOfTypeCheckers) {
|
|
2880
|
+
if (!Array.isArray(arrayOfTypeCheckers)) {
|
|
2881
|
+
process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;
|
|
2882
|
+
return emptyFunctionThatReturnsNull;
|
|
2883
|
+
}
|
|
3276
2884
|
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
2885
|
+
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
|
2886
|
+
var checker = arrayOfTypeCheckers[i];
|
|
2887
|
+
if (typeof checker !== 'function') {
|
|
2888
|
+
printWarning(
|
|
2889
|
+
'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
|
|
2890
|
+
'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
|
|
2891
|
+
);
|
|
2892
|
+
return emptyFunctionThatReturnsNull;
|
|
2893
|
+
}
|
|
3281
2894
|
}
|
|
3282
|
-
function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
|
|
3283
|
-
componentName = componentName || ANONYMOUS;
|
|
3284
|
-
propFullName = propFullName || propName;
|
|
3285
2895
|
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
);
|
|
3294
|
-
err.name = 'Invariant Violation';
|
|
3295
|
-
throw err;
|
|
3296
|
-
} else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {
|
|
3297
|
-
// Old behavior for people using React.PropTypes
|
|
3298
|
-
var cacheKey = componentName + ':' + propName;
|
|
3299
|
-
if (
|
|
3300
|
-
!manualPropTypeCallCache[cacheKey] &&
|
|
3301
|
-
// Avoid spamming the console because they are often not actionable except for lib authors
|
|
3302
|
-
manualPropTypeWarningCount < 3
|
|
3303
|
-
) {
|
|
3304
|
-
printWarning(
|
|
3305
|
-
'You are manually calling a React.PropTypes validation ' +
|
|
3306
|
-
'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +
|
|
3307
|
-
'and will throw in the standalone `prop-types` package. ' +
|
|
3308
|
-
'You may be seeing this warning due to a third-party PropTypes ' +
|
|
3309
|
-
'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'
|
|
3310
|
-
);
|
|
3311
|
-
manualPropTypeCallCache[cacheKey] = true;
|
|
3312
|
-
manualPropTypeWarningCount++;
|
|
3313
|
-
}
|
|
2896
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2897
|
+
var expectedTypes = [];
|
|
2898
|
+
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
|
2899
|
+
var checker = arrayOfTypeCheckers[i];
|
|
2900
|
+
var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);
|
|
2901
|
+
if (checkerResult == null) {
|
|
2902
|
+
return null;
|
|
3314
2903
|
}
|
|
3315
|
-
|
|
3316
|
-
|
|
3317
|
-
if (isRequired) {
|
|
3318
|
-
if (props[propName] === null) {
|
|
3319
|
-
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
|
|
3320
|
-
}
|
|
3321
|
-
return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
|
|
2904
|
+
if (checkerResult.data && has(checkerResult.data, 'expectedType')) {
|
|
2905
|
+
expectedTypes.push(checkerResult.data.expectedType);
|
|
3322
2906
|
}
|
|
3323
|
-
return null;
|
|
3324
|
-
} else {
|
|
3325
|
-
return validate(props, propName, componentName, location, propFullName);
|
|
3326
2907
|
}
|
|
2908
|
+
var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';
|
|
2909
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));
|
|
3327
2910
|
}
|
|
3328
|
-
|
|
3329
|
-
var chainedCheckType = checkType.bind(null, false);
|
|
3330
|
-
chainedCheckType.isRequired = checkType.bind(null, true);
|
|
3331
|
-
|
|
3332
|
-
return chainedCheckType;
|
|
2911
|
+
return createChainableTypeChecker(validate);
|
|
3333
2912
|
}
|
|
3334
2913
|
|
|
3335
|
-
function
|
|
3336
|
-
function validate(props, propName, componentName, location, propFullName
|
|
3337
|
-
|
|
3338
|
-
|
|
3339
|
-
if (propType !== expectedType) {
|
|
3340
|
-
// `propValue` being instance of, say, date/regexp, pass the 'object'
|
|
3341
|
-
// check, but we can offer a more precise error message here rather than
|
|
3342
|
-
// 'of type `object`'.
|
|
3343
|
-
var preciseType = getPreciseType(propValue);
|
|
3344
|
-
|
|
3345
|
-
return new PropTypeError(
|
|
3346
|
-
'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),
|
|
3347
|
-
{expectedType: expectedType}
|
|
3348
|
-
);
|
|
2914
|
+
function createNodeChecker() {
|
|
2915
|
+
function validate(props, propName, componentName, location, propFullName) {
|
|
2916
|
+
if (!isNode(props[propName])) {
|
|
2917
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
|
|
3349
2918
|
}
|
|
3350
2919
|
return null;
|
|
3351
2920
|
}
|
|
3352
2921
|
return createChainableTypeChecker(validate);
|
|
3353
2922
|
}
|
|
3354
2923
|
|
|
3355
|
-
function
|
|
3356
|
-
return
|
|
2924
|
+
function invalidValidatorError(componentName, location, propFullName, key, type) {
|
|
2925
|
+
return new PropTypeError(
|
|
2926
|
+
(componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +
|
|
2927
|
+
'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'
|
|
2928
|
+
);
|
|
3357
2929
|
}
|
|
3358
2930
|
|
|
3359
|
-
function
|
|
2931
|
+
function createShapeTypeChecker(shapeTypes) {
|
|
3360
2932
|
function validate(props, propName, componentName, location, propFullName) {
|
|
3361
|
-
if (typeof typeChecker !== 'function') {
|
|
3362
|
-
return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
|
|
3363
|
-
}
|
|
3364
2933
|
var propValue = props[propName];
|
|
3365
|
-
|
|
3366
|
-
|
|
3367
|
-
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type
|
|
2934
|
+
var propType = getPropType(propValue);
|
|
2935
|
+
if (propType !== 'object') {
|
|
2936
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
|
3368
2937
|
}
|
|
3369
|
-
for (var
|
|
3370
|
-
var
|
|
3371
|
-
if (
|
|
2938
|
+
for (var key in shapeTypes) {
|
|
2939
|
+
var checker = shapeTypes[key];
|
|
2940
|
+
if (typeof checker !== 'function') {
|
|
2941
|
+
return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
|
|
2942
|
+
}
|
|
2943
|
+
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
|
|
2944
|
+
if (error) {
|
|
3372
2945
|
return error;
|
|
3373
2946
|
}
|
|
3374
2947
|
}
|
|
@@ -3377,692 +2950,1113 @@ function requireFactoryWithTypeCheckers () {
|
|
|
3377
2950
|
return createChainableTypeChecker(validate);
|
|
3378
2951
|
}
|
|
3379
2952
|
|
|
3380
|
-
function
|
|
2953
|
+
function createStrictShapeTypeChecker(shapeTypes) {
|
|
3381
2954
|
function validate(props, propName, componentName, location, propFullName) {
|
|
3382
2955
|
var propValue = props[propName];
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type
|
|
2956
|
+
var propType = getPropType(propValue);
|
|
2957
|
+
if (propType !== 'object') {
|
|
2958
|
+
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
|
2959
|
+
}
|
|
2960
|
+
// We need to check all keys in case some are required but missing from props.
|
|
2961
|
+
var allKeys = assign({}, props[propName], shapeTypes);
|
|
2962
|
+
for (var key in allKeys) {
|
|
2963
|
+
var checker = shapeTypes[key];
|
|
2964
|
+
if (has(shapeTypes, key) && typeof checker !== 'function') {
|
|
2965
|
+
return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
|
|
2966
|
+
}
|
|
2967
|
+
if (!checker) {
|
|
2968
|
+
return new PropTypeError(
|
|
2969
|
+
'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
|
|
2970
|
+
'\nBad object: ' + JSON.stringify(props[propName], null, ' ') +
|
|
2971
|
+
'\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')
|
|
2972
|
+
);
|
|
2973
|
+
}
|
|
2974
|
+
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
|
|
2975
|
+
if (error) {
|
|
2976
|
+
return error;
|
|
2977
|
+
}
|
|
3386
2978
|
}
|
|
3387
2979
|
return null;
|
|
3388
2980
|
}
|
|
3389
|
-
|
|
2981
|
+
|
|
2982
|
+
return createChainableTypeChecker(validate);
|
|
2983
|
+
}
|
|
2984
|
+
|
|
2985
|
+
function isNode(propValue) {
|
|
2986
|
+
switch (typeof propValue) {
|
|
2987
|
+
case 'number':
|
|
2988
|
+
case 'string':
|
|
2989
|
+
case 'undefined':
|
|
2990
|
+
return true;
|
|
2991
|
+
case 'boolean':
|
|
2992
|
+
return !propValue;
|
|
2993
|
+
case 'object':
|
|
2994
|
+
if (Array.isArray(propValue)) {
|
|
2995
|
+
return propValue.every(isNode);
|
|
2996
|
+
}
|
|
2997
|
+
if (propValue === null || isValidElement(propValue)) {
|
|
2998
|
+
return true;
|
|
2999
|
+
}
|
|
3000
|
+
|
|
3001
|
+
var iteratorFn = getIteratorFn(propValue);
|
|
3002
|
+
if (iteratorFn) {
|
|
3003
|
+
var iterator = iteratorFn.call(propValue);
|
|
3004
|
+
var step;
|
|
3005
|
+
if (iteratorFn !== propValue.entries) {
|
|
3006
|
+
while (!(step = iterator.next()).done) {
|
|
3007
|
+
if (!isNode(step.value)) {
|
|
3008
|
+
return false;
|
|
3009
|
+
}
|
|
3010
|
+
}
|
|
3011
|
+
} else {
|
|
3012
|
+
// Iterator will provide entry [k,v] tuples rather than values.
|
|
3013
|
+
while (!(step = iterator.next()).done) {
|
|
3014
|
+
var entry = step.value;
|
|
3015
|
+
if (entry) {
|
|
3016
|
+
if (!isNode(entry[1])) {
|
|
3017
|
+
return false;
|
|
3018
|
+
}
|
|
3019
|
+
}
|
|
3020
|
+
}
|
|
3021
|
+
}
|
|
3022
|
+
} else {
|
|
3023
|
+
return false;
|
|
3024
|
+
}
|
|
3025
|
+
|
|
3026
|
+
return true;
|
|
3027
|
+
default:
|
|
3028
|
+
return false;
|
|
3029
|
+
}
|
|
3030
|
+
}
|
|
3031
|
+
|
|
3032
|
+
function isSymbol(propType, propValue) {
|
|
3033
|
+
// Native Symbol.
|
|
3034
|
+
if (propType === 'symbol') {
|
|
3035
|
+
return true;
|
|
3036
|
+
}
|
|
3037
|
+
|
|
3038
|
+
// falsy value can't be a Symbol
|
|
3039
|
+
if (!propValue) {
|
|
3040
|
+
return false;
|
|
3041
|
+
}
|
|
3042
|
+
|
|
3043
|
+
// 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
|
|
3044
|
+
if (propValue['@@toStringTag'] === 'Symbol') {
|
|
3045
|
+
return true;
|
|
3046
|
+
}
|
|
3047
|
+
|
|
3048
|
+
// Fallback for non-spec compliant Symbols which are polyfilled.
|
|
3049
|
+
if (typeof Symbol === 'function' && propValue instanceof Symbol) {
|
|
3050
|
+
return true;
|
|
3051
|
+
}
|
|
3052
|
+
|
|
3053
|
+
return false;
|
|
3054
|
+
}
|
|
3055
|
+
|
|
3056
|
+
// Equivalent of `typeof` but with special handling for array and regexp.
|
|
3057
|
+
function getPropType(propValue) {
|
|
3058
|
+
var propType = typeof propValue;
|
|
3059
|
+
if (Array.isArray(propValue)) {
|
|
3060
|
+
return 'array';
|
|
3061
|
+
}
|
|
3062
|
+
if (propValue instanceof RegExp) {
|
|
3063
|
+
// Old webkits (at least until Android 4.0) return 'function' rather than
|
|
3064
|
+
// 'object' for typeof a RegExp. We'll normalize this here so that /bla/
|
|
3065
|
+
// passes PropTypes.object.
|
|
3066
|
+
return 'object';
|
|
3067
|
+
}
|
|
3068
|
+
if (isSymbol(propType, propValue)) {
|
|
3069
|
+
return 'symbol';
|
|
3070
|
+
}
|
|
3071
|
+
return propType;
|
|
3390
3072
|
}
|
|
3391
3073
|
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3395
|
-
|
|
3396
|
-
|
|
3397
|
-
|
|
3074
|
+
// This handles more types than `getPropType`. Only used for error messages.
|
|
3075
|
+
// See `createPrimitiveTypeChecker`.
|
|
3076
|
+
function getPreciseType(propValue) {
|
|
3077
|
+
if (typeof propValue === 'undefined' || propValue === null) {
|
|
3078
|
+
return '' + propValue;
|
|
3079
|
+
}
|
|
3080
|
+
var propType = getPropType(propValue);
|
|
3081
|
+
if (propType === 'object') {
|
|
3082
|
+
if (propValue instanceof Date) {
|
|
3083
|
+
return 'date';
|
|
3084
|
+
} else if (propValue instanceof RegExp) {
|
|
3085
|
+
return 'regexp';
|
|
3398
3086
|
}
|
|
3399
|
-
return null;
|
|
3400
3087
|
}
|
|
3401
|
-
return
|
|
3088
|
+
return propType;
|
|
3402
3089
|
}
|
|
3403
3090
|
|
|
3404
|
-
|
|
3405
|
-
|
|
3406
|
-
|
|
3407
|
-
|
|
3408
|
-
|
|
3409
|
-
|
|
3410
|
-
|
|
3411
|
-
|
|
3091
|
+
// Returns a string that is postfixed to a warning about an invalid type.
|
|
3092
|
+
// For example, "undefined" or "of type array"
|
|
3093
|
+
function getPostfixForTypeWarning(value) {
|
|
3094
|
+
var type = getPreciseType(value);
|
|
3095
|
+
switch (type) {
|
|
3096
|
+
case 'array':
|
|
3097
|
+
case 'object':
|
|
3098
|
+
return 'an ' + type;
|
|
3099
|
+
case 'boolean':
|
|
3100
|
+
case 'date':
|
|
3101
|
+
case 'regexp':
|
|
3102
|
+
return 'a ' + type;
|
|
3103
|
+
default:
|
|
3104
|
+
return type;
|
|
3412
3105
|
}
|
|
3413
|
-
return createChainableTypeChecker(validate);
|
|
3414
3106
|
}
|
|
3415
3107
|
|
|
3416
|
-
|
|
3417
|
-
|
|
3418
|
-
|
|
3419
|
-
|
|
3420
|
-
printWarning(
|
|
3421
|
-
'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +
|
|
3422
|
-
'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'
|
|
3423
|
-
);
|
|
3424
|
-
} else {
|
|
3425
|
-
printWarning('Invalid argument supplied to oneOf, expected an array.');
|
|
3426
|
-
}
|
|
3427
|
-
}
|
|
3428
|
-
return emptyFunctionThatReturnsNull;
|
|
3108
|
+
// Returns class name of the object, if any.
|
|
3109
|
+
function getClassName(propValue) {
|
|
3110
|
+
if (!propValue.constructor || !propValue.constructor.name) {
|
|
3111
|
+
return ANONYMOUS;
|
|
3429
3112
|
}
|
|
3113
|
+
return propValue.constructor.name;
|
|
3114
|
+
}
|
|
3430
3115
|
|
|
3431
|
-
|
|
3432
|
-
|
|
3433
|
-
|
|
3434
|
-
if (is(propValue, expectedValues[i])) {
|
|
3435
|
-
return null;
|
|
3436
|
-
}
|
|
3437
|
-
}
|
|
3116
|
+
ReactPropTypes.checkPropTypes = checkPropTypes;
|
|
3117
|
+
ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;
|
|
3118
|
+
ReactPropTypes.PropTypes = ReactPropTypes;
|
|
3438
3119
|
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
}
|
|
3444
|
-
return value;
|
|
3445
|
-
});
|
|
3446
|
-
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
|
|
3447
|
-
}
|
|
3448
|
-
return createChainableTypeChecker(validate);
|
|
3449
|
-
}
|
|
3120
|
+
return ReactPropTypes;
|
|
3121
|
+
};
|
|
3122
|
+
return factoryWithTypeCheckers;
|
|
3123
|
+
}
|
|
3450
3124
|
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
|
|
3469
|
-
|
|
3125
|
+
/**
|
|
3126
|
+
* Copyright (c) 2013-present, Facebook, Inc.
|
|
3127
|
+
*
|
|
3128
|
+
* This source code is licensed under the MIT license found in the
|
|
3129
|
+
* LICENSE file in the root directory of this source tree.
|
|
3130
|
+
*/
|
|
3131
|
+
|
|
3132
|
+
var factoryWithThrowingShims;
|
|
3133
|
+
var hasRequiredFactoryWithThrowingShims;
|
|
3134
|
+
|
|
3135
|
+
function requireFactoryWithThrowingShims () {
|
|
3136
|
+
if (hasRequiredFactoryWithThrowingShims) return factoryWithThrowingShims;
|
|
3137
|
+
hasRequiredFactoryWithThrowingShims = 1;
|
|
3138
|
+
|
|
3139
|
+
var ReactPropTypesSecret = /*@__PURE__*/ requireReactPropTypesSecret();
|
|
3140
|
+
|
|
3141
|
+
function emptyFunction() {}
|
|
3142
|
+
function emptyFunctionWithReset() {}
|
|
3143
|
+
emptyFunctionWithReset.resetWarningCache = emptyFunction;
|
|
3144
|
+
|
|
3145
|
+
factoryWithThrowingShims = function() {
|
|
3146
|
+
function shim(props, propName, componentName, location, propFullName, secret) {
|
|
3147
|
+
if (secret === ReactPropTypesSecret) {
|
|
3148
|
+
// It is still safe when called from React.
|
|
3149
|
+
return;
|
|
3470
3150
|
}
|
|
3471
|
-
|
|
3472
|
-
|
|
3151
|
+
var err = new Error(
|
|
3152
|
+
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
|
|
3153
|
+
'Use PropTypes.checkPropTypes() to call them. ' +
|
|
3154
|
+
'Read more at http://fb.me/use-check-prop-types'
|
|
3155
|
+
);
|
|
3156
|
+
err.name = 'Invariant Violation';
|
|
3157
|
+
throw err;
|
|
3158
|
+
} shim.isRequired = shim;
|
|
3159
|
+
function getShim() {
|
|
3160
|
+
return shim;
|
|
3161
|
+
} // Important!
|
|
3162
|
+
// Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
|
|
3163
|
+
var ReactPropTypes = {
|
|
3164
|
+
array: shim,
|
|
3165
|
+
bigint: shim,
|
|
3166
|
+
bool: shim,
|
|
3167
|
+
func: shim,
|
|
3168
|
+
number: shim,
|
|
3169
|
+
object: shim,
|
|
3170
|
+
string: shim,
|
|
3171
|
+
symbol: shim,
|
|
3172
|
+
|
|
3173
|
+
any: shim,
|
|
3174
|
+
arrayOf: getShim,
|
|
3175
|
+
element: shim,
|
|
3176
|
+
elementType: shim,
|
|
3177
|
+
instanceOf: getShim,
|
|
3178
|
+
node: shim,
|
|
3179
|
+
objectOf: getShim,
|
|
3180
|
+
oneOf: getShim,
|
|
3181
|
+
oneOfType: getShim,
|
|
3182
|
+
shape: getShim,
|
|
3183
|
+
exact: getShim,
|
|
3184
|
+
|
|
3185
|
+
checkPropTypes: emptyFunctionWithReset,
|
|
3186
|
+
resetWarningCache: emptyFunction
|
|
3187
|
+
};
|
|
3188
|
+
|
|
3189
|
+
ReactPropTypes.PropTypes = ReactPropTypes;
|
|
3190
|
+
|
|
3191
|
+
return ReactPropTypes;
|
|
3192
|
+
};
|
|
3193
|
+
return factoryWithThrowingShims;
|
|
3194
|
+
}
|
|
3195
|
+
|
|
3196
|
+
/**
|
|
3197
|
+
* Copyright (c) 2013-present, Facebook, Inc.
|
|
3198
|
+
*
|
|
3199
|
+
* This source code is licensed under the MIT license found in the
|
|
3200
|
+
* LICENSE file in the root directory of this source tree.
|
|
3201
|
+
*/
|
|
3202
|
+
|
|
3203
|
+
var hasRequiredPropTypes;
|
|
3204
|
+
|
|
3205
|
+
function requirePropTypes () {
|
|
3206
|
+
if (hasRequiredPropTypes) return propTypes.exports;
|
|
3207
|
+
hasRequiredPropTypes = 1;
|
|
3208
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
3209
|
+
var ReactIs = requireReactIs();
|
|
3210
|
+
|
|
3211
|
+
// By explicitly using `prop-types` you are opting into new development behavior.
|
|
3212
|
+
// http://fb.me/prop-types-in-prod
|
|
3213
|
+
var throwOnDirectAccess = true;
|
|
3214
|
+
propTypes.exports = /*@__PURE__*/ requireFactoryWithTypeCheckers()(ReactIs.isElement, throwOnDirectAccess);
|
|
3215
|
+
} else {
|
|
3216
|
+
// By explicitly using `prop-types` you are opting into new production behavior.
|
|
3217
|
+
// http://fb.me/prop-types-in-prod
|
|
3218
|
+
propTypes.exports = /*@__PURE__*/ requireFactoryWithThrowingShims()();
|
|
3219
|
+
}
|
|
3220
|
+
return propTypes.exports;
|
|
3221
|
+
}
|
|
3222
|
+
|
|
3223
|
+
var propTypesExports = /*@__PURE__*/ requirePropTypes();
|
|
3224
|
+
var PropTypes = /*@__PURE__*/getDefaultExportFromCjs(propTypesExports);
|
|
3225
|
+
|
|
3226
|
+
const SystemOperations = _ref => {
|
|
3227
|
+
let {
|
|
3228
|
+
onPowerOff,
|
|
3229
|
+
onRestart,
|
|
3230
|
+
powerOffLabel = "Power Off",
|
|
3231
|
+
restartLabel = "Restart",
|
|
3232
|
+
iconClassName = "seeder-iconfont seeder-icon-guanji1 text-xl text-neutral-400",
|
|
3233
|
+
confirmTitle = "Confirm",
|
|
3234
|
+
cancelText = "No",
|
|
3235
|
+
okText = "Yes",
|
|
3236
|
+
run
|
|
3237
|
+
} = _ref;
|
|
3238
|
+
const {
|
|
3239
|
+
modal: AntdModal
|
|
3240
|
+
} = App.useApp();
|
|
3241
|
+
const menuItems = [{
|
|
3242
|
+
key: "poweroff",
|
|
3243
|
+
label: powerOffLabel
|
|
3244
|
+
},
|
|
3245
|
+
// {
|
|
3246
|
+
// key: "reboot",
|
|
3247
|
+
// label: rebootLabel, // 硬重启 物理重启
|
|
3248
|
+
// },
|
|
3249
|
+
{
|
|
3250
|
+
key: "restart",
|
|
3251
|
+
label: restartLabel // 软重启 服务重启
|
|
3252
|
+
}];
|
|
3253
|
+
const doAction = action => {
|
|
3254
|
+
try {
|
|
3255
|
+
AntdModal.confirm({
|
|
3256
|
+
icon: /*#__PURE__*/jsx(ExclamationCircleFilled, {}),
|
|
3257
|
+
title: "".concat(confirmTitle, " ").concat(action, "?"),
|
|
3258
|
+
cancelText,
|
|
3259
|
+
okText,
|
|
3260
|
+
onOk: () => {
|
|
3261
|
+
if (action === 'poweroff' && onPowerOff) {
|
|
3262
|
+
onPowerOff();
|
|
3263
|
+
} else if (action === 'restart' && onRestart) {
|
|
3264
|
+
onRestart();
|
|
3265
|
+
}
|
|
3266
|
+
|
|
3267
|
+
// Call the run callback after successful operation
|
|
3268
|
+
if (typeof run === 'function') {
|
|
3269
|
+
run();
|
|
3270
|
+
}
|
|
3271
|
+
}
|
|
3272
|
+
});
|
|
3273
|
+
} catch (error) {
|
|
3274
|
+
console.error("".concat(action.toUpperCase(), " ERROR: "), error);
|
|
3275
|
+
}
|
|
3276
|
+
};
|
|
3277
|
+
const handleMenuClick = _ref2 => {
|
|
3278
|
+
let {
|
|
3279
|
+
key
|
|
3280
|
+
} = _ref2;
|
|
3281
|
+
doAction(key);
|
|
3282
|
+
};
|
|
3283
|
+
return /*#__PURE__*/jsx(Dropdown, {
|
|
3284
|
+
menu: {
|
|
3285
|
+
items: menuItems,
|
|
3286
|
+
onClick: handleMenuClick
|
|
3287
|
+
},
|
|
3288
|
+
trigger: ["hover"],
|
|
3289
|
+
children: /*#__PURE__*/jsx("a", {
|
|
3290
|
+
onClick: e => e.preventDefault(),
|
|
3291
|
+
children: /*#__PURE__*/jsx("i", {
|
|
3292
|
+
className: iconClassName
|
|
3293
|
+
})
|
|
3294
|
+
})
|
|
3295
|
+
});
|
|
3296
|
+
};
|
|
3297
|
+
SystemOperations.propTypes = {
|
|
3298
|
+
onPowerOff: PropTypes.func,
|
|
3299
|
+
onRestart: PropTypes.func,
|
|
3300
|
+
powerOffLabel: PropTypes.string,
|
|
3301
|
+
restartLabel: PropTypes.string,
|
|
3302
|
+
iconClassName: PropTypes.string,
|
|
3303
|
+
confirmTitle: PropTypes.string,
|
|
3304
|
+
cancelText: PropTypes.string,
|
|
3305
|
+
okText: PropTypes.string,
|
|
3306
|
+
run: PropTypes.func
|
|
3307
|
+
};
|
|
3308
|
+
var SystemOperations$1 = SystemOperations;
|
|
3473
3309
|
|
|
3474
|
-
function createUnionTypeChecker(arrayOfTypeCheckers) {
|
|
3475
|
-
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3310
|
+
const logoBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAGaCAYAAAAfLro4AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAGj2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI1LTA5LTA5VDEwOjU2OjU5KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTA5LTA5VDEwOjU2OjU5KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNS0wOS0wOVQxMDo1Njo1OSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZjE5ZjRmMy1jZWFlLTcwNDUtYTA5OC0xMjJmNzViYjVhYmIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1YmIxNjQ4OC1hYzczLWI3NGYtODczMC1hZGZiY2Y1NTk3OWYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MjdjZjIwMy0zM2IyLWU3NDItYWRhNC0wNGY2YzA5ZTYxOWIiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgyN2NmMjAzLTMzYjItZTc0Mi1hZGE0LTA0ZjZjMDllNjE5YiIgc3RFdnQ6d2hlbj0iMjAyNS0wOS0wOVQxMDo1Njo1OSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZjE5ZjRmMy1jZWFlLTcwNDUtYTA5OC0xMjJmNzViYjVhYmIiIHN0RXZ0OndoZW49IjIwMjUtMDktMDlUMTA6NTY6NTkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHJkZjpCYWc+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmZkN2NjZDg5LTViMTQtMDI0MC04YjNhLTQzODU2ODk1YTFlZjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlgJupcAADw7SURBVHic7d15vKdz/f/xx5mNGWMsw1hKkaVQkmm1VFQSKr6VLIXIEtK++ZZIRQtJiG+K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NAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLR/h+CVP12K0zZoAAAAABJRU5ErkJggg==';
|
|
3311
|
+
const defaultResetRoute = () => {
|
|
3312
|
+
window.location.href = window.location.origin;
|
|
3313
|
+
};
|
|
3314
|
+
const useSpaLogo = function () {
|
|
3315
|
+
let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
3316
|
+
const {
|
|
3317
|
+
logoUrl = logoBase64,
|
|
3318
|
+
// 使用者传入 logo URL
|
|
3319
|
+
logoWidth = 100,
|
|
3320
|
+
logoAlt = 'logo',
|
|
3321
|
+
onClick = defaultResetRoute,
|
|
3322
|
+
buttonStyle = {
|
|
3323
|
+
padding: 0,
|
|
3324
|
+
lineHeight: 1,
|
|
3325
|
+
height: 'auto',
|
|
3326
|
+
borderStyle: 'none',
|
|
3327
|
+
display: 'inline-block'
|
|
3328
|
+
}
|
|
3329
|
+
} = props;
|
|
3479
3330
|
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3331
|
+
// 如果没有提供 logoUrl,返回空
|
|
3332
|
+
if (!logoUrl) {
|
|
3333
|
+
return [null];
|
|
3334
|
+
}
|
|
3335
|
+
return [/*#__PURE__*/jsx(Button, {
|
|
3336
|
+
type: "link",
|
|
3337
|
+
style: buttonStyle,
|
|
3338
|
+
onClick: onClick,
|
|
3339
|
+
children: /*#__PURE__*/jsx("img", {
|
|
3340
|
+
alt: logoAlt,
|
|
3341
|
+
src: logoUrl,
|
|
3342
|
+
style: {
|
|
3343
|
+
width: logoWidth
|
|
3344
|
+
}
|
|
3345
|
+
})
|
|
3346
|
+
}, "logo")];
|
|
3347
|
+
};
|
|
3348
|
+
useSpaLogo.propTypes = {
|
|
3349
|
+
logoUrl: PropTypes.string,
|
|
3350
|
+
logoWidth: PropTypes.number,
|
|
3351
|
+
logoAlt: PropTypes.string,
|
|
3352
|
+
onClick: PropTypes.func
|
|
3353
|
+
};
|
|
3354
|
+
var useSpaLogo$1 = useSpaLogo;
|
|
3490
3355
|
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3494
|
-
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
return null;
|
|
3498
|
-
}
|
|
3499
|
-
if (checkerResult.data && has(checkerResult.data, 'expectedType')) {
|
|
3500
|
-
expectedTypes.push(checkerResult.data.expectedType);
|
|
3501
|
-
}
|
|
3502
|
-
}
|
|
3503
|
-
var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';
|
|
3504
|
-
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));
|
|
3505
|
-
}
|
|
3506
|
-
return createChainableTypeChecker(validate);
|
|
3507
|
-
}
|
|
3356
|
+
const defaultGetSocketUrl = url => {
|
|
3357
|
+
if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') {
|
|
3358
|
+
return "ws://127.0.0.1:".concat(window.location.port).concat(url);
|
|
3359
|
+
}
|
|
3360
|
+
return "ws://".concat(window.location.host).concat(url);
|
|
3361
|
+
};
|
|
3508
3362
|
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3363
|
+
/**
|
|
3364
|
+
* 通用 Header 组件
|
|
3365
|
+
* @param {Object} props
|
|
3366
|
+
* @param {React.ReactNode} props.menuElement - 菜单元素
|
|
3367
|
+
* @param {Object} props.productInfo - 产品信息 { productName, version }
|
|
3368
|
+
* @param {boolean} props.showLogo - 是否显示Logo
|
|
3369
|
+
* @param {boolean} props.showProductInfo - 是否显示产品信息
|
|
3370
|
+
* @param {boolean} props.showHardwareUsage - 是否显示硬件使用情况
|
|
3371
|
+
* @param {boolean} props.showSystemOperations - 是否显示系统操作
|
|
3372
|
+
* @param {Function} props.onPowerOff - 关机函数
|
|
3373
|
+
* @param {Function} props.onRestart - 重启函数
|
|
3374
|
+
* @param {Function} props.onRun - 运行函数(用于SystemOperations)
|
|
3375
|
+
* @param {string} props.hardwareMonitorUrl - 硬件监控WebSocket地址
|
|
3376
|
+
* @param {Function} props.getSocketUrl - 获取WebSocket URL的函数
|
|
3377
|
+
* @param {Object} props.logoProps - Logo组件属性
|
|
3378
|
+
* @param {string} props.className - 自定义类名
|
|
3379
|
+
* @param {Object} props.style - 自定义样式
|
|
3380
|
+
*/
|
|
3381
|
+
const CommonHeader = _ref => {
|
|
3382
|
+
let {
|
|
3383
|
+
menuElement,
|
|
3384
|
+
productInfo = {},
|
|
3385
|
+
showLogo = true,
|
|
3386
|
+
showProductInfo = true,
|
|
3387
|
+
showHardwareUsage = true,
|
|
3388
|
+
showSystemOperations = true,
|
|
3389
|
+
onPowerOff,
|
|
3390
|
+
onRestart,
|
|
3391
|
+
onRun,
|
|
3392
|
+
hardwareMonitorUrl = '/ws/psmonitor/status_update',
|
|
3393
|
+
getSocketUrl = defaultGetSocketUrl,
|
|
3394
|
+
logoProps = {},
|
|
3395
|
+
className = '',
|
|
3396
|
+
style = {},
|
|
3397
|
+
// 新增插槽
|
|
3398
|
+
leftContent // 左侧额外内容
|
|
3399
|
+
} = _ref;
|
|
3400
|
+
const [logo] = useSpaLogo$1(logoProps);
|
|
3518
3401
|
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3402
|
+
// 系统资源使用情况
|
|
3403
|
+
const usageElement = useHardwareUsage$1(getSocketUrl(hardwareMonitorUrl));
|
|
3404
|
+
return /*#__PURE__*/jsxs(Flex, {
|
|
3405
|
+
justify: "space-between",
|
|
3406
|
+
align: "center",
|
|
3407
|
+
className: "common-header ".concat(className),
|
|
3408
|
+
style: style,
|
|
3409
|
+
children: [/*#__PURE__*/jsxs(Space, {
|
|
3410
|
+
size: 12,
|
|
3411
|
+
children: [showLogo && logo, showProductInfo && /*#__PURE__*/jsxs(Flex, {
|
|
3412
|
+
align: "center",
|
|
3413
|
+
gap: 8,
|
|
3414
|
+
children: [productInfo.productName && /*#__PURE__*/jsx(Typography.Title, {
|
|
3415
|
+
level: 4,
|
|
3416
|
+
style: {
|
|
3417
|
+
marginBottom: 0
|
|
3418
|
+
},
|
|
3419
|
+
children: productInfo.productName
|
|
3420
|
+
}), productInfo.version && /*#__PURE__*/jsx(Typography.Text, {
|
|
3421
|
+
style: {
|
|
3422
|
+
position: 'relative',
|
|
3423
|
+
top: 6,
|
|
3424
|
+
left: -6
|
|
3425
|
+
},
|
|
3426
|
+
children: productInfo.version
|
|
3427
|
+
})]
|
|
3428
|
+
}), leftContent]
|
|
3429
|
+
}), /*#__PURE__*/jsxs(Flex, {
|
|
3430
|
+
align: "center",
|
|
3431
|
+
gap: 10,
|
|
3432
|
+
children: [showHardwareUsage && usageElement, /*#__PURE__*/jsxs("div", {
|
|
3433
|
+
className: "header-controls",
|
|
3434
|
+
children: [menuElement && /*#__PURE__*/jsx("div", {
|
|
3435
|
+
className: "control-icon",
|
|
3436
|
+
children: menuElement
|
|
3437
|
+
}), showSystemOperations && /*#__PURE__*/jsx("div", {
|
|
3438
|
+
className: "control-icon",
|
|
3439
|
+
children: /*#__PURE__*/jsx(SystemOperations$1, {
|
|
3440
|
+
onPowerOff: onPowerOff,
|
|
3441
|
+
onRestart: onRestart,
|
|
3442
|
+
run: onRun
|
|
3443
|
+
})
|
|
3444
|
+
})]
|
|
3445
|
+
})]
|
|
3446
|
+
})]
|
|
3447
|
+
});
|
|
3448
|
+
};
|
|
3525
3449
|
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3450
|
+
// PropTypes 类型检查
|
|
3451
|
+
CommonHeader.propTypes = {
|
|
3452
|
+
menuElement: PropTypes.node,
|
|
3453
|
+
productInfo: PropTypes.shape({
|
|
3454
|
+
productName: PropTypes.string,
|
|
3455
|
+
version: PropTypes.string
|
|
3456
|
+
}),
|
|
3457
|
+
showLogo: PropTypes.bool,
|
|
3458
|
+
showProductInfo: PropTypes.bool,
|
|
3459
|
+
showHardwareUsage: PropTypes.bool,
|
|
3460
|
+
showSystemOperations: PropTypes.bool,
|
|
3461
|
+
onPowerOff: PropTypes.func,
|
|
3462
|
+
onRestart: PropTypes.func,
|
|
3463
|
+
onRun: PropTypes.func,
|
|
3464
|
+
hardwareMonitorUrl: PropTypes.string,
|
|
3465
|
+
getSocketUrl: PropTypes.func,
|
|
3466
|
+
logoProps: PropTypes.object,
|
|
3467
|
+
className: PropTypes.string,
|
|
3468
|
+
style: PropTypes.object
|
|
3469
|
+
};
|
|
3470
|
+
var CommonHeader$1 = CommonHeader;
|
|
3547
3471
|
|
|
3548
|
-
|
|
3549
|
-
function validate(props, propName, componentName, location, propFullName) {
|
|
3550
|
-
var propValue = props[propName];
|
|
3551
|
-
var propType = getPropType(propValue);
|
|
3552
|
-
if (propType !== 'object') {
|
|
3553
|
-
return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
|
3554
|
-
}
|
|
3555
|
-
// We need to check all keys in case some are required but missing from props.
|
|
3556
|
-
var allKeys = assign({}, props[propName], shapeTypes);
|
|
3557
|
-
for (var key in allKeys) {
|
|
3558
|
-
var checker = shapeTypes[key];
|
|
3559
|
-
if (has(shapeTypes, key) && typeof checker !== 'function') {
|
|
3560
|
-
return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
|
|
3561
|
-
}
|
|
3562
|
-
if (!checker) {
|
|
3563
|
-
return new PropTypeError(
|
|
3564
|
-
'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +
|
|
3565
|
-
'\nBad object: ' + JSON.stringify(props[propName], null, ' ') +
|
|
3566
|
-
'\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')
|
|
3567
|
-
);
|
|
3568
|
-
}
|
|
3569
|
-
var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
|
|
3570
|
-
if (error) {
|
|
3571
|
-
return error;
|
|
3572
|
-
}
|
|
3573
|
-
}
|
|
3574
|
-
return null;
|
|
3575
|
-
}
|
|
3472
|
+
var isCheckBoxInput = (element) => element.type === 'checkbox';
|
|
3576
3473
|
|
|
3577
|
-
|
|
3578
|
-
}
|
|
3474
|
+
var isDateObject = (value) => value instanceof Date;
|
|
3579
3475
|
|
|
3580
|
-
|
|
3581
|
-
switch (typeof propValue) {
|
|
3582
|
-
case 'number':
|
|
3583
|
-
case 'string':
|
|
3584
|
-
case 'undefined':
|
|
3585
|
-
return true;
|
|
3586
|
-
case 'boolean':
|
|
3587
|
-
return !propValue;
|
|
3588
|
-
case 'object':
|
|
3589
|
-
if (Array.isArray(propValue)) {
|
|
3590
|
-
return propValue.every(isNode);
|
|
3591
|
-
}
|
|
3592
|
-
if (propValue === null || isValidElement(propValue)) {
|
|
3593
|
-
return true;
|
|
3594
|
-
}
|
|
3476
|
+
var isNullOrUndefined = (value) => value == null;
|
|
3595
3477
|
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
while (!(step = iterator.next()).done) {
|
|
3602
|
-
if (!isNode(step.value)) {
|
|
3603
|
-
return false;
|
|
3604
|
-
}
|
|
3605
|
-
}
|
|
3606
|
-
} else {
|
|
3607
|
-
// Iterator will provide entry [k,v] tuples rather than values.
|
|
3608
|
-
while (!(step = iterator.next()).done) {
|
|
3609
|
-
var entry = step.value;
|
|
3610
|
-
if (entry) {
|
|
3611
|
-
if (!isNode(entry[1])) {
|
|
3612
|
-
return false;
|
|
3613
|
-
}
|
|
3614
|
-
}
|
|
3615
|
-
}
|
|
3616
|
-
}
|
|
3617
|
-
} else {
|
|
3618
|
-
return false;
|
|
3619
|
-
}
|
|
3478
|
+
const isObjectType = (value) => typeof value === 'object';
|
|
3479
|
+
var isObject = (value) => !isNullOrUndefined(value) &&
|
|
3480
|
+
!Array.isArray(value) &&
|
|
3481
|
+
isObjectType(value) &&
|
|
3482
|
+
!isDateObject(value);
|
|
3620
3483
|
|
|
3621
|
-
|
|
3622
|
-
|
|
3623
|
-
|
|
3624
|
-
|
|
3625
|
-
|
|
3484
|
+
var getEventValue = (event) => isObject(event) && event.target
|
|
3485
|
+
? isCheckBoxInput(event.target)
|
|
3486
|
+
? event.target.checked
|
|
3487
|
+
: event.target.value
|
|
3488
|
+
: event;
|
|
3626
3489
|
|
|
3627
|
-
|
|
3628
|
-
// Native Symbol.
|
|
3629
|
-
if (propType === 'symbol') {
|
|
3630
|
-
return true;
|
|
3631
|
-
}
|
|
3490
|
+
var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
|
|
3632
3491
|
|
|
3633
|
-
|
|
3634
|
-
if (!propValue) {
|
|
3635
|
-
return false;
|
|
3636
|
-
}
|
|
3492
|
+
var isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));
|
|
3637
3493
|
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
3494
|
+
var isPlainObject = (tempObject) => {
|
|
3495
|
+
const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;
|
|
3496
|
+
return (isObject(prototypeCopy) && prototypeCopy.hasOwnProperty('isPrototypeOf'));
|
|
3497
|
+
};
|
|
3642
3498
|
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
}
|
|
3499
|
+
var isWeb = typeof window !== 'undefined' &&
|
|
3500
|
+
typeof window.HTMLElement !== 'undefined' &&
|
|
3501
|
+
typeof document !== 'undefined';
|
|
3647
3502
|
|
|
3648
|
-
|
|
3649
|
-
|
|
3503
|
+
function cloneObject(data) {
|
|
3504
|
+
let copy;
|
|
3505
|
+
const isArray = Array.isArray(data);
|
|
3506
|
+
const isFileListInstance = typeof FileList !== 'undefined' ? data instanceof FileList : false;
|
|
3507
|
+
if (data instanceof Date) {
|
|
3508
|
+
copy = new Date(data);
|
|
3509
|
+
}
|
|
3510
|
+
else if (!(isWeb && (data instanceof Blob || isFileListInstance)) &&
|
|
3511
|
+
(isArray || isObject(data))) {
|
|
3512
|
+
copy = isArray ? [] : Object.create(Object.getPrototypeOf(data));
|
|
3513
|
+
if (!isArray && !isPlainObject(data)) {
|
|
3514
|
+
copy = data;
|
|
3515
|
+
}
|
|
3516
|
+
else {
|
|
3517
|
+
for (const key in data) {
|
|
3518
|
+
if (data.hasOwnProperty(key)) {
|
|
3519
|
+
copy[key] = cloneObject(data[key]);
|
|
3520
|
+
}
|
|
3521
|
+
}
|
|
3522
|
+
}
|
|
3523
|
+
}
|
|
3524
|
+
else {
|
|
3525
|
+
return data;
|
|
3526
|
+
}
|
|
3527
|
+
return copy;
|
|
3528
|
+
}
|
|
3650
3529
|
|
|
3651
|
-
|
|
3652
|
-
function getPropType(propValue) {
|
|
3653
|
-
var propType = typeof propValue;
|
|
3654
|
-
if (Array.isArray(propValue)) {
|
|
3655
|
-
return 'array';
|
|
3656
|
-
}
|
|
3657
|
-
if (propValue instanceof RegExp) {
|
|
3658
|
-
// Old webkits (at least until Android 4.0) return 'function' rather than
|
|
3659
|
-
// 'object' for typeof a RegExp. We'll normalize this here so that /bla/
|
|
3660
|
-
// passes PropTypes.object.
|
|
3661
|
-
return 'object';
|
|
3662
|
-
}
|
|
3663
|
-
if (isSymbol(propType, propValue)) {
|
|
3664
|
-
return 'symbol';
|
|
3665
|
-
}
|
|
3666
|
-
return propType;
|
|
3667
|
-
}
|
|
3530
|
+
var isKey = (value) => /^\w*$/.test(value);
|
|
3668
3531
|
|
|
3669
|
-
|
|
3670
|
-
// See `createPrimitiveTypeChecker`.
|
|
3671
|
-
function getPreciseType(propValue) {
|
|
3672
|
-
if (typeof propValue === 'undefined' || propValue === null) {
|
|
3673
|
-
return '' + propValue;
|
|
3674
|
-
}
|
|
3675
|
-
var propType = getPropType(propValue);
|
|
3676
|
-
if (propType === 'object') {
|
|
3677
|
-
if (propValue instanceof Date) {
|
|
3678
|
-
return 'date';
|
|
3679
|
-
} else if (propValue instanceof RegExp) {
|
|
3680
|
-
return 'regexp';
|
|
3681
|
-
}
|
|
3682
|
-
}
|
|
3683
|
-
return propType;
|
|
3684
|
-
}
|
|
3532
|
+
var isUndefined = (val) => val === undefined;
|
|
3685
3533
|
|
|
3686
|
-
|
|
3687
|
-
// For example, "undefined" or "of type array"
|
|
3688
|
-
function getPostfixForTypeWarning(value) {
|
|
3689
|
-
var type = getPreciseType(value);
|
|
3690
|
-
switch (type) {
|
|
3691
|
-
case 'array':
|
|
3692
|
-
case 'object':
|
|
3693
|
-
return 'an ' + type;
|
|
3694
|
-
case 'boolean':
|
|
3695
|
-
case 'date':
|
|
3696
|
-
case 'regexp':
|
|
3697
|
-
return 'a ' + type;
|
|
3698
|
-
default:
|
|
3699
|
-
return type;
|
|
3700
|
-
}
|
|
3701
|
-
}
|
|
3534
|
+
var compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];
|
|
3702
3535
|
|
|
3703
|
-
|
|
3704
|
-
function getClassName(propValue) {
|
|
3705
|
-
if (!propValue.constructor || !propValue.constructor.name) {
|
|
3706
|
-
return ANONYMOUS;
|
|
3707
|
-
}
|
|
3708
|
-
return propValue.constructor.name;
|
|
3709
|
-
}
|
|
3536
|
+
var stringToPath = (input) => compact(input.replace(/["|']|\]/g, '').split(/\.|\[/));
|
|
3710
3537
|
|
|
3711
|
-
|
|
3712
|
-
|
|
3713
|
-
|
|
3538
|
+
var get = (object, path, defaultValue) => {
|
|
3539
|
+
if (!path || !isObject(object)) {
|
|
3540
|
+
return defaultValue;
|
|
3541
|
+
}
|
|
3542
|
+
const result = (isKey(path) ? [path] : stringToPath(path)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);
|
|
3543
|
+
return isUndefined(result) || result === object
|
|
3544
|
+
? isUndefined(object[path])
|
|
3545
|
+
? defaultValue
|
|
3546
|
+
: object[path]
|
|
3547
|
+
: result;
|
|
3548
|
+
};
|
|
3714
3549
|
|
|
3715
|
-
|
|
3716
|
-
|
|
3717
|
-
|
|
3718
|
-
|
|
3550
|
+
var isBoolean = (value) => typeof value === 'boolean';
|
|
3551
|
+
|
|
3552
|
+
var set = (object, path, value) => {
|
|
3553
|
+
let index = -1;
|
|
3554
|
+
const tempPath = isKey(path) ? [path] : stringToPath(path);
|
|
3555
|
+
const length = tempPath.length;
|
|
3556
|
+
const lastIndex = length - 1;
|
|
3557
|
+
while (++index < length) {
|
|
3558
|
+
const key = tempPath[index];
|
|
3559
|
+
let newValue = value;
|
|
3560
|
+
if (index !== lastIndex) {
|
|
3561
|
+
const objValue = object[key];
|
|
3562
|
+
newValue =
|
|
3563
|
+
isObject(objValue) || Array.isArray(objValue)
|
|
3564
|
+
? objValue
|
|
3565
|
+
: !isNaN(+tempPath[index + 1])
|
|
3566
|
+
? []
|
|
3567
|
+
: {};
|
|
3568
|
+
}
|
|
3569
|
+
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
|
|
3570
|
+
return;
|
|
3571
|
+
}
|
|
3572
|
+
object[key] = newValue;
|
|
3573
|
+
object = object[key];
|
|
3574
|
+
}
|
|
3575
|
+
};
|
|
3576
|
+
|
|
3577
|
+
const EVENTS = {
|
|
3578
|
+
BLUR: 'blur',
|
|
3579
|
+
FOCUS_OUT: 'focusout',
|
|
3580
|
+
CHANGE: 'change',
|
|
3581
|
+
};
|
|
3582
|
+
const VALIDATION_MODE = {
|
|
3583
|
+
onBlur: 'onBlur',
|
|
3584
|
+
onChange: 'onChange',
|
|
3585
|
+
onSubmit: 'onSubmit',
|
|
3586
|
+
onTouched: 'onTouched',
|
|
3587
|
+
all: 'all',
|
|
3588
|
+
};
|
|
3719
3589
|
|
|
3590
|
+
const HookFormContext = React.createContext(null);
|
|
3591
|
+
HookFormContext.displayName = 'HookFormContext';
|
|
3720
3592
|
/**
|
|
3721
|
-
*
|
|
3593
|
+
* This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.
|
|
3722
3594
|
*
|
|
3723
|
-
*
|
|
3724
|
-
*
|
|
3595
|
+
* @remarks
|
|
3596
|
+
* [API](https://react-hook-form.com/docs/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)
|
|
3597
|
+
*
|
|
3598
|
+
* @returns return all useForm methods
|
|
3599
|
+
*
|
|
3600
|
+
* @example
|
|
3601
|
+
* ```tsx
|
|
3602
|
+
* function App() {
|
|
3603
|
+
* const methods = useForm();
|
|
3604
|
+
* const onSubmit = data => console.log(data);
|
|
3605
|
+
*
|
|
3606
|
+
* return (
|
|
3607
|
+
* <FormProvider {...methods} >
|
|
3608
|
+
* <form onSubmit={methods.handleSubmit(onSubmit)}>
|
|
3609
|
+
* <NestedInput />
|
|
3610
|
+
* <input type="submit" />
|
|
3611
|
+
* </form>
|
|
3612
|
+
* </FormProvider>
|
|
3613
|
+
* );
|
|
3614
|
+
* }
|
|
3615
|
+
*
|
|
3616
|
+
* function NestedInput() {
|
|
3617
|
+
* const { register } = useFormContext(); // retrieve all hook methods
|
|
3618
|
+
* return <input {...register("test")} />;
|
|
3619
|
+
* }
|
|
3620
|
+
* ```
|
|
3725
3621
|
*/
|
|
3622
|
+
const useFormContext = () => React.useContext(HookFormContext);
|
|
3726
3623
|
|
|
3727
|
-
var
|
|
3728
|
-
|
|
3729
|
-
|
|
3730
|
-
|
|
3731
|
-
|
|
3732
|
-
|
|
3624
|
+
var getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {
|
|
3625
|
+
const result = {
|
|
3626
|
+
defaultValues: control._defaultValues,
|
|
3627
|
+
};
|
|
3628
|
+
for (const key in formState) {
|
|
3629
|
+
Object.defineProperty(result, key, {
|
|
3630
|
+
get: () => {
|
|
3631
|
+
const _key = key;
|
|
3632
|
+
if (control._proxyFormState[_key] !== VALIDATION_MODE.all) {
|
|
3633
|
+
control._proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;
|
|
3634
|
+
}
|
|
3635
|
+
localProxyFormState && (localProxyFormState[_key] = true);
|
|
3636
|
+
return formState[_key];
|
|
3637
|
+
},
|
|
3638
|
+
});
|
|
3639
|
+
}
|
|
3640
|
+
return result;
|
|
3641
|
+
};
|
|
3733
3642
|
|
|
3734
|
-
|
|
3643
|
+
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
|
|
3735
3644
|
|
|
3736
|
-
|
|
3737
|
-
|
|
3738
|
-
|
|
3645
|
+
/**
|
|
3646
|
+
* This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.
|
|
3647
|
+
*
|
|
3648
|
+
* @remarks
|
|
3649
|
+
* [API](https://react-hook-form.com/docs/useformstate) • [Demo](https://codesandbox.io/s/useformstate-75xly)
|
|
3650
|
+
*
|
|
3651
|
+
* @param props - include options on specify fields to subscribe. {@link UseFormStateReturn}
|
|
3652
|
+
*
|
|
3653
|
+
* @example
|
|
3654
|
+
* ```tsx
|
|
3655
|
+
* function App() {
|
|
3656
|
+
* const { register, handleSubmit, control } = useForm({
|
|
3657
|
+
* defaultValues: {
|
|
3658
|
+
* firstName: "firstName"
|
|
3659
|
+
* }});
|
|
3660
|
+
* const { dirtyFields } = useFormState({
|
|
3661
|
+
* control
|
|
3662
|
+
* });
|
|
3663
|
+
* const onSubmit = (data) => console.log(data);
|
|
3664
|
+
*
|
|
3665
|
+
* return (
|
|
3666
|
+
* <form onSubmit={handleSubmit(onSubmit)}>
|
|
3667
|
+
* <input {...register("firstName")} placeholder="First Name" />
|
|
3668
|
+
* {dirtyFields.firstName && <p>Field is dirty.</p>}
|
|
3669
|
+
* <input type="submit" />
|
|
3670
|
+
* </form>
|
|
3671
|
+
* );
|
|
3672
|
+
* }
|
|
3673
|
+
* ```
|
|
3674
|
+
*/
|
|
3675
|
+
function useFormState(props) {
|
|
3676
|
+
const methods = useFormContext();
|
|
3677
|
+
const { control = methods.control, disabled, name, exact } = props || {};
|
|
3678
|
+
const [formState, updateFormState] = React.useState(control._formState);
|
|
3679
|
+
const _localProxyFormState = React.useRef({
|
|
3680
|
+
isDirty: false,
|
|
3681
|
+
isLoading: false,
|
|
3682
|
+
dirtyFields: false,
|
|
3683
|
+
touchedFields: false,
|
|
3684
|
+
validatingFields: false,
|
|
3685
|
+
isValidating: false,
|
|
3686
|
+
isValid: false,
|
|
3687
|
+
errors: false,
|
|
3688
|
+
});
|
|
3689
|
+
useIsomorphicLayoutEffect(() => control._subscribe({
|
|
3690
|
+
name,
|
|
3691
|
+
formState: _localProxyFormState.current,
|
|
3692
|
+
exact,
|
|
3693
|
+
callback: (formState) => {
|
|
3694
|
+
!disabled &&
|
|
3695
|
+
updateFormState({
|
|
3696
|
+
...control._formState,
|
|
3697
|
+
...formState,
|
|
3698
|
+
});
|
|
3699
|
+
},
|
|
3700
|
+
}), [name, disabled, exact]);
|
|
3701
|
+
React.useEffect(() => {
|
|
3702
|
+
_localProxyFormState.current.isValid && control._setValid(true);
|
|
3703
|
+
}, [control]);
|
|
3704
|
+
return React.useMemo(() => getProxyFormState(formState, control, _localProxyFormState.current, false), [formState, control]);
|
|
3705
|
+
}
|
|
3739
3706
|
|
|
3740
|
-
|
|
3741
|
-
function shim(props, propName, componentName, location, propFullName, secret) {
|
|
3742
|
-
if (secret === ReactPropTypesSecret) {
|
|
3743
|
-
// It is still safe when called from React.
|
|
3744
|
-
return;
|
|
3745
|
-
}
|
|
3746
|
-
var err = new Error(
|
|
3747
|
-
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
|
|
3748
|
-
'Use PropTypes.checkPropTypes() to call them. ' +
|
|
3749
|
-
'Read more at http://fb.me/use-check-prop-types'
|
|
3750
|
-
);
|
|
3751
|
-
err.name = 'Invariant Violation';
|
|
3752
|
-
throw err;
|
|
3753
|
-
} shim.isRequired = shim;
|
|
3754
|
-
function getShim() {
|
|
3755
|
-
return shim;
|
|
3756
|
-
} // Important!
|
|
3757
|
-
// Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.
|
|
3758
|
-
var ReactPropTypes = {
|
|
3759
|
-
array: shim,
|
|
3760
|
-
bigint: shim,
|
|
3761
|
-
bool: shim,
|
|
3762
|
-
func: shim,
|
|
3763
|
-
number: shim,
|
|
3764
|
-
object: shim,
|
|
3765
|
-
string: shim,
|
|
3766
|
-
symbol: shim,
|
|
3707
|
+
var isString = (value) => typeof value === 'string';
|
|
3767
3708
|
|
|
3768
|
-
|
|
3769
|
-
|
|
3770
|
-
|
|
3771
|
-
|
|
3772
|
-
|
|
3773
|
-
|
|
3774
|
-
|
|
3775
|
-
|
|
3776
|
-
|
|
3777
|
-
|
|
3778
|
-
|
|
3709
|
+
var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {
|
|
3710
|
+
if (isString(names)) {
|
|
3711
|
+
isGlobal && _names.watch.add(names);
|
|
3712
|
+
return get(formValues, names, defaultValue);
|
|
3713
|
+
}
|
|
3714
|
+
if (Array.isArray(names)) {
|
|
3715
|
+
return names.map((fieldName) => (isGlobal && _names.watch.add(fieldName),
|
|
3716
|
+
get(formValues, fieldName)));
|
|
3717
|
+
}
|
|
3718
|
+
isGlobal && (_names.watchAll = true);
|
|
3719
|
+
return formValues;
|
|
3720
|
+
};
|
|
3779
3721
|
|
|
3780
|
-
|
|
3781
|
-
resetWarningCache: emptyFunction
|
|
3782
|
-
};
|
|
3722
|
+
var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
|
|
3783
3723
|
|
|
3784
|
-
|
|
3724
|
+
function deepEqual(object1, object2, _internal_visited = new WeakSet()) {
|
|
3725
|
+
if (isPrimitive(object1) || isPrimitive(object2)) {
|
|
3726
|
+
return object1 === object2;
|
|
3727
|
+
}
|
|
3728
|
+
if (isDateObject(object1) && isDateObject(object2)) {
|
|
3729
|
+
return object1.getTime() === object2.getTime();
|
|
3730
|
+
}
|
|
3731
|
+
const keys1 = Object.keys(object1);
|
|
3732
|
+
const keys2 = Object.keys(object2);
|
|
3733
|
+
if (keys1.length !== keys2.length) {
|
|
3734
|
+
return false;
|
|
3735
|
+
}
|
|
3736
|
+
if (_internal_visited.has(object1) || _internal_visited.has(object2)) {
|
|
3737
|
+
return true;
|
|
3738
|
+
}
|
|
3739
|
+
_internal_visited.add(object1);
|
|
3740
|
+
_internal_visited.add(object2);
|
|
3741
|
+
for (const key of keys1) {
|
|
3742
|
+
const val1 = object1[key];
|
|
3743
|
+
if (!keys2.includes(key)) {
|
|
3744
|
+
return false;
|
|
3745
|
+
}
|
|
3746
|
+
if (key !== 'ref') {
|
|
3747
|
+
const val2 = object2[key];
|
|
3748
|
+
if ((isDateObject(val1) && isDateObject(val2)) ||
|
|
3749
|
+
(isObject(val1) && isObject(val2)) ||
|
|
3750
|
+
(Array.isArray(val1) && Array.isArray(val2))
|
|
3751
|
+
? !deepEqual(val1, val2, _internal_visited)
|
|
3752
|
+
: val1 !== val2) {
|
|
3753
|
+
return false;
|
|
3754
|
+
}
|
|
3755
|
+
}
|
|
3756
|
+
}
|
|
3757
|
+
return true;
|
|
3758
|
+
}
|
|
3785
3759
|
|
|
3786
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
3760
|
+
/**
|
|
3761
|
+
* Custom hook to subscribe to field change and isolate re-rendering at the component level.
|
|
3762
|
+
*
|
|
3763
|
+
* @remarks
|
|
3764
|
+
*
|
|
3765
|
+
* [API](https://react-hook-form.com/docs/usewatch) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-usewatch-h9i5e)
|
|
3766
|
+
*
|
|
3767
|
+
* @example
|
|
3768
|
+
* ```tsx
|
|
3769
|
+
* const { control } = useForm();
|
|
3770
|
+
* const values = useWatch({
|
|
3771
|
+
* name: "fieldName"
|
|
3772
|
+
* control,
|
|
3773
|
+
* })
|
|
3774
|
+
* ```
|
|
3775
|
+
*/
|
|
3776
|
+
function useWatch(props) {
|
|
3777
|
+
const methods = useFormContext();
|
|
3778
|
+
const { control = methods.control, name, defaultValue, disabled, exact, compute, } = props || {};
|
|
3779
|
+
const _defaultValue = React.useRef(defaultValue);
|
|
3780
|
+
const _compute = React.useRef(compute);
|
|
3781
|
+
const _computeFormValues = React.useRef(undefined);
|
|
3782
|
+
_compute.current = compute;
|
|
3783
|
+
const defaultValueMemo = React.useMemo(() => control._getWatch(name, _defaultValue.current), [control, name]);
|
|
3784
|
+
const [value, updateValue] = React.useState(_compute.current ? _compute.current(defaultValueMemo) : defaultValueMemo);
|
|
3785
|
+
useIsomorphicLayoutEffect(() => control._subscribe({
|
|
3786
|
+
name,
|
|
3787
|
+
formState: {
|
|
3788
|
+
values: true,
|
|
3789
|
+
},
|
|
3790
|
+
exact,
|
|
3791
|
+
callback: (formState) => {
|
|
3792
|
+
if (!disabled) {
|
|
3793
|
+
const formValues = generateWatchOutput(name, control._names, formState.values || control._formValues, false, _defaultValue.current);
|
|
3794
|
+
if (_compute.current) {
|
|
3795
|
+
const computedFormValues = _compute.current(formValues);
|
|
3796
|
+
if (!deepEqual(computedFormValues, _computeFormValues.current)) {
|
|
3797
|
+
updateValue(computedFormValues);
|
|
3798
|
+
_computeFormValues.current = computedFormValues;
|
|
3799
|
+
}
|
|
3800
|
+
}
|
|
3801
|
+
else {
|
|
3802
|
+
updateValue(formValues);
|
|
3803
|
+
}
|
|
3804
|
+
}
|
|
3805
|
+
},
|
|
3806
|
+
}), [control, disabled, name, exact]);
|
|
3807
|
+
React.useEffect(() => control._removeUnmounted());
|
|
3808
|
+
return value;
|
|
3789
3809
|
}
|
|
3790
3810
|
|
|
3791
3811
|
/**
|
|
3792
|
-
*
|
|
3812
|
+
* Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.
|
|
3793
3813
|
*
|
|
3794
|
-
*
|
|
3795
|
-
*
|
|
3814
|
+
* @remarks
|
|
3815
|
+
* [API](https://react-hook-form.com/docs/usecontroller) • [Demo](https://codesandbox.io/s/usecontroller-0o8px)
|
|
3816
|
+
*
|
|
3817
|
+
* @param props - the path name to the form field value, and validation rules.
|
|
3818
|
+
*
|
|
3819
|
+
* @returns field properties, field and form state. {@link UseControllerReturn}
|
|
3820
|
+
*
|
|
3821
|
+
* @example
|
|
3822
|
+
* ```tsx
|
|
3823
|
+
* function Input(props) {
|
|
3824
|
+
* const { field, fieldState, formState } = useController(props);
|
|
3825
|
+
* return (
|
|
3826
|
+
* <div>
|
|
3827
|
+
* <input {...field} placeholder={props.name} />
|
|
3828
|
+
* <p>{fieldState.isTouched && "Touched"}</p>
|
|
3829
|
+
* <p>{formState.isSubmitted ? "submitted" : ""}</p>
|
|
3830
|
+
* </div>
|
|
3831
|
+
* );
|
|
3832
|
+
* }
|
|
3833
|
+
* ```
|
|
3796
3834
|
*/
|
|
3797
|
-
|
|
3798
|
-
|
|
3799
|
-
|
|
3800
|
-
|
|
3801
|
-
|
|
3802
|
-
|
|
3803
|
-
|
|
3804
|
-
|
|
3805
|
-
|
|
3806
|
-
|
|
3807
|
-
|
|
3808
|
-
|
|
3809
|
-
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
|
|
3814
|
-
|
|
3815
|
-
|
|
3816
|
-
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3849
|
-
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3865
|
-
}
|
|
3835
|
+
function useController(props) {
|
|
3836
|
+
const methods = useFormContext();
|
|
3837
|
+
const { name, disabled, control = methods.control, shouldUnregister, defaultValue, } = props;
|
|
3838
|
+
const isArrayField = isNameInFieldArray(control._names.array, name);
|
|
3839
|
+
const defaultValueMemo = React.useMemo(() => get(control._formValues, name, get(control._defaultValues, name, defaultValue)), [control, name, defaultValue]);
|
|
3840
|
+
const value = useWatch({
|
|
3841
|
+
control,
|
|
3842
|
+
name,
|
|
3843
|
+
defaultValue: defaultValueMemo,
|
|
3844
|
+
exact: true,
|
|
3845
|
+
});
|
|
3846
|
+
const formState = useFormState({
|
|
3847
|
+
control,
|
|
3848
|
+
name,
|
|
3849
|
+
exact: true,
|
|
3850
|
+
});
|
|
3851
|
+
const _props = React.useRef(props);
|
|
3852
|
+
const _registerProps = React.useRef(control.register(name, {
|
|
3853
|
+
...props.rules,
|
|
3854
|
+
value,
|
|
3855
|
+
...(isBoolean(props.disabled) ? { disabled: props.disabled } : {}),
|
|
3856
|
+
}));
|
|
3857
|
+
_props.current = props;
|
|
3858
|
+
const fieldState = React.useMemo(() => Object.defineProperties({}, {
|
|
3859
|
+
invalid: {
|
|
3860
|
+
enumerable: true,
|
|
3861
|
+
get: () => !!get(formState.errors, name),
|
|
3862
|
+
},
|
|
3863
|
+
isDirty: {
|
|
3864
|
+
enumerable: true,
|
|
3865
|
+
get: () => !!get(formState.dirtyFields, name),
|
|
3866
|
+
},
|
|
3867
|
+
isTouched: {
|
|
3868
|
+
enumerable: true,
|
|
3869
|
+
get: () => !!get(formState.touchedFields, name),
|
|
3870
|
+
},
|
|
3871
|
+
isValidating: {
|
|
3872
|
+
enumerable: true,
|
|
3873
|
+
get: () => !!get(formState.validatingFields, name),
|
|
3874
|
+
},
|
|
3875
|
+
error: {
|
|
3876
|
+
enumerable: true,
|
|
3877
|
+
get: () => get(formState.errors, name),
|
|
3878
|
+
},
|
|
3879
|
+
}), [formState, name]);
|
|
3880
|
+
const onChange = React.useCallback((event) => _registerProps.current.onChange({
|
|
3881
|
+
target: {
|
|
3882
|
+
value: getEventValue(event),
|
|
3883
|
+
name: name,
|
|
3884
|
+
},
|
|
3885
|
+
type: EVENTS.CHANGE,
|
|
3886
|
+
}), [name]);
|
|
3887
|
+
const onBlur = React.useCallback(() => _registerProps.current.onBlur({
|
|
3888
|
+
target: {
|
|
3889
|
+
value: get(control._formValues, name),
|
|
3890
|
+
name: name,
|
|
3891
|
+
},
|
|
3892
|
+
type: EVENTS.BLUR,
|
|
3893
|
+
}), [name, control._formValues]);
|
|
3894
|
+
const ref = React.useCallback((elm) => {
|
|
3895
|
+
const field = get(control._fields, name);
|
|
3896
|
+
if (field && elm) {
|
|
3897
|
+
field._f.ref = {
|
|
3898
|
+
focus: () => elm.focus && elm.focus(),
|
|
3899
|
+
select: () => elm.select && elm.select(),
|
|
3900
|
+
setCustomValidity: (message) => elm.setCustomValidity(message),
|
|
3901
|
+
reportValidity: () => elm.reportValidity(),
|
|
3902
|
+
};
|
|
3866
3903
|
}
|
|
3867
|
-
|
|
3868
|
-
|
|
3869
|
-
|
|
3870
|
-
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3889
|
-
|
|
3890
|
-
|
|
3891
|
-
};
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
+
}, [control._fields, name]);
|
|
3905
|
+
const field = React.useMemo(() => ({
|
|
3906
|
+
name,
|
|
3907
|
+
value,
|
|
3908
|
+
...(isBoolean(disabled) || formState.disabled
|
|
3909
|
+
? { disabled: formState.disabled || disabled }
|
|
3910
|
+
: {}),
|
|
3911
|
+
onChange,
|
|
3912
|
+
onBlur,
|
|
3913
|
+
ref,
|
|
3914
|
+
}), [name, disabled, formState.disabled, onChange, onBlur, ref, value]);
|
|
3915
|
+
React.useEffect(() => {
|
|
3916
|
+
const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;
|
|
3917
|
+
control.register(name, {
|
|
3918
|
+
..._props.current.rules,
|
|
3919
|
+
...(isBoolean(_props.current.disabled)
|
|
3920
|
+
? { disabled: _props.current.disabled }
|
|
3921
|
+
: {}),
|
|
3922
|
+
});
|
|
3923
|
+
const updateMounted = (name, value) => {
|
|
3924
|
+
const field = get(control._fields, name);
|
|
3925
|
+
if (field && field._f) {
|
|
3926
|
+
field._f.mount = value;
|
|
3927
|
+
}
|
|
3928
|
+
};
|
|
3929
|
+
updateMounted(name, true);
|
|
3930
|
+
if (_shouldUnregisterField) {
|
|
3931
|
+
const value = cloneObject(get(control._options.defaultValues, name));
|
|
3932
|
+
set(control._defaultValues, name, value);
|
|
3933
|
+
if (isUndefined(get(control._formValues, name))) {
|
|
3934
|
+
set(control._formValues, name, value);
|
|
3935
|
+
}
|
|
3936
|
+
}
|
|
3937
|
+
!isArrayField && control.register(name);
|
|
3938
|
+
return () => {
|
|
3939
|
+
(isArrayField
|
|
3940
|
+
? _shouldUnregisterField && !control._state.action
|
|
3941
|
+
: _shouldUnregisterField)
|
|
3942
|
+
? control.unregister(name)
|
|
3943
|
+
: updateMounted(name, false);
|
|
3944
|
+
};
|
|
3945
|
+
}, [name, control, isArrayField, shouldUnregister]);
|
|
3946
|
+
React.useEffect(() => {
|
|
3947
|
+
control._setDisabledField({
|
|
3948
|
+
disabled,
|
|
3949
|
+
name,
|
|
3950
|
+
});
|
|
3951
|
+
}, [disabled, name, control]);
|
|
3952
|
+
return React.useMemo(() => ({
|
|
3953
|
+
field,
|
|
3954
|
+
formState,
|
|
3955
|
+
fieldState,
|
|
3956
|
+
}), [field, formState, fieldState]);
|
|
3957
|
+
}
|
|
3904
3958
|
|
|
3905
|
-
const logoBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAGaCAYAAAAfLro4AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAGj2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDI1LTA5LTA5VDEwOjU2OjU5KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI1LTA5LTA5VDEwOjU2OjU5KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNS0wOS0wOVQxMDo1Njo1OSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowZjE5ZjRmMy1jZWFlLTcwNDUtYTA5OC0xMjJmNzViYjVhYmIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1YmIxNjQ4OC1hYzczLWI3NGYtODczMC1hZGZiY2Y1NTk3OWYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MjdjZjIwMy0zM2IyLWU3NDItYWRhNC0wNGY2YzA5ZTYxOWIiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgyN2NmMjAzLTMzYjItZTc0Mi1hZGE0LTA0ZjZjMDllNjE5YiIgc3RFdnQ6d2hlbj0iMjAyNS0wOS0wOVQxMDo1Njo1OSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowZjE5ZjRmMy1jZWFlLTcwNDUtYTA5OC0xMjJmNzViYjVhYmIiIHN0RXZ0OndoZW49IjIwMjUtMDktMDlUMTA6NTY6NTkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHJkZjpCYWc+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmZkN2NjZDg5LTViMTQtMDI0MC04YjNhLTQzODU2ODk1YTFlZjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlgJupcAADw7SURBVHic7d15vKdz/f/xx5mNGWMsw1hKkaVQkmm1VFQSKr6VLIXIEtK++ZZIRQtJiG+K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NAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLRLLAkSZIkSZJUNAssSZIkSZIkFc0CS5IkSZIkSUWzwJIkSZIkSVLR/h+CVP12K0zZoAAAAABJRU5ErkJggg==';
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
|
|
3910
|
-
|
|
3959
|
+
/**
|
|
3960
|
+
* Component based on `useController` hook to work with controlled component.
|
|
3961
|
+
*
|
|
3962
|
+
* @remarks
|
|
3963
|
+
* [API](https://react-hook-form.com/docs/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)
|
|
3964
|
+
*
|
|
3965
|
+
* @param props - the path name to the form field value, and validation rules.
|
|
3966
|
+
*
|
|
3967
|
+
* @returns provide field handler functions, field and form state.
|
|
3968
|
+
*
|
|
3969
|
+
* @example
|
|
3970
|
+
* ```tsx
|
|
3971
|
+
* function App() {
|
|
3972
|
+
* const { control } = useForm<FormValues>({
|
|
3973
|
+
* defaultValues: {
|
|
3974
|
+
* test: ""
|
|
3975
|
+
* }
|
|
3976
|
+
* });
|
|
3977
|
+
*
|
|
3978
|
+
* return (
|
|
3979
|
+
* <form>
|
|
3980
|
+
* <Controller
|
|
3981
|
+
* control={control}
|
|
3982
|
+
* name="test"
|
|
3983
|
+
* render={({ field: { onChange, onBlur, value, ref }, formState, fieldState }) => (
|
|
3984
|
+
* <>
|
|
3985
|
+
* <input
|
|
3986
|
+
* onChange={onChange} // send value to hook form
|
|
3987
|
+
* onBlur={onBlur} // notify when input is touched
|
|
3988
|
+
* value={value} // return updated value
|
|
3989
|
+
* ref={ref} // set ref for focus management
|
|
3990
|
+
* />
|
|
3991
|
+
* <p>{formState.isSubmitted ? "submitted" : ""}</p>
|
|
3992
|
+
* <p>{fieldState.isTouched ? "touched" : ""}</p>
|
|
3993
|
+
* </>
|
|
3994
|
+
* )}
|
|
3995
|
+
* />
|
|
3996
|
+
* </form>
|
|
3997
|
+
* );
|
|
3998
|
+
* }
|
|
3999
|
+
* ```
|
|
4000
|
+
*/
|
|
4001
|
+
const Controller = (props) => props.render(useController(props));
|
|
4002
|
+
|
|
4003
|
+
const LSMLabelField = props => {
|
|
4004
|
+
const [lsmList, setLsmList] = useState([]);
|
|
3911
4005
|
const {
|
|
3912
|
-
|
|
3913
|
-
|
|
3914
|
-
|
|
3915
|
-
|
|
3916
|
-
|
|
3917
|
-
|
|
3918
|
-
|
|
3919
|
-
|
|
3920
|
-
|
|
3921
|
-
|
|
3922
|
-
|
|
4006
|
+
name,
|
|
4007
|
+
label = "Label",
|
|
4008
|
+
control,
|
|
4009
|
+
defaultValue,
|
|
4010
|
+
onLsmSelect,
|
|
4011
|
+
fetchLsmData,
|
|
4012
|
+
formItemProps = {},
|
|
4013
|
+
selectProps = {},
|
|
4014
|
+
fieldNames = {
|
|
4015
|
+
label: 'label',
|
|
4016
|
+
value: 'label'
|
|
3923
4017
|
}
|
|
3924
4018
|
} = props;
|
|
3925
|
-
|
|
3926
|
-
|
|
3927
|
-
|
|
3928
|
-
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
|
|
3932
|
-
|
|
3933
|
-
|
|
3934
|
-
children: /*#__PURE__*/jsx("img", {
|
|
3935
|
-
alt: logoAlt,
|
|
3936
|
-
src: logoUrl,
|
|
3937
|
-
style: {
|
|
3938
|
-
width: logoWidth
|
|
4019
|
+
useEffect(() => {
|
|
4020
|
+
const loadLsmData = async () => {
|
|
4021
|
+
try {
|
|
4022
|
+
const res = await fetchLsmData();
|
|
4023
|
+
if (res !== null && res !== void 0 && res.length) {
|
|
4024
|
+
setLsmList(res);
|
|
4025
|
+
}
|
|
4026
|
+
} catch (error) {
|
|
4027
|
+
console.error('Failed to fetch LSM data:', error);
|
|
3939
4028
|
}
|
|
3940
|
-
}
|
|
3941
|
-
|
|
3942
|
-
};
|
|
3943
|
-
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3949
|
-
|
|
3950
|
-
|
|
3951
|
-
|
|
3952
|
-
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
|
|
3963
|
-
* @param {boolean} props.showLogo - 是否显示Logo
|
|
3964
|
-
* @param {boolean} props.showProductInfo - 是否显示产品信息
|
|
3965
|
-
* @param {boolean} props.showHardwareUsage - 是否显示硬件使用情况
|
|
3966
|
-
* @param {boolean} props.showSystemOperations - 是否显示系统操作
|
|
3967
|
-
* @param {Function} props.onPowerOff - 关机函数
|
|
3968
|
-
* @param {Function} props.onRestart - 重启函数
|
|
3969
|
-
* @param {Function} props.onRun - 运行函数(用于SystemOperations)
|
|
3970
|
-
* @param {string} props.hardwareMonitorUrl - 硬件监控WebSocket地址
|
|
3971
|
-
* @param {Function} props.getSocketUrl - 获取WebSocket URL的函数
|
|
3972
|
-
* @param {Object} props.logoProps - Logo组件属性
|
|
3973
|
-
* @param {string} props.className - 自定义类名
|
|
3974
|
-
* @param {Object} props.style - 自定义样式
|
|
3975
|
-
*/
|
|
3976
|
-
const CommonHeader = _ref => {
|
|
3977
|
-
let {
|
|
3978
|
-
menuElement,
|
|
3979
|
-
productInfo = {},
|
|
3980
|
-
showLogo = true,
|
|
3981
|
-
showProductInfo = true,
|
|
3982
|
-
showHardwareUsage = true,
|
|
3983
|
-
showSystemOperations = true,
|
|
3984
|
-
onPowerOff,
|
|
3985
|
-
onRestart,
|
|
3986
|
-
onRun,
|
|
3987
|
-
hardwareMonitorUrl = '/ws/psmonitor/status_update',
|
|
3988
|
-
getSocketUrl = defaultGetSocketUrl,
|
|
3989
|
-
logoProps = {},
|
|
3990
|
-
className = '',
|
|
3991
|
-
style = {},
|
|
3992
|
-
// 新增插槽
|
|
3993
|
-
leftContent // 左侧额外内容
|
|
3994
|
-
} = _ref;
|
|
3995
|
-
const [logo] = useSpaLogo$1(logoProps);
|
|
3996
|
-
|
|
3997
|
-
// 系统资源使用情况
|
|
3998
|
-
const usageElement = useHardwareUsage$1(getSocketUrl(hardwareMonitorUrl));
|
|
3999
|
-
return /*#__PURE__*/jsxs(Flex, {
|
|
4000
|
-
justify: "space-between",
|
|
4001
|
-
align: "center",
|
|
4002
|
-
className: "common-header ".concat(className),
|
|
4003
|
-
style: style,
|
|
4004
|
-
children: [/*#__PURE__*/jsxs(Space, {
|
|
4005
|
-
size: 12,
|
|
4006
|
-
children: [showLogo && logo, showProductInfo && /*#__PURE__*/jsxs(Flex, {
|
|
4007
|
-
align: "center",
|
|
4008
|
-
gap: 8,
|
|
4009
|
-
children: [productInfo.productName && /*#__PURE__*/jsx(Typography.Title, {
|
|
4010
|
-
level: 4,
|
|
4011
|
-
style: {
|
|
4012
|
-
marginBottom: 0
|
|
4013
|
-
},
|
|
4014
|
-
children: productInfo.productName
|
|
4015
|
-
}), productInfo.version && /*#__PURE__*/jsx(Typography.Text, {
|
|
4016
|
-
style: {
|
|
4017
|
-
position: 'relative',
|
|
4018
|
-
top: 6,
|
|
4019
|
-
left: -6
|
|
4029
|
+
};
|
|
4030
|
+
loadLsmData();
|
|
4031
|
+
}, [fetchLsmData]);
|
|
4032
|
+
return /*#__PURE__*/jsx(Controller, {
|
|
4033
|
+
name: name,
|
|
4034
|
+
control: control,
|
|
4035
|
+
defaultValue: defaultValue,
|
|
4036
|
+
render: _ref => {
|
|
4037
|
+
let {
|
|
4038
|
+
field
|
|
4039
|
+
} = _ref;
|
|
4040
|
+
return /*#__PURE__*/jsx(Form.Item, _objectSpread2(_objectSpread2({
|
|
4041
|
+
label: label
|
|
4042
|
+
}, formItemProps), {}, {
|
|
4043
|
+
children: /*#__PURE__*/jsx(Select, _objectSpread2(_objectSpread2(_objectSpread2({}, field), selectProps), {}, {
|
|
4044
|
+
options: lsmList,
|
|
4045
|
+
fieldNames: fieldNames,
|
|
4046
|
+
allowClear: true,
|
|
4047
|
+
showSearch: true,
|
|
4048
|
+
optionFilterProp: "label",
|
|
4049
|
+
onChange: (value, option) => {
|
|
4050
|
+
field.onChange(value);
|
|
4051
|
+
onLsmSelect === null || onLsmSelect === void 0 || onLsmSelect(value === undefined ? undefined : option);
|
|
4020
4052
|
},
|
|
4021
|
-
|
|
4022
|
-
})
|
|
4023
|
-
})
|
|
4024
|
-
}
|
|
4025
|
-
align: "center",
|
|
4026
|
-
gap: 10,
|
|
4027
|
-
children: [showHardwareUsage && usageElement, /*#__PURE__*/jsxs("div", {
|
|
4028
|
-
className: "header-controls",
|
|
4029
|
-
children: [menuElement && /*#__PURE__*/jsx("div", {
|
|
4030
|
-
className: "control-icon",
|
|
4031
|
-
children: menuElement
|
|
4032
|
-
}), showSystemOperations && /*#__PURE__*/jsx("div", {
|
|
4033
|
-
className: "control-icon",
|
|
4034
|
-
children: /*#__PURE__*/jsx(SystemOperations$1, {
|
|
4035
|
-
onPowerOff: onPowerOff,
|
|
4036
|
-
onRestart: onRestart,
|
|
4037
|
-
run: onRun
|
|
4038
|
-
})
|
|
4039
|
-
})]
|
|
4040
|
-
})]
|
|
4041
|
-
})]
|
|
4053
|
+
placeholder: selectProps.placeholder || 'Please select label'
|
|
4054
|
+
}))
|
|
4055
|
+
}));
|
|
4056
|
+
}
|
|
4042
4057
|
});
|
|
4043
4058
|
};
|
|
4044
|
-
|
|
4045
|
-
// PropTypes 类型检查
|
|
4046
|
-
CommonHeader.propTypes = {
|
|
4047
|
-
menuElement: PropTypes.node,
|
|
4048
|
-
productInfo: PropTypes.shape({
|
|
4049
|
-
productName: PropTypes.string,
|
|
4050
|
-
version: PropTypes.string
|
|
4051
|
-
}),
|
|
4052
|
-
showLogo: PropTypes.bool,
|
|
4053
|
-
showProductInfo: PropTypes.bool,
|
|
4054
|
-
showHardwareUsage: PropTypes.bool,
|
|
4055
|
-
showSystemOperations: PropTypes.bool,
|
|
4056
|
-
onPowerOff: PropTypes.func,
|
|
4057
|
-
onRestart: PropTypes.func,
|
|
4058
|
-
onRun: PropTypes.func,
|
|
4059
|
-
hardwareMonitorUrl: PropTypes.string,
|
|
4060
|
-
getSocketUrl: PropTypes.func,
|
|
4061
|
-
logoProps: PropTypes.object,
|
|
4062
|
-
className: PropTypes.string,
|
|
4063
|
-
style: PropTypes.object
|
|
4064
|
-
};
|
|
4065
|
-
var CommonHeader$1 = CommonHeader;
|
|
4059
|
+
var LSMLabelField$1 = /*#__PURE__*/memo(LSMLabelField);
|
|
4066
4060
|
|
|
4067
4061
|
const _excluded = ["value", "min", "max", "className", "disablePointerLock", "modifierKeys", "decimalPlaces", "onChange", "onDragStart", "onDragEnd", "style"];
|
|
4068
4062
|
|
|
@@ -4379,5 +4373,5 @@ function DraggableNumberInput(_ref2) {
|
|
|
4379
4373
|
}));
|
|
4380
4374
|
}
|
|
4381
4375
|
|
|
4382
|
-
export { AuthorizationModal$1 as AuthorizationModal, CommonHeader$1 as CommonHeader, DraggableNumberInput, NetworkSettingsModal$1 as NetworkSettingsModal, PresetModal, PtpModal$1 as PtpModal, SystemOperations$1 as SystemOperations, UpgradeManager$1 as UpgradeManager, useAuth, useHardwareUsage$1 as useHardwareUsage,
|
|
4376
|
+
export { AuthorizationModal$1 as AuthorizationModal, CommonHeader$1 as CommonHeader, DraggableNumberInput, LSMLabelField$1 as LSMLabelField, NetworkSettingsModal$1 as NetworkSettingsModal, PresetModal, PtpModal$1 as PtpModal, SystemOperations$1 as SystemOperations, UpgradeManager$1 as UpgradeManager, useAuth, useHardwareUsage$1 as useHardwareUsage, useSystemOperations$1 as useSystemOperations, useUpgrade$1 as useUpgrade };
|
|
4383
4377
|
//# sourceMappingURL=index.esm.js.map
|