@capillarytech/blaze-ui 1.0.3-alpha.12 → 1.0.3-alpha.14

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.
@@ -1,6 +1,102 @@
1
1
  /******/ (() => { // webpackBootstrap
2
2
  /******/ var __webpack_modules__ = ({
3
3
 
4
+ /***/ 455:
5
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6
+
7
+ "use strict";
8
+
9
+
10
+ exports.__esModule = true;
11
+ exports.SelectAllCheckbox = exports.NoResult = void 0;
12
+ var _antdV = __webpack_require__(4273);
13
+ var _classnames = _interopRequireDefault(__webpack_require__(6942));
14
+ var _react = _interopRequireDefault(__webpack_require__(9206));
15
+ var _CapIcon = _interopRequireDefault(__webpack_require__(8244));
16
+ var _CapLabel = _interopRequireDefault(__webpack_require__(3737));
17
+ var _CapRow = _interopRequireDefault(__webpack_require__(7375));
18
+ var _constants = __webpack_require__(9788);
19
+ var _styles = _interopRequireDefault(__webpack_require__(8263));
20
+ var _jsxRuntime = __webpack_require__(4848);
21
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
+ const NoResult = _ref => {
23
+ let {
24
+ noResultCustomText,
25
+ className,
26
+ showUpload,
27
+ options,
28
+ noResultCustomIcon
29
+ } = _ref;
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CapRow.default, {
31
+ className: (0, _classnames.default)(className, _styles.default['cap-unified-select-no-result']),
32
+ align: "middle",
33
+ gap: 8,
34
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CapIcon.default, {
35
+ type: noResultCustomIcon,
36
+ size: "m"
37
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapLabel.default, {
38
+ className: _styles.default['cap-unified-select-no-result-text'],
39
+ children: showUpload && (options == null ? void 0 : options.length) === 0 ? noResultCustomText : _constants.DEFAULTS.NO_RESULT_TEXT
40
+ })]
41
+ });
42
+ };
43
+
44
+ /**
45
+ * SelectAllCheckbox component for selecting/deselecting all available options
46
+ * Only shown for multi-select with static data
47
+ */
48
+ exports.NoResult = NoResult;
49
+ const SelectAllCheckbox = _ref2 => {
50
+ let {
51
+ currentItems,
52
+ tempValue,
53
+ setTempValue,
54
+ processTreeData,
55
+ disabled = false
56
+ } = _ref2;
57
+ const {
58
+ leafValues = []
59
+ } = processTreeData ? processTreeData(currentItems) : {};
60
+ const totalAvailable = leafValues.length;
61
+ const leafSet = new Set(leafValues);
62
+ const selectedInScope = Array.isArray(tempValue) ? tempValue.filter(v => leafSet.has(v)).length : 0;
63
+ const allChecked = totalAvailable > 0 && selectedInScope === totalAvailable;
64
+ const indeterminate = selectedInScope > 0 && selectedInScope < totalAvailable;
65
+ const handleChange = e => {
66
+ if (disabled) {
67
+ return;
68
+ }
69
+ if (e.target.checked) {
70
+ const merged = new Set(Array.isArray(tempValue) ? tempValue : []);
71
+ leafValues.forEach(v => merged.add(v));
72
+ setTempValue(Array.from(merged));
73
+ } else {
74
+ const toRemove = new Set(leafValues);
75
+ const next = (Array.isArray(tempValue) ? tempValue : []).filter(v => !toRemove.has(v));
76
+ setTempValue(next);
77
+ }
78
+ };
79
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapRow.default, {
80
+ className: _styles.default['cap-unified-select-select-all-container'],
81
+ align: "middle",
82
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antdV.Checkbox, {
83
+ className: _styles.default['cap-unified-select-select-all-checkbox'],
84
+ checked: allChecked,
85
+ indeterminate: indeterminate,
86
+ onChange: handleChange,
87
+ disabled: disabled,
88
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapLabel.default, {
89
+ type: "label14",
90
+ className: _styles.default['cap-unified-select-select-all-label'],
91
+ children: "Select all"
92
+ })
93
+ })
94
+ });
95
+ };
96
+ exports.SelectAllCheckbox = SelectAllCheckbox;
97
+
98
+ /***/ }),
99
+
4
100
  /***/ 540:
5
101
  /***/ ((module) => {
6
102
 
@@ -773,146 +869,17 @@ var _CapRow = _interopRequireDefault(__webpack_require__(7375));
773
869
  var _CapSpin = _interopRequireDefault(__webpack_require__(1549));
774
870
  var _CapTooltip = _interopRequireDefault(__webpack_require__(5636));
775
871
  var _CapTooltipWithInfo = _interopRequireDefault(__webpack_require__(2608));
872
+ var _components = __webpack_require__(455);
776
873
  var _constants = __webpack_require__(9788);
777
874
  var _styles = _interopRequireDefault(__webpack_require__(8263));
875
+ var _utils = __webpack_require__(8052);
778
876
  var _jsxRuntime = __webpack_require__(4848);
779
877
  const _excluded = ["type", "options", "value", "onChange", "placeholder", "className", "style", "isError", "errorMessage", "containerClassName", "popoverClassName", "allowClear", "headerLabel", "onUpload", "uploadLabel", "tooltip", "bylineText", "disabled", "showUpload", "customPopupRender", "showSearch", "searchBasedOn", "onSearch", "searchDebounce", "onConfirm", "clearText", "noResultCustomText", "noResultCustomIcon", "readOnly", "staticValue", "onFooterDownloadChange", "onPopupScroll", "hasMore", "enableVirtualization", "virtualRowHeight", "resetSearch", "resetData", "fetchMissingOptions"];
780
878
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
781
879
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
880
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
782
881
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
783
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /* eslint-disable max-lines */
784
- const NoResult = _ref => {
785
- let {
786
- noResultCustomText,
787
- className,
788
- showUpload,
789
- options,
790
- noResultCustomIcon
791
- } = _ref;
792
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CapRow.default, {
793
- className: (0, _classnames.default)(className, _styles.default['cap-unified-select-no-result']),
794
- align: "middle",
795
- gap: 8,
796
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CapIcon.default, {
797
- type: noResultCustomIcon,
798
- size: "m"
799
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapLabel.default, {
800
- className: _styles.default['cap-unified-select-no-result-text'],
801
- children: showUpload && (options == null ? void 0 : options.length) === 0 ? noResultCustomText : _constants.DEFAULTS.NO_RESULT_TEXT
802
- })]
803
- });
804
- };
805
- const SelectAllCheckbox = _ref2 => {
806
- let {
807
- currentItems,
808
- tempValue,
809
- setTempValue,
810
- processTreeData
811
- } = _ref2;
812
- const {
813
- leafValues = []
814
- } = processTreeData ? processTreeData(currentItems) : {};
815
- const totalAvailable = leafValues.length;
816
- const leafSet = new Set(leafValues);
817
- const selectedInScope = Array.isArray(tempValue) ? tempValue.filter(v => leafSet.has(v)).length : 0;
818
- const allChecked = totalAvailable > 0 && selectedInScope === totalAvailable;
819
- const indeterminate = selectedInScope > 0 && selectedInScope < totalAvailable;
820
- const handleChange = e => {
821
- if (e.target.checked) {
822
- const merged = new Set(Array.isArray(tempValue) ? tempValue : []);
823
- leafValues.forEach(v => merged.add(v));
824
- setTempValue(Array.from(merged));
825
- } else {
826
- const toRemove = new Set(leafValues);
827
- const next = (Array.isArray(tempValue) ? tempValue : []).filter(v => !toRemove.has(v));
828
- setTempValue(next);
829
- }
830
- };
831
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapRow.default, {
832
- className: _styles.default['cap-unified-select-select-all-container'],
833
- align: "middle",
834
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antdV.Checkbox, {
835
- className: _styles.default['cap-unified-select-select-all-checkbox'],
836
- checked: allChecked,
837
- indeterminate: indeterminate,
838
- onChange: handleChange,
839
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapLabel.default, {
840
- type: "label14",
841
- className: _styles.default['cap-unified-select-select-all-label'],
842
- children: "Select all"
843
- })
844
- })
845
- });
846
- };
847
- const buildTreeMaps = nodes => {
848
- const result = {
849
- leafValues: [],
850
- parentChildMap: {},
851
- nodeMap: {}
852
- };
853
- if (!nodes) return result;
854
- const traverse = items => {
855
- items == null || items.forEach(item => {
856
- if (item.value !== undefined) {
857
- result.nodeMap[item.value] = item;
858
- if (item != null && item.children && item.children.length > 0) {
859
- result.parentChildMap[item.value] = item.children.map(child => child == null ? void 0 : child.value).filter(v => v !== undefined);
860
- traverse(item.children);
861
- } else {
862
- result.leafValues.push(item.value);
863
- }
864
- }
865
- });
866
- };
867
- traverse(nodes);
868
- return result;
869
- };
870
- const countSelectedLeaves = (treeMaps, selectedValues) => {
871
- var _treeMaps$leafValues;
872
- if (!Array.isArray(selectedValues) || !(selectedValues != null && selectedValues.length)) return 0;
873
- const expandedSet = new Set(selectedValues);
874
- const processNode = value => {
875
- var _treeMaps$parentChild;
876
- const children = treeMaps == null || (_treeMaps$parentChild = treeMaps.parentChildMap) == null ? void 0 : _treeMaps$parentChild[value];
877
- if (!children) return;
878
- children == null || children.forEach(childValue => {
879
- expandedSet.add(childValue);
880
- processNode(childValue);
881
- });
882
- };
883
- selectedValues == null || selectedValues.forEach(processNode);
884
- return (treeMaps == null || (_treeMaps$leafValues = treeMaps.leafValues) == null ? void 0 : _treeMaps$leafValues.reduce((count, leaf) => expandedSet.has(leaf) ? count + 1 : count, 0)) || 0;
885
- };
886
- const filterTreeData = function (data, search, searchBasedOn, selectedValues) {
887
- if (searchBasedOn === void 0) {
888
- searchBasedOn = 'label';
889
- }
890
- if (!(data != null && data.length) || !search) return data;
891
- const searchLower = search.toLowerCase();
892
- const selectedSet = new Set(selectedValues || []);
893
- const nodeMatchesSearch = node => {
894
- var _node$value, _node$key, _ref3, _node$label;
895
- const target = searchBasedOn === 'value' ? String((_node$value = node == null ? void 0 : node.value) != null ? _node$value : '') : searchBasedOn === 'key' ? String((_node$key = node == null ? void 0 : node.key) != null ? _node$key : '') : String((_ref3 = (_node$label = node == null ? void 0 : node.label) != null ? _node$label : node == null ? void 0 : node.title) != null ? _ref3 : '');
896
- return target.toLowerCase().includes(searchLower);
897
- };
898
- const isNodeSelected = node => {
899
- return node.value !== undefined && selectedSet.has(node.value);
900
- };
901
- const loop = items => items.reduce((acc, item) => {
902
- var _item$children;
903
- if (!item) return acc;
904
- const children = item != null && (_item$children = item.children) != null && _item$children.length ? loop(item.children) : [];
905
- // Include node if: matches search OR is selected OR has matching children
906
- if (nodeMatchesSearch(item) || isNodeSelected(item) || children.length) {
907
- acc.push(_extends({}, item, {
908
- children
909
- }));
910
- }
911
- return acc;
912
- }, []);
913
- return loop(data);
914
- };
915
- const CapUnifiedSelect = _ref4 => {
882
+ const CapUnifiedSelect = _ref => {
916
883
  let {
917
884
  type = _constants.SELECT_TYPES.SELECT,
918
885
  options = [],
@@ -952,134 +919,79 @@ const CapUnifiedSelect = _ref4 => {
952
919
  resetSearch = true,
953
920
  resetData,
954
921
  fetchMissingOptions
955
- } = _ref4,
956
- rest = _objectWithoutPropertiesLoose(_ref4, _excluded);
922
+ } = _ref,
923
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded);
957
924
  const [searchText, setSearchText] = (0, _react.useState)('');
958
925
  const [tempValue, setTempValue] = (0, _react.useState)(value);
959
926
  const [dropdownOpen, setDropdownOpen] = (0, _react.useState)(false);
960
927
  const [isSearching, setIsSearching] = (0, _react.useState)(false);
961
928
  const [isLoadingOnScroll, setIsLoadingOnScroll] = (0, _react.useState)(false);
962
929
  const [isResettingData, setIsResettingData] = (0, _react.useState)(false);
963
- // Store ordered options after confirm (selected items moved to top based on selection order)
964
930
  const [orderedOptions, setOrderedOptions] = (0, _react.useState)(null);
965
931
  const searchTimeoutRef = (0, _react.useRef)(null);
966
932
  const scrollContainerRef = (0, _react.useRef)(null);
967
933
  const scrollLoadingTimeoutRef = (0, _react.useRef)(null);
968
- // Track if scroll handler is currently processing to prevent duplicate calls
969
934
  const isScrollProcessingRef = (0, _react.useRef)(false);
970
- // Throttle ref for scroll events
971
935
  const scrollThrottleTimeoutRef = (0, _react.useRef)(null);
972
- // Ref to track options for scroll handler (avoids recreating handleScroll)
973
936
  const optionsRef = (0, _react.useRef)(options);
974
- // Cache of selected items from async results to preserve them during search
975
937
  const selectedItemsCacheRef = (0, _react.useRef)(new Map());
976
- // Track the last search query to detect when options update after search
977
938
  const lastSearchQueryRef = (0, _react.useRef)('');
978
- // Track when search was cleared to help clear loading state
979
939
  const searchClearedTimeRef = (0, _react.useRef)(null);
980
- // Track previous options to detect when they change after a search
981
940
  const prevOptionsRef = (0, _react.useRef)(options);
982
- // Track previous options before resetData is called to detect when options update
983
941
  const prevOptionsBeforeResetRef = (0, _react.useRef)(options);
984
- // Track previous options count to detect when options change after scroll
985
942
  const prevOptionsCountRef = (0, _react.useRef)(options.length);
986
- // Track previous options to detect when options change (even if count stays same)
987
943
  const prevOptionsRefForScroll = (0, _react.useRef)(options);
988
- // Track options count when scroll was triggered (for orderedOptions update)
989
944
  const scrollTriggerOptionsCountRef = (0, _react.useRef)(options.length);
990
- // Track if initial sort has been done (only sort once on initial load with selected values)
991
945
  const initialSortDoneRef = (0, _react.useRef)(false);
992
- // Track if user has interacted with the dropdown during current session (selected, searched, etc.)
993
946
  const hasInteractedRef = (0, _react.useRef)(false);
994
- // Track the initial tempValue when dropdown opens to detect if user made changes
995
947
  const initialTempValueRef = (0, _react.useRef)(value);
996
- // Track if resetData was already called in the current session to prevent duplicate calls
997
948
  const resetDataCalledRef = (0, _react.useRef)(false);
998
- // Track when resetData was called to help clear loading state
999
949
  const resetDataCalledTimeRef = (0, _react.useRef)(null);
1000
- // Track if fetchMissingOptions was already called to prevent duplicate calls
1001
950
  const fetchMissingOptionsCalledRef = (0, _react.useRef)(false);
1002
- // Track the last missing values that were sent to prevent duplicate calls with same values
1003
951
  const lastMissingValuesRef = (0, _react.useRef)('');
1004
-
1005
- // Helper function to check if a value exists in options (recursive for tree structures)
1006
- const findValueInOptions = (0, _react.useCallback)((opts, targetValue) => {
1007
- for (const opt of opts) {
1008
- if (opt.value === targetValue) {
1009
- return true;
1010
- }
1011
- if (opt.children && opt.children.length > 0) {
1012
- if (findValueInOptions(opt.children, targetValue)) {
1013
- return true;
1014
- }
1015
- }
1016
- }
1017
- return false;
1018
- }, []);
1019
-
1020
- // Helper function to find missing selected values
1021
- const findMissingValues = (0, _react.useCallback)((selectedValues, currentOptions) => {
1022
- if (!selectedValues.length || !currentOptions.length) {
1023
- return selectedValues;
1024
- }
1025
- return selectedValues.filter(val => !findValueInOptions(currentOptions, val));
1026
- }, [findValueInOptions]);
1027
-
1028
- // Check for missing options and call fetchMissingOptions if needed
1029
952
  (0, _react.useEffect)(() => {
1030
- // Only check if fetchMissingOptions is provided
1031
953
  if (!fetchMissingOptions) {
1032
954
  return;
1033
955
  }
956
+ if (options.length === 0) {
957
+ return;
958
+ }
1034
959
 
1035
- // Get current selected values
960
+ // For API-driven data, don't fetch missing options during active search
961
+ // Only fetch when there's no search query or search is cleared
962
+ const hasActiveSearch = !staticValue && lastSearchQueryRef.current.trim().length > 0;
963
+ if (hasActiveSearch) {
964
+ return;
965
+ }
1036
966
  const selectedValues = Array.isArray(value) ? value : value ? [value] : [];
1037
967
  if (selectedValues.length === 0) {
1038
- // No selected values, reset the tracking
1039
968
  fetchMissingOptionsCalledRef.current = false;
1040
969
  lastMissingValuesRef.current = '';
1041
970
  return;
1042
971
  }
1043
-
1044
- // Find missing values
1045
- const missingValues = findMissingValues(selectedValues, options);
1046
-
1047
- // If no missing values, reset tracking and return
972
+ const missingValues = (0, _utils.findMissingValues)(selectedValues, options);
1048
973
  if (missingValues.length === 0) {
1049
974
  fetchMissingOptionsCalledRef.current = false;
1050
975
  lastMissingValuesRef.current = '';
1051
976
  return;
1052
977
  }
1053
-
1054
- // Create a sorted string representation of missing values for comparison
1055
- // Use slice() to avoid mutating the original array
1056
978
  const missingValuesKey = [...missingValues].sort().join(',');
1057
-
1058
- // Only call if:
1059
- // 1. We haven't called it before, OR
1060
- // 2. The missing values have changed (different values are missing now)
1061
979
  if (!fetchMissingOptionsCalledRef.current || lastMissingValuesRef.current !== missingValuesKey) {
1062
980
  fetchMissingOptionsCalledRef.current = true;
1063
981
  lastMissingValuesRef.current = missingValuesKey;
1064
- // Call the developer's function with missing values (pass a copy to avoid mutation)
1065
982
  fetchMissingOptions([...missingValues]);
1066
983
  }
1067
- }, [value, options, fetchMissingOptions, findMissingValues]);
984
+ }, [value, options, fetchMissingOptions, staticValue]);
1068
985
  (0, _react.useEffect)(() => {
1069
986
  const isEqual = Array.isArray(value) && Array.isArray(tempValue) ? (value == null ? void 0 : value.length) === (tempValue == null ? void 0 : tempValue.length) && value.every(v => Array.isArray(tempValue) && tempValue.includes(v)) : value === tempValue;
1070
987
  if (!isEqual) {
1071
988
  setTempValue(value);
1072
- // Reset ordered options when value changes from outside
1073
989
  setOrderedOptions(null);
1074
990
  }
1075
991
  // eslint-disable-next-line react-hooks/exhaustive-deps
1076
992
  }, [value]);
1077
-
1078
- // Cache selected items when tempValue changes
1079
993
  (0, _react.useEffect)(() => {
1080
994
  const currentSelected = Array.isArray(tempValue) ? tempValue : tempValue ? [tempValue] : [];
1081
-
1082
- // Store selected items in cache for persistence
1083
995
  const findAndCacheOption = (opts, val) => {
1084
996
  for (const opt of opts) {
1085
997
  if (opt.value === val) {
@@ -1099,8 +1011,6 @@ const CapUnifiedSelect = _ref4 => {
1099
1011
  findAndCacheOption(options, val);
1100
1012
  }
1101
1013
  });
1102
-
1103
- // Clean up cache for unselected items
1104
1014
  const selectedSet = new Set(currentSelected);
1105
1015
  selectedItemsCacheRef.current.forEach((_, value) => {
1106
1016
  if (!selectedSet.has(value)) {
@@ -1108,15 +1018,9 @@ const CapUnifiedSelect = _ref4 => {
1108
1018
  }
1109
1019
  });
1110
1020
  }, [tempValue, options]);
1111
-
1112
- // Reset ordered options when options change, but only if it would invalidate the current ordering
1113
- // This prevents resetting when options are updated via onSearch/onScroll but selected items still exist
1114
1021
  (0, _react.useEffect)(() => {
1115
- // Only reset if we have orderedOptions and the current value's items are no longer in options
1116
1022
  if (orderedOptions) {
1117
1023
  const currentSelected = Array.isArray(tempValue) ? tempValue : tempValue ? [tempValue] : [];
1118
-
1119
- // Check if all selected values still exist in the new options
1120
1024
  const checkValueExists = (opts, val) => {
1121
1025
  for (const opt of opts) {
1122
1026
  if (opt.value === val) return true;
@@ -1126,27 +1030,16 @@ const CapUnifiedSelect = _ref4 => {
1126
1030
  }
1127
1031
  return false;
1128
1032
  };
1129
-
1130
- // If any selected value is missing from new options, reset ordering
1131
1033
  const allSelectedStillExist = currentSelected.every(val => checkValueExists(options, val));
1132
1034
  if (!allSelectedStillExist) {
1133
1035
  setOrderedOptions(null);
1134
1036
  }
1135
- // Otherwise, keep the ordering even if options changed (e.g., via onSearch adding more items)
1136
- } else {
1137
- // No ordering set, nothing to reset
1138
1037
  }
1139
1038
  }, [options, orderedOptions, tempValue]);
1140
-
1141
- // Extract debounce timeout (extracted early for use in useEffects)
1142
1039
  const debounceTimeout = searchDebounce != null ? searchDebounce : _constants.TIMEOUTS.DEFAULT_SEARCH_DEBOUNCE;
1143
-
1144
- // Keep optionsRef in sync with options
1145
1040
  (0, _react.useEffect)(() => {
1146
1041
  optionsRef.current = options;
1147
1042
  }, [options]);
1148
-
1149
- // Cleanup timeouts on unmount
1150
1043
  (0, _react.useEffect)(() => {
1151
1044
  return () => {
1152
1045
  if (searchTimeoutRef.current) {
@@ -1160,35 +1053,21 @@ const CapUnifiedSelect = _ref4 => {
1160
1053
  }
1161
1054
  };
1162
1055
  }, []);
1163
-
1164
- // Detect when options update after a search to clear loading state
1165
- // This prevents showing "No results found" before data arrives
1166
1056
  (0, _react.useEffect)(() => {
1167
- // Only handle this for API-based searches (staticValue = false)
1168
- // Check if lastSearchQueryRef has been set (including empty string for cleared search)
1169
1057
  const hasSearchQuery = lastSearchQueryRef.current !== null && lastSearchQueryRef.current !== undefined;
1170
1058
  if (staticValue || !isSearching || !hasSearchQuery) {
1171
1059
  prevOptionsRef.current = options;
1172
1060
  return;
1173
1061
  }
1174
-
1175
- // Check if options actually changed (reference or content)
1176
1062
  const optionsChanged = prevOptionsRef.current !== options || prevOptionsRef.current.length !== options.length;
1177
-
1178
- // Also check if search was cleared (empty string) and enough time has passed
1179
- // This handles the case where clearing search reloads initial data that might be the same reference
1180
1063
  const searchCleared = lastSearchQueryRef.current === '';
1181
1064
  const timeSinceCleared = searchClearedTimeRef.current ? Date.now() - searchClearedTimeRef.current : Infinity;
1182
1065
  const hasOptionsData = options.length > 0;
1183
- // Wait at least SEARCH_CLEARED_TIMEOUT after search is cleared to allow API call to complete
1184
1066
  const clearedSearchReady = searchCleared && hasOptionsData && timeSinceCleared > _constants.TIMEOUTS.SEARCH_CLEARED_TIMEOUT;
1185
1067
  if (optionsChanged || clearedSearchReady) {
1186
- // Options updated after search - data has arrived
1187
- // Use a small delay to ensure state updates are processed
1188
1068
  const timeoutId = setTimeout(() => {
1189
1069
  setIsSearching(false);
1190
1070
  prevOptionsRef.current = options;
1191
- // Clear timestamp when search loading is cleared
1192
1071
  if (searchCleared) {
1193
1072
  searchClearedTimeRef.current = null;
1194
1073
  }
@@ -1197,91 +1076,50 @@ const CapUnifiedSelect = _ref4 => {
1197
1076
  }
1198
1077
  prevOptionsRef.current = options;
1199
1078
  }, [options, staticValue, isSearching]);
1200
-
1201
- // Fallback: Clear searching state after a reasonable timeout to prevent infinite loading
1202
- // This handles edge cases where options might not change reference but data has arrived
1203
- // Also handles error cases where options don't update after search
1204
1079
  (0, _react.useEffect)(() => {
1205
- // Check if lastSearchQueryRef has been set (including empty string for cleared search)
1206
1080
  const hasSearchQuery = lastSearchQueryRef.current !== null && lastSearchQueryRef.current !== undefined;
1207
1081
  if (!isSearching || staticValue || !hasSearchQuery) {
1208
1082
  return;
1209
1083
  }
1210
-
1211
- // For cleared search (empty string), use a shorter timeout since it should reload initial data quickly
1212
- // For regular search, use debounce timeout + buffer
1213
1084
  const searchCleared = lastSearchQueryRef.current === '';
1214
- const timeoutDuration = searchCleared ? debounceTimeout + _constants.TIMEOUTS.SEARCH_CLEARED_BUFFER // Shorter timeout for cleared search
1215
- : debounceTimeout + _constants.TIMEOUTS.SEARCH_REGULAR_BUFFER; // Longer timeout for regular search
1216
-
1217
- // Calculate timeout: debounce timeout + a small buffer for API response
1218
- // This ensures we wait for the API call to complete before showing "No results"
1219
- // For error cases where options don't update, this will clear loading state
1085
+ const timeoutDuration = searchCleared ? debounceTimeout + _constants.TIMEOUTS.SEARCH_CLEARED_BUFFER : debounceTimeout + _constants.TIMEOUTS.SEARCH_REGULAR_BUFFER;
1220
1086
  const fallbackTimeout = setTimeout(() => {
1221
1087
  setIsSearching(false);
1222
- searchClearedTimeRef.current = null; // Clear search cleared timestamp
1088
+ searchClearedTimeRef.current = null;
1223
1089
  }, timeoutDuration);
1224
1090
  return () => clearTimeout(fallbackTimeout);
1225
1091
  }, [isSearching, staticValue, debounceTimeout, options.length]);
1226
-
1227
- // Detect when options update after resetData is called to clear loading state
1228
1092
  (0, _react.useEffect)(() => {
1229
1093
  if (!isResettingData) {
1230
- // Update ref even when not resetting to keep it in sync
1231
1094
  prevOptionsBeforeResetRef.current = options;
1232
- // Clear timestamp when not resetting
1233
1095
  resetDataCalledTimeRef.current = null;
1234
1096
  return;
1235
1097
  }
1236
-
1237
- // Check if options actually changed (reference, length, or content)
1238
- // Compare against the options that existed before resetData was called
1239
1098
  const prevOptions = prevOptionsBeforeResetRef.current;
1240
1099
  const currentOptions = options;
1241
-
1242
- // More robust comparison: check reference, length, or any content differences
1243
- const optionsChanged = prevOptions !== currentOptions || prevOptions.length !== currentOptions.length ||
1244
- // Deep comparison: check if any option values or labels changed
1245
- prevOptions.length === currentOptions.length && prevOptions.length > 0 && prevOptions.some((prevOpt, idx) => {
1100
+ const optionsChanged = prevOptions !== currentOptions || prevOptions.length !== currentOptions.length || prevOptions.length === currentOptions.length && prevOptions.length > 0 && prevOptions.some((prevOpt, idx) => {
1246
1101
  const currentOpt = currentOptions[idx];
1247
1102
  return !currentOpt || prevOpt.value !== currentOpt.value || prevOpt.label !== currentOpt.label;
1248
1103
  });
1249
-
1250
- // Additional check: if enough time has passed since resetData was called
1251
- // and we have options data, assume data has loaded even if comparison didn't detect change
1252
1104
  const timeSinceReset = resetDataCalledTimeRef.current ? Date.now() - resetDataCalledTimeRef.current : Infinity;
1253
1105
  const hasDataAfterTimeout = currentOptions.length > 0 && timeSinceReset > _constants.TIMEOUTS.RESET_DATA_MIN_TIME && timeSinceReset < _constants.TIMEOUTS.RESET_DATA_MAX_TIME;
1254
-
1255
- // If options changed or enough time has passed with data, clear the loading state
1256
1106
  if (optionsChanged || hasDataAfterTimeout) {
1257
- // Options updated after resetData - data has arrived
1258
- // Clear immediately without delay for faster response
1259
1107
  setIsResettingData(false);
1260
1108
  prevOptionsBeforeResetRef.current = currentOptions;
1261
1109
  resetDataCalledTimeRef.current = null;
1262
1110
  }
1263
1111
  }, [options, isResettingData]);
1264
-
1265
- // Fallback: Clear resetData loading state after a reasonable timeout
1266
- // This handles edge cases where options might not change reference but data has arrived
1267
1112
  (0, _react.useEffect)(() => {
1268
1113
  if (!isResettingData) {
1269
1114
  return;
1270
1115
  }
1271
-
1272
- // Set a timeout to clear loading state if options don't update
1273
- // Reduced timeout to 1 second for faster recovery
1274
1116
  const fallbackTimeout = setTimeout(() => {
1275
1117
  setIsResettingData(false);
1276
- // Update ref to current options to prevent false positives in future comparisons
1277
1118
  prevOptionsBeforeResetRef.current = options;
1278
- // Clear timestamp
1279
1119
  resetDataCalledTimeRef.current = null;
1280
1120
  }, _constants.TIMEOUTS.RESET_DATA_TIMEOUT);
1281
1121
  return () => clearTimeout(fallbackTimeout);
1282
1122
  }, [isResettingData, options]);
1283
-
1284
- // Clear loading state when hasMore becomes false (all items exhausted)
1285
1123
  (0, _react.useEffect)(() => {
1286
1124
  if (!hasMore && isLoadingOnScroll) {
1287
1125
  setIsLoadingOnScroll(false);
@@ -1292,79 +1130,47 @@ const CapUnifiedSelect = _ref4 => {
1292
1130
  }
1293
1131
  }
1294
1132
  }, [hasMore, isLoadingOnScroll]);
1295
-
1296
- // Detect when options change after scroll to clear loading overlay
1297
1133
  (0, _react.useEffect)(() => {
1298
- // Always update refs when options change (when not loading)
1299
- // This ensures we track the current state for next scroll detection
1300
1134
  if (!isLoadingOnScroll) {
1301
1135
  prevOptionsCountRef.current = options.length;
1302
- // Store a reference to the options array for comparison
1303
- // We'll compare by length and last item to detect changes
1304
1136
  prevOptionsRefForScroll.current = options;
1305
1137
  }
1306
-
1307
- // Only check for changes if we're currently loading from scroll
1308
1138
  if (!isLoadingOnScroll || !onPopupScroll) {
1309
1139
  return;
1310
1140
  }
1311
-
1312
- // Check if options count increased (new data loaded via append)
1313
1141
  const optionsCountIncreased = options.length > prevOptionsCountRef.current;
1314
-
1315
- // Check if options content changed (even if count is same - replacement scenario)
1316
- // Compare the last option to detect if new data was appended
1317
1142
  const optionsContentChanged = (() => {
1318
1143
  const prevCount = prevOptionsCountRef.current;
1319
1144
  const currentCount = options.length;
1320
-
1321
- // If count changed, definitely content changed
1322
1145
  if (prevCount !== currentCount) {
1323
1146
  return true;
1324
1147
  }
1325
-
1326
- // If count is same, check if last option changed (indicates new data appended/replaced)
1327
1148
  if (currentCount > 0 && prevCount > 0 && prevOptionsRefForScroll.current.length > 0) {
1328
1149
  const prevOptions = prevOptionsRefForScroll.current;
1329
1150
  const lastPrevOption = prevOptions[prevOptions.length - 1];
1330
1151
  const lastCurrentOption = options[options.length - 1];
1331
-
1332
- // If last option is different, content changed
1333
1152
  if ((lastPrevOption == null ? void 0 : lastPrevOption.value) !== (lastCurrentOption == null ? void 0 : lastCurrentOption.value) || (lastPrevOption == null ? void 0 : lastPrevOption.label) !== (lastCurrentOption == null ? void 0 : lastCurrentOption.label)) {
1334
1153
  return true;
1335
1154
  }
1336
1155
  }
1337
1156
  return false;
1338
1157
  })();
1339
-
1340
- // Clear loading if options changed (either count increased or content changed)
1341
- // This handles both append (count increase) and replace (content change) scenarios
1342
1158
  if (optionsCountIncreased || optionsContentChanged) {
1343
- // Options updated after scroll - data has arrived, clear loading overlay
1344
1159
  setIsLoadingOnScroll(false);
1345
- // Reset processing flag to allow next scroll event
1346
1160
  isScrollProcessingRef.current = false;
1347
1161
  if (scrollLoadingTimeoutRef.current) {
1348
1162
  clearTimeout(scrollLoadingTimeoutRef.current);
1349
1163
  scrollLoadingTimeoutRef.current = null;
1350
1164
  }
1351
-
1352
- // Update refs to track the new state after options change
1353
- // This is critical for detecting subsequent scroll loads
1354
1165
  prevOptionsCountRef.current = options.length;
1355
1166
  prevOptionsRefForScroll.current = options;
1356
1167
  }
1357
1168
  }, [options, isLoadingOnScroll, onPopupScroll]);
1358
-
1359
- // Handle search with debouncing
1360
1169
  const handleSearch = (0, _react.useCallback)(query => {
1361
- // Clear existing timeout
1362
1170
  if (searchTimeoutRef.current) {
1363
1171
  clearTimeout(searchTimeoutRef.current);
1364
1172
  }
1365
1173
  const trimmedQuery = query.trim();
1366
-
1367
- // Track when search is cleared (empty string after having a query)
1368
1174
  const wasSearching = lastSearchQueryRef.current !== '';
1369
1175
  const isNowCleared = trimmedQuery === '';
1370
1176
  if (wasSearching && isNowCleared) {
@@ -1372,36 +1178,19 @@ const CapUnifiedSelect = _ref4 => {
1372
1178
  } else if (!isNowCleared) {
1373
1179
  searchClearedTimeRef.current = null;
1374
1180
  }
1375
-
1376
- // Track the search query to detect when options update
1377
1181
  lastSearchQueryRef.current = trimmedQuery;
1378
-
1379
- // Mark as interacted if user typed something (even if they clear it later)
1380
1182
  if (trimmedQuery.length > 0 || lastSearchQueryRef.current.length > 0) {
1381
1183
  hasInteractedRef.current = true;
1382
1184
  }
1383
-
1384
- // For API-based searches (staticValue = false), always call onSearch
1385
- // This allows the developer to reload all initial data when search is cleared
1386
1185
  if (!staticValue && onSearch) {
1387
- // Set loading state for both empty and non-empty queries
1388
1186
  setIsSearching(true);
1389
-
1390
- // Debounce the search callback
1391
1187
  searchTimeoutRef.current = setTimeout(() => {
1392
- // Send the search input (empty string when cleared, or the actual query)
1393
1188
  onSearch(trimmedQuery);
1394
- // For API-based searches, keep isSearching true until options update
1395
- // This prevents showing "No results found" before data arrives
1396
1189
  }, debounceTimeout);
1397
1190
  } else if (!trimmedQuery) {
1398
- // For static searches, if query is empty, just reset the state
1399
1191
  setIsSearching(false);
1400
1192
  } else {
1401
- // For static searches with content, show brief loading indicator
1402
- // Set loading state briefly to show user feedback
1403
1193
  setIsSearching(true);
1404
- // Clear loading state after a short delay (filtering is instant but we show feedback)
1405
1194
  searchTimeoutRef.current = setTimeout(() => {
1406
1195
  setIsSearching(false);
1407
1196
  }, _constants.TIMEOUTS.STATIC_SEARCH_DELAY);
@@ -1409,222 +1198,78 @@ const CapUnifiedSelect = _ref4 => {
1409
1198
  }, [onSearch, staticValue, debounceTimeout]);
1410
1199
  const isMulti = (0, _react.useMemo)(() => type === _constants.SELECT_TYPES.MULTI_SELECT || type === _constants.SELECT_TYPES.MULTI_TREE_SELECT, [type]);
1411
1200
  const isTree = (0, _react.useMemo)(() => type === _constants.SELECT_TYPES.TREE_SELECT || type === _constants.SELECT_TYPES.MULTI_TREE_SELECT, [type]);
1412
-
1413
- // Use options directly since pagination is handled by the developer
1414
1201
  const mergedOptions = (0, _react.useMemo)(() => {
1415
1202
  return options;
1416
1203
  }, [options]);
1417
-
1418
- // Helper function to reorder options based on selection order
1419
- // Selected items are moved to top in the order they were selected
1420
- // For tree structures, maintains parent-child relationships
1421
- // For flat lists, directly reorders items
1422
- // Works for all data types: flat lists, tree structures, nested trees
1423
- const reorderOptionsBySelection = (0, _react.useCallback)((opts, selectedOrder) => {
1424
- if (!Array.isArray(selectedOrder) || selectedOrder.length === 0 || !(opts != null && opts.length)) {
1425
- return opts;
1426
- }
1427
- const selectedSet = new Set(selectedOrder);
1428
- const selectedItems = [];
1429
- const unselectedItems = [];
1430
- const processedTopLevelValues = new Set();
1431
-
1432
- // Deep clone helper to avoid mutating original items
1433
- const deepCloneItem = item => {
1434
- return _extends({}, item, {
1435
- children: item.children ? item.children.map(deepCloneItem) : undefined
1436
- });
1437
- };
1438
-
1439
- // Find the top-level item that contains the selected value
1440
- // For flat lists, returns the item itself
1441
- // For tree structures, returns the top-level parent from opts
1442
- const findTopLevelItem = targetValue => {
1443
- // First, find which top-level item in opts contains this value
1444
- for (const topLevelItem of opts) {
1445
- // Check if this top-level item itself matches
1446
- if (topLevelItem.value === targetValue) {
1447
- return topLevelItem;
1448
- }
1449
-
1450
- // Recursively search in children
1451
- const searchInChildren = items => {
1452
- for (const item of items) {
1453
- if (item.value === targetValue) {
1454
- return true; // Found it
1455
- }
1456
- if (item.children && item.children.length > 0) {
1457
- if (searchInChildren(item.children)) {
1458
- return true;
1459
- }
1460
- }
1461
- }
1462
- return false;
1463
- };
1464
-
1465
- // If found in this top-level item's children, return the top-level item
1466
- if (topLevelItem.children && topLevelItem.children.length > 0) {
1467
- if (searchInChildren(topLevelItem.children)) {
1468
- return topLevelItem;
1469
- }
1470
- }
1471
- }
1472
- return null;
1473
- };
1474
-
1475
- // Check if an item or any of its descendants is selected
1476
- const hasSelectedDescendant = item => {
1477
- if (item.value !== undefined && selectedSet.has(item.value)) {
1478
- return true;
1479
- }
1480
- if (item.children && item.children.length > 0) {
1481
- return item.children.some(child => hasSelectedDescendant(child));
1482
- }
1483
- return false;
1484
- };
1485
-
1486
- // Collect selected items in selection order
1487
- selectedOrder.forEach(selectedVal => {
1488
- const topLevelItem = findTopLevelItem(selectedVal);
1489
- if (topLevelItem && topLevelItem.value !== undefined && !processedTopLevelValues.has(topLevelItem.value)) {
1490
- // Clone the item to avoid mutating the original
1491
- const clonedItem = deepCloneItem(topLevelItem);
1492
- selectedItems.push(clonedItem);
1493
- processedTopLevelValues.add(topLevelItem.value);
1494
- }
1495
- });
1496
-
1497
- // Collect unselected items maintaining original order
1498
- // For tree structures, only include top-level items that don't have any selected descendants
1499
- opts.forEach(item => {
1500
- if (item.value === undefined) {
1501
- // Item without value, include as-is
1502
- unselectedItems.push(deepCloneItem(item));
1503
- } else if (!processedTopLevelValues.has(item.value)) {
1504
- // Check if this item or any of its descendants is selected
1505
- if (!hasSelectedDescendant(item)) {
1506
- unselectedItems.push(deepCloneItem(item));
1507
- }
1508
- }
1509
- });
1510
-
1511
- // Return selected items first (in selection order), then unselected items
1512
- return [...selectedItems, ...unselectedItems];
1513
- }, []);
1514
-
1515
- // Track previous options count before fetchMissingOptions to detect when missing options are added
1516
1204
  const prevOptionsCountBeforeFetchMissingRef = (0, _react.useRef)(options.length);
1517
- // Track previous options before fetchMissingOptions to detect when missing options are added
1518
1205
  const prevOptionsBeforeFetchMissingRef = (0, _react.useRef)(options);
1519
-
1520
- // Update orderedOptions when new options are appended via scroll (when items are selected)
1521
- // This ensures new data appears even when items are selected
1522
1206
  (0, _react.useEffect)(() => {
1523
- // Only update if we have orderedOptions (items are selected), onPopupScroll is provided,
1524
- // and options increased from when scroll was triggered
1525
1207
  if (!orderedOptions || !onPopupScroll) {
1526
1208
  return;
1527
1209
  }
1528
1210
  const currentOptions = options;
1529
- // Compare against the count when scroll was triggered, not the current ref value
1530
- // This ensures we detect increases even if refs were updated in other useEffects
1531
1211
  const optionsCountIncreased = currentOptions.length > scrollTriggerOptionsCountRef.current;
1532
-
1533
- // Only update if options increased from scroll trigger time
1534
- // This prevents updating on other option changes (like search)
1535
1212
  if (optionsCountIncreased && scrollTriggerOptionsCountRef.current > 0) {
1536
1213
  const selectedValues = Array.isArray(tempValue) ? tempValue : tempValue ? [tempValue] : [];
1537
1214
  if (selectedValues.length > 0) {
1538
- // Reorder the full options list (which now includes new options) to maintain selection order
1539
- // This will put selected items at top and append new unselected items at bottom
1540
- const reordered = reorderOptionsBySelection(currentOptions, selectedValues);
1215
+ const reordered = (0, _utils.reorderOptionsBySelection)(currentOptions, selectedValues);
1541
1216
  setOrderedOptions(reordered);
1542
- // Update the scroll trigger count for next scroll detection
1543
1217
  scrollTriggerOptionsCountRef.current = currentOptions.length;
1544
1218
  }
1545
1219
  }
1546
- }, [options, orderedOptions, onPopupScroll, tempValue, reorderOptionsBySelection]);
1547
-
1548
- // Update orderedOptions when new options are added via fetchMissingOptions (for paginated API-driven data)
1549
- // This handles the case when user selects items from paginated pages and confirms
1550
- // The fetchMissingOptions callback fetches the missing selected items, and we need to reorder them to top
1551
- // Also handles search cases and upload cases where selected items might not be in current options
1220
+ }, [options, orderedOptions, onPopupScroll, tempValue]);
1552
1221
  (0, _react.useEffect)(() => {
1553
- // Only handle if fetchMissingOptions is provided (indicates API-driven pagination)
1554
1222
  if (!fetchMissingOptions) {
1555
- // Update refs even when fetchMissingOptions is not provided
1556
1223
  prevOptionsCountBeforeFetchMissingRef.current = options.length;
1557
1224
  prevOptionsBeforeFetchMissingRef.current = options;
1558
1225
  return;
1559
1226
  }
1227
+
1228
+ // For API-driven data, don't reorder options during active search
1229
+ // Only reorder when there's no search query or search is cleared
1230
+ const hasActiveSearch = !staticValue && lastSearchQueryRef.current.trim().length > 0;
1231
+ if (hasActiveSearch) {
1232
+ return;
1233
+ }
1560
1234
  const currentOptions = options;
1561
1235
  const currentSelectedValues = Array.isArray(value) ? value : value ? [value] : [];
1562
1236
  const tempSelectedValues = Array.isArray(tempValue) ? tempValue : tempValue ? [tempValue] : [];
1563
- // Use tempValue if available (during selection), otherwise use value (after confirm)
1564
1237
  const selectedValues = tempSelectedValues.length > 0 ? tempSelectedValues : currentSelectedValues;
1565
1238
  if (selectedValues.length === 0) {
1566
- // No selected values, update refs and return
1567
1239
  prevOptionsCountBeforeFetchMissingRef.current = currentOptions.length;
1568
1240
  prevOptionsBeforeFetchMissingRef.current = currentOptions;
1569
1241
  return;
1570
1242
  }
1571
-
1572
- // Check if options changed (count or content) after fetchMissingOptions was called
1573
1243
  const prevOptions = prevOptionsBeforeFetchMissingRef.current;
1574
1244
  const optionsCountIncreased = currentOptions.length > prevOptionsCountBeforeFetchMissingRef.current;
1575
1245
  const optionsChanged = prevOptions !== currentOptions || optionsCountIncreased;
1576
-
1577
- // Check if any previously missing selected values now exist in options
1578
- // This handles both cases: when fetchMissingOptions was called, and when options update for any reason
1579
1246
  const hasNewlyFetchedSelectedItems = (() => {
1580
1247
  if (selectedValues.length === 0 || !optionsChanged) {
1581
1248
  return false;
1582
1249
  }
1583
-
1584
- // Find which selected values were missing in previous options
1585
- const previouslyMissingValues = selectedValues.filter(val => !findValueInOptions(prevOptions, val));
1250
+ const previouslyMissingValues = selectedValues.filter(val => !(0, _utils.findValueInOptions)(prevOptions, val));
1586
1251
  if (previouslyMissingValues.length === 0) {
1587
1252
  return false;
1588
1253
  }
1589
-
1590
- // Check if any of those previously missing values now exist in current options
1591
- const nowPresentValues = previouslyMissingValues.filter(val => findValueInOptions(currentOptions, val));
1254
+ const nowPresentValues = previouslyMissingValues.filter(val => (0, _utils.findValueInOptions)(currentOptions, val));
1592
1255
  return nowPresentValues.length > 0;
1593
1256
  })();
1594
-
1595
- // Update orderedOptions if:
1596
- // 1. Options changed (increased or content changed) AND
1597
- // 2. Previously missing selected items are now present in options
1598
- // This works for both cases: when fetchMissingOptions was explicitly called, and when options update for other reasons
1599
1257
  if (optionsChanged && hasNewlyFetchedSelectedItems) {
1600
- // Reorder the full options list to put selected items at top
1601
- const reordered = reorderOptionsBySelection(currentOptions, selectedValues);
1258
+ const reordered = (0, _utils.reorderOptionsBySelection)(currentOptions, selectedValues);
1602
1259
  setOrderedOptions(reordered);
1603
1260
  }
1604
-
1605
- // Always update the previous options and count for next comparison
1606
- // This ensures we can detect when missing options are added in the future
1607
1261
  prevOptionsCountBeforeFetchMissingRef.current = currentOptions.length;
1608
1262
  prevOptionsBeforeFetchMissingRef.current = currentOptions;
1609
- }, [options, value, tempValue, fetchMissingOptions, reorderOptionsBySelection, findValueInOptions]);
1610
-
1611
- // Sort selected items to top on initial load (only once)
1612
- // This handles the case when user comes from another flow with pre-selected values
1263
+ }, [options, value, tempValue, fetchMissingOptions, staticValue]);
1613
1264
  (0, _react.useEffect)(() => {
1614
- // Only do this once, and only if we have options and selected values
1615
1265
  if (initialSortDoneRef.current || !(options != null && options.length)) {
1616
1266
  return;
1617
1267
  }
1618
-
1619
- // Check if there are selected values
1620
1268
  const selectedValues = Array.isArray(value) ? value : value ? [value] : [];
1621
1269
  if (selectedValues.length === 0) {
1622
- // No selected values, mark as done
1623
1270
  initialSortDoneRef.current = true;
1624
1271
  return;
1625
1272
  }
1626
-
1627
- // Check if any selected values exist in options
1628
1273
  const checkValueExists = (opts, val) => {
1629
1274
  for (const opt of opts) {
1630
1275
  if (opt.value === val) return true;
@@ -1636,40 +1281,27 @@ const CapUnifiedSelect = _ref4 => {
1636
1281
  };
1637
1282
  const hasSelectedInOptions = selectedValues.some(val => checkValueExists(options, val));
1638
1283
  if (hasSelectedInOptions) {
1639
- // Reorder options to move selected items to top
1640
- const reordered = reorderOptionsBySelection(options, selectedValues);
1284
+ const reordered = (0, _utils.reorderOptionsBySelection)(options, selectedValues);
1641
1285
  setOrderedOptions(reordered);
1642
1286
  }
1643
-
1644
- // Mark as done - only sort once on initial load
1645
1287
  initialSortDoneRef.current = true;
1646
- }, [options, value, reorderOptionsBySelection]);
1288
+ }, [options, value]);
1647
1289
  const dataSource = (0, _react.useMemo)(() => {
1648
- // During search, use normal options (mergedOptions) to show filtered results without selected items at top
1649
- // When not searching, use ordered options if available (selected items at top), otherwise use merged options
1650
1290
  const sourceOptions = searchText.trim() ? mergedOptions : orderedOptions || mergedOptions;
1651
-
1652
- // Get current selected values to check for missing ones
1653
- // Use value prop (external state) instead of tempValue (internal state)
1654
- // This ensures we only create virtual options for values that are actually selected
1655
- // and not just temporarily selected during dropdown interaction
1656
1291
  const selectedValues = Array.isArray(value) ? value : value ? [value] : [];
1657
1292
  const hasSearchQuery = searchText.trim().length > 0;
1658
1293
 
1659
- // Find selected values that don't exist in the current options
1660
- // Only include missing values when not searching (so they're always visible)
1661
- // or when searching but they should still be shown
1294
+ // For API-driven data, don't append virtual options during search
1295
+ // Only show search results when searching
1296
+ const shouldAppendVirtualOptions = staticValue || !hasSearchQuery;
1662
1297
  const missingSelectedValues = [];
1663
- if (selectedValues.length > 0) {
1298
+ if (shouldAppendVirtualOptions && selectedValues.length > 0) {
1664
1299
  selectedValues.forEach(val => {
1665
- if (!findValueInOptions(sourceOptions, val)) {
1300
+ if (!(0, _utils.findValueInOptions)(sourceOptions, val)) {
1666
1301
  missingSelectedValues.push(val);
1667
1302
  }
1668
1303
  });
1669
1304
  }
1670
-
1671
- // Create virtual option nodes for missing selected values
1672
- // Use cached option data if available, otherwise create a simple node with value as label
1673
1305
  const virtualOptions = missingSelectedValues.map(val => {
1674
1306
  const cachedOption = selectedItemsCacheRef.current.get(val);
1675
1307
  return _extends({
@@ -1685,10 +1317,6 @@ const CapUnifiedSelect = _ref4 => {
1685
1317
  children: cachedOption.children
1686
1318
  });
1687
1319
  });
1688
-
1689
- // Combine source options with virtual options for missing selected values
1690
- // When not searching, add virtual options at the beginning so selected items appear first
1691
- // When searching, still include them if they match the search (handled by filterTreeData)
1692
1320
  const allOptions = hasSearchQuery ? [...sourceOptions, ...virtualOptions] : [...virtualOptions, ...sourceOptions];
1693
1321
  if (!(allOptions != null && allOptions.length)) return [];
1694
1322
  const enhanceOptions = opts => opts.map(opt => {
@@ -1745,20 +1373,13 @@ const CapUnifiedSelect = _ref4 => {
1745
1373
  }),
1746
1374
  label: opt == null ? void 0 : opt.label
1747
1375
  }));
1748
- }, [isTree, mergedOptions, orderedOptions, searchText, value, findValueInOptions]);
1376
+ }, [isTree, mergedOptions, orderedOptions, searchText, value, staticValue]);
1749
1377
  const filteredTree = (0, _react.useMemo)(() => {
1750
1378
  const selectedValues = Array.isArray(tempValue) ? tempValue : tempValue ? [tempValue] : [];
1751
-
1752
- // If staticValue is true, use local filtering on existing options
1753
- // If staticValue is false, still use local filtering for immediate feedback,
1754
- // but onSearch callback will be triggered for parent to update options
1755
- // Always include selectedValues to ensure uploaded/selected items are visible
1756
- // This ensures that when dev uploads values, they remain visible in the dropdown
1757
- // even if they're not in the options array yet
1758
- return filterTreeData(dataSource, searchText.trim(), searchBasedOn, selectedValues.length > 0 ? selectedValues : undefined);
1379
+ return (0, _utils.filterTreeData)(dataSource, searchText.trim(), searchBasedOn, selectedValues.length > 0 ? selectedValues : undefined);
1759
1380
  }, [dataSource, searchText, searchBasedOn, tempValue]);
1760
- const treeMaps = (0, _react.useMemo)(() => buildTreeMaps(options), [options]);
1761
- const selectedLeafCount = (0, _react.useMemo)(() => countSelectedLeaves(treeMaps, Array.isArray(tempValue) ? tempValue : undefined), [treeMaps, tempValue]);
1381
+ const treeMaps = (0, _react.useMemo)(() => (0, _utils.buildTreeMaps)(options), [options]);
1382
+ const selectedLeafCount = (0, _react.useMemo)(() => (0, _utils.countSelectedLeaves)(treeMaps, Array.isArray(tempValue) ? tempValue : undefined), [treeMaps, tempValue]);
1762
1383
  const displayValue = dropdownOpen ? tempValue : value;
1763
1384
  const suffix = (0, _react.useMemo)(() => {
1764
1385
  const count = Array.isArray(displayValue) ? displayValue == null ? void 0 : displayValue.length : displayValue ? 1 : 0;
@@ -1793,27 +1414,22 @@ const CapUnifiedSelect = _ref4 => {
1793
1414
  if (isMulti && Array.isArray(displayValue) && (displayValue == null ? void 0 : displayValue.length) > 0) {
1794
1415
  var _treeMaps$nodeMap;
1795
1416
  const firstLeafValue = displayValue.find(val => {
1796
- var _treeMaps$leafValues2;
1797
- return treeMaps == null || (_treeMaps$leafValues2 = treeMaps.leafValues) == null ? void 0 : _treeMaps$leafValues2.includes(val);
1417
+ var _treeMaps$leafValues;
1418
+ return treeMaps == null || (_treeMaps$leafValues = treeMaps.leafValues) == null ? void 0 : _treeMaps$leafValues.includes(val);
1798
1419
  });
1799
1420
  return firstLeafValue ? (treeMaps == null || (_treeMaps$nodeMap = treeMaps.nodeMap) == null || (_treeMaps$nodeMap = _treeMaps$nodeMap[firstLeafValue]) == null ? void 0 : _treeMaps$nodeMap.label) || null : null;
1800
1421
  }
1801
1422
  return null;
1802
1423
  }, [isMulti, displayValue, treeMaps]);
1803
1424
  const handleConfirm = (0, _react.useCallback)(() => {
1804
- // Mark as interacted since user clicked confirm (explicit action)
1805
1425
  hasInteractedRef.current = true;
1806
-
1807
- // Reorder options based on selection order when confirm is clicked
1808
- // Use mergedOptions to include paginated options if they exist
1809
1426
  const optionsToReorder = mergedOptions;
1810
1427
  if (isMulti && Array.isArray(tempValue) && tempValue.length > 0) {
1811
- // Reorder the options (includes paginated if they exist)
1812
- const reordered = reorderOptionsBySelection(optionsToReorder, tempValue);
1428
+ const reordered = (0, _utils.reorderOptionsBySelection)(optionsToReorder, tempValue);
1813
1429
  setOrderedOptions(reordered);
1814
1430
  } else if (!isMulti && tempValue && !Array.isArray(tempValue)) {
1815
1431
  // For single select, move selected item to top
1816
- const reordered = reorderOptionsBySelection(optionsToReorder, [tempValue]);
1432
+ const reordered = (0, _utils.reorderOptionsBySelection)(optionsToReorder, [tempValue]);
1817
1433
  setOrderedOptions(reordered);
1818
1434
  } else {
1819
1435
  // No selection, reset to original order
@@ -1821,18 +1437,13 @@ const CapUnifiedSelect = _ref4 => {
1821
1437
  }
1822
1438
  onChange == null || onChange(tempValue);
1823
1439
  setDropdownOpen(false);
1824
- // Always clear searching state since search operation is complete
1825
1440
  setIsSearching(false);
1826
- searchClearedTimeRef.current = null; // Clear search cleared timestamp
1827
- // Clear search text on confirm only if resetSearch is true
1828
- // This allows users to keep their search when reopening the dropdown if desired
1441
+ searchClearedTimeRef.current = null;
1829
1442
  if (resetSearch) {
1830
1443
  setSearchText('');
1831
- lastSearchQueryRef.current = ''; // Clear search query ref
1444
+ lastSearchQueryRef.current = '';
1832
1445
  }
1833
- // Call resetData to allow developer to reload initial data
1834
- if (resetData) {
1835
- // Store current options before calling resetData to detect when they update
1446
+ if (resetData && mergedOptions.length > 0) {
1836
1447
  prevOptionsBeforeResetRef.current = mergedOptions;
1837
1448
  setIsResettingData(true);
1838
1449
  resetDataCalledRef.current = true;
@@ -1840,17 +1451,14 @@ const CapUnifiedSelect = _ref4 => {
1840
1451
  resetData();
1841
1452
  }
1842
1453
  onConfirm == null || onConfirm(tempValue);
1843
- }, [onChange, onConfirm, tempValue, resetSearch, isMulti, mergedOptions, reorderOptionsBySelection, resetData]);
1454
+ }, [onChange, onConfirm, tempValue, resetSearch, isMulti, mergedOptions, resetData]);
1844
1455
  const handleClearAll = (0, _react.useCallback)(() => {
1845
- // Mark as interacted since user clicked clear (explicit action)
1846
1456
  hasInteractedRef.current = true;
1847
1457
  const cleared = isMulti ? [] : undefined;
1848
1458
  setTempValue(cleared);
1849
1459
  onChange == null || onChange(cleared);
1850
1460
  setDropdownOpen(false);
1851
- // Call resetData to allow developer to reload initial data
1852
- if (resetData) {
1853
- // Store current options before calling resetData to detect when they update
1461
+ if (resetData && options.length > 0) {
1854
1462
  prevOptionsBeforeResetRef.current = options;
1855
1463
  setIsResettingData(true);
1856
1464
  resetDataCalledRef.current = true;
@@ -1859,25 +1467,19 @@ const CapUnifiedSelect = _ref4 => {
1859
1467
  }
1860
1468
  }, [isMulti, onChange, resetData, options]);
1861
1469
  const handleDropdownVisibilityChange = (0, _react.useCallback)(open => {
1862
- if (readOnly) {
1470
+ if (readOnly || disabled) {
1863
1471
  return;
1864
1472
  }
1865
1473
  if (open) {
1866
- // Reset interaction tracking when dropdown opens
1867
- // Store initial value (not tempValue) to detect if user makes changes
1868
- // This ensures we track changes from the actual selected value, not temporary state
1869
1474
  initialTempValueRef.current = value;
1870
1475
  hasInteractedRef.current = false;
1871
1476
  resetDataCalledRef.current = false;
1872
- // Reset fetchMissingOptions tracking to allow re-checking when dropdown opens
1873
1477
  fetchMissingOptionsCalledRef.current = false;
1874
1478
  lastMissingValuesRef.current = '';
1875
- // Clear any pending search timeouts
1876
1479
  if (searchTimeoutRef.current) {
1877
1480
  clearTimeout(searchTimeoutRef.current);
1878
1481
  searchTimeoutRef.current = null;
1879
1482
  }
1880
- // Clear any pending scroll loading timeouts
1881
1483
  if (scrollLoadingTimeoutRef.current) {
1882
1484
  clearTimeout(scrollLoadingTimeoutRef.current);
1883
1485
  scrollLoadingTimeoutRef.current = null;
@@ -1886,35 +1488,27 @@ const CapUnifiedSelect = _ref4 => {
1886
1488
  clearTimeout(scrollThrottleTimeoutRef.current);
1887
1489
  scrollThrottleTimeoutRef.current = null;
1888
1490
  }
1889
- // Reset loading states
1890
1491
  setIsSearching(false);
1891
- searchClearedTimeRef.current = null; // Clear search cleared timestamp
1492
+ searchClearedTimeRef.current = null;
1892
1493
  setIsLoadingOnScroll(false);
1893
1494
  isScrollProcessingRef.current = false;
1894
- // Safety check: Clear isResettingData if it's still true when opening
1895
- // This handles cases where options updated while dropdown was closed
1896
1495
  if (isResettingData) {
1897
1496
  setIsResettingData(false);
1898
- // Update ref to current options to prevent false positives
1899
1497
  prevOptionsBeforeResetRef.current = options;
1900
- // Clear timestamp
1901
1498
  resetDataCalledTimeRef.current = null;
1902
1499
  }
1903
1500
  } else {
1904
- // Dropdown is closing
1905
1501
  if (!customPopupRender) {
1906
1502
  onChange == null || onChange(tempValue);
1907
1503
  } else {
1908
1504
  setTempValue(value);
1909
1505
  }
1910
- // Clear search when closing (if enabled)
1911
1506
  if (resetSearch) {
1912
1507
  setSearchText('');
1913
1508
  setIsSearching(false);
1914
- lastSearchQueryRef.current = ''; // Clear search query ref
1915
- searchClearedTimeRef.current = null; // Clear search cleared timestamp
1509
+ lastSearchQueryRef.current = '';
1510
+ searchClearedTimeRef.current = null;
1916
1511
  }
1917
- // Reset scroll loading state
1918
1512
  setIsLoadingOnScroll(false);
1919
1513
  isScrollProcessingRef.current = false;
1920
1514
  if (scrollLoadingTimeoutRef.current) {
@@ -1926,35 +1520,25 @@ const CapUnifiedSelect = _ref4 => {
1926
1520
  scrollThrottleTimeoutRef.current = null;
1927
1521
  }
1928
1522
  scrollContainerRef.current = null;
1929
-
1930
- // Only call resetData if user actually interacted (selected, searched, etc.)
1931
- // and resetData hasn't been called already in this session
1932
- // This prevents multiple API calls when user just opens/closes without interaction
1933
- if (resetData && hasInteractedRef.current && !resetDataCalledRef.current) {
1934
- // Store current options before calling resetData to detect when they update
1523
+ if (resetData && hasInteractedRef.current && !resetDataCalledRef.current && options.length > 0) {
1935
1524
  prevOptionsBeforeResetRef.current = options;
1936
1525
  setIsResettingData(true);
1937
1526
  resetDataCalledRef.current = true;
1938
1527
  resetDataCalledTimeRef.current = Date.now();
1939
1528
  resetData();
1940
1529
  } else if (!hasInteractedRef.current) {
1941
- // User did nothing - reset everything as if it's a fresh load
1942
- // Clear any pending operations
1943
1530
  if (searchTimeoutRef.current) {
1944
1531
  clearTimeout(searchTimeoutRef.current);
1945
1532
  searchTimeoutRef.current = null;
1946
1533
  }
1947
1534
  setIsSearching(false);
1948
1535
  setIsResettingData(false);
1949
- // Reset search query ref
1950
1536
  lastSearchQueryRef.current = '';
1951
1537
  }
1952
-
1953
- // Reset interaction flag for next session
1954
1538
  hasInteractedRef.current = false;
1955
1539
  }
1956
1540
  setDropdownOpen(open);
1957
- }, [customPopupRender, value, onChange, tempValue, readOnly, resetSearch, resetData, options, isResettingData]);
1541
+ }, [customPopupRender, value, onChange, tempValue, readOnly, disabled, resetSearch, resetData, options, isResettingData]);
1958
1542
  const handleFooterDownload = (0, _react.useCallback)(() => {
1959
1543
  const currentValues = Array.isArray(tempValue) ? tempValue : tempValue ? [tempValue] : [];
1960
1544
  onFooterDownloadChange == null || onFooterDownloadChange(currentValues);
@@ -1966,151 +1550,80 @@ const CapUnifiedSelect = _ref4 => {
1966
1550
  const handleSearchChange = (0, _react.useCallback)(e => {
1967
1551
  const query = e.target.value;
1968
1552
  setSearchText(query);
1969
-
1970
- // Trigger search handler (handles debouncing and minLength check)
1971
1553
  handleSearch(query);
1972
1554
  }, [handleSearch]);
1973
1555
  const handleSearchKeyDown = (0, _react.useCallback)(e => {
1974
- // Stop propagation of backspace and delete keys to prevent TreeSelect from deselecting items
1975
- // The input itself will handle the deletion, we just need to prevent TreeSelect from handling it
1976
1556
  if (e.key === 'Backspace' || e.key === 'Delete') {
1977
1557
  e.stopPropagation();
1978
1558
  }
1979
- // Also stop Escape key to prevent dropdown from closing when clearing search
1980
1559
  if (e.key === 'Escape' && searchText.length > 0) {
1981
1560
  e.stopPropagation();
1982
1561
  }
1983
1562
  }, [searchText]);
1984
-
1985
- // Handle scroll event - automatically checks if scroll is near bottom
1986
- // Developer handles hasMore and isLoading conditions in onPopupScroll callback
1987
- // Using refs to avoid recreating the callback when options change
1988
1563
  const handleScroll = (0, _react.useCallback)(event => {
1989
1564
  if (!onPopupScroll) return;
1990
1565
  const target = event.target;
1991
1566
  if (!target) return;
1992
-
1993
- // Check if scroll is near bottom
1994
1567
  const isNearBottom = Math.floor(target.scrollHeight - target.scrollTop) <= target.clientHeight;
1995
-
1996
- // Only call onPopupScroll if scroll is near bottom
1997
- // Developer will handle hasMore and isLoading checks inside the callback
1998
1568
  if (!isNearBottom) {
1999
- // Reset processing flag when not near bottom
2000
1569
  isScrollProcessingRef.current = false;
2001
1570
  return;
2002
1571
  }
2003
-
2004
- // Prevent multiple scroll triggers while already processing
2005
- // This ensures we don't trigger multiple API calls simultaneously
2006
1572
  if (isScrollProcessingRef.current) return;
2007
-
2008
- // Prevent multiple scroll triggers while already loading
2009
- // This ensures loading state is managed properly and data loading completes
2010
1573
  if (isLoadingOnScroll) return;
2011
-
2012
- // Don't trigger if there are no more items to load
2013
- // This prevents showing loading state when all items are exhausted
2014
1574
  if (!hasMore) {
2015
1575
  isScrollProcessingRef.current = false;
2016
1576
  return;
2017
1577
  }
2018
-
2019
- // Throttle scroll events to prevent rapid-fire API calls
2020
- // Clear any existing throttle timeout
2021
1578
  if (scrollThrottleTimeoutRef.current) {
2022
1579
  clearTimeout(scrollThrottleTimeoutRef.current);
2023
1580
  }
2024
-
2025
- // Set processing flag immediately to prevent duplicate calls
2026
1581
  isScrollProcessingRef.current = true;
2027
-
2028
- // Throttle the actual API call to prevent multiple rapid triggers
2029
1582
  scrollThrottleTimeoutRef.current = setTimeout(() => {
2030
- // Double-check we're still near bottom and not loading
2031
1583
  const stillNearBottom = Math.floor(target.scrollHeight - target.scrollTop) <= target.clientHeight;
2032
- // Also check if hasMore is still true (might have changed during throttle delay)
2033
1584
  if (!stillNearBottom || isLoadingOnScroll || !hasMore) {
2034
1585
  isScrollProcessingRef.current = false;
2035
1586
  return;
2036
1587
  }
2037
-
2038
- // Store current options count and options reference before triggering load
2039
- // This helps detect when new data arrives
2040
- // Use ref to get current options without depending on options.length
2041
1588
  const currentOptions = optionsRef.current;
2042
1589
  prevOptionsCountRef.current = currentOptions.length;
2043
1590
  prevOptionsRefForScroll.current = currentOptions;
2044
- // Also store the count at scroll trigger time for orderedOptions update
2045
1591
  scrollTriggerOptionsCountRef.current = currentOptions.length;
2046
-
2047
- // Show loading indicator when scrolling near bottom
2048
- // This happens before calling onPopupScroll to provide immediate feedback
2049
1592
  setIsLoadingOnScroll(true);
2050
-
2051
- // Clear any existing timeout
2052
1593
  if (scrollLoadingTimeoutRef.current) {
2053
1594
  clearTimeout(scrollLoadingTimeoutRef.current);
2054
1595
  scrollLoadingTimeoutRef.current = null;
2055
1596
  }
2056
-
2057
- // Mark as interacted when user scrolls (triggers data loading)
2058
1597
  hasInteractedRef.current = true;
2059
-
2060
- // Call the developer's scroll handler - component already checked scroll position
2061
- // Developer should check hasMore and isLoading inside the callback
2062
- // This triggers the async data loading
2063
1598
  onPopupScroll();
2064
-
2065
- // Set a fallback timeout to clear loading if options don't change
2066
- // This prevents loading from staying forever if data never arrives
2067
- // Using a longer timeout (10 seconds) to give enough time for slow API calls
2068
1599
  scrollLoadingTimeoutRef.current = setTimeout(() => {
2069
- // Only clear if still loading (options change detection might have cleared it already)
2070
1600
  setIsLoadingOnScroll(prev => {
2071
1601
  if (prev) {
2072
- // Clear the timeout reference when clearing loading state
2073
1602
  scrollLoadingTimeoutRef.current = null;
2074
- // Reset processing flag when loading times out
2075
1603
  isScrollProcessingRef.current = false;
2076
1604
  return false;
2077
1605
  }
2078
1606
  return prev;
2079
1607
  });
2080
1608
  }, _constants.TIMEOUTS.SCROLL_LOADING_TIMEOUT);
2081
- }, 150); // 150ms throttle to prevent rapid-fire events
1609
+ }, 150);
2082
1610
  }, [onPopupScroll, isLoadingOnScroll, hasMore]);
2083
-
2084
- // Setup scroll listener for onPopupScroll
2085
1611
  (0, _react.useEffect)(() => {
2086
1612
  if (!onPopupScroll || !dropdownOpen) return;
2087
-
2088
- // Use a small delay to ensure DOM is ready
2089
1613
  const timeoutId = setTimeout(() => {
2090
- // Find the scrollable container in the dropdown
2091
1614
  const findScrollContainer = () => {
2092
- // Try to find the Ant Design dropdown scroll container
2093
- // Look for dropdowns that are currently visible (not hidden)
2094
1615
  const dropdowns = document.querySelectorAll('.ant-select-dropdown:not(.ant-select-dropdown-hidden)');
2095
1616
  if (dropdowns.length === 0) return null;
2096
-
2097
- // Get the last opened dropdown (most recent)
2098
1617
  const dropdown = Array.from(dropdowns).pop();
2099
1618
  if (!dropdown) return null;
2100
-
2101
- // Look for the scrollable list container
2102
1619
  const treeList = dropdown.querySelector('.ant-select-tree-list-holder');
2103
1620
  if (treeList && treeList.scrollHeight > treeList.clientHeight) {
2104
1621
  return treeList;
2105
1622
  }
2106
-
2107
- // Try alternative selectors
2108
1623
  const virtualList = dropdown.querySelector('.rc-virtual-list-holder');
2109
1624
  if (virtualList && virtualList.scrollHeight > virtualList.clientHeight) {
2110
1625
  return virtualList;
2111
1626
  }
2112
-
2113
- // Fallback to dropdown itself if it's scrollable
2114
1627
  if (dropdown.scrollHeight > dropdown.clientHeight) {
2115
1628
  return dropdown;
2116
1629
  }
@@ -2126,7 +1639,6 @@ const CapUnifiedSelect = _ref4 => {
2126
1639
  }, _constants.TIMEOUTS.SCROLL_CONTAINER_DELAY);
2127
1640
  return () => {
2128
1641
  clearTimeout(timeoutId);
2129
- // Clear throttle timeout when cleaning up
2130
1642
  if (scrollThrottleTimeoutRef.current) {
2131
1643
  clearTimeout(scrollThrottleTimeoutRef.current);
2132
1644
  scrollThrottleTimeoutRef.current = null;
@@ -2135,7 +1647,6 @@ const CapUnifiedSelect = _ref4 => {
2135
1647
  scrollContainerRef.current.removeEventListener('scroll', handleScroll);
2136
1648
  scrollContainerRef.current = null;
2137
1649
  }
2138
- // Reset processing flag when listener is removed
2139
1650
  isScrollProcessingRef.current = false;
2140
1651
  };
2141
1652
  }, [onPopupScroll, dropdownOpen, handleScroll]);
@@ -2183,9 +1694,10 @@ const CapUnifiedSelect = _ref4 => {
2183
1694
  value: searchText,
2184
1695
  onChange: handleSearchChange,
2185
1696
  onKeyDown: handleSearchKeyDown,
2186
- allowClear: true
1697
+ allowClear: true,
1698
+ disabled: disabled
2187
1699
  })
2188
- }), isMulti && showUpload && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CapRow.default, {
1700
+ }), isMulti && showUpload && !disabled && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CapRow.default, {
2189
1701
  className: _styles.default['cap-unified-select-upload-container'],
2190
1702
  align: "middle",
2191
1703
  onClick: handleUpload,
@@ -2198,11 +1710,12 @@ const CapUnifiedSelect = _ref4 => {
2198
1710
  className: _styles.default['cap-unified-select-upload-label'],
2199
1711
  children: uploadLabel
2200
1712
  })]
2201
- }), isMulti && staticValue && currentItems.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(SelectAllCheckbox, {
1713
+ }), isMulti && staticValue && currentItems.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.SelectAllCheckbox, {
2202
1714
  currentItems: currentItems,
2203
1715
  tempValue: Array.isArray(tempValue) ? tempValue : undefined,
2204
1716
  setTempValue: val => setTempValue(val),
2205
- processTreeData: buildTreeMaps
1717
+ processTreeData: _utils.buildTreeMaps,
1718
+ disabled: disabled
2206
1719
  }), currentItems.length === 0 ? isSearching || isResettingData ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
2207
1720
  className: _styles.default['cap-unified-select-loading-container'],
2208
1721
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_CapRow.default, {
@@ -2219,7 +1732,7 @@ const CapUnifiedSelect = _ref4 => {
2219
1732
  children: "Loading..."
2220
1733
  })
2221
1734
  })]
2222
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(NoResult, {
1735
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.NoResult, {
2223
1736
  noResultCustomText: noResultCustomText,
2224
1737
  className: className,
2225
1738
  showUpload: showUpload,
@@ -2269,15 +1782,16 @@ const CapUnifiedSelect = _ref4 => {
2269
1782
  size: "small",
2270
1783
  className: _styles.default['cap-unified-select-confirm-button'],
2271
1784
  onClick: handleConfirm,
2272
- disabled: selectedLeafCount === 0,
1785
+ disabled: disabled || selectedLeafCount === 0,
2273
1786
  children: "Confirm"
2274
1787
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_antdV.Button, {
2275
1788
  type: "text",
2276
1789
  className: _styles.default['cap-unified-select-cancel-button'],
2277
1790
  size: "small",
2278
1791
  onClick: handleClearAll,
1792
+ disabled: disabled,
2279
1793
  children: clearText
2280
- }), onFooterDownloadChange && selectedLeafCount > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CapRow.default, {
1794
+ }), onFooterDownloadChange && selectedLeafCount > 0 && !disabled && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CapRow.default, {
2281
1795
  className: _styles.default['cap-unified-select-footer-download-container'],
2282
1796
  align: "middle",
2283
1797
  onClick: handleFooterDownload,
@@ -2291,7 +1805,7 @@ const CapUnifiedSelect = _ref4 => {
2291
1805
  })]
2292
1806
  })]
2293
1807
  })
2294
- }), (type === _constants.SELECT_TYPES.SELECT || type === _constants.SELECT_TYPES.TREE_SELECT) && allowClear && /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapRow.default, {
1808
+ }), (type === _constants.SELECT_TYPES.SELECT || type === _constants.SELECT_TYPES.TREE_SELECT) && allowClear && !disabled && /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapRow.default, {
2295
1809
  className: _styles.default['cap-unified-select-tree-clear-container'],
2296
1810
  onClick: handleClearAll,
2297
1811
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CapLabel.default, {
@@ -2300,22 +1814,19 @@ const CapUnifiedSelect = _ref4 => {
2300
1814
  })
2301
1815
  })]
2302
1816
  });
2303
- }, [customPopupRender, filteredTree, searchText, isMulti, showUpload, uploadLabel, handleUpload, noResultCustomText, noResultCustomIcon, options, type, tempValue, handleConfirm, handleClearAll, popoverClassName, className, selectedLeafCount, clearText, allowClear, staticValue, showSearch, onFooterDownloadChange, handleFooterDownload, isSearching, handleSearchChange, handleSearchKeyDown, isLoadingOnScroll, onPopupScroll, hasMore, isResettingData]);
1817
+ }, [customPopupRender, filteredTree, searchText, isMulti, showUpload, uploadLabel, handleUpload, noResultCustomText, noResultCustomIcon, options, type, tempValue, handleConfirm, handleClearAll, popoverClassName, className, selectedLeafCount, clearText, allowClear, staticValue, showSearch, onFooterDownloadChange, handleFooterDownload, isSearching, handleSearchChange, handleSearchKeyDown, isLoadingOnScroll, onPopupScroll, hasMore, isResettingData, disabled]);
2304
1818
  const combinedClassName = (0, _react.useMemo)(() => (0, _classnames.default)(containerClassName, _styles.default['cap-unified-tree-select'], {
2305
1819
  [_styles.default['cap-unified-tree-select-readonly']]: readOnly
2306
1820
  }, className), [containerClassName, className, readOnly]);
2307
-
2308
- // Handle onChange for single select - detect clear button click and call resetData
2309
1821
  const handleSingleSelectChange = (0, _react.useCallback)(newValue => {
2310
- // Mark as interacted if value changed from initial
1822
+ if (disabled) {
1823
+ return;
1824
+ }
2311
1825
  if (newValue !== initialTempValueRef.current) {
2312
1826
  hasInteractedRef.current = true;
2313
1827
  }
2314
-
2315
- // If value is cleared (becomes undefined), call resetData
2316
1828
  if (newValue === undefined || newValue === null) {
2317
- if (resetData) {
2318
- // Store current options before calling resetData to detect when they update
1829
+ if (resetData && options.length > 0) {
2319
1830
  prevOptionsBeforeResetRef.current = options;
2320
1831
  setIsResettingData(true);
2321
1832
  resetDataCalledRef.current = true;
@@ -2324,20 +1835,18 @@ const CapUnifiedSelect = _ref4 => {
2324
1835
  }
2325
1836
  }
2326
1837
  onChange == null || onChange(newValue);
2327
- }, [onChange, resetData, options]);
2328
-
2329
- // Handle onChange for multi select - detect clear and call resetData
1838
+ }, [onChange, resetData, options, disabled]);
2330
1839
  const handleMultiSelectChange = (0, _react.useCallback)(newValue => {
2331
- // Mark as interacted if value changed from initial
1840
+ if (disabled) {
1841
+ return;
1842
+ }
2332
1843
  const initialValue = initialTempValueRef.current;
2333
1844
  const hasChanged = Array.isArray(newValue) && Array.isArray(initialValue) ? newValue.length !== initialValue.length || !newValue.every(v => initialValue.includes(v)) || !initialValue.every(v => newValue.includes(v)) : newValue !== initialValue;
2334
1845
  if (hasChanged) {
2335
1846
  hasInteractedRef.current = true;
2336
1847
  }
2337
- // If value is cleared (becomes empty array or undefined), call resetData
2338
1848
  if (newValue === undefined || newValue === null || Array.isArray(newValue) && newValue.length === 0) {
2339
- if (resetData) {
2340
- // Store current options before calling resetData to detect when they update
1849
+ if (resetData && options.length > 0) {
2341
1850
  prevOptionsBeforeResetRef.current = options;
2342
1851
  setIsResettingData(true);
2343
1852
  resetDataCalledRef.current = true;
@@ -2346,7 +1855,7 @@ const CapUnifiedSelect = _ref4 => {
2346
1855
  }
2347
1856
  }
2348
1857
  setTempValue(newValue);
2349
- }, [resetData, options]);
1858
+ }, [resetData, options, disabled]);
2350
1859
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_CapRow.default, {
2351
1860
  className: className,
2352
1861
  children: [renderHeader, /*#__PURE__*/(0, _jsxRuntime.jsx)(_antdV.TreeSelect, _extends({
@@ -3103,6 +2612,233 @@ module.exports = insertBySelector;
3103
2612
 
3104
2613
  /***/ }),
3105
2614
 
2615
+ /***/ 8052:
2616
+ /***/ ((__unused_webpack_module, exports) => {
2617
+
2618
+ "use strict";
2619
+
2620
+
2621
+ exports.__esModule = true;
2622
+ exports.reorderOptionsBySelection = exports.findValueInOptions = exports.findMissingValues = exports.filterTreeData = exports.countSelectedLeaves = exports.buildTreeMaps = void 0;
2623
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2624
+ /**
2625
+ * Builds tree maps for efficient tree operations
2626
+ * Creates maps for leaf values, parent-child relationships, and node lookups
2627
+ */
2628
+ const buildTreeMaps = nodes => {
2629
+ const result = {
2630
+ leafValues: [],
2631
+ parentChildMap: {},
2632
+ nodeMap: {}
2633
+ };
2634
+ if (!nodes) return result;
2635
+ const traverse = items => {
2636
+ items == null || items.forEach(item => {
2637
+ if (item.value !== undefined) {
2638
+ result.nodeMap[item.value] = item;
2639
+ if (item != null && item.children && item.children.length > 0) {
2640
+ result.parentChildMap[item.value] = item.children.map(child => child == null ? void 0 : child.value).filter(v => v !== undefined);
2641
+ traverse(item.children);
2642
+ } else {
2643
+ result.leafValues.push(item.value);
2644
+ }
2645
+ }
2646
+ });
2647
+ };
2648
+ traverse(nodes);
2649
+ return result;
2650
+ };
2651
+
2652
+ /**
2653
+ * Counts the number of selected leaf nodes in a tree structure
2654
+ * Handles parent-child relationships by expanding selected parent nodes
2655
+ */
2656
+ exports.buildTreeMaps = buildTreeMaps;
2657
+ const countSelectedLeaves = (treeMaps, selectedValues) => {
2658
+ var _treeMaps$leafValues;
2659
+ if (!Array.isArray(selectedValues) || !(selectedValues != null && selectedValues.length)) return 0;
2660
+ const expandedSet = new Set(selectedValues);
2661
+ const processNode = value => {
2662
+ var _treeMaps$parentChild;
2663
+ const children = treeMaps == null || (_treeMaps$parentChild = treeMaps.parentChildMap) == null ? void 0 : _treeMaps$parentChild[value];
2664
+ if (!children) return;
2665
+ children == null || children.forEach(childValue => {
2666
+ expandedSet.add(childValue);
2667
+ processNode(childValue);
2668
+ });
2669
+ };
2670
+ selectedValues == null || selectedValues.forEach(processNode);
2671
+ return (treeMaps == null || (_treeMaps$leafValues = treeMaps.leafValues) == null ? void 0 : _treeMaps$leafValues.reduce((count, leaf) => expandedSet.has(leaf) ? count + 1 : count, 0)) || 0;
2672
+ };
2673
+
2674
+ /**
2675
+ * Filters tree data based on search query
2676
+ * Includes nodes that match search OR are selected OR have matching children
2677
+ * Supports searching by label, value, or key
2678
+ */
2679
+ exports.countSelectedLeaves = countSelectedLeaves;
2680
+ const filterTreeData = function (data, search, searchBasedOn, selectedValues) {
2681
+ if (searchBasedOn === void 0) {
2682
+ searchBasedOn = 'label';
2683
+ }
2684
+ if (!(data != null && data.length) || !search) return data;
2685
+ const searchLower = search.toLowerCase();
2686
+ const selectedSet = new Set(selectedValues || []);
2687
+ const nodeMatchesSearch = node => {
2688
+ var _node$value, _node$key, _ref, _node$label;
2689
+ const target = searchBasedOn === 'value' ? String((_node$value = node == null ? void 0 : node.value) != null ? _node$value : '') : searchBasedOn === 'key' ? String((_node$key = node == null ? void 0 : node.key) != null ? _node$key : '') : String((_ref = (_node$label = node == null ? void 0 : node.label) != null ? _node$label : node == null ? void 0 : node.title) != null ? _ref : '');
2690
+ return target.toLowerCase().includes(searchLower);
2691
+ };
2692
+ const isNodeSelected = node => {
2693
+ return node.value !== undefined && selectedSet.has(node.value);
2694
+ };
2695
+ const loop = items => items.reduce((acc, item) => {
2696
+ var _item$children;
2697
+ if (!item) return acc;
2698
+ const children = item != null && (_item$children = item.children) != null && _item$children.length ? loop(item.children) : [];
2699
+ // Include node if: matches search OR is selected OR has matching children
2700
+ if (nodeMatchesSearch(item) || isNodeSelected(item) || children.length) {
2701
+ acc.push(_extends({}, item, {
2702
+ children
2703
+ }));
2704
+ }
2705
+ return acc;
2706
+ }, []);
2707
+ return loop(data);
2708
+ };
2709
+
2710
+ /**
2711
+ * Checks if a value exists in options (recursive for tree structures)
2712
+ */
2713
+ exports.filterTreeData = filterTreeData;
2714
+ const findValueInOptions = (opts, targetValue) => {
2715
+ for (const opt of opts) {
2716
+ if (opt.value === targetValue) {
2717
+ return true;
2718
+ }
2719
+ if (opt.children && opt.children.length > 0) {
2720
+ if (findValueInOptions(opt.children, targetValue)) {
2721
+ return true;
2722
+ }
2723
+ }
2724
+ }
2725
+ return false;
2726
+ };
2727
+
2728
+ /**
2729
+ * Finds selected values that don't exist in the current options
2730
+ */
2731
+ exports.findValueInOptions = findValueInOptions;
2732
+ const findMissingValues = (selectedValues, currentOptions) => {
2733
+ if (!selectedValues.length || !currentOptions.length) {
2734
+ return selectedValues;
2735
+ }
2736
+ return selectedValues.filter(val => !findValueInOptions(currentOptions, val));
2737
+ };
2738
+
2739
+ /**
2740
+ * Reorders options based on selection order
2741
+ * Selected items are moved to top in the order they were selected
2742
+ * For tree structures, maintains parent-child relationships
2743
+ * For flat lists, directly reorders items
2744
+ * Works for all data types: flat lists, tree structures, nested trees
2745
+ */
2746
+ exports.findMissingValues = findMissingValues;
2747
+ const reorderOptionsBySelection = (opts, selectedOrder) => {
2748
+ if (!Array.isArray(selectedOrder) || selectedOrder.length === 0 || !(opts != null && opts.length)) {
2749
+ return opts;
2750
+ }
2751
+ const selectedSet = new Set(selectedOrder);
2752
+ const selectedItems = [];
2753
+ const unselectedItems = [];
2754
+ const processedTopLevelValues = new Set();
2755
+
2756
+ // Deep clone helper to avoid mutating original items
2757
+ const deepCloneItem = item => {
2758
+ return _extends({}, item, {
2759
+ children: item.children ? item.children.map(deepCloneItem) : undefined
2760
+ });
2761
+ };
2762
+
2763
+ // Find the top-level item that contains the selected value
2764
+ // For flat lists, returns the item itself
2765
+ // For tree structures, returns the top-level parent from opts
2766
+ const findTopLevelItem = targetValue => {
2767
+ // First, find which top-level item in opts contains this value
2768
+ for (const topLevelItem of opts) {
2769
+ // Check if this top-level item itself matches
2770
+ if (topLevelItem.value === targetValue) {
2771
+ return topLevelItem;
2772
+ }
2773
+
2774
+ // Recursively search in children
2775
+ const searchInChildren = items => {
2776
+ for (const item of items) {
2777
+ if (item.value === targetValue) {
2778
+ return true; // Found it
2779
+ }
2780
+ if (item.children && item.children.length > 0) {
2781
+ if (searchInChildren(item.children)) {
2782
+ return true;
2783
+ }
2784
+ }
2785
+ }
2786
+ return false;
2787
+ };
2788
+
2789
+ // If found in this top-level item's children, return the top-level item
2790
+ if (topLevelItem.children && topLevelItem.children.length > 0) {
2791
+ if (searchInChildren(topLevelItem.children)) {
2792
+ return topLevelItem;
2793
+ }
2794
+ }
2795
+ }
2796
+ return null;
2797
+ };
2798
+
2799
+ // Check if an item or any of its descendants is selected
2800
+ const hasSelectedDescendant = item => {
2801
+ if (item.value !== undefined && selectedSet.has(item.value)) {
2802
+ return true;
2803
+ }
2804
+ if (item.children && item.children.length > 0) {
2805
+ return item.children.some(child => hasSelectedDescendant(child));
2806
+ }
2807
+ return false;
2808
+ };
2809
+
2810
+ // Collect selected items in selection order
2811
+ selectedOrder.forEach(selectedVal => {
2812
+ const topLevelItem = findTopLevelItem(selectedVal);
2813
+ if (topLevelItem && topLevelItem.value !== undefined && !processedTopLevelValues.has(topLevelItem.value)) {
2814
+ // Clone the item to avoid mutating the original
2815
+ const clonedItem = deepCloneItem(topLevelItem);
2816
+ selectedItems.push(clonedItem);
2817
+ processedTopLevelValues.add(topLevelItem.value);
2818
+ }
2819
+ });
2820
+
2821
+ // Collect unselected items maintaining original order
2822
+ // For tree structures, only include top-level items that don't have any selected descendants
2823
+ opts.forEach(item => {
2824
+ if (item.value === undefined) {
2825
+ // Item without value, include as-is
2826
+ unselectedItems.push(deepCloneItem(item));
2827
+ } else if (!processedTopLevelValues.has(item.value)) {
2828
+ // Check if this item or any of its descendants is selected
2829
+ if (!hasSelectedDescendant(item)) {
2830
+ unselectedItems.push(deepCloneItem(item));
2831
+ }
2832
+ }
2833
+ });
2834
+
2835
+ // Return selected items first (in selection order), then unselected items
2836
+ return [...selectedItems, ...unselectedItems];
2837
+ };
2838
+ exports.reorderOptionsBySelection = reorderOptionsBySelection;
2839
+
2840
+ /***/ }),
2841
+
3106
2842
  /***/ 8244:
3107
2843
  /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
3108
2844
 
@@ -3185,7 +2921,7 @@ var ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ = __webpack_require__(1601);
3185
2921
  var ___CSS_LOADER_API_IMPORT___ = __webpack_require__(6314);
3186
2922
  var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);
3187
2923
  // Module
3188
- ___CSS_LOADER_EXPORT___.push([module.id, `.blaze-ui-cap-unified-select-header-wrapper{display:flex;align-items:center}.blaze-ui-cap-unified-select-header-wrapper.blaze-ui-disabled{opacity:.5;cursor:not-allowed}.blaze-ui-cap-unified-select-header-wrapper .blaze-ui-cap-unified-select-header-label{font-family:"Roboto",sans-serif;font-weight:500;font-size:1rem;line-height:1.429rem;letter-spacing:0}.blaze-ui-cap-unified-select-header-byline-text{font-family:"Roboto",sans-serif;font-weight:400;font-size:.857rem;letter-spacing:0;color:#97a0af}.blaze-ui-cap-unified-select-container{text-align:justify;min-width:13.786rem}.blaze-ui-cap-unified-select-container.blaze-ui-disabled{cursor:not-allowed}.blaze-ui-cap-unified-select-container.ant-select-focused .ant-select-selector{border:.071rem solid #091e42 !important}.blaze-ui-cap-unified-select-container .blaze-ui-cap-unified-select-more-text{cursor:pointer;color:#091e42;margin-right:.286rem;position:relative}.blaze-ui-cap-unified-select-container .blaze-ui-cap-unified-select-suffix-icon{color:#7a869a}.blaze-ui-cap-unified-select-container .blaze-ui-cap-tooltip-with-info-icon{margin-top:.143rem}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select.blaze-ui-cap-unified-tree-select-readonly{pointer-events:none}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select.blaze-ui-cap-unified-tree-select-readonly .blaze-ui-cap-unified-select-more-text{pointer-events:auto}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select .ant-select-tree-treenode{padding-left:.286rem}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly .ant-select-selector{background-color:#fff;border-color:#ebecf0 !important;cursor:default}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly .ant-select-arrow{pointer-events:auto;color:#b3bac5}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly.ant-select-outlined:hover .ant-select-selector,.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly.ant-select-outlined:active .ant-select-selector,.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly.ant-select-outlined:focus .ant-select-selector{border-color:#ebecf0 !important}.blaze-ui-cap-unified-select-container .blaze-ui-cap-unified-select-status{color:#ea213a}.blaze-ui-cap-unified-select-container .ant-select-outlined:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer):hover .ant-select-selector{border-color:#7a869a}.blaze-ui-cap-unified-select-container .ant-select-selector{background-color:#fff !important;border:.071rem solid #7a869a !important;border-radius:.286rem !important}.blaze-ui-cap-unified-select-container .ant-select-selector .ant-select-selection-placeholder{pointer-events:unset;color:#97a0af;display:flex;align-items:center}.blaze-ui-cap-unified-select-container .ant-select-prefix{font-size:1rem;font-weight:400;color:#091e42;line-height:1.429rem}.blaze-ui-cap-unified-select-container .ant-input-affix-wrapper .ant-input-prefix{left:.857rem}.blaze-ui-cap-unified-select-container .ant-select-selector{border-color:#7a869a !important;box-shadow:none !important;outline:0}.blaze-ui-cap-unified-select-container .ant-btn-variant-solid:not(:disabled):not(.ant-btn-disabled):hover{background-color:#47af46}.blaze-ui-cap-unified-select-container .ant-select-dropdown{margin-top:-0.571rem !important;border-radius:.286rem;background-color:#fff;box-shadow:0 .286rem .571rem -0.143rem rgba(9,30,66,.15),0 0 .071rem 0 rgba(9,30,66,.1);max-height:25.714rem;overflow:visible}.blaze-ui-cap-unified-select-container .ant-select-outlined.ant-select-multiple .ant-select-selection-wrap .ant-select-selection-item{background:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-container .ant-select-multiple .ant-select-selection-wrap .ant-select-selection-item,.blaze-ui-cap-unified-select-container .ant-select-selection-wrap .ant-select-selection-item{background:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-container .ant-select-multiple .ant-select-selection-wrap{align-self:center}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-search-container{border-bottom:.071rem solid #ebecf0 !important;line-height:2.857rem !important}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-search-container .blaze-ui-cap-unified-select-search-icon{color:#b3bac5}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-select-all-container{padding:.643rem 1.071rem;display:flex;align-items:center;border-bottom:.071rem solid #ebecf0;height:2.857rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-select-all-container .blaze-ui-cap-unified-select-select-all-checkbox{display:contents !important}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-upload-container{cursor:pointer;display:flex;align-items:center;border-bottom:.071rem solid #ebecf0;height:2.857rem;padding-left:1.143rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-upload-container .blaze-ui-cap-unified-select-upload-icon{color:#2466ea}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-upload-container .blaze-ui-cap-unified-select-upload-label{margin-left:.857rem;color:#2466ea}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container{display:flex;align-items:center;height:3.429rem;padding:.5rem;border-top:.071rem solid #ebecf0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group{display:flex;padding-left:.571rem;align-items:center;width:100%}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-confirm-button{background-color:#47af46;height:2.286rem;width:6.714rem;color:#fff}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-confirm-button:hover{background-color:#1f9a1d}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-confirm-button:disabled{background-color:#a1d8a0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-cancel-button{border:rgba(0,0,0,0);box-shadow:none;width:5.714rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-selected-count{display:flex;margin-left:auto;font-size:.857rem;font-weight:400;line-height:1.143rem;color:#5e6c84}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-tree-clear-container{display:flex;justify-content:center;align-items:center;height:2.857rem;border-top:.071rem solid #ebecf0;cursor:pointer;color:#091e42}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-tree-clear-container:hover{background-color:#ebecf0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-tree-clear-container .blaze-ui-cap-unified-select-tree-clear-label{font-size:1rem;font-weight:400}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container{cursor:pointer;display:flex;align-items:center;margin-left:auto;padding-right:1.143rem;gap:.857rem;flex-wrap:nowrap}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container:hover{opacity:.8}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container .blaze-ui-cap-unified-select-footer-download-icon{color:#2466ea;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:1}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container .blaze-ui-cap-unified-select-footer-download-label{color:#2466ea;font-family:Roboto,sans-serif;font-weight:400;font-style:normal;font-size:.857rem;line-height:1.143rem;letter-spacing:0;white-space:nowrap;display:inline-flex;align-items:center}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-no-result{display:flex;flex-direction:column;align-items:center;justify-content:center;height:14.286rem;color:#97a0af;font-size:1rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-no-result .blaze-ui-cap-unified-select-no-result-text{font-weight:500}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:14.286rem;width:100%;gap:.571rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-loading-more{display:flex;align-items:center;justify-content:center;padding:.857rem;border-top:.071rem solid #ebecf0;color:#97a0af}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-menu-wrapper{position:relative;width:100%}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background-color:rgba(255,255,255,.8);z-index:10;gap:.571rem;color:#97a0af}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix{display:flex;justify-content:start;align-items:center;width:100%;height:100%;line-height:1.5;vertical-align:middle;flex:1}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-unified-select-option-label{display:flex;align-items:center;flex-shrink:1;min-width:0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-unified-select-option-end{display:flex;align-items:center;gap:.571rem;flex-shrink:0;margin-left:auto}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-unified-select-option-suffix{display:flex;align-items:center;padding:0 .571rem;max-height:1.429rem;white-space:nowrap}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-tooltip-with-info .blaze-ui-cap-tooltip-with-info-icon{margin-top:.357rem;color:#42526e}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-tooltip-with-info .blaze-ui-cap-tooltip-with-info-icon .blaze-ui-cap-icon{color:#42526e}.blaze-ui-cap-unified-select-popup .ant-select-dropdown .ant-select-dropdown-menu{margin-top:0 !important}.blaze-ui-cap-unified-select-popup .ant-select-dropdown .ant-select-dropdown-menu .ant-select-dropdown-menu-item{padding:.571rem 1.714rem !important;height:unset !important;font-size:1rem !important}.blaze-ui-cap-unified-select-popup .ant-select-dropdown .ant-select-dropdown-menu-item-disabled{color:rgba(0,0,0,.25) !important;cursor:not-allowed !important;line-height:1.428rem !important;font-size:1rem !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper{background-color:rgba(0,0,0,0);height:100%;display:flex;align-items:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper:hover{background-color:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode{height:2.857rem;margin-bottom:0;display:flex;align-items:center;width:100%}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode:hover{background-color:#fffbe6}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-selected{background-color:#f4f5f7 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-disabled{cursor:not-allowed !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-disabled .blaze-ui-cap-unified-select-option-label{color:#b3bac5}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-disabled .blaze-ui-cap-icon{color:#b3bac5 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode.ant-select-tree-treenode-selected{background-color:#f4f5f7}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-leaf .ant-select-tree-switcher-noop{display:none}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox{display:flex;align-items:center;justify-content:center;line-height:1;vertical-align:middle}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox .ant-select-tree-checkbox-inner{height:1.286rem;width:1.286rem;border:.143rem solid #b3bac5;border-radius:.286rem;display:flex;align-items:center;justify-content:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#47af46;border:.143rem solid #47af46 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:hover{background-color:#47af46;border:.143rem solid #47af46 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#47af46 !important;border-color:#47af46 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner::after{content:"";position:absolute;top:50%;left:50%;width:.714rem;height:.143rem;background-color:#fff;transform:translate(-50%, -50%);border-radius:.071rem}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper{border-radius:0;padding-left:.214rem;width:100%;display:flex;align-items:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-title{width:100%;display:flex}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-indent{margin-left:.857rem;display:flex;align-items:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-switcher{display:flex;align-items:center;justify-content:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-switcher:not(.ant-select-tree-switcher-noop):hover:before{background-color:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-switcher .ant-select-tree-switcher-icon{font-size:.857rem;margin-top:1.286rem}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-list-holder-inner{width:fit-content !important;min-width:100%}.blaze-ui-cap-unified-select-popup .ant-tree-select:hover .ant-select-selector{border-color:#7a869a}.blaze-ui-cap-unified-select-popup .ant-tree-select-focused .ant-select-selector,.blaze-ui-cap-unified-select-popup .ant-tree-select-open .ant-select-selector{border-color:#7a869a;box-shadow:none;outline:none}.blaze-ui-cap-unified-select-popup .ant-checkbox-inner{height:1.286rem;width:1.286rem;border:.143rem solid #b3bac5;border-radius:.286rem}.blaze-ui-cap-unified-select-popup .ant-checkbox-wrapper:not(.ant-checkbox-wrapper-disabled):hover .ant-checkbox-checked:not(.ant-checkbox-disabled) .ant-checkbox-inner{background-color:#47af46;border:.143rem solid #47af46 !important}.blaze-ui-cap-unified-select-popup .ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#47af46 !important;border-color:#47af46 !important}.blaze-ui-cap-unified-select-popup .ant-checkbox-indeterminate .ant-checkbox-inner::after{content:"";position:absolute;top:50%;left:50%;width:.714rem;height:.143rem;background-color:#fff;transform:translate(-50%, -50%);border-radius:.071rem}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper{padding-left:.571rem;border:none;box-shadow:none;border-radius:0;border-bottom:.071rem solid rgba(0,0,0,0);transition:border-color .2s ease}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper:hover{border-bottom:.071rem solid #7a869a !important;box-shadow:none}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper:focus-within{border-bottom:.071rem solid #091e42 !important;box-shadow:none;outline:none}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper .ant-input{border:none !important;box-shadow:none !important}`, ""]);
2924
+ ___CSS_LOADER_EXPORT___.push([module.id, `.blaze-ui-cap-unified-select-header-wrapper{display:flex;align-items:center}.blaze-ui-cap-unified-select-header-wrapper.blaze-ui-disabled{opacity:.5;cursor:not-allowed}.blaze-ui-cap-unified-select-header-wrapper .blaze-ui-cap-unified-select-header-label{font-family:"Roboto",sans-serif;font-weight:500;font-size:1rem;line-height:1.429rem;letter-spacing:0}.blaze-ui-cap-unified-select-header-byline-text{font-family:"Roboto",sans-serif;font-weight:400;font-size:.857rem;letter-spacing:0;color:#97a0af}.blaze-ui-cap-unified-select-container{text-align:justify;min-width:13.786rem}.blaze-ui-cap-unified-select-container.blaze-ui-disabled{cursor:not-allowed}.blaze-ui-cap-unified-select-container .blaze-ui-cap-unified-select-more-text{cursor:pointer;color:#091e42;margin-right:.286rem;position:relative}.blaze-ui-cap-unified-select-container.ant-select-disabled .blaze-ui-cap-unified-select-more-text{color:unset !important;cursor:not-allowed}.blaze-ui-cap-unified-select-container.ant-select-focused .ant-select-selector{border:.071rem solid #091e42 !important}.blaze-ui-cap-unified-select-container .blaze-ui-cap-unified-select-suffix-icon{color:#7a869a}.blaze-ui-cap-unified-select-container .blaze-ui-cap-tooltip-with-info-icon{margin-top:.143rem}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select.blaze-ui-cap-unified-tree-select-readonly{pointer-events:none}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select.blaze-ui-cap-unified-tree-select-readonly .blaze-ui-cap-unified-select-more-text{pointer-events:auto;color:unset !important}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select .ant-select-tree-treenode{padding-left:.286rem}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly .ant-select-selector{background-color:#fff;border-color:#ebecf0 !important;cursor:default}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly .ant-select-arrow{pointer-events:auto;color:#b3bac5}.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly.ant-select-outlined:hover .ant-select-selector,.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly.ant-select-outlined:active .ant-select-selector,.blaze-ui-cap-unified-select-container.blaze-ui-cap-unified-tree-select-readonly.ant-select-outlined:focus .ant-select-selector{border-color:#ebecf0 !important}.blaze-ui-cap-unified-select-container .blaze-ui-cap-unified-select-status{color:#ea213a}.blaze-ui-cap-unified-select-container .ant-select-outlined:not(.ant-select-disabled):not(.ant-select-customize-input):not(.ant-pagination-size-changer):hover .ant-select-selector{border-color:#7a869a}.blaze-ui-cap-unified-select-container .ant-select-selector{background-color:#fff !important;border:.071rem solid #7a869a !important;border-radius:.286rem !important}.blaze-ui-cap-unified-select-container .ant-select-selector .ant-select-selection-placeholder{pointer-events:unset;color:#97a0af;display:flex;align-items:center}.blaze-ui-cap-unified-select-container .ant-select-prefix{font-size:1rem;font-weight:400;color:unset !important;line-height:1.429rem}.blaze-ui-cap-unified-select-container .ant-select-disabled .ant-select-prefix{color:unset !important}.blaze-ui-cap-unified-select-container .ant-input-affix-wrapper .ant-input-prefix{left:.857rem}.blaze-ui-cap-unified-select-container .ant-select-selector{border-color:#7a869a !important;box-shadow:none !important;outline:0}.blaze-ui-cap-unified-select-container .ant-btn-variant-solid:not(:disabled):not(.ant-btn-disabled):hover{background-color:#47af46}.blaze-ui-cap-unified-select-container .ant-select-dropdown{margin-top:-0.571rem !important;border-radius:.286rem;background-color:#fff;box-shadow:0 .286rem .571rem -0.143rem rgba(9,30,66,.15),0 0 .071rem 0 rgba(9,30,66,.1);max-height:25.714rem;overflow:visible}.blaze-ui-cap-unified-select-container .ant-select-outlined.ant-select-multiple .ant-select-selection-wrap .ant-select-selection-item{background:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-container .ant-select-multiple .ant-select-selection-wrap .ant-select-selection-item,.blaze-ui-cap-unified-select-container .ant-select-selection-wrap .ant-select-selection-item{background:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-container .ant-select-multiple .ant-select-selection-wrap{align-self:center}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-search-container{border-bottom:.071rem solid #ebecf0 !important;line-height:2.857rem !important}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-search-container .blaze-ui-cap-unified-select-search-icon{color:#b3bac5}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-select-all-container{padding:.643rem 1.071rem;display:flex;align-items:center;border-bottom:.071rem solid #ebecf0;height:2.857rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-select-all-container .blaze-ui-cap-unified-select-select-all-checkbox{display:contents !important}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-upload-container{cursor:pointer;display:flex;align-items:center;border-bottom:.071rem solid #ebecf0;height:2.857rem;padding-left:1.143rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-upload-container .blaze-ui-cap-unified-select-upload-icon{color:#2466ea}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-upload-container .blaze-ui-cap-unified-select-upload-label{margin-left:.857rem;color:#2466ea}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container{display:flex;align-items:center;height:3.429rem;padding:.5rem;border-top:.071rem solid #ebecf0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group{display:flex;padding-left:.571rem;align-items:center;width:100%}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-confirm-button{background-color:#47af46;height:2.286rem;width:6.714rem;color:#fff}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-confirm-button:hover{background-color:#1f9a1d}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-confirm-button:disabled{background-color:#a1d8a0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-cancel-button{border:rgba(0,0,0,0);box-shadow:none;width:5.714rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-confirm-container .blaze-ui-cap-unified-select-confirm-button-group .blaze-ui-cap-unified-select-selected-count{display:flex;margin-left:auto;font-size:.857rem;font-weight:400;line-height:1.143rem;color:#5e6c84}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-tree-clear-container{display:flex;justify-content:center;align-items:center;height:2.857rem;border-top:.071rem solid #ebecf0;cursor:pointer;color:#091e42}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-tree-clear-container:hover{background-color:#ebecf0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-tree-clear-container .blaze-ui-cap-unified-select-tree-clear-label{font-size:1rem;font-weight:400}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container{cursor:pointer;display:flex;align-items:center;margin-left:auto;padding-right:1.143rem;gap:.857rem;flex-wrap:nowrap}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container:hover{opacity:.8}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container .blaze-ui-cap-unified-select-footer-download-icon{color:#2466ea;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:1}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-footer-download-container .blaze-ui-cap-unified-select-footer-download-label{color:#2466ea;font-family:Roboto,sans-serif;font-weight:400;font-style:normal;font-size:.857rem;line-height:1.143rem;letter-spacing:0;white-space:nowrap;display:inline-flex;align-items:center}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-no-result{display:flex;flex-direction:column;align-items:center;justify-content:center;height:14.286rem;color:#97a0af;font-size:1rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-no-result .blaze-ui-cap-unified-select-no-result-text{font-weight:500}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-loading-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:14.286rem;width:100%;gap:.571rem}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-loading-more{display:flex;align-items:center;justify-content:center;padding:.857rem;border-top:.071rem solid #ebecf0;color:#97a0af}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-menu-wrapper{position:relative;width:100%}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-loading-overlay{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background-color:rgba(255,255,255,.8);z-index:10;gap:.571rem;color:#97a0af}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix{display:flex;justify-content:start;align-items:center;width:100%;height:100%;line-height:1.5;vertical-align:middle;flex:1}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-unified-select-option-label{display:flex;align-items:center;flex-shrink:1;min-width:0}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-unified-select-option-end{display:flex;align-items:center;gap:.571rem;flex-shrink:0;margin-left:auto}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-unified-select-option-suffix{display:flex;align-items:center;padding:0 .571rem;max-height:1.429rem;white-space:nowrap}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-tooltip-with-info .blaze-ui-cap-tooltip-with-info-icon{margin-top:.357rem;color:#42526e}.blaze-ui-cap-unified-select-popup .blaze-ui-cap-unified-select-option-with-suffix .blaze-ui-cap-tooltip-with-info .blaze-ui-cap-tooltip-with-info-icon .blaze-ui-cap-icon{color:#42526e}.blaze-ui-cap-unified-select-popup .ant-select-dropdown .ant-select-dropdown-menu{margin-top:0 !important}.blaze-ui-cap-unified-select-popup .ant-select-dropdown .ant-select-dropdown-menu .ant-select-dropdown-menu-item{padding:.571rem 1.714rem !important;height:unset !important;font-size:1rem !important}.blaze-ui-cap-unified-select-popup .ant-select-dropdown .ant-select-dropdown-menu-item-disabled{color:rgba(0,0,0,.25) !important;cursor:not-allowed !important;line-height:1.428rem !important;font-size:1rem !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper{background-color:rgba(0,0,0,0);height:100%;display:flex;align-items:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper:hover{background-color:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode{height:2.857rem;margin-bottom:0;display:flex;align-items:center;width:100%}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode:hover{background-color:#fffbe6}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-selected{background-color:#f4f5f7 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-disabled{cursor:not-allowed !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-disabled .blaze-ui-cap-unified-select-option-label{color:#b3bac5}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-disabled .blaze-ui-cap-icon{color:#b3bac5 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode.ant-select-tree-treenode-selected{background-color:#f4f5f7}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-treenode-leaf .ant-select-tree-switcher-noop{display:none}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox{display:flex;align-items:center;justify-content:center;line-height:1;vertical-align:middle}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox .ant-select-tree-checkbox-inner{height:1.286rem;width:1.286rem;border:.143rem solid #b3bac5;border-radius:.286rem;display:flex;align-items:center;justify-content:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#47af46;border:.143rem solid #47af46 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:hover{background-color:#47af46;border:.143rem solid #47af46 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#47af46 !important;border-color:#47af46 !important}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-checkbox.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner::after{content:"";position:absolute;top:50%;left:50%;width:.714rem;height:.143rem;background-color:#fff;transform:translate(-50%, -50%);border-radius:.071rem}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper{border-radius:0;padding-left:.214rem;width:100%;display:flex;align-items:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-title{width:100%;display:flex}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-indent{margin-left:.857rem;display:flex;align-items:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-switcher{display:flex;align-items:center;justify-content:center}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-switcher:not(.ant-select-tree-switcher-noop):hover:before{background-color:rgba(0,0,0,0)}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-switcher .ant-select-tree-switcher-icon{font-size:.857rem;margin-top:1.286rem}.blaze-ui-cap-unified-select-popup .ant-select-tree .ant-select-tree-list-holder-inner{width:fit-content !important;min-width:100%}.blaze-ui-cap-unified-select-popup .ant-tree-select:hover .ant-select-selector{border-color:#7a869a}.blaze-ui-cap-unified-select-popup .ant-tree-select-focused .ant-select-selector,.blaze-ui-cap-unified-select-popup .ant-tree-select-open .ant-select-selector{border-color:#7a869a;box-shadow:none;outline:none}.blaze-ui-cap-unified-select-popup .ant-checkbox-inner{height:1.286rem;width:1.286rem;border:.143rem solid #b3bac5;border-radius:.286rem}.blaze-ui-cap-unified-select-popup .ant-checkbox-wrapper:not(.ant-checkbox-wrapper-disabled):hover .ant-checkbox-checked:not(.ant-checkbox-disabled) .ant-checkbox-inner{background-color:#47af46;border:.143rem solid #47af46 !important}.blaze-ui-cap-unified-select-popup .ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#47af46 !important;border-color:#47af46 !important}.blaze-ui-cap-unified-select-popup .ant-checkbox-indeterminate .ant-checkbox-inner::after{content:"";position:absolute;top:50%;left:50%;width:.714rem;height:.143rem;background-color:#fff;transform:translate(-50%, -50%);border-radius:.071rem}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper{padding-left:.571rem;border:none;box-shadow:none;border-radius:0;border-bottom:.071rem solid rgba(0,0,0,0);transition:border-color .2s ease}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper:hover{border-bottom:.071rem solid #7a869a !important;box-shadow:none}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper:focus-within{border-bottom:.071rem solid #091e42 !important;box-shadow:none;outline:none}.blaze-ui-cap-unified-select-popup .ant-input-affix-wrapper .ant-input{border:none !important;box-shadow:none !important}`, ""]);
3189
2925
  // Exports
3190
2926
  ___CSS_LOADER_EXPORT___.locals = {
3191
2927
  "cap-unified-select-header-wrapper": `blaze-ui-cap-unified-select-header-wrapper`,
@@ -3243,62 +2979,33 @@ module.exports = ___CSS_LOADER_EXPORT___;
3243
2979
 
3244
2980
  exports.__esModule = true;
3245
2981
  exports.TIMEOUTS = exports.SELECT_TYPES = exports.DEFAULTS = void 0;
3246
- /**
3247
- * Select type constants for CapUnifiedSelect component
3248
- */
3249
2982
  const SELECT_TYPES = exports.SELECT_TYPES = {
3250
2983
  SELECT: 'select',
3251
2984
  MULTI_SELECT: 'multiSelect',
3252
2985
  TREE_SELECT: 'treeSelect',
3253
2986
  MULTI_TREE_SELECT: 'multiTreeSelect'
3254
2987
  };
3255
- /**
3256
- * Timeout constants (in milliseconds)
3257
- */
3258
2988
  const TIMEOUTS = exports.TIMEOUTS = {
3259
- /** Default search debounce timeout */
3260
2989
  DEFAULT_SEARCH_DEBOUNCE: 300,
3261
- /** Delay for state updates after search */
3262
2990
  SEARCH_STATE_UPDATE_DELAY: 100,
3263
- /** Minimum time since search was cleared to consider data ready */
3264
2991
  SEARCH_CLEARED_TIMEOUT: 200,
3265
- /** Buffer time added to debounce for cleared search */
3266
2992
  SEARCH_CLEARED_BUFFER: 300,
3267
- /** Buffer time added to debounce for regular search */
3268
2993
  SEARCH_REGULAR_BUFFER: 500,
3269
- /** Brief delay to show loading indicator for static search */
3270
2994
  STATIC_SEARCH_DELAY: 150,
3271
- /** Timeout for resetData fallback (1 second) */
3272
2995
  RESET_DATA_TIMEOUT: 1000,
3273
- /** Minimum time since resetData was called to consider data ready */
3274
2996
  RESET_DATA_MIN_TIME: 300,
3275
- /** Maximum time since resetData was called to consider data ready */
3276
2997
  RESET_DATA_MAX_TIME: 2000,
3277
- /** Fallback timeout for scroll loading (10 seconds) */
3278
2998
  SCROLL_LOADING_TIMEOUT: 10000,
3279
- /** Delay before setting up scroll container listener */
3280
2999
  SCROLL_CONTAINER_DELAY: 100
3281
3000
  };
3282
-
3283
- /**
3284
- * Default values for component props
3285
- */
3286
3001
  const DEFAULTS = exports.DEFAULTS = {
3287
- /** Default placeholder text */
3288
3002
  PLACEHOLDER: 'Select an option',
3289
- /** Default upload button label */
3290
3003
  UPLOAD_LABEL: 'Upload',
3291
- /** Default clear button text */
3292
3004
  CLEAR_TEXT: 'Clear',
3293
- /** Default no results message */
3294
3005
  NO_RESULT_TEXT: 'No results found',
3295
- /** Default no results icon */
3296
3006
  NO_RESULT_ICON: 'warning',
3297
- /** Default virtual row height in pixels */
3298
3007
  VIRTUAL_ROW_HEIGHT: 32,
3299
- /** Default list height in pixels */
3300
3008
  LIST_HEIGHT: 256,
3301
- /** Default search input placeholder */
3302
3009
  SEARCH_PLACEHOLDER: 'Search'
3303
3010
  };
3304
3011