seeder-st2110-components 1.6.3 → 1.6.4

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