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.js CHANGED
@@ -792,853 +792,258 @@ const useSystemOperations = function () {
792
792
  };
793
793
  var useSystemOperations$1 = useSystemOperations;
794
794
 
795
- var isCheckBoxInput = (element) => element.type === 'checkbox';
796
-
797
- var isDateObject = (value) => value instanceof Date;
798
-
799
- var isNullOrUndefined = (value) => value == null;
800
-
801
- const isObjectType = (value) => typeof value === 'object';
802
- var isObject = (value) => !isNullOrUndefined(value) &&
803
- !Array.isArray(value) &&
804
- isObjectType(value) &&
805
- !isDateObject(value);
806
-
807
- var getEventValue = (event) => isObject(event) && event.target
808
- ? isCheckBoxInput(event.target)
809
- ? event.target.checked
810
- : event.target.value
811
- : event;
812
-
813
- var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
814
-
815
- var isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));
816
-
817
- var isPlainObject = (tempObject) => {
818
- const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;
819
- return (isObject(prototypeCopy) && prototypeCopy.hasOwnProperty('isPrototypeOf'));
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
- var isWeb = typeof window !== 'undefined' &&
823
- typeof window.HTMLElement !== 'undefined' &&
824
- typeof document !== 'undefined';
825
-
826
- function cloneObject(data) {
827
- let copy;
828
- const isArray = Array.isArray(data);
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
- else if (!(isWeb && (data instanceof Blob || isFileListInstance)) &&
834
- (isArray || isObject(data))) {
835
- copy = isArray ? [] : Object.create(Object.getPrototypeOf(data));
836
- if (!isArray && !isPlainObject(data)) {
837
- copy = data;
838
- }
839
- else {
840
- for (const key in data) {
841
- if (data.hasOwnProperty(key)) {
842
- copy[key] = cloneObject(data[key]);
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
- else {
848
- return data;
849
- }
850
- return copy;
851
- }
852
-
853
- var isKey = (value) => /^\w*$/.test(value);
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
- var get = (object, path, defaultValue) => {
862
- if (!path || !isObject(object)) {
863
- return defaultValue;
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
- const result = (isKey(path) ? [path] : stringToPath(path)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], object);
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
- var set = (object, path, value) => {
876
- let index = -1;
877
- const tempPath = isKey(path) ? [path] : stringToPath(path);
878
- const length = tempPath.length;
879
- const lastIndex = length - 1;
880
- while (++index < length) {
881
- const key = tempPath[index];
882
- let newValue = value;
883
- if (index !== lastIndex) {
884
- const objValue = object[key];
885
- newValue =
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
- const EVENTS = {
901
- BLUR: 'blur',
902
- FOCUS_OUT: 'focusout',
903
- CHANGE: 'change',
904
- };
905
- const VALIDATION_MODE = {
906
- onBlur: 'onBlur',
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 result;
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
- var generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {
1033
- if (isString(names)) {
1034
- isGlobal && _names.watch.add(names);
1035
- return get(formValues, names, defaultValue);
995
+ // 当初始值准备好后设置表单值
996
+ React.useEffect(() => {
997
+ if (isInitialized && !initializationStatus.current.hasInitialized) {
998
+ form.setFieldsValue(initialValues);
999
+ initializationStatus.current.hasInitialized = true;
1036
1000
  }
1037
- if (Array.isArray(names)) {
1038
- return names.map((fieldName) => (isGlobal && _names.watch.add(fieldName),
1039
- get(formValues, fieldName)));
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
- function deepEqual(object1, object2, _internal_visited = new WeakSet()) {
1048
- if (isPrimitive(object1) || isPrimitive(object2)) {
1049
- return object1 === object2;
1050
- }
1051
- if (isDateObject(object1) && isDateObject(object2)) {
1052
- return object1.getTime() === object2.getTime();
1053
- }
1054
- const keys1 = Object.keys(object1);
1055
- const keys2 = Object.keys(object2);
1056
- if (keys1.length !== keys2.length) {
1057
- return false;
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
- return true;
1081
- }
1082
-
1083
- /**
1084
- * Custom hook to subscribe to field change and isolate re-rendering at the component level.
1085
- *
1086
- * @remarks
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
- * We use an Error-like object for backward compatibility as people may call
3266
- * PropTypes directly and inspect their output. However, we don't use real
3267
- * Errors anymore. We don't inspect their stack anyway, and creating them
3268
- * is prohibitively expensive if they are created too often, such as what
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
- function createChainableTypeChecker(validate) {
3280
- if (process.env.NODE_ENV !== 'production') {
3281
- var manualPropTypeCallCache = {};
3282
- var manualPropTypeWarningCount = 0;
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
- if (secret !== ReactPropTypesSecret) {
3289
- if (throwOnDirectAccess) {
3290
- // New behavior only for users of `prop-types` package
3291
- var err = new Error(
3292
- 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
3293
- 'Use `PropTypes.checkPropTypes()` to call them. ' +
3294
- 'Read more at http://fb.me/use-check-prop-types'
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
- if (props[propName] == null) {
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 createPrimitiveTypeChecker(expectedType) {
3338
- function validate(props, propName, componentName, location, propFullName, secret) {
3339
- var propValue = props[propName];
3340
- var propType = getPropType(propValue);
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 createAnyTypeChecker() {
3358
- return createChainableTypeChecker(emptyFunctionThatReturnsNull);
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 createArrayOfTypeChecker(typeChecker) {
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
- if (!Array.isArray(propValue)) {
3368
- var propType = getPropType(propValue);
3369
- return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
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 i = 0; i < propValue.length; i++) {
3372
- var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);
3373
- if (error instanceof Error) {
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 createElementTypeChecker() {
2955
+ function createStrictShapeTypeChecker(shapeTypes) {
3383
2956
  function validate(props, propName, componentName, location, propFullName) {
3384
2957
  var propValue = props[propName];
3385
- if (!isValidElement(propValue)) {
3386
- var propType = getPropType(propValue);
3387
- return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
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
- return createChainableTypeChecker(validate);
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
- function createElementTypeTypeChecker() {
3395
- function validate(props, propName, componentName, location, propFullName) {
3396
- var propValue = props[propName];
3397
- if (!ReactIs.isValidElementType(propValue)) {
3398
- var propType = getPropType(propValue);
3399
- return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));
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 createChainableTypeChecker(validate);
3090
+ return propType;
3404
3091
  }
3405
3092
 
3406
- function createInstanceTypeChecker(expectedClass) {
3407
- function validate(props, propName, componentName, location, propFullName) {
3408
- if (!(props[propName] instanceof expectedClass)) {
3409
- var expectedClassName = expectedClass.name || ANONYMOUS;
3410
- var actualClassName = getClassName(props[propName]);
3411
- return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
3412
- }
3413
- return null;
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
- function createEnumTypeChecker(expectedValues) {
3419
- if (!Array.isArray(expectedValues)) {
3420
- if (process.env.NODE_ENV !== 'production') {
3421
- if (arguments.length > 1) {
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
- function validate(props, propName, componentName, location, propFullName) {
3434
- var propValue = props[propName];
3435
- for (var i = 0; i < expectedValues.length; i++) {
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
- var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {
3442
- var type = getPreciseType(value);
3443
- if (type === 'symbol') {
3444
- return String(value);
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
- function createObjectOfTypeChecker(typeChecker) {
3454
- function validate(props, propName, componentName, location, propFullName) {
3455
- if (typeof typeChecker !== 'function') {
3456
- return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
3457
- }
3458
- var propValue = props[propName];
3459
- var propType = getPropType(propValue);
3460
- if (propType !== 'object') {
3461
- return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
3462
- }
3463
- for (var key in propValue) {
3464
- if (has(propValue, key)) {
3465
- var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
3466
- if (error instanceof Error) {
3467
- return error;
3468
- }
3469
- }
3470
- }
3471
- return null;
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
- return createChainableTypeChecker(validate);
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
- if (!Array.isArray(arrayOfTypeCheckers)) {
3478
- process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;
3479
- return emptyFunctionThatReturnsNull;
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
- for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
3483
- var checker = arrayOfTypeCheckers[i];
3484
- if (typeof checker !== 'function') {
3485
- printWarning(
3486
- 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +
3487
- 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'
3488
- );
3489
- return emptyFunctionThatReturnsNull;
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
- function validate(props, propName, componentName, location, propFullName) {
3494
- var expectedTypes = [];
3495
- for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
3496
- var checker = arrayOfTypeCheckers[i];
3497
- var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);
3498
- if (checkerResult == null) {
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
- function createNodeChecker() {
3512
- function validate(props, propName, componentName, location, propFullName) {
3513
- if (!isNode(props[propName])) {
3514
- return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
3515
- }
3516
- return null;
3517
- }
3518
- return createChainableTypeChecker(validate);
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
- function invalidValidatorError(componentName, location, propFullName, key, type) {
3522
- return new PropTypeError(
3523
- (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +
3524
- 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'
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
- function createShapeTypeChecker(shapeTypes) {
3529
- function validate(props, propName, componentName, location, propFullName) {
3530
- var propValue = props[propName];
3531
- var propType = getPropType(propValue);
3532
- if (propType !== 'object') {
3533
- return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
3534
- }
3535
- for (var key in shapeTypes) {
3536
- var checker = shapeTypes[key];
3537
- if (typeof checker !== 'function') {
3538
- return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));
3539
- }
3540
- var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);
3541
- if (error) {
3542
- return error;
3543
- }
3544
- }
3545
- return null;
3546
- }
3547
- return createChainableTypeChecker(validate);
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
- function createStrictShapeTypeChecker(shapeTypes) {
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
- return createChainableTypeChecker(validate);
3580
- }
3476
+ var isDateObject = (value) => value instanceof Date;
3581
3477
 
3582
- function isNode(propValue) {
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
- var iteratorFn = getIteratorFn(propValue);
3599
- if (iteratorFn) {
3600
- var iterator = iteratorFn.call(propValue);
3601
- var step;
3602
- if (iteratorFn !== propValue.entries) {
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
- return true;
3624
- default:
3625
- return false;
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
- function isSymbol(propType, propValue) {
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
- // falsy value can't be a Symbol
3636
- if (!propValue) {
3637
- return false;
3638
- }
3494
+ var isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));
3639
3495
 
3640
- // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
3641
- if (propValue['@@toStringTag'] === 'Symbol') {
3642
- return true;
3643
- }
3496
+ var isPlainObject = (tempObject) => {
3497
+ const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;
3498
+ return (isObject(prototypeCopy) && prototypeCopy.hasOwnProperty('isPrototypeOf'));
3499
+ };
3644
3500
 
3645
- // Fallback for non-spec compliant Symbols which are polyfilled.
3646
- if (typeof Symbol === 'function' && propValue instanceof Symbol) {
3647
- return true;
3648
- }
3501
+ var isWeb = typeof window !== 'undefined' &&
3502
+ typeof window.HTMLElement !== 'undefined' &&
3503
+ typeof document !== 'undefined';
3649
3504
 
3650
- return false;
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
- // Equivalent of `typeof` but with special handling for array and regexp.
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
- // This handles more types than `getPropType`. Only used for error messages.
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
- // Returns a string that is postfixed to a warning about an invalid type.
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
- // Returns class name of the object, if any.
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
- ReactPropTypes.checkPropTypes = checkPropTypes;
3714
- ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;
3715
- ReactPropTypes.PropTypes = ReactPropTypes;
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
- return ReactPropTypes;
3718
- };
3719
- return factoryWithTypeCheckers;
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
- * Copyright (c) 2013-present, Facebook, Inc.
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
- * This source code is licensed under the MIT license found in the
3726
- * LICENSE file in the root directory of this source tree.
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 factoryWithThrowingShims;
3730
- var hasRequiredFactoryWithThrowingShims;
3731
-
3732
- function requireFactoryWithThrowingShims () {
3733
- if (hasRequiredFactoryWithThrowingShims) return factoryWithThrowingShims;
3734
- hasRequiredFactoryWithThrowingShims = 1;
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
- var ReactPropTypesSecret = /*@__PURE__*/ requireReactPropTypesSecret();
3645
+ const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
3737
3646
 
3738
- function emptyFunction() {}
3739
- function emptyFunctionWithReset() {}
3740
- emptyFunctionWithReset.resetWarningCache = emptyFunction;
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
- factoryWithThrowingShims = function() {
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
- any: shim,
3771
- arrayOf: getShim,
3772
- element: shim,
3773
- elementType: shim,
3774
- instanceOf: getShim,
3775
- node: shim,
3776
- objectOf: getShim,
3777
- oneOf: getShim,
3778
- oneOfType: getShim,
3779
- shape: getShim,
3780
- exact: getShim,
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
- checkPropTypes: emptyFunctionWithReset,
3783
- resetWarningCache: emptyFunction
3784
- };
3724
+ var isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);
3785
3725
 
3786
- ReactPropTypes.PropTypes = ReactPropTypes;
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
- return ReactPropTypes;
3789
- };
3790
- return factoryWithThrowingShims;
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
- * Copyright (c) 2013-present, Facebook, Inc.
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
- * This source code is licensed under the MIT license found in the
3797
- * LICENSE file in the root directory of this source tree.
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
- var hasRequiredPropTypes;
3801
-
3802
- function requirePropTypes () {
3803
- if (hasRequiredPropTypes) return propTypes.exports;
3804
- hasRequiredPropTypes = 1;
3805
- if (process.env.NODE_ENV !== 'production') {
3806
- var ReactIs = requireReactIs();
3807
-
3808
- // By explicitly using `prop-types` you are opting into new development behavior.
3809
- // http://fb.me/prop-types-in-prod
3810
- var throwOnDirectAccess = true;
3811
- propTypes.exports = /*@__PURE__*/ requireFactoryWithTypeCheckers()(ReactIs.isElement, throwOnDirectAccess);
3812
- } else {
3813
- // By explicitly using `prop-types` you are opting into new production behavior.
3814
- // http://fb.me/prop-types-in-prod
3815
- propTypes.exports = /*@__PURE__*/ requireFactoryWithThrowingShims()();
3816
- }
3817
- return propTypes.exports;
3818
- }
3819
-
3820
- var propTypesExports = /*@__PURE__*/ requirePropTypes();
3821
- var PropTypes = /*@__PURE__*/getDefaultExportFromCjs(propTypesExports);
3822
-
3823
- const SystemOperations = _ref => {
3824
- let {
3825
- onPowerOff,
3826
- onRestart,
3827
- powerOffLabel = "Power Off",
3828
- restartLabel = "Restart",
3829
- iconClassName = "seeder-iconfont seeder-icon-guanji1 text-xl text-neutral-400",
3830
- confirmTitle = "Confirm",
3831
- cancelText = "No",
3832
- okText = "Yes",
3833
- run
3834
- } = _ref;
3835
- const {
3836
- modal: AntdModal
3837
- } = antd.App.useApp();
3838
- const menuItems = [{
3839
- key: "poweroff",
3840
- label: powerOffLabel
3841
- },
3842
- // {
3843
- // key: "reboot",
3844
- // label: rebootLabel, // 硬重启 物理重启
3845
- // },
3846
- {
3847
- key: "restart",
3848
- label: restartLabel // 软重启 服务重启
3849
- }];
3850
- const doAction = action => {
3851
- try {
3852
- AntdModal.confirm({
3853
- icon: /*#__PURE__*/jsxRuntime.jsx(icons.ExclamationCircleFilled, {}),
3854
- title: "".concat(confirmTitle, " ").concat(action, "?"),
3855
- cancelText,
3856
- okText,
3857
- onOk: () => {
3858
- if (action === 'poweroff' && onPowerOff) {
3859
- onPowerOff();
3860
- } else if (action === 'restart' && onRestart) {
3861
- onRestart();
3862
- }
3863
-
3864
- // Call the run callback after successful operation
3865
- if (typeof run === 'function') {
3866
- run();
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
- } catch (error) {
3871
- console.error("".concat(action.toUpperCase(), " ERROR: "), error);
3872
- }
3873
- };
3874
- const handleMenuClick = _ref2 => {
3875
- let {
3876
- key
3877
- } = _ref2;
3878
- doAction(key);
3879
- };
3880
- return /*#__PURE__*/jsxRuntime.jsx(antd.Dropdown, {
3881
- menu: {
3882
- items: menuItems,
3883
- onClick: handleMenuClick
3884
- },
3885
- trigger: ["hover"],
3886
- children: /*#__PURE__*/jsxRuntime.jsx("a", {
3887
- onClick: e => e.preventDefault(),
3888
- children: /*#__PURE__*/jsxRuntime.jsx("i", {
3889
- className: iconClassName
3890
- })
3891
- })
3892
- });
3893
- };
3894
- SystemOperations.propTypes = {
3895
- onPowerOff: PropTypes.func,
3896
- onRestart: PropTypes.func,
3897
- powerOffLabel: PropTypes.string,
3898
- restartLabel: PropTypes.string,
3899
- iconClassName: PropTypes.string,
3900
- confirmTitle: PropTypes.string,
3901
- cancelText: PropTypes.string,
3902
- okText: PropTypes.string,
3903
- run: PropTypes.func
3904
- };
3905
- var SystemOperations$1 = SystemOperations;
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
- const defaultResetRoute = () => {
3909
- window.location.href = window.location.origin;
3910
- };
3911
- const useSpaLogo = function () {
3912
- let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
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
- logoUrl = logoBase64,
3915
- // 使用者传入 logo URL
3916
- logoWidth = 100,
3917
- logoAlt = 'logo',
3918
- onClick = defaultResetRoute,
3919
- buttonStyle = {
3920
- padding: 0,
3921
- lineHeight: 1,
3922
- height: 'auto',
3923
- borderStyle: 'none',
3924
- display: 'inline-block'
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
- // 如果没有提供 logoUrl,返回空
3929
- if (!logoUrl) {
3930
- return [null];
3931
- }
3932
- return [/*#__PURE__*/jsxRuntime.jsx(antd.Button, {
3933
- type: "link",
3934
- style: buttonStyle,
3935
- onClick: onClick,
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
- }, "logo")];
3944
- };
3945
- useSpaLogo.propTypes = {
3946
- logoUrl: PropTypes.string,
3947
- logoWidth: PropTypes.number,
3948
- logoAlt: PropTypes.string,
3949
- onClick: PropTypes.func
3950
- };
3951
- var useSpaLogo$1 = useSpaLogo;
3952
-
3953
- const defaultGetSocketUrl = url => {
3954
- if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') {
3955
- return "ws://127.0.0.1:".concat(window.location.port).concat(url);
3956
- }
3957
- return "ws://".concat(window.location.host).concat(url);
3958
- };
3959
-
3960
- /**
3961
- * 通用 Header 组件
3962
- * @param {Object} props
3963
- * @param {React.ReactNode} props.menuElement - 菜单元素
3964
- * @param {Object} props.productInfo - 产品信息 { productName, version }
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
- children: productInfo.version
4024
- })]
4025
- }), leftContent]
4026
- }), /*#__PURE__*/jsxRuntime.jsxs(antd.Flex, {
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