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