@oceanbase/design 1.0.0-alpha.17 → 1.0.0-alpha.18

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.
Files changed (46) hide show
  1. package/dist/design.min.js +1 -1
  2. package/es/_util/genComponentStyleHook.js +6 -2
  3. package/es/config-provider/index.d.ts +2 -0
  4. package/es/config-provider/index.js +68 -38
  5. package/es/filter/FilterContext.d.ts +1 -1
  6. package/es/filter/components/FilterButton.js +30 -7
  7. package/es/filter/components/FilterCascader/components/FlatCascaderContent/index.d.ts +4 -3
  8. package/es/filter/components/FilterCascader/components/FlatCascaderContent/index.js +20 -6
  9. package/es/filter/components/FilterCascader/components/NormalCascaderContent.js +2 -7
  10. package/es/filter/components/FilterInput.d.ts +2 -0
  11. package/es/filter/components/FilterInput.js +18 -4
  12. package/es/filter/components/FilterSlot.d.ts +28 -0
  13. package/es/filter/components/FilterSlot.js +189 -0
  14. package/es/filter/components/FilterWrap.js +9 -0
  15. package/es/filter/components/ResponsiveFilterGroup.js +38 -2
  16. package/es/filter/index.d.ts +2 -0
  17. package/es/filter/index.js +3 -1
  18. package/es/filter/style/index.js +1 -1
  19. package/es/filter/type.d.ts +2 -0
  20. package/es/table/index.d.ts +2 -2
  21. package/es/table/style/index.js +34 -16
  22. package/es/theme/default.d.ts +12 -0
  23. package/es/theme/default.js +27 -5
  24. package/lib/_util/genComponentStyleHook.js +6 -2
  25. package/lib/config-provider/index.d.ts +2 -0
  26. package/lib/config-provider/index.js +38 -2
  27. package/lib/filter/FilterContext.d.ts +1 -1
  28. package/lib/filter/components/FilterButton.js +22 -4
  29. package/lib/filter/components/FilterCascader/components/FlatCascaderContent/index.d.ts +4 -3
  30. package/lib/filter/components/FilterCascader/components/FlatCascaderContent/index.js +12 -5
  31. package/lib/filter/components/FilterCascader/components/NormalCascaderContent.js +2 -7
  32. package/lib/filter/components/FilterInput.d.ts +2 -0
  33. package/lib/filter/components/FilterInput.js +18 -3
  34. package/lib/filter/components/FilterSlot.d.ts +28 -0
  35. package/lib/filter/components/FilterSlot.js +174 -0
  36. package/lib/filter/components/FilterWrap.js +8 -0
  37. package/lib/filter/components/ResponsiveFilterGroup.js +32 -2
  38. package/lib/filter/index.d.ts +2 -0
  39. package/lib/filter/index.js +3 -1
  40. package/lib/filter/style/index.js +1 -1
  41. package/lib/filter/type.d.ts +2 -0
  42. package/lib/table/index.d.ts +2 -2
  43. package/lib/table/style/index.js +28 -19
  44. package/lib/theme/default.d.ts +12 -0
  45. package/lib/theme/default.js +29 -6
  46. package/package.json +2 -2
@@ -35,8 +35,12 @@ export var genSelectCommonStyle = function genSelectCommonStyle(token) {
35
35
  export function genStyleHooks(componentName, styleFn, getDefaultToken, options) {
36
36
  var normalizedComponentName = Array.isArray(componentName) ? componentName[0] : componentName;
37
37
 
38
- // Create the component name with OB- prefix
39
- var obComponentName = Array.isArray(componentName) ? ["OB-".concat(normalizedComponentName), componentName[1]] : "OB-".concat(normalizedComponentName);
38
+ /**
39
+ * 使用 [Component, subName] 注册,第一维与 antd 一致以便合并 `theme.components[Component]`(如 Table.cellFontSize);
40
+ * 第二维与 antd 默认样式区分,避免覆盖/顶替同组件的主样式钩子。
41
+ */
42
+ var OCEANBASE_SUB_STYLE = 'oceanbase';
43
+ var obComponentName = Array.isArray(componentName) ? [normalizedComponentName, "".concat(OCEANBASE_SUB_STYLE, "-").concat(componentName[1])] : [normalizedComponentName, OCEANBASE_SUB_STYLE];
40
44
  return antGenStyleHooks(obComponentName, function (token) {
41
45
  var styles = [];
42
46
 
@@ -63,5 +63,7 @@ export type ConfigProviderType = React.FC<ConfigProviderProps> & {
63
63
  config: typeof AntConfigProvider.config;
64
64
  useConfig: typeof AntConfigProvider.useConfig;
65
65
  };
66
+ /** Cn 字号补丁(正文 + Table 单元格),供单测与 ConfigProvider 共用。 */
67
+ export declare function getLocaleFontSizeThemePatch(mergedLocale: Locale, mergedTheme: ThemeConfig, resolvedFontSize: number | undefined): ThemeConfig;
66
68
  declare const ConfigProvider: ConfigProviderType;
67
69
  export default ConfigProvider;
@@ -24,7 +24,7 @@ import { merge } from 'lodash';
24
24
  import App from "../app";
25
25
  import StaticFunction from "../static-function";
26
26
  import themeConfig from "../theme";
27
- import defaultTheme, { fontFamilyEn, fontWeightWeakEn, fontWeightEn, fontWeightStrongEn } from "../theme/default";
27
+ import defaultTheme, { fontFamilyEn, fontSizeCn, fontHeightCn, lineHeightCn, fontSizeEn, fontWeightWeakEn, fontWeightEn, fontWeightStrongEn, isCnLikeLocale, tableCellFontSizeEn } from "../theme/default";
28
28
  import darkTheme from "../theme/dark";
29
29
  import compactTheme from "../theme/compact";
30
30
  import DefaultRenderEmpty from "./DefaultRenderEmpty";
@@ -42,26 +42,55 @@ var ExtendedConfigContext = /*#__PURE__*/React.createContext({
42
42
  hideOnSinglePage: false,
43
43
  injectStaticFunction: true
44
44
  });
45
+ /** `en` / `en-gb` → `tokenValueEn`(与 `fontFamilyEn` 等一致)。 */
45
46
  var getLocaleTokenValue = function getLocaleTokenValue(mergedThemeToken, locale, tokenKey, tokenValue, tokenValueEn) {
46
47
  return tokenValue !== mergedThemeToken[tokenKey] ? _defineProperty({}, tokenKey, tokenValue) : ['en', 'en-gb'].includes(locale.locale) ? _defineProperty({}, tokenKey, tokenValueEn) : {};
47
48
  };
48
- var ConfigProvider = function ConfigProvider(_ref3) {
49
- var _mergedTheme$token, _mergedTheme$token2, _mergedTheme$token3, _mergedTheme$token4, _parentContext$pagina;
50
- var children = _ref3.children,
51
- theme = _ref3.theme,
52
- locale = _ref3.locale,
53
- wave = _ref3.wave,
54
- navigate = _ref3.navigate,
55
- hideOnSinglePage = _ref3.hideOnSinglePage,
56
- card = _ref3.card,
57
- collapse = _ref3.collapse,
58
- form = _ref3.form,
59
- spin = _ref3.spin,
60
- table = _ref3.table,
61
- tabs = _ref3.tabs,
62
- styleProviderProps = _ref3.styleProviderProps,
63
- appProps = _ref3.appProps,
64
- restProps = _objectWithoutProperties(_ref3, _excluded);
49
+
50
+ /** Cn(zh/ja/ko)且仍为拉丁基线 `tokenValueEn` `tokenValueCn`,结构上与 {@link getLocaleTokenValue} 对称。 */
51
+ var getLocaleTokenValueCn = function getLocaleTokenValueCn(mergedThemeToken, locale, tokenKey, tokenValue, tokenValueEn, tokenValueCn) {
52
+ return tokenValue !== mergedThemeToken[tokenKey] ? _defineProperty({}, tokenKey, tokenValue) : isCnLikeLocale(locale.locale) && (tokenValue === undefined || tokenValue === tokenValueEn) ? _defineProperty({}, tokenKey, tokenValueCn) : {};
53
+ };
54
+
55
+ /** Cn 字号补丁(正文 + Table 单元格),供单测与 ConfigProvider 共用。 */
56
+ export function getLocaleFontSizeThemePatch(mergedLocale, mergedTheme, resolvedFontSize) {
57
+ var _mergedTheme$token, _mergedTheme$componen;
58
+ var tokenPatch = getLocaleTokenValueCn((_mergedTheme$token = mergedTheme.token) !== null && _mergedTheme$token !== void 0 ? _mergedTheme$token : {}, mergedLocale, 'fontSize', resolvedFontSize, fontSizeEn, fontSizeCn);
59
+ var patch = {};
60
+ if ('fontSize' in tokenPatch && tokenPatch.fontSize !== undefined) {
61
+ patch.token = {
62
+ fontSize: tokenPatch.fontSize,
63
+ lineHeight: lineHeightCn,
64
+ fontHeight: fontHeightCn
65
+ };
66
+ }
67
+ var cellFs = (_mergedTheme$componen = mergedTheme.components) === null || _mergedTheme$componen === void 0 || (_mergedTheme$componen = _mergedTheme$componen.Table) === null || _mergedTheme$componen === void 0 ? void 0 : _mergedTheme$componen.cellFontSize;
68
+ if ((cellFs === undefined || cellFs === tableCellFontSizeEn) && isCnLikeLocale(mergedLocale.locale)) {
69
+ patch.components = {
70
+ Table: {
71
+ cellFontSize: fontSizeCn
72
+ }
73
+ };
74
+ }
75
+ return patch;
76
+ }
77
+ var ConfigProvider = function ConfigProvider(_ref5) {
78
+ var _mergedTheme$token2, _mergedTheme$token$fo, _mergedTheme$token3, _mergedTheme$token4, _mergedTheme$token5, _mergedTheme$token6, _parentContext$pagina;
79
+ var children = _ref5.children,
80
+ theme = _ref5.theme,
81
+ locale = _ref5.locale,
82
+ wave = _ref5.wave,
83
+ navigate = _ref5.navigate,
84
+ hideOnSinglePage = _ref5.hideOnSinglePage,
85
+ card = _ref5.card,
86
+ collapse = _ref5.collapse,
87
+ form = _ref5.form,
88
+ spin = _ref5.spin,
89
+ table = _ref5.table,
90
+ tabs = _ref5.tabs,
91
+ styleProviderProps = _ref5.styleProviderProps,
92
+ appProps = _ref5.appProps,
93
+ restProps = _objectWithoutProperties(_ref5, _excluded);
65
94
  // inherit from parent ConfigProvider
66
95
  var parentContext = React.useContext(AntConfigProvider.ConfigContext);
67
96
  var parentExtendedContext = React.useContext(ExtendedConfigContext);
@@ -71,28 +100,29 @@ var ConfigProvider = function ConfigProvider(_ref3) {
71
100
  isCompact = _merge.isCompact;
72
101
  var aliyunThemeConfig = isAliyun ? aliyunTheme : undefined;
73
102
  var darkThemeConfig = isDark && !isAliyun ? isCompact ? darkTheme : _objectSpread(_objectSpread({}, darkTheme), {}, {
74
- token: _objectSpread(_objectSpread({}, darkTheme.token), Object.fromEntries(Object.entries(defaultTheme.token).filter(function (_ref4) {
103
+ token: _objectSpread(_objectSpread({}, darkTheme.token), Object.fromEntries(Object.entries(defaultTheme.token).filter(function (_ref6) {
75
104
  var _key$toLowerCase;
76
- var _ref5 = _slicedToArray(_ref4, 1),
77
- key = _ref5[0];
105
+ var _ref7 = _slicedToArray(_ref6, 1),
106
+ key = _ref7[0];
78
107
  return !(key !== null && key !== void 0 && (_key$toLowerCase = key.toLowerCase()) !== null && _key$toLowerCase !== void 0 && _key$toLowerCase.startsWith('color'));
79
108
  })))
80
109
  }) : undefined;
81
110
  var compactThemeConfig = isCompact && !isAliyun ? isDark ? compactTheme : _objectSpread(_objectSpread({}, compactTheme), {}, {
82
- token: _objectSpread(_objectSpread({}, compactTheme.token), Object.fromEntries(Object.entries(defaultTheme.token).filter(function (_ref6) {
111
+ token: _objectSpread(_objectSpread({}, compactTheme.token), Object.fromEntries(Object.entries(defaultTheme.token).filter(function (_ref8) {
83
112
  var _key$toLowerCase2;
84
- var _ref7 = _slicedToArray(_ref6, 1),
85
- key = _ref7[0];
113
+ var _ref9 = _slicedToArray(_ref8, 1),
114
+ key = _ref9[0];
86
115
  return (key === null || key === void 0 || (_key$toLowerCase2 = key.toLowerCase()) === null || _key$toLowerCase2 === void 0 ? void 0 : _key$toLowerCase2.startsWith('color')) && !['colorBgBase', 'colorTextBase'].includes(key);
87
116
  })))
88
117
  }) : undefined;
89
118
  var mergedTheme = merge({}, isAliyun ? {} : isDark || isCompact ? themeConfig.defaultSeed : defaultTheme, parentContext.theme, aliyunThemeConfig, darkThemeConfig, compactThemeConfig, theme);
90
119
  var _themeConfig$useToken = themeConfig.useToken(),
91
120
  token = _themeConfig$useToken.token;
92
- var fontFamily = ((_mergedTheme$token = mergedTheme.token) === null || _mergedTheme$token === void 0 ? void 0 : _mergedTheme$token.fontFamily) || token.fontFamily;
93
- var fontWeightWeak = ((_mergedTheme$token2 = mergedTheme.token) === null || _mergedTheme$token2 === void 0 ? void 0 : _mergedTheme$token2.fontWeightWeak) || token.fontWeightWeak;
94
- var fontWeight = ((_mergedTheme$token3 = mergedTheme.token) === null || _mergedTheme$token3 === void 0 ? void 0 : _mergedTheme$token3.fontWeight) || token.fontWeight;
95
- var fontWeightStrong = ((_mergedTheme$token4 = mergedTheme.token) === null || _mergedTheme$token4 === void 0 ? void 0 : _mergedTheme$token4.fontWeightStrong) || token.fontWeightStrong;
121
+ var fontFamily = ((_mergedTheme$token2 = mergedTheme.token) === null || _mergedTheme$token2 === void 0 ? void 0 : _mergedTheme$token2.fontFamily) || token.fontFamily;
122
+ var fontSize = (_mergedTheme$token$fo = (_mergedTheme$token3 = mergedTheme.token) === null || _mergedTheme$token3 === void 0 ? void 0 : _mergedTheme$token3.fontSize) !== null && _mergedTheme$token$fo !== void 0 ? _mergedTheme$token$fo : token.fontSize;
123
+ var fontWeightWeak = ((_mergedTheme$token4 = mergedTheme.token) === null || _mergedTheme$token4 === void 0 ? void 0 : _mergedTheme$token4.fontWeightWeak) || token.fontWeightWeak;
124
+ var fontWeight = ((_mergedTheme$token5 = mergedTheme.token) === null || _mergedTheme$token5 === void 0 ? void 0 : _mergedTheme$token5.fontWeight) || token.fontWeight;
125
+ var fontWeightStrong = ((_mergedTheme$token6 = mergedTheme.token) === null || _mergedTheme$token6 === void 0 ? void 0 : _mergedTheme$token6.fontWeightStrong) || token.fontWeightStrong;
96
126
 
97
127
  // inherit from parent StyleProvider
98
128
  var parentStyleContext = React.useContext(StyleContext);
@@ -105,8 +135,8 @@ var ConfigProvider = function ConfigProvider(_ref3) {
105
135
  }, parentContext.wave, wave),
106
136
  card: merge({}, parentContext.card, card),
107
137
  collapse: merge({}, {
108
- expandIcon: function expandIcon(_ref8) {
109
- var isActive = _ref8.isActive;
138
+ expandIcon: function expandIcon(_ref10) {
139
+ var isActive = _ref10.isActive;
110
140
  return /*#__PURE__*/_jsx(CaretRightOutlined, {
111
141
  rotate: isActive ? 90 : 0
112
142
  });
@@ -118,12 +148,12 @@ var ConfigProvider = function ConfigProvider(_ref3) {
118
148
  spin: merge({}, parentContext.spin, spin),
119
149
  table: merge({}, {
120
150
  expandable: {
121
- expandIcon: function expandIcon(_ref9) {
122
- var _mergedTheme$token5, _mergedTheme$token6;
123
- var expandable = _ref9.expandable,
124
- expanded = _ref9.expanded,
125
- onExpand = _ref9.onExpand,
126
- record = _ref9.record;
151
+ expandIcon: function expandIcon(_ref11) {
152
+ var _mergedTheme$token7, _mergedTheme$token8;
153
+ var expandable = _ref11.expandable,
154
+ expanded = _ref11.expanded,
155
+ onExpand = _ref11.onExpand,
156
+ record = _ref11.record;
127
157
  return expandable && /*#__PURE__*/_jsx(CaretRightOutlined, {
128
158
  onClick: function onClick(e) {
129
159
  return onExpand(record, e);
@@ -132,14 +162,14 @@ var ConfigProvider = function ConfigProvider(_ref3) {
132
162
  // marginRight: mergedTheme.token?.marginXS || 8,
133
163
  transition: "transform 0.2s",
134
164
  transform: expanded ? 'rotate(90deg)' : undefined,
135
- color: ((_mergedTheme$token5 = mergedTheme.token) === null || _mergedTheme$token5 === void 0 ? void 0 : _mergedTheme$token5.colorIcon) || ((_mergedTheme$token6 = mergedTheme.token) === null || _mergedTheme$token6 === void 0 ? void 0 : _mergedTheme$token6.colorTextSecondary)
165
+ color: ((_mergedTheme$token7 = mergedTheme.token) === null || _mergedTheme$token7 === void 0 ? void 0 : _mergedTheme$token7.colorIcon) || ((_mergedTheme$token8 = mergedTheme.token) === null || _mergedTheme$token8 === void 0 ? void 0 : _mergedTheme$token8.colorTextSecondary)
136
166
  }
137
167
  });
138
168
  }
139
169
  }
140
170
  }, parentContext.table, table),
141
171
  tabs: merge({}, parentContext.tabs, tabs),
142
- theme: merge({}, mergedTheme, {
172
+ theme: merge({}, mergedTheme, getLocaleFontSizeThemePatch(mergedLocale, mergedTheme, fontSize), {
143
173
  token: _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, getLocaleTokenValue(mergedTheme.token || {}, mergedLocale, 'fontFamily', fontFamily, fontFamilyEn)), getLocaleTokenValue(mergedTheme.token || {}, mergedLocale, 'fontWeightWeak', fontWeightWeak, fontWeightWeakEn)), getLocaleTokenValue(mergedTheme.token || {}, mergedLocale, 'fontWeight', fontWeight, fontWeightEn)), getLocaleTokenValue(mergedTheme.token || {}, mergedLocale, 'fontWeightStrong', fontWeightStrong, fontWeightStrongEn))
144
174
  }),
145
175
  renderEmpty: parentContext.renderEmpty || function (componentName) {
@@ -1,5 +1,5 @@
1
1
  import type { FC, ReactNode } from 'react';
2
- export type FilterComponentName = 'select' | 'checkbox' | 'cascader' | 'switch' | 'range' | 'input';
2
+ export type FilterComponentName = 'select' | 'checkbox' | 'cascader' | 'switch' | 'range' | 'input' | 'slot';
3
3
  export type FilterValue = string | string[] | string[][] | boolean | [any, any] | null | undefined;
4
4
  export interface FilterValueItem {
5
5
  id: string;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
- var _excluded = ["children", "icon", "label", "bordered", "onClear", "content", "footer", "trigger", "placement", "disabled", "loading", "selected", "extra", "autoCloseOnSelect", "onSelect", "showLabelDivider", "showSuffixIcon", "_isInWrapComponent", "_isFlat", "style"],
3
+ var _excluded = ["children", "icon", "label", "bordered", "onClear", "content", "footer", "trigger", "placement", "disabled", "loading", "selected", "extra", "autoCloseOnSelect", "onSelect", "showLabelDivider", "showSuffixIcon", "_isInWrapComponent", "_isFlat", "style", "allowClear"],
4
4
  _excluded2 = ["onOpenChange"];
5
5
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
6
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -15,7 +15,7 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
15
15
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
16
16
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
17
17
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
18
- import React, { forwardRef, useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react';
18
+ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
19
19
  import { Flex, Popover } from 'antd';
20
20
  import Spin from "../../spin";
21
21
  import theme from "../../theme";
@@ -58,6 +58,8 @@ var FilterButton = /*#__PURE__*/forwardRef(function (_ref, ref) {
58
58
  _ref$_isFlat = _ref._isFlat,
59
59
  _isFlat = _ref$_isFlat === void 0 ? false : _ref$_isFlat,
60
60
  style = _ref.style,
61
+ _ref$allowClear = _ref.allowClear,
62
+ allowClear = _ref$allowClear === void 0 ? true : _ref$allowClear,
61
63
  restProps = _objectWithoutProperties(_ref, _excluded);
62
64
  var _theme$useToken = theme.useToken(),
63
65
  token = _theme$useToken.token;
@@ -67,6 +69,10 @@ var FilterButton = /*#__PURE__*/forwardRef(function (_ref, ref) {
67
69
  _useState2 = _slicedToArray(_useState, 2),
68
70
  open = _useState2[0],
69
71
  setOpen = _useState2[1];
72
+ var _useState3 = useState(),
73
+ _useState4 = _slicedToArray(_useState3, 2),
74
+ popoverWidth = _useState4[0],
75
+ setPopoverWidth = _useState4[1];
70
76
  var _useFilterStyle = useFilterStyle(),
71
77
  wrapSSR = _useFilterStyle.wrapSSR,
72
78
  prefixCls = _useFilterStyle.prefixCls;
@@ -97,11 +103,26 @@ var FilterButton = /*#__PURE__*/forwardRef(function (_ref, ref) {
97
103
  var handleOpenChange = function handleOpenChange(newOpen) {
98
104
  if (!disabled) {
99
105
  setOpen(newOpen);
100
- // 调用外部传入的 onOpenChange 回调,让父组件能够实时监听状态变化
101
106
  externalOnOpenChange === null || externalOnOpenChange === void 0 || externalOnOpenChange(newOpen);
102
107
  }
103
108
  };
104
109
 
110
+ // 折叠模式下实时监听按钮宽度变化,同步到 Popover 面板宽度
111
+ useEffect(function () {
112
+ if (!open || !isCollapsed || _isInWrapComponent || !innerRef.current) {
113
+ return;
114
+ }
115
+ var el = innerRef.current;
116
+ setPopoverWidth(el.offsetWidth);
117
+ var observer = new ResizeObserver(function () {
118
+ setPopoverWidth(el.offsetWidth);
119
+ });
120
+ observer.observe(el);
121
+ return function () {
122
+ return observer.disconnect();
123
+ };
124
+ }, [open, isCollapsed, _isInWrapComponent]);
125
+
105
126
  // 使用 useMemo 缓存 content,避免每次都重新创建
106
127
  var popoverContent = useMemo(function () {
107
128
  return /*#__PURE__*/_jsxs(_Fragment, {
@@ -135,11 +156,13 @@ var FilterButton = /*#__PURE__*/forwardRef(function (_ref, ref) {
135
156
  onOpenChange: handleOpenChange,
136
157
  forceRender: _isInWrapComponent,
137
158
  styles: {
138
- body: {
159
+ body: _objectSpread({
139
160
  padding: 0,
140
161
  maxWidth: 300,
141
162
  minWidth: 120
142
- }
163
+ }, isCollapsed && !_isInWrapComponent && popoverWidth ? {
164
+ width: popoverWidth
165
+ } : {})
143
166
  }
144
167
  }, popoverProps), {}, {
145
168
  children: /*#__PURE__*/_jsx("div", {
@@ -175,11 +198,11 @@ var FilterButton = /*#__PURE__*/forwardRef(function (_ref, ref) {
175
198
  }) : showSuffixIcon ? /*#__PURE__*/_jsxs("div", {
176
199
  className: getFilterCls(prefixCls, 'icon-wrapper'),
177
200
  children: [/*#__PURE__*/_jsx(DownOutlined, {
178
- className: selected ? getFilterCls(prefixCls, 'arrow-icon') : '',
201
+ className: selected && allowClear ? getFilterCls(prefixCls, 'arrow-icon') : '',
179
202
  style: disabled ? {
180
203
  color: 'var(--ob-color-icon-disabled)'
181
204
  } : undefined
182
- }), selected && /*#__PURE__*/_jsx("div", {
205
+ }), selected && allowClear && /*#__PURE__*/_jsx("div", {
183
206
  className: getFilterCls(prefixCls, 'clear-icon'),
184
207
  onClick: function onClick(e) {
185
208
  if (!disabled) {
@@ -1,12 +1,13 @@
1
1
  import React from 'react';
2
+ import type { CascaderPanelProps } from 'antd';
2
3
  import type { CascaderOption } from '../../types';
3
4
  import type { FilterButtonRef } from '../../../FilterButton';
4
- interface FlatCascaderContentProps {
5
+ interface FlatCascaderContentProps extends CascaderPanelProps {
5
6
  options: CascaderOption[];
6
- currentValue: string[][];
7
+ currentValue: (string | number)[][];
7
8
  multiple: boolean;
8
9
  filterButtonRef: React.RefObject<FilterButtonRef>;
9
- onValueChange: (value: string[][]) => void;
10
+ onValueChange: (value: (string | number)[][]) => void;
10
11
  }
11
12
  /**
12
13
  * Flat 模式的级联内容容器组件
@@ -1,4 +1,13 @@
1
1
  "use client";
2
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
+ var _excluded = ["options", "currentValue", "filterButtonRef", "multiple", "onValueChange"];
4
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
7
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
8
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
9
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
10
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
2
11
  import React, { useMemo } from 'react';
3
12
  import { Cascader } from 'antd';
4
13
 
@@ -18,7 +27,8 @@ export var FlatCascaderContent = function FlatCascaderContent(_ref) {
18
27
  filterButtonRef = _ref.filterButtonRef,
19
28
  _ref$multiple = _ref.multiple,
20
29
  multiple = _ref$multiple === void 0 ? false : _ref$multiple,
21
- onValueChange = _ref.onValueChange;
30
+ onValueChange = _ref.onValueChange,
31
+ restProps = _objectWithoutProperties(_ref, _excluded);
22
32
  // 将组件内部的值格式转换为 Cascader.Panel 需要的格式
23
33
  // 组件内部:[[parent, child], ...] 或 [[parent, child]]
24
34
  // Cascader.Panel:
@@ -37,7 +47,7 @@ export var FlatCascaderContent = function FlatCascaderContent(_ref) {
37
47
  }, [currentValue, multiple]);
38
48
 
39
49
  // 处理 Cascader.Panel 的值变化
40
- var handleCascaderChange = function handleCascaderChange(value, _selectedOptions) {
50
+ var handleCascaderChange = function handleCascaderChange(value) {
41
51
  if (multiple) {
42
52
  // 多选:value 是 string[][],如 [['frontend', 'react'], ['backend', 'java']]
43
53
  onValueChange(value);
@@ -50,15 +60,19 @@ export var FlatCascaderContent = function FlatCascaderContent(_ref) {
50
60
  };
51
61
 
52
62
  // 使用条件渲染来处理 multiple 属性的类型问题
53
- return multiple ? /*#__PURE__*/_jsx(Cascader.Panel, {
63
+ return multiple ?
64
+ /*#__PURE__*/
65
+ // @ts-ignore-next-line
66
+ _jsx(Cascader.Panel, _objectSpread({
54
67
  options: options,
55
68
  value: cascaderValue,
56
69
  onChange: handleCascaderChange,
57
- multiple: multiple
58
- }) : /*#__PURE__*/_jsx(Cascader.Panel, {
70
+ multiple: multiple,
71
+ showCheckedStrategy: Cascader.SHOW_CHILD
72
+ }, restProps)) : /*#__PURE__*/_jsx(Cascader.Panel, _objectSpread({
59
73
  options: options,
60
74
  value: cascaderValue,
61
75
  onChange: handleCascaderChange,
62
76
  multiple: false
63
- });
77
+ }, restProps));
64
78
  };
@@ -1,8 +1,4 @@
1
1
  "use client";
2
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
5
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
2
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
7
3
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
8
4
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -16,7 +12,6 @@ import theme from "../../../../theme";
16
12
  import Input from "../../../../input";
17
13
  import Empty from "../../../../empty";
18
14
  import { CheckOutlined, CloseOutlined, RightOutlined, SearchOutlined } from '@oceanbase/icons';
19
- import classNames from 'classnames';
20
15
  import { getFilterCls } from "../../../style";
21
16
  import { MAX_HEIGHT, PADDING_VERTICAL, PADDING_HORIZONTAL, GAP_SIZE_SMALL } from "../constants";
22
17
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -133,7 +128,7 @@ export var NormalCascaderContent = function NormalCascaderContent(_ref) {
133
128
  },
134
129
  children: /*#__PURE__*/_jsx(Flex, {
135
130
  gap: GAP_SIZE_SMALL * 2,
136
- className: classNames(getFilterCls(prefixCls, 'select-option'), _defineProperty({}, getFilterCls(prefixCls, 'has-selected'), isNodeSelected)),
131
+ className: getFilterCls(prefixCls, 'select-option'),
137
132
  justify: "space-between",
138
133
  align: "center",
139
134
  onClick: handleNodeClick,
@@ -229,7 +224,7 @@ export var NormalCascaderContent = function NormalCascaderContent(_ref) {
229
224
  },
230
225
  children: /*#__PURE__*/_jsxs(Flex, {
231
226
  gap: GAP_SIZE_SMALL * 2,
232
- className: classNames(getFilterCls(prefixCls, 'select-option'), _defineProperty({}, getFilterCls(prefixCls, 'has-selected'), hasSelectedChildren)),
227
+ className: getFilterCls(prefixCls, 'select-option'),
233
228
  justify: "space-between",
234
229
  align: "center",
235
230
  style: {
@@ -11,6 +11,8 @@ export interface FilterInputProps extends BaseFilterProps {
11
11
  inputProps?: InputProps;
12
12
  /** Switch 组件的额外属性 */
13
13
  switchProps?: SwitchProps;
14
+ /** 是否显示开关,默认为 false */
15
+ showSwitch?: boolean;
14
16
  }
15
17
  declare const FilterInput: FC<FilterInputProps>;
16
18
  export default FilterInput;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
- var _excluded = ["value", "onChange", "icon", "label", "bordered", "inputProps", "switchProps"];
3
+ var _excluded = ["value", "onChange", "icon", "label", "bordered", "inputProps", "switchProps", "showSwitch"];
4
4
  function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure " + obj); }
5
5
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
6
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -36,6 +36,7 @@ var FilterInput = function FilterInput(_ref) {
36
36
  bordered = _ref$bordered === void 0 ? true : _ref$bordered,
37
37
  inputProps = _ref.inputProps,
38
38
  switchProps = _ref.switchProps,
39
+ showSwitch = _ref.showSwitch,
39
40
  restProps = _objectWithoutProperties(_ref, _excluded);
40
41
  var _theme$useToken = theme.useToken(),
41
42
  token = _theme$useToken.token;
@@ -93,14 +94,16 @@ var FilterInput = function FilterInput(_ref) {
93
94
  align: "center",
94
95
  children: [/*#__PURE__*/_jsx("span", {
95
96
  children: label
96
- }), /*#__PURE__*/_jsx(Switch, _objectSpread({
97
+ }), showSwitch && /*#__PURE__*/_jsx(Switch, _objectSpread({
97
98
  checked: switchValue,
98
99
  onChange: function onChange(val) {
99
100
  return setSwitchValue(val);
100
101
  },
101
102
  size: "small"
102
103
  }, switchProps))]
103
- }), switchValue ? /*#__PURE__*/_jsx("div", {
104
+ }), showSwitch ?
105
+ // 有开关:根据 switchValue 决定是否显示 Input
106
+ switchValue && /*#__PURE__*/_jsx("div", {
104
107
  style: {
105
108
  marginTop: 8
106
109
  },
@@ -108,7 +111,18 @@ var FilterInput = function FilterInput(_ref) {
108
111
  value: currentValue,
109
112
  onChange: handleChange
110
113
  }, inputProps))
111
- }) : null]
114
+ }) :
115
+ /*#__PURE__*/
116
+ // 无开关:直接显示 Input
117
+ _jsx("div", {
118
+ style: {
119
+ marginTop: 8
120
+ },
121
+ children: /*#__PURE__*/_jsx(Input, _objectSpread({
122
+ value: currentValue,
123
+ onChange: handleChange
124
+ }, inputProps))
125
+ })]
112
126
  });
113
127
 
114
128
  // 如果处于折叠模式,只渲染内容部分
@@ -0,0 +1,28 @@
1
+ import type { FC, ReactNode } from 'react';
2
+ import type { BaseFilterProps, InternalFilterProps } from '../type';
3
+ export interface FilterSlotProps extends BaseFilterProps, InternalFilterProps {
4
+ /**
5
+ * 直接渲染的自定义内容,不包裹 FilterButton + Popover。
6
+ * Filter.Slot 仅作为响应式收集的包裹容器,
7
+ * 会通过 cloneElement 自动注入 value/onChange。
8
+ */
9
+ children?: ReactNode;
10
+ /**
11
+ * Popover 弹框中的自定义筛选内容。
12
+ * 设置后使用 FilterButton + Popover 模式,
13
+ * 会通过 cloneElement 自动注入 value/onChange。
14
+ */
15
+ dropdownRender?: ReactNode;
16
+ /** 当前筛选值(受控) */
17
+ value?: any;
18
+ /** 默认筛选值(非受控) */
19
+ defaultValue?: any;
20
+ /** 值变化回调 */
21
+ onChange?: (value: any) => void;
22
+ /** 将 value 格式化为展示文本,用于 FilterButton 标签和折叠态 Tooltip */
23
+ formatValue?: (value: any) => string;
24
+ /** 未选值时的占位文本 */
25
+ placeholder?: string;
26
+ }
27
+ declare const FilterSlot: FC<FilterSlotProps>;
28
+ export default FilterSlot;