@kne/react-filter 0.1.28 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,1006 +1,2369 @@
1
- var React = require('react');
2
- var antd = require('antd');
3
- var useEvent = require('@kne/use-event');
4
1
  var classnames = require('classnames');
5
- var reactCitySelect = require('@kne/react-city-select');
6
- var lodash = require('lodash');
7
- var useSimulationBlur = require('@kne/use-simulation-blur');
8
- var moment = require('moment');
2
+ var react = require('react');
3
+ var antd = require('antd');
4
+ var reactIntl = require('@kne/react-intl');
5
+ var get = require('lodash/get');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var clone = require('lodash/clone');
8
+ var reactDom = require('react-dom');
9
+ var isNumber = require('lodash/isNumber');
10
+ var SuperSelect = require('@kne/super-select');
11
+ var superSelectPlus = require('@kne/super-select-plus');
12
+ require('@kne/super-select-plus/dist/index.css');
13
+ var dayjs = require('dayjs');
14
+ var transform = require('lodash/transform');
15
+ var reactRouterDom = require('react-router-dom');
16
+ var isEqual = require('lodash/isEqual');
9
17
 
10
18
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
19
 
12
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
13
- var useEvent__default = /*#__PURE__*/_interopDefaultLegacy(useEvent);
14
20
  var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
15
- var useSimulationBlur__default = /*#__PURE__*/_interopDefaultLegacy(useSimulationBlur);
16
- var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
17
-
18
- var context$1 = React.createContext({});
19
- var Provider$1 = context$1.Provider;
20
- var useConsumer = function useConsumer() {
21
- return React.useContext(context$1);
22
- };
21
+ var get__default = /*#__PURE__*/_interopDefaultLegacy(get);
22
+ var clone__default = /*#__PURE__*/_interopDefaultLegacy(clone);
23
+ var isNumber__default = /*#__PURE__*/_interopDefaultLegacy(isNumber);
24
+ var SuperSelect__default = /*#__PURE__*/_interopDefaultLegacy(SuperSelect);
25
+ var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs);
26
+ var transform__default = /*#__PURE__*/_interopDefaultLegacy(transform);
27
+ var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
23
28
 
24
29
  function _extends() {
25
- _extends = Object.assign ? Object.assign.bind() : function (target) {
26
- for (var i = 1; i < arguments.length; i++) {
27
- var source = arguments[i];
28
-
29
- for (var key in source) {
30
- if (Object.prototype.hasOwnProperty.call(source, key)) {
31
- target[key] = source[key];
32
- }
33
- }
30
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
31
+ for (var e = 1; e < arguments.length; e++) {
32
+ var t = arguments[e];
33
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
34
34
  }
35
-
36
- return target;
37
- };
38
- return _extends.apply(this, arguments);
35
+ return n;
36
+ }, _extends.apply(null, arguments);
39
37
  }
40
-
41
- function _objectWithoutPropertiesLoose(source, excluded) {
42
- if (source == null) return {};
43
- var target = {};
44
- var sourceKeys = Object.keys(source);
45
- var key, i;
46
-
47
- for (i = 0; i < sourceKeys.length; i++) {
48
- key = sourceKeys[i];
49
- if (excluded.indexOf(key) >= 0) continue;
50
- target[key] = source[key];
38
+ function _objectWithoutPropertiesLoose(r, e) {
39
+ if (null == r) return {};
40
+ var t = {};
41
+ for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
42
+ if (-1 !== e.indexOf(n)) continue;
43
+ t[n] = r[n];
51
44
  }
52
-
53
- return target;
45
+ return t;
54
46
  }
55
47
 
56
- var _excluded$9 = ["label", "labelHidden", "isMore", "moreTrigger"];
57
-
58
- var PopContent = function PopContent(props) {
59
- var _useState = React.useState(false),
60
- visible = _useState[0],
61
- setVisible = _useState[1];
62
-
63
- var _useConsumer = useConsumer(),
64
- emitter = _useConsumer.emitter;
65
-
66
- React.useEffect(function () {
67
- emitter.addListener('change', function () {
68
- setVisible(false);
48
+ var style$1 = {"filter":"kne-react-filter_b3gMw","filter-item-icon":"kne-react-filter_e3V6h","filter-item-option-icon":"kne-react-filter_dLoYj","filter-title":"kne-react-filter_khFt2","filter-title-hidden":"kne-react-filter_j2mP1","ad-filter-title":"kne-react-filter_HptIY","ad-filter-line":"kne-react-filter_7Ob6-","filter-line":"kne-react-filter_Y9XTa","clean-btn":"kne-react-filter_CJ935","filter-item":"kne-react-filter_JpaMr","un-expand":"kne-react-filter_LfQME","ad-filter-selected":"kne-react-filter_pBsaE","filter-label":"kne-react-filter_Bx3s8","filter-item-wrap":"kne-react-filter_Co4Pg","option":"kne-react-filter_G1cRp","is-active":"kne-react-filter_Aab98","is-visited":"kne-react-filter_Ww12R","un-expand-shadow":"kne-react-filter_2ExqW","filter-item-label":"kne-react-filter_JAmeE","filter-item-field":"kne-react-filter_WvRvl","filter-drop-tag":"kne-react-filter_dG8rq","filter-list":"kne-react-filter_qlWu6","filter-list-scroll-wrap":"kne-react-filter_oaIF4","filter-list-scroll":"kne-react-filter_Jq43Q","filter-scroll-next":"kne-react-filter_BdfSI","filter-list-tag":"kne-react-filter_LV2VI","filter-tag":"kne-react-filter_yyR3u","filter-tag-value":"kne-react-filter_8nm8n","filter-value-tag":"kne-react-filter_tWyCr","filter-value-tag-label":"kne-react-filter_XPzrL","filter-value-tag-content":"kne-react-filter_6e79l","pop-util-content":"kne-react-filter_g-hXk","pop-util-body":"kne-react-filter_4n4MP","date-range-picker-popup":"kne-react-filter_6Zx60","pop-util-overlay":"kne-react-filter_m7Csi","pop-util-mask":"kne-react-filter_o2B3k","pop-util-mask-fade-in":"kne-react-filter_oCXiX","pop-util-mask-leave":"kne-react-filter_qGnRO","pop-util-mask-fade-out":"kne-react-filter_cDx1y","field-item-mobile-popup":"kne-react-filter_wq5nf","pop-util-mobile-expand-down":"kne-react-filter_6RxjE","date-picker-popup":"kne-react-filter_iwLs2","pop-util-mobile-collapse-up":"kne-react-filter_009r-","pop-util-footer":"kne-react-filter_iqe8W","pop-util-text":"kne-react-filter_72gGQ","filter-item-inner":"kne-react-filter_cYX12","filter-item-text":"kne-react-filter_cnMY-","filter-item-number-range":"kne-react-filter_Cv2Bw","filter-item-custom":"kne-react-filter_CBczA","filter-item-custom-active":"kne-react-filter_ldxUR","filter-item-number-range-split":"kne-react-filter_4p3C9","filter-item-number-input":"kne-react-filter_yy1y1","range-picker":"kne-react-filter_81zQn","cascader-select-wrap":"kne-react-filter_UHBfi","cascader-dropdown-menu":"kne-react-filter_bY8JQ","filter-advanced":"kne-react-filter_rg45N","filter-advanced-item-other":"kne-react-filter_HcsA8","filter-advanced-item-other-inner":"kne-react-filter_4Bqtz","filter-advanced-more":"kne-react-filter_jVH7z","filter-scroll-next-icon":"kne-react-filter_Fd6ab"};
49
+
50
+ const context = /*#__PURE__*/react.createContext({});
51
+ const Provider = context.Provider;
52
+ const useContext = () => react.useContext(context);
53
+
54
+ const Line$1 = _ref => {
55
+ let list = _ref.list,
56
+ children = _ref.children;
57
+ const _useContext = useContext(),
58
+ value = _useContext.value,
59
+ onChange = _useContext.onChange;
60
+ return /*#__PURE__*/jsxRuntime.jsxs("div", {
61
+ className: style$1['filter-line'],
62
+ children: [list.filter(item => !!item.type).map((item, index) => {
63
+ if (typeof item === 'function') {
64
+ return item(props => {
65
+ return {
66
+ index,
67
+ value: value ? get__default["default"](value.get(props == null ? void 0 : props.name), 'value') : props == null ? void 0 : props.value,
68
+ onChange: onChange ? value => onChange({
69
+ name: props == null ? void 0 : props.name,
70
+ label: props == null ? void 0 : props.label,
71
+ value
72
+ }) : props == null ? void 0 : props.onChange
73
+ };
74
+ });
75
+ }
76
+ const ComponentItem = item.type;
77
+ return /*#__PURE__*/react.createElement(ComponentItem, _extends({}, Object.assign({}, item.props, {
78
+ value: value ? get__default["default"](value.get(item.props.name), 'value') : item.props.value,
79
+ onChange: onChange ? value => onChange({
80
+ name: item.props.name,
81
+ label: item.props.label,
82
+ value
83
+ }) : item.props.onChange
84
+ }), {
85
+ key: item.key || item.props.name || index
86
+ }));
87
+ }), children]
88
+ });
89
+ };
90
+ const FilterLines = _ref2 => {
91
+ let className = _ref2.className,
92
+ _ref2$list = _ref2.list,
93
+ list = _ref2$list === void 0 ? [] : _ref2$list,
94
+ _ref2$displayLine = _ref2.displayLine,
95
+ displayLine = _ref2$displayLine === void 0 ? 1 : _ref2$displayLine,
96
+ label = _ref2.label,
97
+ extra = _ref2.extra,
98
+ children = _ref2.children;
99
+ const hasMore = list.length > displayLine;
100
+ const mobileList = list.reduce((result, item) => result.concat(Array.isArray(item) ? item : [item]), []);
101
+ const _useState = react.useState(false),
102
+ isExpand = _useState[0],
103
+ setIsExpand = _useState[1];
104
+ const _useState2 = react.useState(false),
105
+ isMobile = _useState2[0],
106
+ setIsMobile = _useState2[1];
107
+ const _useState3 = react.useState(false),
108
+ showScrollNext = _useState3[0],
109
+ setShowScrollNext = _useState3[1];
110
+ const scrollRef = react.useRef(null);
111
+ const _useIntl = reactIntl.useIntl({
112
+ moduleName: 'Filter'
113
+ }),
114
+ formatMessage = _useIntl.formatMessage;
115
+ const updateScrollNextVisible = react.useCallback(() => {
116
+ const el = scrollRef.current;
117
+ if (!el) {
118
+ setShowScrollNext(false);
119
+ return;
120
+ }
121
+ setShowScrollNext(el.scrollWidth > el.clientWidth && el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
122
+ }, []);
123
+ react.useEffect(() => {
124
+ if (typeof window === 'undefined') return;
125
+ const mediaQuery = window.matchMedia('(max-width: 768px)');
126
+ const updateIsMobile = () => {
127
+ setIsMobile(mediaQuery.matches);
128
+ };
129
+ updateIsMobile();
130
+ mediaQuery.addEventListener ? mediaQuery.addEventListener('change', updateIsMobile) : mediaQuery.addListener(updateIsMobile);
131
+ return () => {
132
+ mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', updateIsMobile) : mediaQuery.removeListener(updateIsMobile);
133
+ };
134
+ }, []);
135
+ react.useEffect(() => {
136
+ if (!isMobile) {
137
+ setShowScrollNext(false);
138
+ return;
139
+ }
140
+ const el = scrollRef.current;
141
+ if (!el) return;
142
+ updateScrollNextVisible();
143
+ const update = () => {
144
+ updateScrollNextVisible();
145
+ };
146
+ el.addEventListener('scroll', update);
147
+ window.addEventListener('resize', update);
148
+ const rafId = window.requestAnimationFrame(update);
149
+ return () => {
150
+ el.removeEventListener('scroll', update);
151
+ window.removeEventListener('resize', update);
152
+ window.cancelAnimationFrame(rafId);
153
+ };
154
+ }, [isMobile, list, updateScrollNextVisible]);
155
+ const scrollToNext = react.useCallback(() => {
156
+ const el = scrollRef.current;
157
+ if (!el) return;
158
+ el.scrollTo({
159
+ left: el.scrollLeft + el.clientWidth * 0.8,
160
+ behavior: 'smooth'
69
161
  });
70
162
  }, []);
71
- return /*#__PURE__*/React__default["default"].createElement(antd.Popover, _extends({}, props, {
72
- visible: visible,
73
- onVisibleChange: setVisible
74
- }));
163
+ const scrollItemIntoView = react.useCallback(e => {
164
+ if (!isMobile) return;
165
+ const container = scrollRef.current;
166
+ const item = e.target.closest("." + style$1['filter-item-wrap']) || e.target.closest("." + style$1['filter-item']);
167
+ if (!container || !item) return;
168
+ item.scrollIntoView({
169
+ behavior: 'smooth',
170
+ block: 'nearest',
171
+ inline: 'center'
172
+ });
173
+ }, [isMobile]);
174
+ return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
175
+ children: [/*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
176
+ className: classnames__default["default"](style$1['filter-title'], 'filter-title', className),
177
+ align: "top",
178
+ size: 16,
179
+ children: [/*#__PURE__*/jsxRuntime.jsx("span", {
180
+ className: style$1['filter-label'],
181
+ children: list && list.length > 0 && (label || formatMessage({
182
+ id: 'filterText'
183
+ }))
184
+ }), /*#__PURE__*/jsxRuntime.jsxs(antd.Row, {
185
+ justify: "space-between",
186
+ wrap: false,
187
+ align: "top",
188
+ children: [/*#__PURE__*/jsxRuntime.jsx(antd.Col, {
189
+ className: style$1['filter-list'],
190
+ flex: 1,
191
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
192
+ className: style$1['filter-list-scroll-wrap'],
193
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
194
+ className: style$1['filter-list-scroll'],
195
+ ref: scrollRef,
196
+ onClick: scrollItemIntoView,
197
+ children: (isMobile ? mobileList : list.slice(0, displayLine)).map((item, index) => /*#__PURE__*/jsxRuntime.jsx(Line$1, {
198
+ list: isMobile ? [item] : item,
199
+ children: !isMobile && hasMore && isExpand === false && index === displayLine - 1 ? /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
200
+ size: 4,
201
+ className: classnames__default["default"](style$1['filter-item'], style$1['option']),
202
+ onClick: () => {
203
+ setIsExpand(value => !value);
204
+ },
205
+ children: [formatMessage({
206
+ id: 'moreText'
207
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
208
+ className: style$1['filter-item-option-icon'],
209
+ children: "\u25BC"
210
+ })]
211
+ }) : null
212
+ }, index))
213
+ }), isMobile && showScrollNext ? /*#__PURE__*/jsxRuntime.jsx("button", {
214
+ type: "button",
215
+ className: style$1['filter-scroll-next'],
216
+ onClick: scrollToNext,
217
+ "aria-label": "scroll next",
218
+ children: /*#__PURE__*/jsxRuntime.jsx("span", {
219
+ className: style$1['filter-scroll-next-icon'],
220
+ children: "\u203A"
221
+ })
222
+ }) : null]
223
+ })
224
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.Col, {
225
+ children: extra
226
+ })]
227
+ })]
228
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.Space, {
229
+ className: classnames__default["default"](style$1['filter-title'], 'filter-title-wrap'),
230
+ align: "center",
231
+ size: 16,
232
+ children: children
233
+ }), /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
234
+ className: classnames__default["default"](style$1['filter-title'], 'filter-title-wrap', {
235
+ [style$1['filter-title-hidden']]: isMobile || !(hasMore && isExpand)
236
+ }),
237
+ align: "top",
238
+ size: 16,
239
+ children: [/*#__PURE__*/jsxRuntime.jsx("span", {
240
+ className: style$1['filter-label'],
241
+ children: formatMessage({
242
+ id: 'moreText'
243
+ })
244
+ }), /*#__PURE__*/jsxRuntime.jsx("div", {
245
+ className: style$1['filter-list'],
246
+ children: list.slice(displayLine).map((item, index) => /*#__PURE__*/jsxRuntime.jsx(Line$1, {
247
+ list: item,
248
+ children: index === list.length - displayLine - 1 && /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
249
+ children: [/*#__PURE__*/jsxRuntime.jsx(antd.Space, {
250
+ size: 4,
251
+ className: classnames__default["default"](style$1['un-expand-shadow']),
252
+ children: /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
253
+ size: 4,
254
+ className: classnames__default["default"](style$1['option'], style$1['filter-item']),
255
+ children: [formatMessage({
256
+ id: 'toggleUpText'
257
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
258
+ className: style$1['filter-item-option-icon'],
259
+ children: "\u25B2"
260
+ })]
261
+ })
262
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.Space, {
263
+ size: 4,
264
+ className: classnames__default["default"](style$1['un-expand']),
265
+ onClick: () => {
266
+ setIsExpand(value => !value);
267
+ },
268
+ children: /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
269
+ size: 4,
270
+ className: classnames__default["default"](style$1['option'], style$1['filter-item']),
271
+ children: [formatMessage({
272
+ id: 'toggleUpText'
273
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
274
+ className: style$1['filter-item-option-icon'],
275
+ children: "\u25B2"
276
+ })]
277
+ })
278
+ })]
279
+ })
280
+ }, index))
281
+ })]
282
+ })]
283
+ });
75
284
  };
76
285
 
77
- var FilterItem = function FilterItem(_ref) {
78
- var className = _ref.className,
79
- label = _ref.label,
80
- labelHidden = _ref.labelHidden,
81
- isMore = _ref.isMore,
82
- moreTrigger = _ref.moreTrigger,
83
- onClick = _ref.onClick,
84
- children = _ref.children;
85
-
86
- if (isMore) {
87
- return /*#__PURE__*/React__default["default"].createElement("div", {
88
- className: classnames__default["default"]("react-filter-item-label", "is-more", className)
89
- }, children ? /*#__PURE__*/React__default["default"].createElement(PopContent, {
90
- content: children,
91
- trigger: moreTrigger,
92
- placement: "bottom",
93
- overlayClassName: "react-filter-item-popover"
94
- }, /*#__PURE__*/React__default["default"].createElement("a", {
95
- className: "react-filter-item-more"
96
- }, label)) : /*#__PURE__*/React__default["default"].createElement("a", {
97
- className: "react-filter-item-more",
98
- onClick: onClick
99
- }, label));
100
- }
101
-
102
- return /*#__PURE__*/React__default["default"].createElement(antd.Space, {
103
- className: classnames__default["default"]('react-filter-item', className)
104
- }, labelHidden ? null : /*#__PURE__*/React__default["default"].createElement("div", {
105
- className: "react-filter-item-label"
106
- }, label, ":"), /*#__PURE__*/React__default["default"].createElement("div", {
107
- className: "react-filter-item-children"
108
- }, children));
286
+ const message$1 = {
287
+ filterText: '筛选',
288
+ moreText: '更多',
289
+ selectedText: '您已选择',
290
+ clearAllText: '清空全部',
291
+ toggleUpText: '收起',
292
+ selectedTextAdvanced: '已选',
293
+ clearText: '清空筛选',
294
+ otherText: '其他',
295
+ cancelText: '取消',
296
+ determineText: '确定',
297
+ year: '年',
298
+ over: '{count}{unit}以上',
299
+ lessThan: '{count}{unit}以下',
300
+ inputPlaceholder: '请输入{label}',
301
+ pleaseInput: '请输入',
302
+ defaultInputPlaceholder: '请输入{label}',
303
+ maxSelectedCount: '最多选择{count}项',
304
+ customTime: '自定义时间',
305
+ monthly: '按月',
306
+ weekly: '按周',
307
+ last7Days: '近7天',
308
+ thisMonth: '本月',
309
+ last3Months: '近三个月',
310
+ thisYear: '当年',
311
+ fullYear: '本年度',
312
+ pleaseSelect: '请选择'
109
313
  };
110
314
 
111
- var withFilterItem = function withFilterItem(WrappedComponent) {
112
- return function (_ref2) {
113
- var label = _ref2.label,
114
- labelHidden = _ref2.labelHidden,
115
- isMore = _ref2.isMore,
116
- moreTrigger = _ref2.moreTrigger,
117
- props = _objectWithoutPropertiesLoose(_ref2, _excluded$9);
118
-
119
- return /*#__PURE__*/React__default["default"].createElement(FilterItem, {
120
- label: label,
121
- labelHidden: labelHidden,
122
- isMore: isMore,
123
- moreTrigger: moreTrigger
124
- }, /*#__PURE__*/React__default["default"].createElement(WrappedComponent, _extends({}, props, {
125
- label: label,
126
- isMore: isMore
127
- })));
128
- };
315
+ const message = {
316
+ filterText: 'Filter',
317
+ moreText: 'More',
318
+ selectedText: 'Selected',
319
+ clearAllText: 'Clear All',
320
+ toggleUpText: 'Pack Up',
321
+ selectedTextAdvanced: 'Selected',
322
+ clearText: 'Clear Filter',
323
+ otherText: 'Other',
324
+ cancelText: 'Cancel',
325
+ determineText: 'Determine',
326
+ year: 'year',
327
+ over: 'over {count} {unit}s',
328
+ lessThan: 'less than {count} {unit}s',
329
+ inputPlaceholder: 'Please enter {label}',
330
+ pleaseInput: 'Please enter ',
331
+ defaultInputPlaceholder: 'Please enter {label}',
332
+ maxSelectedCount: 'Select up to {count} items',
333
+ customTime: 'Custom Time',
334
+ monthly: 'Monthly',
335
+ weekly: 'Weekly',
336
+ last7Days: 'Last 7 Days',
337
+ thisMonth: 'This Month',
338
+ last3Months: 'Last 3 Months',
339
+ thisYear: 'Year to Date',
340
+ fullYear: 'Full Year',
341
+ pleaseSelect: 'Please Select'
129
342
  };
130
343
 
131
- var _excluded$8 = ["value", "label"];
132
- var CheckableTag = antd.Tag.CheckableTag;
133
- var context = React.createContext({});
134
- var Provider = context.Provider;
135
-
136
- var List = function List(_ref) {
137
- var label = _ref.label,
138
- labelHidden = _ref.labelHidden,
139
- name = _ref.name,
140
- size = _ref.size,
141
- children = _ref.children,
142
- options = _ref.options,
143
- more = _ref.more;
344
+ const withLocale = reactIntl.createWithIntlProvider({
345
+ defaultLocale: 'zh-CN',
346
+ messages: {
347
+ 'zh-CN': message$1,
348
+ 'en-US': message
349
+ },
350
+ namespace: 'react-filter'
351
+ });
144
352
 
145
- var _useConsumer = useConsumer(),
146
- value = _useConsumer.value,
147
- onChange = _useConsumer.onChange;
353
+ const FilterValueDisplay = withLocale(_ref => {
354
+ let filterValue = _ref.value,
355
+ extraExpand = _ref.extraExpand,
356
+ onChange = _ref.onChange;
357
+ const _useIntl = reactIntl.useIntl({
358
+ moduleName: 'Filter'
359
+ }),
360
+ formatMessage = _useIntl.formatMessage;
361
+ return /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
362
+ className: style$1['filter-title'],
363
+ align: "top",
364
+ size: 16,
365
+ children: [/*#__PURE__*/jsxRuntime.jsx("span", {
366
+ className: style$1['filter-label'],
367
+ children: formatMessage({
368
+ id: 'selectedText'
369
+ })
370
+ }), /*#__PURE__*/jsxRuntime.jsxs("div", {
371
+ className: style$1['filter-line'],
372
+ children: [filterValue.map((_ref2, index) => {
373
+ let name = _ref2.name,
374
+ label = _ref2.label,
375
+ value = _ref2.value;
376
+ const valueLabel = Array.isArray(value) ? value.map(item => item.label).join(',') : value == null ? void 0 : value.label;
377
+ return /*#__PURE__*/jsxRuntime.jsxs(antd.Tag, {
378
+ closable: true,
379
+ className: style$1['filter-value-tag'],
380
+ onClose: () => {
381
+ const newValue = filterValue.slice(0);
382
+ newValue.splice(index, 1);
383
+ onChange(newValue);
384
+ },
385
+ children: [/*#__PURE__*/jsxRuntime.jsxs("span", {
386
+ className: style$1['filter-value-tag-label'],
387
+ children: [label, ":"]
388
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
389
+ className: style$1['filter-value-tag-content'],
390
+ children: valueLabel
391
+ })]
392
+ }, name);
393
+ }), /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
394
+ size: 4,
395
+ className: classnames__default["default"](style$1['un-expand-shadow']),
396
+ children: [extraExpand, /*#__PURE__*/jsxRuntime.jsx(antd.Button, {
397
+ size: "small",
398
+ children: formatMessage({
399
+ id: 'clearAllText'
400
+ })
401
+ })]
402
+ }), /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
403
+ size: 4,
404
+ className: classnames__default["default"](style$1['un-expand']),
405
+ children: [extraExpand, /*#__PURE__*/jsxRuntime.jsx(antd.Button, {
406
+ size: "small",
407
+ onClick: () => {
408
+ onChange([]);
409
+ },
410
+ children: formatMessage({
411
+ id: 'clearAllText'
412
+ })
413
+ })]
414
+ })]
415
+ })]
416
+ });
417
+ });
148
418
 
149
- var currentValue = function () {
150
- var originValue = lodash.get(value, name);
419
+ const isNotEmpty$2 = value => {
420
+ if (value === null || value === undefined) return false;
421
+ if (typeof value === 'string' && value.trim() === '') return false;
422
+ if (Array.isArray(value) && value.length === 0) return false;
423
+ return true;
424
+ };
425
+ const FilterProvider = _ref => {
426
+ let children = _ref.children,
427
+ valueBase = _ref.value,
428
+ onChange = _ref.onChange,
429
+ _ref$defaultValue = _ref.defaultValue,
430
+ defaultValue = _ref$defaultValue === void 0 ? [] : _ref$defaultValue;
431
+ const value = react.useMemo(() => {
432
+ return (valueBase || defaultValue).filter(item => isNotEmpty$2(item.value));
433
+ }, [valueBase, defaultValue]);
434
+ const filterValue = react.useMemo(() => {
435
+ return new Map(value.map(item => [item.name, item]));
436
+ }, [value]);
437
+ return /*#__PURE__*/jsxRuntime.jsx(Provider, {
438
+ value: {
439
+ value: filterValue,
440
+ onChange: item => {
441
+ const newFilterValue = clone__default["default"](filterValue);
442
+ item.value ? newFilterValue.set(item.name, item) : newFilterValue.delete(item.name);
443
+ onChange == null || onChange(Array.from(newFilterValue.values()));
444
+ }
445
+ },
446
+ children: typeof children === 'function' ? children({
447
+ value,
448
+ onChange
449
+ }) : children
450
+ });
451
+ };
151
452
 
152
- if (size === 1) {
153
- return originValue !== void 0 ? [originValue] : [];
154
- } else {
155
- return originValue || [];
156
- }
157
- }();
453
+ const FilterOuter = ({
454
+ children,
455
+ className,
456
+ ...props
457
+ }) => {
458
+ return /*#__PURE__*/jsxRuntime.jsx(FilterProvider, {
459
+ ...props,
460
+ children: context => /*#__PURE__*/jsxRuntime.jsx("div", {
461
+ className: classnames__default["default"](style$1['filter'], 'filter', className),
462
+ children: children({
463
+ ...context,
464
+ props
465
+ })
466
+ })
467
+ });
468
+ };
158
469
 
159
- var changeHandler = function changeHandler(value) {
160
- if (size === 1) {
161
- return onChange(name, value[0]);
162
- } else {
163
- return onChange(name, value);
470
+ const _excluded$7 = ["defaultValue"],
471
+ _excluded2 = ["extraExpand"];
472
+ const Filter = withLocale(_ref => {
473
+ let _ref$defaultValue = _ref.defaultValue,
474
+ defaultValue = _ref$defaultValue === void 0 ? [] : _ref$defaultValue,
475
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$7);
476
+ return /*#__PURE__*/jsxRuntime.jsx(FilterOuter, _extends({}, props, {
477
+ defaultValue: defaultValue,
478
+ children: _ref2 => {
479
+ let _ref2$props = _ref2.props,
480
+ filterProps = _ref2$props === void 0 ? {} : _ref2$props,
481
+ value = _ref2.value,
482
+ onChange = _ref2.onChange;
483
+ const extraExpand = filterProps.extraExpand,
484
+ others = _objectWithoutPropertiesLoose(filterProps, _excluded2);
485
+ return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
486
+ children: [/*#__PURE__*/jsxRuntime.jsx(FilterLines, _extends({}, others)), value && value.length > 0 && /*#__PURE__*/jsxRuntime.jsx(FilterValueDisplay, {
487
+ value: value,
488
+ onChange: onChange,
489
+ extraExpand: extraExpand
490
+ })]
491
+ });
164
492
  }
165
- };
166
-
167
- var createCheckedChangeHandler = function createCheckedChangeHandler(value) {
168
- return function (checked) {
169
- if (checked) {
170
- var newList = currentValue.slice(0);
171
-
172
- if (currentValue.length < size) {
173
- newList.push(value);
174
- }
175
-
176
- if (currentValue.length === size && size === 1) {
177
- newList = [value];
178
- }
179
-
180
- if (currentValue.length >= size && size > 1) {
181
- antd.message.error("\u6700\u591A\u9009\u62E9" + size + "\u4E2A");
182
- return;
183
- }
184
-
185
- changeHandler(newList);
186
- } else {
187
- var _newList = currentValue.slice(0);
493
+ }));
494
+ });
188
495
 
189
- _newList.splice(lodash.findIndex(currentValue, function (item) {
190
- return item.value === value.value;
191
- }), 1);
496
+ const FilterItem = withLocale(_ref => {
497
+ let open = _ref.open,
498
+ active = _ref.active,
499
+ label = _ref.label,
500
+ children = _ref.children;
501
+ return /*#__PURE__*/jsxRuntime.jsx(antd.Space, {
502
+ className: style$1['filter-item-wrap'],
503
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
504
+ className: classnames__default["default"](style$1['filter-item'], {
505
+ [style$1['is-active']]: active,
506
+ [style$1['is-visited']]: open
507
+ }),
508
+ children: [/*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
509
+ className: style$1['filter-item-label'],
510
+ size: 4,
511
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
512
+ children: label
513
+ }), /*#__PURE__*/jsxRuntime.jsx("span", {
514
+ className: style$1['filter-item-icon'],
515
+ children: "\u25BC"
516
+ })]
517
+ }), /*#__PURE__*/jsxRuntime.jsx("div", {
518
+ className: style$1['filter-item-field'],
519
+ children: children
520
+ })]
521
+ })
522
+ });
523
+ });
192
524
 
193
- changeHandler(_newList);
525
+ const _excluded$6 = ["value", "onChange", "interceptor", "label", "render"];
526
+ const isNotEmpty$1 = value => {
527
+ if (value === null || value === undefined) return false;
528
+ if (typeof value === 'string' && value.trim() === '') return false;
529
+ return !(Array.isArray(value) && value.length === 0);
530
+ };
531
+ const MASK_ANIMATION_DURATION$1 = 180;
532
+ const FIELD_MOBILE_POPUP_CLASS = 'react-filter-field-mobile-popup';
533
+ const MOBILE_POPUP_OFFSET$1 = 4;
534
+ const withFieldItem = function (WrappedComponent, options) {
535
+ if (options === void 0) {
536
+ options = {};
537
+ }
538
+ return _ref => {
539
+ let value = _ref.value,
540
+ onChange = _ref.onChange,
541
+ interceptor = _ref.interceptor,
542
+ label = _ref.label,
543
+ render = _ref.render,
544
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$6);
545
+ const _useState = react.useState(false),
546
+ open = _useState[0],
547
+ setOpen = _useState[1];
548
+ const _useState2 = react.useState(false),
549
+ isMobile = _useState2[0],
550
+ setIsMobile = _useState2[1];
551
+ const _useState3 = react.useState(false),
552
+ renderMask = _useState3[0],
553
+ setRenderMask = _useState3[1];
554
+ const _useState4 = react.useState(false),
555
+ maskClosing = _useState4[0],
556
+ setMaskClosing = _useState4[1];
557
+ const _useState5 = react.useState({
558
+ top: 0,
559
+ pageTop: 0,
560
+ height: 0
561
+ }),
562
+ popupMetrics = _useState5[0],
563
+ setPopupMetrics = _useState5[1];
564
+ const triggerRef = react.useRef(null);
565
+ const setMobilePopupVariables = react.useCallback(metrics => {
566
+ if (typeof document === 'undefined') return;
567
+ document.body.style.setProperty('--react-filter-field-mobile-height', metrics.height + "px");
568
+ document.body.style.setProperty('--react-filter-popover-mobile-height', metrics.height + "px");
569
+ document.body.style.setProperty('--react-filter-field-mobile-top', metrics.pageTop + "px");
570
+ }, []);
571
+ const updatePopupMetrics = react.useCallback(() => {
572
+ if (typeof window === 'undefined' || !triggerRef.current) return;
573
+ const rect = triggerRef.current.getBoundingClientRect();
574
+ const top = Math.max(rect.bottom + MOBILE_POPUP_OFFSET$1, 0);
575
+ const metrics = {
576
+ top,
577
+ pageTop: top + window.scrollY,
578
+ height: Math.max(window.innerHeight - top, 0)
579
+ };
580
+ setPopupMetrics(metrics);
581
+ setMobilePopupVariables(metrics);
582
+ }, [setMobilePopupVariables]);
583
+ react.useEffect(() => {
584
+ if (typeof window === 'undefined') return;
585
+ const mediaQuery = window.matchMedia('(max-width: 768px)');
586
+ const updateIsMobile = () => {
587
+ setIsMobile(mediaQuery.matches);
588
+ };
589
+ updateIsMobile();
590
+ mediaQuery.addEventListener ? mediaQuery.addEventListener('change', updateIsMobile) : mediaQuery.addListener(updateIsMobile);
591
+ return () => {
592
+ mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', updateIsMobile) : mediaQuery.removeListener(updateIsMobile);
593
+ };
594
+ }, []);
595
+ react.useEffect(() => {
596
+ if (!open || !isMobile) return;
597
+ updatePopupMetrics();
598
+ window.addEventListener('resize', updatePopupMetrics);
599
+ window.addEventListener('scroll', updatePopupMetrics, true);
600
+ return () => {
601
+ window.removeEventListener('resize', updatePopupMetrics);
602
+ window.removeEventListener('scroll', updatePopupMetrics, true);
603
+ };
604
+ }, [isMobile, open, updatePopupMetrics]);
605
+ react.useEffect(() => {
606
+ if (typeof document === 'undefined' || !isMobile || popupMetrics.height <= 0) return;
607
+ setMobilePopupVariables(popupMetrics);
608
+ return () => {
609
+ document.body.style.removeProperty('--react-filter-field-mobile-height');
610
+ document.body.style.removeProperty('--react-filter-popover-mobile-height');
611
+ document.body.style.removeProperty('--react-filter-field-mobile-top');
612
+ };
613
+ }, [isMobile, popupMetrics, setMobilePopupVariables]);
614
+ react.useEffect(() => {
615
+ if (open && isMobile) {
616
+ setRenderMask(true);
617
+ setMaskClosing(false);
618
+ return;
194
619
  }
620
+ if (!renderMask) return;
621
+ setMaskClosing(true);
622
+ const timer = setTimeout(() => {
623
+ setRenderMask(false);
624
+ setMaskClosing(false);
625
+ }, MASK_ANIMATION_DURATION$1);
626
+ return () => {
627
+ clearTimeout(timer);
628
+ };
629
+ }, [isMobile, open, renderMask]);
630
+ const closeFieldItem = react.useCallback(() => {
631
+ setOpen(false);
632
+ props.onOpenChange && props.onOpenChange(false);
633
+ props.onDropdownVisibleChange && props.onDropdownVisibleChange(false);
634
+ }, [props]);
635
+ const handleOpenChange = react.useCallback(open => {
636
+ if (open && isMobile) {
637
+ updatePopupMetrics();
638
+ }
639
+ setOpen(open);
640
+ props.onOpenChange && props.onOpenChange(open);
641
+ props.onDropdownVisibleChange && props.onDropdownVisibleChange(open);
642
+ }, [isMobile, props, updatePopupMetrics]);
643
+ const mobilePopupStyle = isMobile ? {
644
+ '--react-filter-field-mobile-height': popupMetrics.height + "px",
645
+ '--react-filter-popover-mobile-height': popupMetrics.height + "px",
646
+ '--react-filter-field-mobile-top': popupMetrics.pageTop + "px",
647
+ top: popupMetrics.pageTop,
648
+ left: 0
649
+ } : undefined;
650
+ const mergePopupClassNames = classNames => {
651
+ var _classNames$popup;
652
+ if (!isMobile) return classNames;
653
+ return Object.assign({}, classNames, {
654
+ popup: Object.assign({}, classNames == null ? void 0 : classNames.popup, {
655
+ root: classnames__default["default"](classNames == null || (_classNames$popup = classNames.popup) == null ? void 0 : _classNames$popup.root, style$1['field-item-mobile-popup'], FIELD_MOBILE_POPUP_CLASS)
656
+ })
657
+ });
658
+ };
659
+ const mergePopupStyles = styles => {
660
+ var _styles$popup;
661
+ if (!isMobile) return styles;
662
+ return Object.assign({}, styles, {
663
+ popup: Object.assign({}, styles == null ? void 0 : styles.popup, {
664
+ root: Object.assign({}, styles == null || (_styles$popup = styles.popup) == null ? void 0 : _styles$popup.root, mobilePopupStyle)
665
+ })
666
+ });
195
667
  };
668
+ const renderChildren = otherProps => /*#__PURE__*/jsxRuntime.jsx(WrappedComponent, _extends({
669
+ allowClear: false
670
+ }, Object.assign({}, props, otherProps), {
671
+ className: style$1['filter-item-inner'],
672
+ value: typeof (interceptor == null ? void 0 : interceptor.input) === 'function' ? interceptor.input(value) : value,
673
+ onChange: typeof (interceptor == null ? void 0 : interceptor.output) === 'function' ? function () {
674
+ return onChange(interceptor.output(...[].slice.call(arguments)));
675
+ } : onChange,
676
+ valueType: "all",
677
+ onOpenChange: handleOpenChange,
678
+ onDropdownVisibleChange: handleOpenChange,
679
+ popupClassName: classnames__default["default"](props.popupClassName, isMobile && style$1['field-item-mobile-popup'], isMobile && FIELD_MOBILE_POPUP_CLASS),
680
+ dropdownClassName: classnames__default["default"](props.dropdownClassName, isMobile && style$1['field-item-mobile-popup'], isMobile && FIELD_MOBILE_POPUP_CLASS),
681
+ overlayClassName: classnames__default["default"](props.overlayClassName, isMobile && style$1['field-item-mobile-popup'], isMobile && FIELD_MOBILE_POPUP_CLASS),
682
+ overlayStyle: Object.assign({}, props.overlayStyle, mobilePopupStyle),
683
+ popupStyle: Object.assign({}, props.popupStyle, mobilePopupStyle),
684
+ dropdownStyle: Object.assign({}, props.dropdownStyle, mobilePopupStyle),
685
+ classNames: mergePopupClassNames(props.classNames),
686
+ styles: mergePopupStyles(props.styles),
687
+ transitionName: isMobile ? '' : props.transitionName,
688
+ autoAdjustOverflow: isMobile ? false : props.autoAdjustOverflow,
689
+ align: isMobile ? {
690
+ offset: [0, 0]
691
+ } : props.align,
692
+ isPopup: options.forcePopup ? true : props.isPopup,
693
+ overlayWidth: isMobile && options.forcePopup ? typeof window === 'undefined' ? props.overlayWidth : window.innerWidth : props.overlayWidth
694
+ }));
695
+ return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
696
+ children: [renderMask && typeof document !== 'undefined' && /*#__PURE__*/reactDom.createPortal(/*#__PURE__*/jsxRuntime.jsx("div", {
697
+ className: classnames__default["default"](style$1['pop-util-mask'], maskClosing && style$1['pop-util-mask-leave']),
698
+ style: {
699
+ top: popupMetrics.top,
700
+ height: popupMetrics.height
701
+ },
702
+ onClick: closeFieldItem
703
+ }), document.body), /*#__PURE__*/jsxRuntime.jsx("span", {
704
+ ref: triggerRef,
705
+ children: /*#__PURE__*/jsxRuntime.jsx(FilterItem, {
706
+ label: label,
707
+ open: open,
708
+ active: isNotEmpty$1(value),
709
+ children: typeof render === 'function' ? render({
710
+ children: renderChildren
711
+ }) : renderChildren()
712
+ })
713
+ })]
714
+ });
196
715
  };
716
+ };
197
717
 
198
- var computedChildren = function () {
199
- if (Array.isArray(options)) {
200
- return options.map(function (_ref2) {
201
- var label = _ref2.label,
202
- value = _ref2.value;
203
- return /*#__PURE__*/React__default["default"].createElement(List.Item, {
204
- key: value,
205
- value: value,
206
- label: label
207
- });
208
- });
718
+ const isNotEmpty = value => {
719
+ if (value === null || value === undefined) return false;
720
+ if (typeof value === 'string' && value.trim() === '') return false;
721
+ if (Array.isArray(value) && value.length === 0) return false;
722
+ return true;
723
+ };
724
+ const MASK_ANIMATION_DURATION = 180;
725
+ const MOBILE_POPUP_OFFSET = 4;
726
+ const PopoverItem = withLocale(_ref => {
727
+ let value = _ref.value,
728
+ label = _ref.label,
729
+ onValidate = _ref.onValidate,
730
+ overlayClassName = _ref.overlayClassName,
731
+ _ref$placement = _ref.placement,
732
+ placement = _ref$placement === void 0 ? 'bottomLeft' : _ref$placement,
733
+ onOpenChange = _ref.onOpenChange,
734
+ onChange = _ref.onChange,
735
+ children = _ref.children;
736
+ const _useState = react.useState(value),
737
+ state = _useState[0],
738
+ setState = _useState[1];
739
+ const _useState2 = react.useState(false),
740
+ open = _useState2[0],
741
+ setOpen = _useState2[1];
742
+ const _useState3 = react.useState(false),
743
+ isMobile = _useState3[0],
744
+ setIsMobile = _useState3[1];
745
+ const _useState4 = react.useState(false),
746
+ renderMask = _useState4[0],
747
+ setRenderMask = _useState4[1];
748
+ const _useState5 = react.useState(false),
749
+ maskClosing = _useState5[0],
750
+ setMaskClosing = _useState5[1];
751
+ const _useState6 = react.useState({
752
+ top: 0,
753
+ pageTop: 0,
754
+ height: 0
755
+ }),
756
+ popupMetrics = _useState6[0],
757
+ setPopupMetrics = _useState6[1];
758
+ const triggerRef = react.useRef(null);
759
+ const disabled = react.useMemo(() => {
760
+ return onValidate && !onValidate(state);
761
+ }, [onValidate, state]);
762
+ const _useIntl = reactIntl.useIntl({
763
+ moduleName: 'Filter'
764
+ }),
765
+ formatMessage = _useIntl.formatMessage;
766
+ react.useEffect(() => {
767
+ if (typeof window === 'undefined') return;
768
+ const mediaQuery = window.matchMedia('(max-width: 768px)');
769
+ const updateIsMobile = () => {
770
+ setIsMobile(mediaQuery.matches);
771
+ };
772
+ updateIsMobile();
773
+ mediaQuery.addEventListener ? mediaQuery.addEventListener('change', updateIsMobile) : mediaQuery.addListener(updateIsMobile);
774
+ return () => {
775
+ mediaQuery.removeEventListener ? mediaQuery.removeEventListener('change', updateIsMobile) : mediaQuery.removeListener(updateIsMobile);
776
+ };
777
+ }, []);
778
+ const updatePopupMetrics = react.useCallback(() => {
779
+ if (typeof window === 'undefined' || !triggerRef.current) return;
780
+ const rect = triggerRef.current.getBoundingClientRect();
781
+ const top = Math.max(rect.bottom + MOBILE_POPUP_OFFSET, 0);
782
+ setPopupMetrics({
783
+ top,
784
+ pageTop: top + window.scrollY,
785
+ height: Math.max(window.innerHeight - top, 0)
786
+ });
787
+ }, []);
788
+ react.useEffect(() => {
789
+ if (!open || !isMobile) return;
790
+ updatePopupMetrics();
791
+ window.addEventListener('resize', updatePopupMetrics);
792
+ window.addEventListener('scroll', updatePopupMetrics, true);
793
+ return () => {
794
+ window.removeEventListener('resize', updatePopupMetrics);
795
+ window.removeEventListener('scroll', updatePopupMetrics, true);
796
+ };
797
+ }, [isMobile, open, updatePopupMetrics]);
798
+ react.useEffect(() => {
799
+ if (open && isMobile) {
800
+ setRenderMask(true);
801
+ setMaskClosing(false);
802
+ return;
209
803
  }
210
-
211
- if (lodash.isFunction(children)) {
212
- return children({
213
- value: currentValue,
214
- onChange: changeHandler
215
- });
804
+ if (!renderMask) return;
805
+ setMaskClosing(true);
806
+ const timer = setTimeout(() => {
807
+ setRenderMask(false);
808
+ setMaskClosing(false);
809
+ }, MASK_ANIMATION_DURATION);
810
+ return () => {
811
+ clearTimeout(timer);
812
+ };
813
+ }, [isMobile, open, renderMask]);
814
+ const closeDropdown = react.useCallback(() => {
815
+ setOpen(false);
816
+ onOpenChange && onOpenChange(false);
817
+ }, [onOpenChange]);
818
+ const handleOpenChange = react.useCallback(open => {
819
+ if (open && isMobile) {
820
+ updatePopupMetrics();
216
821
  }
822
+ setOpen(open);
823
+ setState(value);
824
+ onOpenChange && onOpenChange(open);
825
+ }, [isMobile, onOpenChange, updatePopupMetrics, value]);
826
+ const mobileOverlayStyle = isMobile ? {
827
+ '--react-filter-popover-mobile-height': popupMetrics.height + "px",
828
+ top: popupMetrics.pageTop,
829
+ left: 0
830
+ } : undefined;
831
+ const overlayContent = /*#__PURE__*/jsxRuntime.jsxs("div", {
832
+ className: style$1['pop-util-body'],
833
+ onClick: e => {
834
+ e.stopPropagation();
835
+ },
836
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
837
+ className: style$1['pop-util-content'],
838
+ children: children({
839
+ value: state,
840
+ onChange: setState
841
+ })
842
+ }), /*#__PURE__*/jsxRuntime.jsxs(antd.Row, {
843
+ className: style$1['pop-util-footer'],
844
+ justify: "end",
845
+ gutter: 8,
846
+ children: [/*#__PURE__*/jsxRuntime.jsx(antd.Col, {
847
+ children: /*#__PURE__*/jsxRuntime.jsx(antd.Button, {
848
+ size: "small",
849
+ onClick: closeDropdown,
850
+ children: formatMessage({
851
+ id: 'cancelText'
852
+ })
853
+ })
854
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.Col, {
855
+ children: /*#__PURE__*/jsxRuntime.jsx(antd.Button, {
856
+ size: "small",
857
+ type: "primary",
858
+ disabled: disabled,
859
+ onClick: () => {
860
+ closeDropdown();
861
+ onChange && onChange(state);
862
+ },
863
+ children: formatMessage({
864
+ id: 'determineText'
865
+ })
866
+ })
867
+ })]
868
+ })]
869
+ });
870
+ return /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
871
+ children: [renderMask && typeof document !== 'undefined' && /*#__PURE__*/reactDom.createPortal(/*#__PURE__*/jsxRuntime.jsx("div", {
872
+ className: classnames__default["default"](style$1['pop-util-mask'], maskClosing && style$1['pop-util-mask-leave']),
873
+ style: {
874
+ top: popupMetrics.top,
875
+ height: popupMetrics.height
876
+ },
877
+ onClick: closeDropdown
878
+ }), document.body), /*#__PURE__*/jsxRuntime.jsx(antd.Dropdown, {
879
+ open: open,
880
+ trigger: ['click'],
881
+ placement: isMobile ? 'bottomLeft' : placement,
882
+ autoAdjustOverflow: !isMobile,
883
+ align: isMobile ? {
884
+ offset: [0, 0]
885
+ } : undefined,
886
+ overlayClassName: classnames__default["default"](style$1['pop-util-overlay'], overlayClassName),
887
+ overlayStyle: mobileOverlayStyle,
888
+ onOpenChange: handleOpenChange,
889
+ menu: {
890
+ items: [{
891
+ key: 'content',
892
+ label: null
893
+ }]
894
+ },
895
+ dropdownRender: () => overlayContent,
896
+ children: /*#__PURE__*/jsxRuntime.jsx("span", {
897
+ ref: triggerRef,
898
+ children: /*#__PURE__*/jsxRuntime.jsx(FilterItem, {
899
+ open: open,
900
+ active: isNotEmpty(value),
901
+ label: label
902
+ })
903
+ })
904
+ })]
905
+ });
906
+ });
217
907
 
218
- return children;
219
- }();
908
+ const InputFilterItem$2 = withLocale(({
909
+ label,
910
+ value,
911
+ onChange,
912
+ placeholder,
913
+ onValidate,
914
+ overlayClassName,
915
+ placement,
916
+ onOpenChange,
917
+ ...props
918
+ }) => {
919
+ return /*#__PURE__*/jsxRuntime.jsx(PopoverItem, {
920
+ label: label,
921
+ value: value,
922
+ onChange: onChange,
923
+ onValidate,
924
+ overlayClassName,
925
+ placement,
926
+ onOpenChange,
927
+ children: ({
928
+ value,
929
+ onChange
930
+ }) => /*#__PURE__*/jsxRuntime.jsx(antd.Input, {
931
+ ...props,
932
+ placeholder: placeholder || `请输入${label}`,
933
+ className: style$1['filter-item-text'],
934
+ value: get__default["default"](value, 'value', ''),
935
+ onChange: e => onChange(e.target.value ? {
936
+ label: e.target.value,
937
+ value: e.target.value
938
+ } : null)
939
+ })
940
+ });
941
+ });
220
942
 
221
- return /*#__PURE__*/React__default["default"].createElement(FilterItem, {
943
+ const computedFilterValue = (range, unit, formatMessage) => {
944
+ if (!isNumber__default["default"](range[0]) && !isNumber__default["default"](range[1])) {
945
+ return null;
946
+ }
947
+ return {
948
+ label: (range => {
949
+ if (isNumber__default["default"](range[0]) && isNumber__default["default"](range[1])) {
950
+ return `${range[0]}-${range[1]}${unit || ''}`;
951
+ }
952
+ if (isNumber__default["default"](range[0])) {
953
+ return formatMessage({
954
+ id: 'over'
955
+ }, {
956
+ count: range[0],
957
+ unit
958
+ });
959
+ }
960
+ if (isNumber__default["default"](range[1])) {
961
+ return formatMessage({
962
+ id: 'lessThan'
963
+ }, {
964
+ count: range[1],
965
+ unit
966
+ });
967
+ }
968
+ })(range),
969
+ value: [range[0] || null, range[1] || null]
970
+ };
971
+ };
972
+ const defaultPropsOnValidate = value => {
973
+ const range = get__default["default"](value, 'value');
974
+ return !(range && isNumber__default["default"](range[0]) && isNumber__default["default"](range[1]) && range[1] < range[0]);
975
+ };
976
+ const NumberRangeFilterItem$1 = withLocale(({
977
+ label,
978
+ value,
979
+ onChange,
980
+ placeholder,
981
+ onValidate = defaultPropsOnValidate,
982
+ overlayClassName,
983
+ placement,
984
+ onOpenChange,
985
+ unit,
986
+ ...props
987
+ }) => {
988
+ const {
989
+ formatMessage
990
+ } = reactIntl.useIntl({
991
+ moduleName: 'Filter'
992
+ });
993
+ return /*#__PURE__*/jsxRuntime.jsx(PopoverItem, {
222
994
  label: label,
223
- labelHidden: labelHidden
224
- }, /*#__PURE__*/React__default["default"].createElement(Provider, {
225
- value: {
226
- currentValue: currentValue,
227
- createCheckedChangeHandler: createCheckedChangeHandler
228
- }
229
- }, computedChildren, more ? function () {
230
- if (lodash.isFunction(more)) {
231
- return more({
232
- name: name,
233
- size: size,
234
- label: label,
235
- value: currentValue,
236
- onChange: changeHandler
995
+ value: value,
996
+ onChange: onChange,
997
+ onValidate,
998
+ overlayClassName,
999
+ placement,
1000
+ onOpenChange,
1001
+ children: ({
1002
+ value,
1003
+ onChange
1004
+ }) => /*#__PURE__*/jsxRuntime.jsxs(antd.Space.Compact, {
1005
+ children: [/*#__PURE__*/jsxRuntime.jsx(antd.InputNumber, {
1006
+ ...props,
1007
+ placeholder: placeholder || `${formatMessage({
1008
+ id: 'pleaseInput'
1009
+ })}${label}`,
1010
+ className: style$1['filter-item-number-range'],
1011
+ value: get__default["default"](value, 'value[0]', ''),
1012
+ onChange: target => {
1013
+ onChange(computedFilterValue([target, get__default["default"](value, 'value[1]')], unit, formatMessage));
1014
+ }
1015
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.Input, {
1016
+ style: {
1017
+ width: 30,
1018
+ borderLeft: 0,
1019
+ borderRight: 0,
1020
+ pointerEvents: 'none'
1021
+ },
1022
+ placeholder: "~",
1023
+ disabled: true
1024
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.InputNumber, {
1025
+ ...props,
1026
+ placeholder: placeholder || `${formatMessage({
1027
+ id: 'pleaseInput'
1028
+ })}${label}`,
1029
+ className: style$1['filter-item-number-range'],
1030
+ value: get__default["default"](value, 'value[1]', ''),
1031
+ onChange: target => {
1032
+ onChange(computedFilterValue([get__default["default"](value, 'value[0]'), target], unit, formatMessage));
1033
+ }
1034
+ }), unit && /*#__PURE__*/jsxRuntime.jsx(antd.Input, {
1035
+ style: {
1036
+ width: 50,
1037
+ borderLeft: 0
1038
+ },
1039
+ value: unit,
1040
+ disabled: true
1041
+ })]
1042
+ })
1043
+ });
1044
+ });
1045
+
1046
+ const DatePickerFilterItem = withLocale(withFieldItem(({
1047
+ value,
1048
+ onChange,
1049
+ picker = 'date',
1050
+ ...props
1051
+ }) => {
1052
+ return /*#__PURE__*/jsxRuntime.jsx(antd.DatePicker, {
1053
+ ...props,
1054
+ picker: picker,
1055
+ classNames: {
1056
+ ...props.classNames,
1057
+ popup: {
1058
+ ...props.classNames?.popup,
1059
+ root: classnames__default["default"](props.classNames?.popup?.root, style$1['date-picker-popup'])
1060
+ }
1061
+ },
1062
+ value: value && dayjs__default["default"](value.value),
1063
+ onChange: value => {
1064
+ const {
1065
+ format
1066
+ } = Object.assign({
1067
+ format: 'YYYY-MM-DD'
1068
+ }, props);
1069
+ value && onChange({
1070
+ label: picker !== 'date' ? `${value.startOf(picker).format(format)}~${value.endOf(picker).format(format)}` : value.format(format),
1071
+ value: new Date(value.startOf(picker).valueOf())
237
1072
  });
238
1073
  }
1074
+ });
1075
+ }));
239
1076
 
240
- var children = more.children,
241
- _onClick = more.onClick;
242
- return /*#__PURE__*/React__default["default"].createElement(List.Item, _extends({}, more, {
243
- onClick: function onClick(e) {
244
- _onClick({
245
- name: name,
246
- label: label,
247
- value: currentValue,
248
- onChange: changeHandler
249
- }, e);
1077
+ const DateRangePickerFilterItem = withLocale(withFieldItem(({
1078
+ value,
1079
+ onChange,
1080
+ header,
1081
+ ...props
1082
+ }) => {
1083
+ return /*#__PURE__*/jsxRuntime.jsxs(antd.Flex, {
1084
+ vertical: true,
1085
+ children: [typeof header === 'function' ? header({
1086
+ value,
1087
+ onChange
1088
+ }) : header, /*#__PURE__*/jsxRuntime.jsx(antd.DatePicker.RangePicker, {
1089
+ ...props,
1090
+ allowEmpty: [false, false],
1091
+ classNames: {
1092
+ ...props.classNames,
1093
+ popup: {
1094
+ ...props.classNames?.popup,
1095
+ root: classnames__default["default"](props.classNames?.popup?.root, style$1['date-range-picker-popup'])
1096
+ }
250
1097
  },
251
- label: children || "其他"
252
- }));
253
- }() : null));
254
- };
1098
+ value: value && Array.isArray(value.value) && value.value.length === 2 && value.value.map(item => dayjs__default["default"](item)),
1099
+ onChange: value => {
1100
+ const {
1101
+ format
1102
+ } = Object.assign({
1103
+ format: 'YYYY-MM-DD'
1104
+ }, props);
1105
+ onChange({
1106
+ label: value.map(item => item.format(format)).join('~'),
1107
+ value: value.map(item => new Date(item.valueOf()))
1108
+ });
1109
+ }
1110
+ })]
1111
+ });
1112
+ }));
255
1113
 
256
- List.Item = function (_ref3) {
257
- var value = _ref3.value,
258
- label = _ref3.label,
259
- props = _objectWithoutPropertiesLoose(_ref3, _excluded$8);
1114
+ var style = {"shortcuts-container":"kne-react-filter_3w4Bb","shortcut-item":"kne-react-filter_myRhG","is-active":"kne-react-filter_FowoG"};
1115
+
1116
+ const _excluded$5 = ["value", "onChange", "defaultValue", "shortcuts", "shortcutOptions"];
1117
+ const TypeDateRangePickerField = _ref => {
1118
+ let valueProp = _ref.value,
1119
+ onChangeProp = _ref.onChange,
1120
+ defaultValue = _ref.defaultValue,
1121
+ _ref$shortcuts = _ref.shortcuts,
1122
+ shortcuts = _ref$shortcuts === void 0 ? true : _ref$shortcuts,
1123
+ shortcutOptions = _ref.shortcutOptions,
1124
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$5);
1125
+ const _useIntl = reactIntl.useIntl({
1126
+ moduleName: 'Filter'
1127
+ }),
1128
+ formatMessage = _useIntl.formatMessage;
1129
+ const typeList = new Map([['date', formatMessage({
1130
+ id: 'customTime'
1131
+ })], ['month', formatMessage({
1132
+ id: 'monthly'
1133
+ })], ['week', formatMessage({
1134
+ id: 'weekly'
1135
+ })]]);
1136
+ const defaultShortcuts = react.useMemo(() => [{
1137
+ label: formatMessage({
1138
+ id: 'last7Days'
1139
+ }),
1140
+ getValue: () => [dayjs__default["default"]().subtract(7, 'day').startOf('day'), dayjs__default["default"]().endOf('day')]
1141
+ }, {
1142
+ label: formatMessage({
1143
+ id: 'thisMonth'
1144
+ }),
1145
+ getValue: () => [dayjs__default["default"]().startOf('month'), dayjs__default["default"]().endOf('month')]
1146
+ }, {
1147
+ label: formatMessage({
1148
+ id: 'last3Months'
1149
+ }),
1150
+ getValue: () => [dayjs__default["default"]().subtract(3, 'month').startOf('day'), dayjs__default["default"]().endOf('day')]
1151
+ }, {
1152
+ label: formatMessage({
1153
+ id: 'thisYear'
1154
+ }),
1155
+ getValue: () => [dayjs__default["default"]().startOf('year'), dayjs__default["default"]().endOf('day')]
1156
+ }, {
1157
+ label: formatMessage({
1158
+ id: 'fullYear'
1159
+ }),
1160
+ getValue: () => [dayjs__default["default"]().startOf('year'), dayjs__default["default"]().endOf('year')]
1161
+ }], [formatMessage]);
1162
+ const currentShortcuts = shortcutOptions !== undefined ? shortcutOptions : shortcuts ? defaultShortcuts : null;
1163
+ const isControlled = valueProp !== undefined;
1164
+ const innerValueRef = react.useRef(defaultValue || {
1165
+ type: 'date',
1166
+ value: null
1167
+ });
1168
+ const value = isControlled ? valueProp : innerValueRef.current;
1169
+ const onChange = react.useCallback(newValue => {
1170
+ if (!isControlled) {
1171
+ innerValueRef.current = typeof newValue === 'function' ? newValue(innerValueRef.current) : newValue;
1172
+ }
1173
+ onChangeProp == null || onChangeProp(typeof newValue === 'function' ? newValue(value) : newValue);
1174
+ }, [isControlled, onChangeProp, value]);
1175
+ const handleShortcutClick = react.useCallback(shortcut => {
1176
+ const _shortcut$getValue = shortcut.getValue(),
1177
+ start = _shortcut$getValue[0],
1178
+ end = _shortcut$getValue[1];
1179
+ const type = 'date';
1180
+ onChange({
1181
+ type,
1182
+ value: [start.startOf(type).toDate(), end.endOf(type).toDate()]
1183
+ });
1184
+ }, [onChange]);
1185
+ const isShortcutActive = react.useCallback(shortcut => {
1186
+ if (!(value != null && value.value) || !Array.isArray(value.value) || value.value.length !== 2) {
1187
+ return false;
1188
+ }
1189
+ const _shortcut$getValue2 = shortcut.getValue(),
1190
+ start = _shortcut$getValue2[0],
1191
+ end = _shortcut$getValue2[1];
1192
+ const type = (value == null ? void 0 : value.type) || 'date';
1193
+ const valueStart = dayjs__default["default"](value.value[0]).startOf(type);
1194
+ const valueEnd = dayjs__default["default"](value.value[1]).endOf(type);
1195
+ const shortcutStart = start.startOf(type);
1196
+ const shortcutEnd = end.endOf(type);
1197
+ return valueStart.isSame(shortcutStart, type) && valueEnd.isSame(shortcutEnd, type);
1198
+ }, [value]);
1199
+ const renderShortcuts = react.useMemo(() => {
1200
+ if (!currentShortcuts || currentShortcuts.length === 0) {
1201
+ return null;
1202
+ }
1203
+ return /*#__PURE__*/jsxRuntime.jsx("div", {
1204
+ className: style['shortcuts-container'],
1205
+ children: currentShortcuts.map((shortcut, index) => /*#__PURE__*/jsxRuntime.jsx("span", {
1206
+ className: classnames__default["default"](style['shortcut-item'], {
1207
+ [style['is-active']]: isShortcutActive(shortcut)
1208
+ }),
1209
+ onClick: () => handleShortcutClick(shortcut),
1210
+ children: shortcut.label
1211
+ }, index))
1212
+ });
1213
+ }, [currentShortcuts, handleShortcutClick, isShortcutActive]);
1214
+ return /*#__PURE__*/jsxRuntime.jsxs(antd.Flex, {
1215
+ vertical: true,
1216
+ gap: 0,
1217
+ children: [/*#__PURE__*/jsxRuntime.jsxs(antd.Space.Compact, {
1218
+ children: [/*#__PURE__*/jsxRuntime.jsx(antd.Select, {
1219
+ style: {
1220
+ width: '120px'
1221
+ },
1222
+ value: (value == null ? void 0 : value.type) || 'date',
1223
+ onChange: typeValue => {
1224
+ onChange(currentValue => {
1225
+ var _currentValue$value;
1226
+ if (!(currentValue != null && (_currentValue$value = currentValue.value) != null && _currentValue$value.length)) {
1227
+ return {
1228
+ value: null,
1229
+ type: typeValue || 'date'
1230
+ };
1231
+ }
1232
+ const startTime = dayjs__default["default"](currentValue.value[0]);
1233
+ const endTime = dayjs__default["default"](currentValue.value[1]);
1234
+ return {
1235
+ value: [startTime.isValid() ? startTime.startOf(typeValue || 'date').toDate() : null, endTime.isValid() ? endTime.endOf(typeValue || 'date').toDate() : null],
1236
+ type: typeValue || 'date'
1237
+ };
1238
+ });
1239
+ },
1240
+ options: Array.from(typeList).map(_ref2 => {
1241
+ let val = _ref2[0],
1242
+ label = _ref2[1];
1243
+ return {
1244
+ label,
1245
+ value: val
1246
+ };
1247
+ })
1248
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.DatePicker.RangePicker, _extends({}, props, {
1249
+ picker: (value == null ? void 0 : value.type) || 'date',
1250
+ value: Array.isArray(value == null ? void 0 : value.value) && value.value.length === 2 ? value.value.map(item => item && dayjs__default["default"](item)) : null,
1251
+ onChange: dateValue => {
1252
+ onChange(currentValue => {
1253
+ return Object.assign({
1254
+ type: 'date'
1255
+ }, currentValue, {
1256
+ value: dateValue && dateValue[0] && dateValue[1] ? [dateValue[0].startOf((currentValue == null ? void 0 : currentValue.type) || 'date').toDate(), dateValue[1].endOf((currentValue == null ? void 0 : currentValue.type) || 'date').toDate()] : null
1257
+ });
1258
+ });
1259
+ }
1260
+ }))]
1261
+ }), renderShortcuts]
1262
+ });
1263
+ };
260
1264
 
261
- var _useContext = React.useContext(context),
262
- currentValue = _useContext.currentValue,
263
- createCheckedChangeHandler = _useContext.createCheckedChangeHandler;
1265
+ const TypeDateRangePickerFilterItem = withLocale(({
1266
+ label,
1267
+ value,
1268
+ onChange,
1269
+ ...props
1270
+ }) => {
1271
+ return /*#__PURE__*/jsxRuntime.jsx(PopoverItem, {
1272
+ label: label,
1273
+ value: value,
1274
+ onChange: onChange,
1275
+ onValidate: item => {
1276
+ const itemValue = item?.value;
1277
+ return itemValue?.type && Array.isArray(itemValue?.value) && itemValue.value.length === 2;
1278
+ },
1279
+ children: ({
1280
+ value,
1281
+ onChange
1282
+ }) => /*#__PURE__*/jsxRuntime.jsx(TypeDateRangePickerField, {
1283
+ ...props,
1284
+ className: style$1['filter-item-text'],
1285
+ value: get__default["default"](value, 'value'),
1286
+ onChange: pickerValue => {
1287
+ const {
1288
+ format = 'YYYY-MM-DD'
1289
+ } = props;
1290
+ const val = pickerValue?.value || [];
1291
+ let displayLabel = '';
1292
+ if (val[0] && !val[1]) {
1293
+ displayLabel = `${dayjs__default["default"](val[0]).format(format)}以后`;
1294
+ } else if (!val[0] && val[1]) {
1295
+ displayLabel = `${dayjs__default["default"](val[1]).format(format)}以前`;
1296
+ } else if (val[0] && val[1]) {
1297
+ displayLabel = `${dayjs__default["default"](val[0]).format(format)}~${dayjs__default["default"](val[1]).format(format)}`;
1298
+ }
1299
+ onChange({
1300
+ label: displayLabel,
1301
+ value: pickerValue
1302
+ });
1303
+ }
1304
+ })
1305
+ });
1306
+ });
264
1307
 
265
- var itemProps = {};
1308
+ const _excluded$4 = ["placeholder", "label"];
1309
+ const withInputDefaultPlaceholder = WrappedComponent => withLocale(_ref => {
1310
+ let placeholder = _ref.placeholder,
1311
+ label = _ref.label,
1312
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$4);
1313
+ const _useIntl = reactIntl.useIntl({
1314
+ moduleName: 'Filter'
1315
+ }),
1316
+ formatMessage = _useIntl.formatMessage;
1317
+ return /*#__PURE__*/jsxRuntime.jsx(WrappedComponent, _extends({}, props, {
1318
+ label: label,
1319
+ placeholder: placeholder || formatMessage({
1320
+ id: 'defaultInputPlaceholder'
1321
+ }, {
1322
+ label
1323
+ })
1324
+ }));
1325
+ });
1326
+ const InputFilterItem$1 = withInputDefaultPlaceholder(InputFilterItem$2);
1327
+ const NumberRangeFilterItem = withInputDefaultPlaceholder(NumberRangeFilterItem$1);
1328
+ const SuperSelectFilterItem = withFieldItem(SuperSelect__default["default"], {
1329
+ forcePopup: true
1330
+ });
1331
+ const SelectFunctionFilterItem = withFieldItem(superSelectPlus.SelectFunction, {
1332
+ forcePopup: true
1333
+ });
1334
+ const SelectIndustryFilterItem = withFieldItem(superSelectPlus.SelectIndustry, {
1335
+ forcePopup: true
1336
+ });
1337
+ const SelectAddressFilterItem = withFieldItem(superSelectPlus.SelectAddress, {
1338
+ forcePopup: true
1339
+ });
266
1340
 
267
- if (value !== void 0) {
268
- itemProps.checked = currentValue.findIndex(function (item) {
269
- return lodash.isEqual(lodash.get(item, 'value'), value);
270
- }) > -1;
271
- itemProps.onChange = createCheckedChangeHandler({
272
- label: label,
273
- value: value
274
- });
275
- }
1341
+ var fields$1 = {
1342
+ __proto__: null,
1343
+ InputFilterItem: InputFilterItem$1,
1344
+ NumberRangeFilterItem: NumberRangeFilterItem,
1345
+ SuperSelectFilterItem: SuperSelectFilterItem,
1346
+ SelectFunctionFilterItem: SelectFunctionFilterItem,
1347
+ SelectIndustryFilterItem: SelectIndustryFilterItem,
1348
+ SelectAddressFilterItem: SelectAddressFilterItem,
1349
+ DatePickerFilterItem: DatePickerFilterItem,
1350
+ DateRangePickerFilterItem: DateRangePickerFilterItem,
1351
+ TypeDateRangePickerFilterItem: TypeDateRangePickerFilterItem
1352
+ };
276
1353
 
277
- return /*#__PURE__*/React__default["default"].createElement(CheckableTag, _extends({}, props, itemProps), label);
1354
+ const getFilterValue = filterValue => {
1355
+ return transform__default["default"](filterValue, (result, _ref) => {
1356
+ let name = _ref.name,
1357
+ value = _ref.value;
1358
+ result[name] = Array.isArray(value) ? value.map(_ref2 => {
1359
+ let value = _ref2.value;
1360
+ return value;
1361
+ }) : value == null ? void 0 : value.value;
1362
+ }, {});
278
1363
  };
279
1364
 
280
- List.defaultProps = {
281
- size: 2
1365
+ const _excluded$3 = ["name", "label"];
1366
+ const withFilterValue = WrappedComponent => {
1367
+ return _ref => {
1368
+ let name = _ref.name,
1369
+ label = _ref.label,
1370
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$3);
1371
+ const _useContext = useContext(),
1372
+ value = _useContext.value,
1373
+ onChange = _useContext.onChange;
1374
+ return /*#__PURE__*/jsxRuntime.jsx(WrappedComponent, _extends({}, props, {
1375
+ label: label,
1376
+ onChange: onChange ? value => onChange({
1377
+ name,
1378
+ label,
1379
+ value
1380
+ }) : props.onChange,
1381
+ value: value ? get__default["default"](value.get(name), 'value') : props.value
1382
+ }));
1383
+ };
282
1384
  };
283
1385
 
284
- var _excluded$7 = ["label", "labelHidden", "name", "size", "isMore"];
285
- var Item = List.Item;
1386
+ const _excluded$2 = ["label", "onChange", "value", "placeholder"];
1387
+ const Search = antd.Input.Search;
1388
+ const SearchInput = withFilterValue(_ref => {
1389
+ let label = _ref.label,
1390
+ onChange = _ref.onChange,
1391
+ value = _ref.value,
1392
+ placeholder = _ref.placeholder,
1393
+ props = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1394
+ const _useIntl = reactIntl.useIntl({
1395
+ moduleName: 'Filter'
1396
+ }),
1397
+ formatMessage = _useIntl.formatMessage;
1398
+ return /*#__PURE__*/jsxRuntime.jsx(Search, _extends({}, props, {
1399
+ placeholder: placeholder || formatMessage({
1400
+ id: 'inputPlaceholder'
1401
+ }, {
1402
+ label
1403
+ }),
1404
+ value: (value == null ? void 0 : value.value) || '',
1405
+ onSearch: value => {
1406
+ onChange({
1407
+ label: value,
1408
+ value
1409
+ });
1410
+ }
1411
+ }));
1412
+ });
286
1413
 
287
- var City = function City(_ref) {
288
- var label = _ref.label,
289
- labelHidden = _ref.labelHidden,
290
- name = _ref.name,
291
- size = _ref.size;
292
- _objectWithoutPropertiesLoose(_ref, _excluded$7);
1414
+ /**
1415
+ * 从筛选值中提取原始值数组。
1416
+ * 支持:原始值、{ value } 对象、{ id } 对象、以及它们的数组。
1417
+ *
1418
+ * @example
1419
+ * pickSelectValues([{ value: 1 }, { id: 2 }, '3'])
1420
+ * // => ['1', '2', '3']
1421
+ *
1422
+ * pickSelectValues({ value: 'open' })
1423
+ * // => ['open']
1424
+ *
1425
+ * pickSelectValues(null)
1426
+ * // => []
1427
+ */
1428
+ const pickSelectValues = value => {
1429
+ if (value == null || value === '') {
1430
+ return [];
1431
+ }
1432
+ const list = Array.isArray(value) ? value : [value];
1433
+ return list.map(item => {
1434
+ if (item == null) {
1435
+ return null;
1436
+ }
1437
+ if (typeof item !== 'object') {
1438
+ return String(item);
1439
+ }
1440
+ if (item.value != null && item.value !== '') {
1441
+ return String(item.value);
1442
+ }
1443
+ if (item.id != null && item.id !== '') {
1444
+ return String(item.id);
1445
+ }
1446
+ return null;
1447
+ }).filter(Boolean);
1448
+ };
293
1449
 
294
- return /*#__PURE__*/React__default["default"].createElement(List, {
295
- labelHidden: labelHidden,
296
- label: label,
297
- name: name,
298
- size: size,
299
- more: {
300
- children: "其他",
301
- onClick: function onClick(_ref2) {
302
- var value = _ref2.value,
303
- _onChange = _ref2.onChange;
304
- reactCitySelect.createCitySelect({
305
- size: size,
306
- defaultValue: value.map(function (_ref3) {
307
- var value = _ref3.value;
308
- return value;
309
- }),
310
- onChange: function onChange(value) {
311
- Promise.all(value.map(function (id) {
312
- return reactCitySelect.apis.getCity(id).then(function (_ref4) {
313
- var city = _ref4.city;
314
- return {
315
- label: city.name,
316
- value: city.code
317
- };
318
- });
319
- })).then(function (value) {
320
- return _onChange(value);
321
- });
1450
+ /**
1451
+ * 声明式创建 mapFilterValue 函数。
1452
+ *
1453
+ * Filter.getFilterValue 默认只读取 { value },而 SuperSelectFilterItem 等
1454
+ * 组件使用 { id, name } 格式,需要额外处理。此工具通过声明字段映射规则,
1455
+ * 自动生成符合 (filter, getFilterValue) => value 签名的函数。
1456
+ *
1457
+ * @param {Object} fieldMappers - 字段名到映射规则的映射
1458
+ * @param {'string'} fieldMappers[field] - 确保值为字符串类型
1459
+ * @param {'multi'} fieldMappers[field] - 多选,从 filter entry 提取值数组
1460
+ * @param {'single'} fieldMappers[field] - 单选,从 filter entry 提取第一个值
1461
+ * @param {Function} fieldMappers[field] - 自定义转换,接收 (rawValue, { entry, filter, value }) 返回新值
1462
+ *
1463
+ * @example
1464
+ * const mapFilterValue = createFilterValueMapper({
1465
+ * id: 'string',
1466
+ * roles: 'multi',
1467
+ * tenantOrgId: 'single',
1468
+ * status: (rawValue) => normalizeStatus(rawValue)
1469
+ * });
1470
+ *
1471
+ * // 使用方式与手写 mapFilterValue 一致
1472
+ * const filterValue = mapFilterValue(filter, Filter.getFilterValue);
1473
+ *
1474
+ * // 也可直接传给 BizUnit 的 options.mapFilterValue
1475
+ * <BizUnit options={{ mapFilterValue }} />
1476
+ */
1477
+ const createFilterValueMapper = fieldMappers => {
1478
+ return (filter, getFilterValue) => {
1479
+ const value = getFilterValue(filter);
1480
+ Object.entries(fieldMappers).forEach(_ref => {
1481
+ let fieldName = _ref[0],
1482
+ mapper = _ref[1];
1483
+ const entry = filter.find(item => item.name === fieldName);
1484
+ if (mapper === 'string') {
1485
+ if (value[fieldName] != null && value[fieldName] !== '') {
1486
+ value[fieldName] = String(value[fieldName]);
1487
+ }
1488
+ } else if (mapper === 'multi') {
1489
+ if (entry) {
1490
+ const values = pickSelectValues(entry.value);
1491
+ if (values.length) {
1492
+ value[fieldName] = values;
1493
+ } else {
1494
+ delete value[fieldName];
322
1495
  }
323
- });
324
- }
325
- }
326
- }, function (_ref5) {
327
- var currentValue = _ref5.value;
328
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(reactCitySelect.RemoteData, {
329
- loader: reactCitySelect.apis.getChinaHotCities
330
- }, function (data) {
331
- var otherList = currentValue.filter(function (_ref6) {
332
- var code = _ref6.value;
333
- return !data.find(function (item) {
334
- return item.code === code;
335
- });
336
- });
337
- var extraLength = 0;
338
- data.forEach(function (item, index) {
339
- if (currentValue.findIndex(function (_ref7) {
340
- var value = _ref7.value;
341
- return value === item.code;
342
- }) > -1 && index >= data.length - otherList.length) {
343
- extraLength += 1;
344
1496
  }
345
- });
346
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, otherList.map(function (_ref8) {
347
- var code = _ref8.value;
348
- return /*#__PURE__*/React__default["default"].createElement(reactCitySelect.DisplayCity, {
349
- id: code,
350
- key: code
351
- }, function (_ref9) {
352
- var item = _ref9.city;
353
- return /*#__PURE__*/React__default["default"].createElement(Item, {
354
- value: code,
355
- label: item.name
1497
+ } else if (mapper === 'single') {
1498
+ if (entry) {
1499
+ const values = pickSelectValues(entry.value);
1500
+ if (values[0] != null) {
1501
+ value[fieldName] = values[0];
1502
+ } else {
1503
+ delete value[fieldName];
1504
+ }
1505
+ } else if (value[fieldName] != null && typeof value[fieldName] === 'object') {
1506
+ const values = pickSelectValues(value[fieldName]);
1507
+ if (values.length) {
1508
+ value[fieldName] = values[0];
1509
+ } else {
1510
+ delete value[fieldName];
1511
+ }
1512
+ }
1513
+ } else if (typeof mapper === 'function') {
1514
+ let rawValue = value[fieldName];
1515
+ if (rawValue != null && typeof rawValue === 'object' && 'value' in rawValue) {
1516
+ rawValue = rawValue.value;
1517
+ }
1518
+ if (rawValue != null && rawValue !== '') {
1519
+ const result = mapper(rawValue, {
1520
+ entry,
1521
+ filter,
1522
+ value
356
1523
  });
357
- });
358
- }), data.filter(function (item, index) {
359
- return currentValue.findIndex(function (_ref10) {
360
- var value = _ref10.value;
361
- return value === item.code;
362
- }) > -1 || index < data.length - otherList.length - extraLength;
363
- }).map(function (item) {
364
- return /*#__PURE__*/React__default["default"].createElement(Item, {
365
- key: item.code,
366
- value: item.code,
367
- label: item.name
368
- });
369
- }));
370
- }));
371
- });
1524
+ if (result != null && result !== '') {
1525
+ value[fieldName] = result;
1526
+ } else {
1527
+ delete value[fieldName];
1528
+ }
1529
+ }
1530
+ }
1531
+ });
1532
+ return value;
1533
+ };
372
1534
  };
373
1535
 
374
- var SearchButton = function SearchButton(_ref) {
375
- var name = _ref.name,
376
- isMore = _ref.isMore,
377
- template = _ref.template,
378
- children = _ref.children,
379
- defaultValue = _ref.defaultValue,
380
- defaultActive = _ref.defaultActive,
381
- onBlur = _ref.onBlur,
382
- onSearch = _ref.onSearch,
383
- onBeforeSearch = _ref.onBeforeSearch,
384
- onActiveChange = _ref.onActiveChange,
385
- buttonText = _ref.buttonText;
386
-
387
- var _useConsumer = useConsumer(),
388
- aValue = _useConsumer.value,
389
- onChange = _useConsumer.onChange;
390
-
391
- var currentValue = aValue[name];
392
- var initCurrentValue = lodash.get(currentValue, "value");
393
-
394
- var _useState = React.useState(defaultValue || initCurrentValue),
395
- value = _useState[0],
396
- setValue = _useState[1];
397
-
398
- var _useState2 = React.useState(defaultActive),
399
- active = _useState2[0],
400
- setActive = _useState2[1];
401
-
402
- var withTemplate = function withTemplate(value) {
403
- if (value === void 0) {
404
- value = '';
405
- }
406
-
407
- return {
408
- value: value,
409
- label: lodash.isFunction(template) ? template(value) : value.toString()
410
- };
1536
+ /**
1537
+ * 创建 URL 参数读取器,自动追踪已消费的参数 key。
1538
+ *
1539
+ * @param {URLSearchParams} searchParams - React Router 的 searchParams 对象
1540
+ * @returns {{ take: (key: string) => string|null, getConsumedKeys: () => string[] }}
1541
+ *
1542
+ * @example
1543
+ * const { take, getConsumedKeys } = createUrlParamsReader(searchParams);
1544
+ * const orgId = take('tenantOrgId');
1545
+ * const orgName = take('orgName');
1546
+ * // getConsumedKeys() => ['tenantOrgId', 'orgName']
1547
+ */
1548
+ const createUrlParamsReader = searchParams => {
1549
+ const consumedKeys = [];
1550
+ const take = key => {
1551
+ if (!searchParams.has(key)) return null;
1552
+ consumedKeys.push(key);
1553
+ return searchParams.get(key);
1554
+ };
1555
+ const getConsumedKeys = () => consumedKeys;
1556
+ return {
1557
+ take,
1558
+ getConsumedKeys
411
1559
  };
1560
+ };
412
1561
 
413
- React.useEffect(function () {
414
- setValue(initCurrentValue);
415
- }, [initCurrentValue]);
416
- var ref = useSimulationBlur__default["default"](function () {
417
- setValue(initCurrentValue);
418
- setActive(false);
419
- onBlur && onBlur();
420
- });
421
- var activeChangeRef = React.useRef(onActiveChange);
422
- activeChangeRef.current = onActiveChange;
423
- React.useEffect(function () {
424
- activeChangeRef.current && activeChangeRef.current(active);
425
- }, [active]);
426
- return /*#__PURE__*/React__default["default"].createElement("div", {
427
- className: classnames__default["default"]("react-filter-search-button", {
428
- "is-active": active && !isMore
429
- }),
430
- ref: ref,
431
- onMouseEnter: function onMouseEnter() {
432
- !active && setActive(true);
433
- },
434
- onMouseLeave: function onMouseLeave() {
435
- active && initCurrentValue === value && setActive(false);
1562
+ /**
1563
+ * 从 URL 参数中移除已消费的 key,返回新的 URLSearchParams 或 null(无变化时)。
1564
+ *
1565
+ * @param {URLSearchParams} searchParams - 当前 URL 参数
1566
+ * @param {string[]} consumedKeys - 需要移除的 key 列表
1567
+ * @returns {URLSearchParams|null}
1568
+ */
1569
+ const stripConsumedUrlParams = (searchParams, consumedKeys) => {
1570
+ if (!(consumedKeys != null && consumedKeys.length)) return null;
1571
+ const next = new URLSearchParams(searchParams);
1572
+ let changed = false;
1573
+ consumedKeys.forEach(key => {
1574
+ if (next.has(key)) {
1575
+ next.delete(key);
1576
+ changed = true;
436
1577
  }
437
- }, /*#__PURE__*/React__default["default"].createElement(antd.Space, {
438
- className: "inner",
439
- size: 0
440
- }, /*#__PURE__*/React__default["default"].createElement("div", null, children({
441
- value: value,
442
- setValue: setValue,
443
- setActive: setActive
444
- })), active || isMore ? /*#__PURE__*/React__default["default"].createElement(antd.Button, {
445
- className: classnames__default["default"]("react-filter-search-confirm", {
446
- "is-more": isMore
447
- }),
448
- size: "small",
449
- type: "primary",
450
- onClick: function onClick(e) {
451
- e.stopPropagation();
452
-
453
- if (onBeforeSearch && onBeforeSearch(value) === false) {
454
- return;
455
- }
1578
+ });
1579
+ return changed ? next : null;
1580
+ };
456
1581
 
457
- onChange(name, withTemplate(value));
458
- setActive(false);
459
- onSearch && onSearch({
460
- value: value
1582
+ /**
1583
+ * 从 URL 参数初始化 Filter 状态的 hook。
1584
+ *
1585
+ * 读取 URL 参数构建初始筛选值,并在挂载后自动清除已消费的 URL 参数。
1586
+ *
1587
+ * @param {Object} options
1588
+ * @param {Function} options.readUrlParams - 读取 URL 参数并返回 { consumedKeys: string[], ...data }
1589
+ * @param {Function} options.buildFilter - 接收 readUrlParams 的返回值,构建初始 filter 数组
1590
+ * @returns {[Array, Function]} - [filter, setFilter]
1591
+ *
1592
+ * @example
1593
+ * const [filter, setFilter] = useUrlFilter({
1594
+ * readUrlParams: (searchParams) => {
1595
+ * const { take, getConsumedKeys } = createUrlParamsReader(searchParams);
1596
+ * const orgId = take('tenantOrgId');
1597
+ * return { consumedKeys: getConsumedKeys(), orgId };
1598
+ * },
1599
+ * buildFilter: ({ orgId }) => [
1600
+ * { name: 'status', value: { label: '开启', value: 'open' } },
1601
+ * ...(orgId ? [{ name: 'tenantOrgId', value: { label: orgId, value: orgId } }] : [])
1602
+ * ]
1603
+ * });
1604
+ */
1605
+ const useUrlFilter = _ref => {
1606
+ let readUrlParams = _ref.readUrlParams,
1607
+ buildFilter = _ref.buildFilter;
1608
+ const _useSearchParams = reactRouterDom.useSearchParams(),
1609
+ searchParams = _useSearchParams[0],
1610
+ setSearchParams = _useSearchParams[1];
1611
+ const urlFilterSnapshotRef = react.useRef(null);
1612
+ if (urlFilterSnapshotRef.current === null) {
1613
+ urlFilterSnapshotRef.current = readUrlParams(searchParams);
1614
+ }
1615
+ const _useState = react.useState(() => buildFilter(urlFilterSnapshotRef.current)),
1616
+ filter = _useState[0],
1617
+ setFilter = _useState[1];
1618
+ const urlStrippedRef = react.useRef(false);
1619
+ react.useEffect(() => {
1620
+ var _urlFilterSnapshotRef;
1621
+ if (urlStrippedRef.current) return;
1622
+ urlStrippedRef.current = true;
1623
+ const nextParams = stripConsumedUrlParams(searchParams, (_urlFilterSnapshotRef = urlFilterSnapshotRef.current) == null ? void 0 : _urlFilterSnapshotRef.consumedKeys);
1624
+ if (nextParams) {
1625
+ setSearchParams(nextParams, {
1626
+ replace: true
461
1627
  });
462
1628
  }
463
- }, buttonText) : null));
1629
+ }, [searchParams, setSearchParams]);
1630
+ return [filter, setFilter];
464
1631
  };
465
1632
 
466
- SearchButton.defaultProps = {
467
- defaultActive: false,
468
- buttonText: "确定"
1633
+ /**
1634
+ * 将筛选值数组序列化为 URLSearchParams,保留 label 信息以便反序列化还原完整筛选状态。
1635
+ *
1636
+ * 序列化格式(使用冒号分隔 label 和 value,逗号分隔多值):
1637
+ * - 单值且 label === value:prefix[name]=value(如输入框)
1638
+ * - 单值且 label !== value:prefix[name]=label:value
1639
+ * - 多值:prefix[name]=label1:value1,label2:value2
1640
+ *
1641
+ * @param {Array} filterValue - 筛选值数组,格式为 [{ name, label, value }, ...]
1642
+ * @param {Object} [options] - 选项
1643
+ * @param {string} [options.prefix='filterParams'] - URL 参数前缀,设为空字符串则不加前缀
1644
+ * @returns {URLSearchParams}
1645
+ *
1646
+ * @example
1647
+ * const params = filterToUrlParams([
1648
+ * { name: 'keyword', label: '关键词', value: { label: '测试', value: '测试' } },
1649
+ * { name: 'city', label: '城市', value: [{ label: '上海', value: '010' }, { label: '北京', value: '020' }] },
1650
+ * { name: 'status', label: '状态', value: { label: '启用', value: 'active' } },
1651
+ * ]);
1652
+ * // params.toString() => 'filterParams[keyword]=测试&filterParams[city]=上海:010,北京:020&filterParams[status]=启用:active'
1653
+ *
1654
+ * // 自定义前缀
1655
+ * filterToUrlParams(filterValue, { prefix: 'f' })
1656
+ * // => 'f[keyword]=测试&f[city]=上海:010,北京:020'
1657
+ *
1658
+ * // 无前缀(直接平铺)
1659
+ * filterToUrlParams(filterValue, { prefix: '' })
1660
+ * // => 'keyword=测试&city=上海:010,北京:020'
1661
+ */
1662
+ const filterToUrlParams = function (filterValue, _temp) {
1663
+ let _ref = _temp === void 0 ? {} : _temp,
1664
+ _ref$prefix = _ref.prefix,
1665
+ prefix = _ref$prefix === void 0 ? 'filterParams' : _ref$prefix;
1666
+ const params = new URLSearchParams();
1667
+ if (!Array.isArray(filterValue)) return params;
1668
+ filterValue.forEach(_ref2 => {
1669
+ let name = _ref2.name,
1670
+ value = _ref2.value;
1671
+ if (value == null || value === '') return;
1672
+ const key = prefix ? prefix + "[" + name + "]" : name;
1673
+ if (Array.isArray(value)) {
1674
+ if (value.length === 0) return;
1675
+ const serialized = value.map(item => serializeEntry(item)).filter(Boolean).join(',');
1676
+ if (serialized) params.set(key, serialized);
1677
+ } else {
1678
+ const serialized = serializeEntry(value);
1679
+ if (serialized) params.set(key, serialized);
1680
+ }
1681
+ });
1682
+ return params;
469
1683
  };
470
1684
 
471
- var RangeInner = function RangeInner(_ref) {
472
- var name = _ref.name,
473
- isMore = _ref.isMore,
474
- defaultActive = _ref.defaultActive,
475
- template = _ref.template,
476
- onBlur = _ref.onBlur,
477
- onSearch = _ref.onSearch,
478
- _onActiveChange = _ref.onActiveChange,
479
- onBeforeSearch = _ref.onBeforeSearch,
480
- startProps = _ref.startProps,
481
- endProps = _ref.endProps,
482
- placeholder = _ref.placeholder;
483
-
484
- var _useState = React.useState(null),
485
- error = _useState[0],
486
- setError = _useState[1];
1685
+ /**
1686
+ * 序列化单个筛选值项。
1687
+ * - label === value 时返回 value(简化格式)
1688
+ * - 否则返回 label:value
1689
+ */
1690
+ const serializeEntry = item => {
1691
+ var _item$label, _item$value;
1692
+ if (item == null) return null;
1693
+ if (typeof item !== 'object') return String(item);
1694
+ const label = (_item$label = item.label) != null ? _item$label : item.name;
1695
+ const value = (_item$value = item.value) != null ? _item$value : item.id;
1696
+ if (value == null || value === '') return null;
1697
+ if (label === value) return String(value);
1698
+ return label + ":" + value;
1699
+ };
487
1700
 
488
- var check = function check(value) {
489
- setError(null);
1701
+ /**
1702
+ * 解析 URL 参数中的单个筛选值项,反序列化为 { label, value } 对象。
1703
+ * 与 filterToUrlParams 配合使用。
1704
+ *
1705
+ * 解析规则:
1706
+ * - 无冒号:label 和 value 相同,如 "测试" → { label: '测试', value: '测试' }
1707
+ * - 有冒号:冒号前为 label,冒号后为 value,如 "启用:active" → { label: '启用', value: 'active' }
1708
+ *
1709
+ * @param {string} str - URL 参数中的原始字符串
1710
+ * @returns {{ label: string, value: string }}
1711
+ *
1712
+ * @example
1713
+ * parseFilterEntry('测试')
1714
+ * // => { label: '测试', value: '测试' }
1715
+ *
1716
+ * parseFilterEntry('启用:active')
1717
+ * // => { label: '启用', value: 'active' }
1718
+ */
1719
+ const parseFilterEntry = str => {
1720
+ const colonIndex = str.indexOf(':');
1721
+ if (colonIndex === -1) {
1722
+ return {
1723
+ label: str,
1724
+ value: str
1725
+ };
1726
+ }
1727
+ return {
1728
+ label: str.slice(0, colonIndex),
1729
+ value: str.slice(colonIndex + 1)
1730
+ };
1731
+ };
490
1732
 
491
- if (!Array.isArray(value)) {
492
- return false;
493
- }
1733
+ /**
1734
+ * 从 URL 参数中读取筛选值项,返回单选 { label, value } 或多选数组。
1735
+ *
1736
+ * @param {URLSearchParams} searchParams - URL 参数对象
1737
+ * @param {string} key - 参数名(不含前缀)
1738
+ * @param {Object} [options] - 选项
1739
+ * @param {boolean} [options.multi=false] - 是否多选,多选返回数组
1740
+ * @param {string} [options.prefix='filterParams'] - URL 参数前缀,设为空字符串则不加前缀
1741
+ * @returns {{ label: string, value: string } | { label: string, value: string }[] | null}
1742
+ *
1743
+ * @example
1744
+ * // URL: ?filterParams[city]=上海:010,北京:020&filterParams[status]=启用:active
1745
+ * takeFilterEntry(searchParams, 'city', { multi: true })
1746
+ * // => [{ label: '上海', value: '010' }, { label: '北京', value: '020' }]
1747
+ *
1748
+ * // 无前缀
1749
+ * takeFilterEntry(searchParams, 'keyword', { prefix: '' })
1750
+ * // => { label: '测试', value: '测试' }
1751
+ */
1752
+ const takeFilterEntry = function (searchParams, key, _temp2) {
1753
+ let _ref3 = _temp2 === void 0 ? {} : _temp2,
1754
+ _ref3$multi = _ref3.multi,
1755
+ multi = _ref3$multi === void 0 ? false : _ref3$multi,
1756
+ _ref3$prefix = _ref3.prefix,
1757
+ prefix = _ref3$prefix === void 0 ? 'filterParams' : _ref3$prefix;
1758
+ const fullKey = prefix ? prefix + "[" + key + "]" : key;
1759
+ if (!searchParams.has(fullKey)) return null;
1760
+ const raw = searchParams.get(fullKey);
1761
+ if (!raw) return null;
1762
+ if (multi) {
1763
+ return raw.split(',').map(parseFilterEntry);
1764
+ }
494
1765
 
495
- if (lodash.isNumber(value[1]) && value[0] > value[1]) {
496
- setError("最大值不能小于最小值");
497
- return false;
498
- }
1766
+ // 单选时,如果包含逗号,只取第一个
1767
+ const firstEntry = raw.includes(',') ? raw.split(',')[0] : raw;
1768
+ return parseFilterEntry(firstEntry);
1769
+ };
499
1770
 
500
- if (onBeforeSearch) {
501
- return onBeforeSearch(value);
1771
+ /**
1772
+ * 创建 URL 筛选参数读取器,自动追踪已消费的参数 key。
1773
+ * 配合 useUrlFilter 使用,readUrlParams 返回的 consumedKeys 可被自动清除。
1774
+ *
1775
+ * @param {URLSearchParams} searchParams - React Router 的 searchParams 对象
1776
+ * @param {Object} [options] - 选项
1777
+ * @param {string} [options.prefix='filterParams'] - URL 参数前缀
1778
+ * @returns {{ takeFilterEntry, getConsumedKeys }}
1779
+ *
1780
+ * @example
1781
+ * const { takeFilterEntry, getConsumedKeys } = createUrlFilterReader(searchParams);
1782
+ * const keyword = takeFilterEntry('keyword');
1783
+ * const city = takeFilterEntry('city', { multi: true });
1784
+ * const status = takeFilterEntry('status');
1785
+ * // getConsumedKeys() => ['filterParams[keyword]', 'filterParams[city]', 'filterParams[status]']
1786
+ *
1787
+ * // 配合 useUrlFilter 使用
1788
+ * const [filter, setFilter] = useUrlFilter({
1789
+ * readUrlParams: (searchParams) => {
1790
+ * const { takeFilterEntry, getConsumedKeys } = createUrlFilterReader(searchParams);
1791
+ * const keyword = takeFilterEntry('keyword');
1792
+ * const city = takeFilterEntry('city', { multi: true });
1793
+ * return { consumedKeys: getConsumedKeys(), keyword, city };
1794
+ * },
1795
+ * buildFilter: ({ keyword, city }) => [
1796
+ * ...(keyword ? [{ name: 'keyword', label: '关键词', value: keyword }] : []),
1797
+ * ...(city ? [{ name: 'city', label: '城市', value: city }] : []),
1798
+ * ],
1799
+ * });
1800
+ */
1801
+ const createUrlFilterReader = function (searchParams, _temp3) {
1802
+ let _ref4 = _temp3 === void 0 ? {} : _temp3,
1803
+ _ref4$prefix = _ref4.prefix,
1804
+ prefix = _ref4$prefix === void 0 ? 'filterParams' : _ref4$prefix;
1805
+ const consumedKeys = [];
1806
+ const takeFilterEntry = function (key, _temp4) {
1807
+ let _ref5 = _temp4 === void 0 ? {} : _temp4,
1808
+ _ref5$multi = _ref5.multi,
1809
+ multi = _ref5$multi === void 0 ? false : _ref5$multi;
1810
+ const fullKey = prefix ? prefix + "[" + key + "]" : key;
1811
+ if (!searchParams.has(fullKey)) return null;
1812
+ consumedKeys.push(fullKey);
1813
+ const raw = searchParams.get(fullKey);
1814
+ if (!raw) return null;
1815
+ if (multi) {
1816
+ return raw.split(',').map(parseFilterEntry);
502
1817
  }
503
-
504
- return true;
1818
+ const firstEntry = raw.includes(',') ? raw.split(',')[0] : raw;
1819
+ return parseFilterEntry(firstEntry);
1820
+ };
1821
+ const getConsumedKeys = () => consumedKeys;
1822
+ return {
1823
+ takeFilterEntry,
1824
+ getConsumedKeys
505
1825
  };
1826
+ };
506
1827
 
507
- return /*#__PURE__*/React__default["default"].createElement(SearchButton, {
508
- template: template,
509
- isMore: isMore,
510
- onBlur: onBlur,
511
- defaultActive: defaultActive,
512
- name: name,
513
- onSearch: onSearch,
514
- onBeforeSearch: function onBeforeSearch(value) {
515
- return check(value);
1828
+ const _excluded$1 = ["consumedKeys"];
1829
+
1830
+ /**
1831
+ * 从 URL 参数初始化 Filter 状态的 hook(简化版)。
1832
+ *
1833
+ * 基于 useUrlFilter 封装,使用 createUrlFilterReader 解析 filterParams[key] 格式的 URL 参数,
1834
+ * 自动解析 label:value 格式,支持单选和多选。
1835
+ *
1836
+ * @param {string[]|Object} mapping - URL 参数映射
1837
+ * - 数组: ['tenantOrgId', 'orgName'],默认单选,自动创建 { name: key, value: { label, value } }
1838
+ * - 对象:
1839
+ * - 值为 true: 单选,使用默认转换 { name: key, value: { label, value } }
1840
+ * - 值为 { multi: true }: 多选,value 为 [{ label, value }, ...] 数组
1841
+ * - 值为函数: 自定义转换,接收解析后的值(单选为 { label, value },多选为数组),返回 filter 项或 null/falsy 跳过
1842
+ * @returns {[Array, Function]} - [filter, setFilter]
1843
+ *
1844
+ * @example
1845
+ * // 数组形式(默认单选)
1846
+ * const [filter, setFilter] = useUrlFilterValue(['keyword', 'status']);
1847
+ * // URL: ?filterParams[keyword]=前端开发&filterParams[status]=招聘中:active
1848
+ * // → filter: [
1849
+ * // { name: 'keyword', value: { label: '前端开发', value: '前端开发' } },
1850
+ * // { name: 'status', value: { label: '招聘中', value: 'active' } }
1851
+ * // ]
1852
+ *
1853
+ * @example
1854
+ * // 对象形式(多选 + 自定义)
1855
+ * const [filter, setFilter] = useUrlFilterValue({
1856
+ * keyword: true,
1857
+ * city: { multi: true },
1858
+ * status: (parsed) => parsed ? { name: 'status', value: parsed } : null
1859
+ * });
1860
+ * // URL: ?filterParams[keyword]=测试&filterParams[city]=上海:010,北京:020
1861
+ * // → keyword: { label: '测试', value: '测试' }
1862
+ * // → city: [{ label: '上海', value: '010' }, { label: '北京', value: '020' }]
1863
+ */
1864
+ const useUrlFilterValue = mapping => {
1865
+ const normalizedMapping = Array.isArray(mapping) ? mapping.reduce((acc, item) => {
1866
+ const key = typeof item === 'string' ? item : item.name;
1867
+ acc[key] = typeof item === 'string' ? true : item;
1868
+ return acc;
1869
+ }, {}) : mapping;
1870
+ return useUrlFilter({
1871
+ readUrlParams: searchParams => {
1872
+ const _createUrlFilterReade = createUrlFilterReader(searchParams),
1873
+ takeFilterEntry = _createUrlFilterReade.takeFilterEntry,
1874
+ getConsumedKeys = _createUrlFilterReade.getConsumedKeys;
1875
+ const data = {};
1876
+ Object.entries(normalizedMapping).forEach(_ref => {
1877
+ let key = _ref[0],
1878
+ config = _ref[1];
1879
+ const multi = typeof config === 'object' && config !== null && config.multi;
1880
+ const val = takeFilterEntry(key, {
1881
+ multi
1882
+ });
1883
+ if (val !== null) data[key] = val;
1884
+ });
1885
+ return _extends({
1886
+ consumedKeys: getConsumedKeys()
1887
+ }, data);
516
1888
  },
517
- onActiveChange: function onActiveChange(active) {
518
- if (!active) {
519
- setError(null);
520
- }
521
-
522
- _onActiveChange && _onActiveChange(active);
1889
+ buildFilter: data => {
1890
+ const values = _objectWithoutPropertiesLoose(data, _excluded$1);
1891
+ const filters = [];
1892
+ Object.entries(normalizedMapping).forEach(_ref2 => {
1893
+ let key = _ref2[0],
1894
+ config = _ref2[1];
1895
+ if (values[key] === undefined) return;
1896
+ const parsedValue = values[key];
1897
+ if (typeof config === 'function') {
1898
+ const result = config(parsedValue);
1899
+ if (result) filters.push(result);
1900
+ } else {
1901
+ const label = typeof config === 'object' && config !== null ? config.label : key;
1902
+ filters.push({
1903
+ name: key,
1904
+ label,
1905
+ value: parsedValue
1906
+ });
1907
+ }
1908
+ });
1909
+ return filters;
523
1910
  }
524
- }, function (_ref2) {
525
- var value = _ref2.value,
526
- setValue = _ref2.setValue,
527
- setActive = _ref2.setActive;
528
- return /*#__PURE__*/React__default["default"].createElement(antd.Tooltip, {
529
- visible: !!error,
530
- title: error,
531
- placement: "bottomRight"
532
- }, /*#__PURE__*/React__default["default"].createElement(antd.Space, {
533
- size: "small",
534
- className: "react-filter-range"
535
- }, /*#__PURE__*/React__default["default"].createElement(antd.InputNumber, _extends({
536
- size: "small"
537
- }, startProps, {
538
- value: lodash.get(value, 0),
539
- onChange: function onChange(inputValue) {
540
- var target = [inputValue, lodash.get(value, 1)];
541
- check(target);
542
- setValue(target);
543
- },
544
- onFocus: function onFocus() {
545
- setActive(true);
546
- },
547
- placeholder: Array.isArray(placeholder) ? placeholder[0] : placeholder || "请输入"
548
- })), "~", /*#__PURE__*/React__default["default"].createElement(antd.InputNumber, _extends({
549
- size: "small"
550
- }, endProps, {
551
- value: lodash.get(value, 1),
552
- onChange: function onChange(inputValue) {
553
- var target = [lodash.get(value, 0), inputValue];
554
- check(target);
555
- setValue(target);
556
- },
557
- onFocus: function onFocus() {
558
- setActive(true);
559
- },
560
- placeholder: Array.isArray(placeholder) ? placeholder[0] : placeholder || "请输入"
561
- }))));
562
1911
  });
563
1912
  };
564
- var Range = withFilterItem(RangeInner);
565
1913
 
566
- var _excluded$6 = ["name", "label", "isMore", "template", "defaultActive", "onBlur", "onSearch", "onBeforeSearch", "onActiveChange", "placeholder"];
567
-
568
- var withValue$1 = function withValue(WrappedComponent, options) {
569
- if (options === void 0) {
570
- options = {};
1914
+ const toIdName = item => {
1915
+ if (!item) {
1916
+ return null;
571
1917
  }
572
-
573
- return function (_ref) {
574
- var name = _ref.name,
575
- label = _ref.label,
576
- isMore = _ref.isMore,
577
- template = _ref.template,
578
- defaultActive = _ref.defaultActive,
579
- onBlur = _ref.onBlur,
580
- onSearch = _ref.onSearch,
581
- onBeforeSearch = _ref.onBeforeSearch,
582
- _onActiveChange = _ref.onActiveChange,
583
- placeholder = _ref.placeholder,
584
- props = _objectWithoutPropertiesLoose(_ref, _excluded$6);
585
-
586
- return /*#__PURE__*/React__default["default"].createElement(SearchButton, {
587
- defaultActive: defaultActive,
588
- isMore: isMore,
589
- onBlur: onBlur,
590
- template: template,
591
- name: name,
592
- onSearch: onSearch,
593
- onBeforeSearch: onBeforeSearch,
594
- onActiveChange: function onActiveChange(active) {
595
- _onActiveChange && _onActiveChange(active);
596
- }
597
- }, function (_ref2) {
598
- var value = _ref2.value,
599
- setValue = _ref2.setValue,
600
- setActive = _ref2.setActive;
601
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(WrappedComponent, _extends({
602
- size: "small"
603
- }, props, {
604
- placeholder: placeholder || label,
605
- value: value,
606
- onChange: function onChange(e) {
607
- setValue(options.getValue ? options.getValue(e) : e.target.value.trim());
608
- },
609
- onFocus: function onFocus() {
610
- setActive(true);
611
- }
612
- })));
613
- });
614
- };
1918
+ if (item.id != null) {
1919
+ return item;
1920
+ }
1921
+ if (item.value != null) {
1922
+ return {
1923
+ id: item.value,
1924
+ name: item.label
1925
+ };
1926
+ }
1927
+ return item;
615
1928
  };
616
-
617
- var TextInner = withValue$1(antd.Input);
618
- var Text = withFilterItem(withValue$1(antd.Input));
619
- Text.Number = withFilterItem(withValue$1(antd.InputNumber, {
620
- getValue: function getValue(value) {
621
- return value;
1929
+ const toLabelValue = item => {
1930
+ var _item$name, _item$id;
1931
+ if (!item) {
1932
+ return null;
622
1933
  }
623
- }));
1934
+ return {
1935
+ label: (_item$name = item.name) != null ? _item$name : item.label,
1936
+ value: (_item$id = item.id) != null ? _item$id : item.value
1937
+ };
1938
+ };
624
1939
 
625
- var _excluded$5 = ["name", "label", "placeholder", "isMore"];
626
- var SelectorInner = function SelectorInner(_ref) {
627
- var name = _ref.name,
628
- label = _ref.label,
629
- placeholder = _ref.placeholder,
630
- props = _objectWithoutPropertiesLoose(_ref, _excluded$5);
631
-
632
- var _useConsumer = useConsumer(),
633
- aValue = _useConsumer.value,
634
- _onChange = _useConsumer.onChange;
635
-
636
- var currentValue = aValue[name];
637
- return /*#__PURE__*/React__default["default"].createElement(antd.Select, _extends({}, props, {
638
- placeholder: label || placeholder,
639
- size: "small",
640
- value: currentValue,
641
- onChange: function onChange(value, item) {
642
- _onChange(name, item);
1940
+ /**
1941
+ * 单选 SuperSelect interceptor:{id, name} ↔ {label, value}
1942
+ * 适用于 valueKey="id" labelKey="name" 的单选场景
1943
+ */
1944
+ const singleSelectInterceptor = {
1945
+ input: value => {
1946
+ if (!value) {
1947
+ return value;
643
1948
  }
644
- }));
1949
+ const item = Array.isArray(value) ? value[0] : value;
1950
+ const result = toIdName(item);
1951
+ return result;
1952
+ },
1953
+ output: selected => {
1954
+ if (!selected) {
1955
+ return selected;
1956
+ }
1957
+ const item = Array.isArray(selected) ? selected[0] : selected;
1958
+ return toLabelValue(item);
1959
+ }
645
1960
  };
646
- var Selector = withFilterItem(SelectorInner);
647
1961
 
648
- var _excluded$4 = ["name", "label", "className", "isMore"];
649
-
650
- var Check = function Check(_ref) {
651
- var name = _ref.name,
652
- label = _ref.label,
653
- className = _ref.className,
654
- props = _objectWithoutPropertiesLoose(_ref, _excluded$4);
655
-
656
- var _useConsumer = useConsumer(),
657
- aValue = _useConsumer.value,
658
- _onChange = _useConsumer.onChange;
659
-
660
- var currentValue = aValue[name];
661
- return /*#__PURE__*/React__default["default"].createElement(antd.Checkbox, _extends({}, props, {
662
- className: classnames__default["default"]('react-filter-item', className),
663
- size: "small",
664
- checked: currentValue,
665
- onChange: function onChange(e) {
666
- _onChange(name, e.target.checked ? {
667
- value: true,
668
- label: label
669
- } : null);
1962
+ /**
1963
+ * 多选 SuperSelect interceptor:[{id, name}] ↔ [{label, value}]
1964
+ * 适用于 valueKey="id" labelKey="name" 的多选场景
1965
+ */
1966
+ const multiSelectInterceptor = {
1967
+ input: value => {
1968
+ if (!value) {
1969
+ return value;
1970
+ }
1971
+ const list = Array.isArray(value) ? value : [value];
1972
+ return list.map(toIdName).filter(Boolean);
1973
+ },
1974
+ output: selected => {
1975
+ if (!selected) {
1976
+ return selected;
670
1977
  }
671
- }), label);
1978
+ const list = Array.isArray(selected) ? selected : [selected];
1979
+ return list.map(toLabelValue).filter(Boolean);
1980
+ }
1981
+ };
1982
+ var filterInterceptors = {
1983
+ single: singleSelectInterceptor,
1984
+ multi: multiSelectInterceptor
672
1985
  };
673
1986
 
674
- var _excluded$3 = ["label", "name", "options", "isMore"];
675
- var RadioList = withFilterItem(function (_ref) {
676
- var name = _ref.name,
677
- options = _ref.options,
678
- props = _objectWithoutPropertiesLoose(_ref, _excluded$3);
679
-
680
- var _useConsumer = useConsumer(),
681
- aValue = _useConsumer.value,
682
- _onChange = _useConsumer.onChange;
683
-
684
- var currentValue = aValue[name];
685
- return /*#__PURE__*/React__default["default"].createElement(antd.Radio.Group, _extends({}, props, {
686
- options: options,
687
- value: lodash.get(currentValue, 'value'),
688
- onChange: function onChange(e) {
689
- var item = options.find(function (item) {
690
- return item.value === e.target.value;
691
- });
692
-
693
- _onChange(name, item);
1987
+ const InputFilterItem = withLocale(({
1988
+ value,
1989
+ label,
1990
+ onChange,
1991
+ ...props
1992
+ }) => {
1993
+ const propsValue = value?.value;
1994
+ const [inputValue, setInputValue] = react.useState(propsValue || '');
1995
+ const [active, setActive] = react.useState(false);
1996
+ const {
1997
+ formatMessage
1998
+ } = reactIntl.useIntl({
1999
+ moduleName: 'Filter'
2000
+ });
2001
+ const searchHandler = () => {
2002
+ onChange(inputValue ? {
2003
+ label: inputValue,
2004
+ value: inputValue
2005
+ } : null);
2006
+ };
2007
+ const handleBlur = () => {
2008
+ setActive(false);
2009
+ searchHandler();
2010
+ };
2011
+ const inputValueRef = react.useRef('');
2012
+ inputValueRef.current = inputValue;
2013
+ react.useEffect(() => {
2014
+ if (propsValue !== inputValueRef.current) {
2015
+ setInputValue(propsValue);
694
2016
  }
695
- }));
2017
+ }, [propsValue]);
2018
+ return /*#__PURE__*/jsxRuntime.jsxs(antd.Space.Compact, {
2019
+ children: [/*#__PURE__*/jsxRuntime.jsx(antd.Input, {
2020
+ placeholder: `${formatMessage({
2021
+ id: 'pleaseInput'
2022
+ })}${label}`,
2023
+ ...props,
2024
+ size: "small",
2025
+ value: inputValue,
2026
+ onFocus: () => {
2027
+ setActive(true);
2028
+ },
2029
+ onBlur: handleBlur,
2030
+ onChange: e => {
2031
+ setInputValue(e.target.value);
2032
+ },
2033
+ onPressEnter: searchHandler
2034
+ }), active && /*#__PURE__*/jsxRuntime.jsx(antd.Button, {
2035
+ size: "small",
2036
+ type: "primary",
2037
+ onClick: searchHandler,
2038
+ children: formatMessage({
2039
+ id: 'determineText'
2040
+ })
2041
+ })]
2042
+ });
696
2043
  });
697
2044
 
698
- var _excluded$2 = ["label", "name", "options", "isMore"];
699
- var CheckboxList = withFilterItem(function (_ref) {
700
- var name = _ref.name,
701
- options = _ref.options,
702
- props = _objectWithoutPropertiesLoose(_ref, _excluded$2);
703
-
704
- var _useConsumer = useConsumer(),
705
- aValue = _useConsumer.value,
706
- _onChange = _useConsumer.onChange;
707
-
708
- var currentValue = aValue[name];
709
- return /*#__PURE__*/React__default["default"].createElement(antd.Checkbox.Group, _extends({}, props, {
710
- value: (currentValue || []).map(function (_ref2) {
711
- var value = _ref2.value;
712
- return value;
713
- }),
714
- onChange: function onChange(value) {
715
- var item = value.map(function (value) {
716
- return options.find(function (item) {
717
- return item.value === value;
718
- });
719
- });
720
- console.log(item);
721
-
722
- _onChange(name, item);
723
- },
724
- options: options
725
- }));
2045
+ const {
2046
+ CheckableTag: CheckableTag$1
2047
+ } = antd.Tag;
2048
+ const ListFilterItem = withLocale(({
2049
+ value,
2050
+ onChange,
2051
+ label,
2052
+ single = false,
2053
+ maxLength = 5,
2054
+ items = []
2055
+ }) => {
2056
+ const {
2057
+ message
2058
+ } = antd.App.useApp();
2059
+ const {
2060
+ formatMessage
2061
+ } = reactIntl.useIntl({
2062
+ moduleName: 'Filter'
2063
+ });
2064
+ return /*#__PURE__*/jsxRuntime.jsx(antd.Space, {
2065
+ size: 4,
2066
+ wrap: true,
2067
+ block: true,
2068
+ children: items.map(({
2069
+ label: itemLabel,
2070
+ value: itemValue
2071
+ }) => {
2072
+ return /*#__PURE__*/jsxRuntime.jsx(CheckableTag$1, {
2073
+ size: "small",
2074
+ checked: single ? isEqual__default["default"](itemValue, value?.value) : !!(value || []).find(({
2075
+ value
2076
+ }) => isEqual__default["default"](itemValue, value)),
2077
+ onChange: checked => {
2078
+ if (single) {
2079
+ onChange(checked ? {
2080
+ value: itemValue,
2081
+ label: itemLabel
2082
+ } : null);
2083
+ return;
2084
+ }
2085
+ const newValue = (value || []).slice(0);
2086
+ if (checked) {
2087
+ newValue.push({
2088
+ value: itemValue,
2089
+ label: itemLabel
2090
+ });
2091
+ } else {
2092
+ const index = newValue.findIndex(({
2093
+ value
2094
+ }) => isEqual__default["default"](itemValue, value));
2095
+ if (index > -1) {
2096
+ newValue.splice(index, 1);
2097
+ }
2098
+ }
2099
+ if (newValue.length > maxLength) {
2100
+ message.error(formatMessage({
2101
+ id: 'maxSelectedCount'
2102
+ }, {
2103
+ count: maxLength
2104
+ }));
2105
+ return;
2106
+ }
2107
+ onChange(newValue);
2108
+ },
2109
+ children: itemLabel
2110
+ }, itemLabel);
2111
+ })
2112
+ });
726
2113
  });
727
2114
 
728
- var _excluded$1 = ["name", "label", "placeholder", "template", "isMore"];
729
-
730
- var withValue = function withValue(WrappedComponent, options) {
731
- if (options === void 0) {
732
- options = {};
2115
+ const {
2116
+ CheckableTag
2117
+ } = antd.Tag;
2118
+ const getLabelForLocal = (item, locale) => {
2119
+ if (locale === 'en-US') {
2120
+ return item?.enName || item?.name;
733
2121
  }
734
-
735
- return function (_ref) {
736
- var name = _ref.name,
737
- label = _ref.label,
738
- placeholder = _ref.placeholder,
739
- template = _ref.template,
740
- props = _objectWithoutPropertiesLoose(_ref, _excluded$1);
741
-
742
- var _useConsumer = useConsumer(),
743
- aValue = _useConsumer.value,
744
- _onChange = _useConsumer.onChange;
745
-
746
- var currentValue = aValue[name];
747
- return /*#__PURE__*/React__default["default"].createElement(WrappedComponent, _extends({}, props, {
748
- placeholder: options.range ? placeholder || [label, label] : placeholder || label,
749
- size: "small",
750
- value: currentValue && moment__default["default"](currentValue),
751
- onChange: function onChange(value, item) {
752
- _onChange(name, {
753
- label: lodash.isFunction(template) ? template(item) : options.range ? item.join('~') : item,
754
- value: item
755
- });
756
- }
757
- }));
758
- };
2122
+ return item?.name;
759
2123
  };
760
-
761
- var DateTime = withFilterItem(withValue(antd.DatePicker));
762
- DateTime.Month = withFilterItem(withValue(antd.DatePicker.MonthPicker));
763
- DateTime.Week = withFilterItem(withValue(antd.DatePicker.WeekPicker));
764
- DateTime.Time = withFilterItem(withValue(antd.DatePicker.TimePicker));
765
- DateTime.YearPicker = withFilterItem(withValue(antd.DatePicker.YearPicker));
766
- DateTime.Range = withFilterItem(withValue(antd.DatePicker.RangePicker, {
767
- range: true
768
- }));
769
-
770
- var filterNull = function filterNull(item) {
771
- var target = Object.assign({}, item);
772
- Object.keys(target).forEach(function (key) {
773
- var item = target[key];
774
-
775
- (function () {
776
- if (Array.isArray(item) && item.length > 0 && item.every(function (item) {
777
- return item.value === void 0 || item.value === null || item.value === "";
778
- })) {
779
- delete target[key];
780
- return;
781
- }
782
-
783
- if (Array.isArray(item) && item.length === 0) {
784
- delete target[key];
785
- return;
786
- }
787
-
788
- if (item && Array.isArray(item.value) && (item.value.length === 0 || item.value.every(function (item) {
789
- return item === void 0 || item === null || item === "";
790
- }))) {
791
- delete target[key];
792
- return;
793
- }
794
-
795
- if (item === void 0 || item === null || !Array.isArray(item) && item && (item.value === void 0 || item.value === null || item.value === "")) {
796
- delete target[key];
797
- return;
2124
+ const CityFilterItemInner = ({
2125
+ value,
2126
+ onChange,
2127
+ single = false,
2128
+ maxLength = 5,
2129
+ ...props
2130
+ }) => {
2131
+ const {
2132
+ message
2133
+ } = antd.App.useApp();
2134
+ const {
2135
+ locale
2136
+ } = reactIntl.useIntl();
2137
+ const {
2138
+ formatMessage
2139
+ } = reactIntl.useIntl({
2140
+ moduleName: 'Filter'
2141
+ });
2142
+ const [addressApi, setAddressApi] = react.useState(null);
2143
+ react.useEffect(() => {
2144
+ let cancelled = false;
2145
+ superSelectPlus.SelectAddress.defaultData().then(data => {
2146
+ if (!cancelled && data) {
2147
+ setAddressApi(superSelectPlus.createAddressApi(data));
798
2148
  }
799
- })();
2149
+ });
2150
+ return () => {
2151
+ cancelled = true;
2152
+ };
2153
+ }, []);
2154
+ const cityList = react.useMemo(() => {
2155
+ return addressApi ? addressApi.getChinaHotCities() : [];
2156
+ }, [addressApi]);
2157
+ return /*#__PURE__*/jsxRuntime.jsxs(antd.Space, {
2158
+ size: 4,
2159
+ wrap: true,
2160
+ block: true,
2161
+ children: [cityList.map(city => {
2162
+ const label = getLabelForLocal(city, locale);
2163
+ return /*#__PURE__*/jsxRuntime.jsx(CheckableTag, {
2164
+ size: "small",
2165
+ checked: single ? value?.value === city.code : !!(value || []).find(({
2166
+ value
2167
+ }) => value === city.code),
2168
+ onChange: checked => {
2169
+ if (single) {
2170
+ onChange(checked ? city : null);
2171
+ return;
2172
+ }
2173
+ const newValue = (value || []).slice(0);
2174
+ checked ? newValue.push(Object.assign({}, city, {
2175
+ label,
2176
+ value: city.code
2177
+ })) : (() => {
2178
+ const index = newValue.findIndex(({
2179
+ value
2180
+ }) => value === city.code);
2181
+ newValue.splice(index, 1);
2182
+ })();
2183
+ if (newValue.length > maxLength) {
2184
+ message.error(formatMessage({
2185
+ id: 'maxSelectedCount'
2186
+ }, {
2187
+ count: maxLength
2188
+ }));
2189
+ return;
2190
+ }
2191
+ onChange(newValue);
2192
+ },
2193
+ children: label
2194
+ }, city.code);
2195
+ }), /*#__PURE__*/jsxRuntime.jsxs(CheckableTag, {
2196
+ className: style$1['filter-advanced-item-other'],
2197
+ size: "small",
2198
+ checked: (single ? value?.value : value?.length > 0) && !cityList.find(({
2199
+ code
2200
+ }) => single ? value?.value === code : !!(value || []).find(({
2201
+ value
2202
+ }) => value === code)),
2203
+ children: [formatMessage({
2204
+ id: 'otherText'
2205
+ }), /*#__PURE__*/jsxRuntime.jsx(superSelectPlus.SelectAddress, {
2206
+ ...props,
2207
+ className: style$1['filter-advanced-item-other-inner'],
2208
+ maxLength: maxLength,
2209
+ allowClear: false,
2210
+ value: value,
2211
+ single: single,
2212
+ onChange: value => {
2213
+ if (value.length > maxLength) {
2214
+ message.error(formatMessage({
2215
+ id: 'maxSelectedCount'
2216
+ }, {
2217
+ count: maxLength
2218
+ }));
2219
+ return;
2220
+ }
2221
+ onChange(value);
2222
+ }
2223
+ })]
2224
+ })]
800
2225
  });
801
- return target;
802
2226
  };
2227
+ const CityFilterItem = withLocale(CityFilterItemInner);
803
2228
 
804
- var Filter = function Filter(_ref) {
805
- var displayLine = _ref.displayLine,
806
- defaultDisplay = _ref.defaultDisplay,
807
- isExtra = _ref.isExtra,
808
- list = _ref.list,
809
- label = _ref.label,
810
- labelHidden = _ref.labelHidden,
811
- itemLabelHidden = _ref.itemLabelHidden,
812
- unfoldText = _ref.unfoldText,
813
- foldText = _ref.foldText,
814
- extra = _ref.extra,
815
- more = _ref.more,
816
- moreTrigger = _ref.moreTrigger,
817
- moreLabel = _ref.moreLabel,
818
- originValue = _ref.value,
819
- onChange = _ref.onChange;
820
- var value = React.useMemo(function () {
821
- return filterNull(originValue);
822
- }, [originValue]);
823
- var emitter = useEvent__default["default"]();
824
-
825
- var _useState = React.useState(defaultDisplay),
826
- display = _useState[0],
827
- setDisplay = _useState[1];
828
-
829
- var basicList = list.slice(0, displayLine),
830
- moreList = list.slice(displayLine);
831
-
832
- var renderList = function renderList(list) {
833
- return list.map(function (item, index) {
834
- return /*#__PURE__*/React__default["default"].createElement(antd.Space, {
835
- key: index,
836
- className: "react-filter-line"
837
- }, item.map(function (item, index) {
838
- return React.cloneElement(item, {
839
- key: index,
840
- labelHidden: itemLabelHidden
841
- });
842
- }));
843
- });
844
- };
845
-
846
- var changeHandler = function changeHandler(name, item) {
847
- var _Object$assign;
848
-
849
- var target = Object.assign({}, value, (_Object$assign = {}, _Object$assign[name] = item, _Object$assign));
850
- var output = filterNull(target);
851
- emitter.emit('change', output);
852
- onChange(output);
853
- };
2229
+ const fields = {
2230
+ InputFilterItem,
2231
+ ListFilterItem,
2232
+ CityFilterItem
2233
+ };
854
2234
 
855
- var moreFilter = more && more.length > 0 ? /*#__PURE__*/React__default["default"].createElement(antd.Space, {
856
- className: "react-filter-line is-more"
857
- }, /*#__PURE__*/React__default["default"].createElement(antd.Space, {
858
- className: "react-filter-item"
859
- }, /*#__PURE__*/React__default["default"].createElement("div", {
860
- className: "react-filter-item-label"
861
- }, moreLabel, ":"), /*#__PURE__*/React__default["default"].createElement(antd.Space, {
862
- className: "react-filter-item-children",
863
- split: /*#__PURE__*/React__default["default"].createElement(antd.Divider, {
864
- type: "vertical"
2235
+ const Line = _ref => {
2236
+ let list = _ref.list;
2237
+ const _useContext = useContext(),
2238
+ value = _useContext.value,
2239
+ onChange = _useContext.onChange;
2240
+ return /*#__PURE__*/jsxRuntime.jsx(antd.Flex, {
2241
+ gap: 8,
2242
+ children: list.map((item, index) => {
2243
+ const ComponentItem = item.type;
2244
+ return /*#__PURE__*/jsxRuntime.jsxs(antd.Flex, {
2245
+ gap: 16,
2246
+ align: "center",
2247
+ children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
2248
+ className: style$1['filter-label'],
2249
+ children: [item.props.label, ":"]
2250
+ }), /*#__PURE__*/jsxRuntime.jsx(antd.Flex, {
2251
+ wrap: true,
2252
+ align: "center",
2253
+ children: /*#__PURE__*/jsxRuntime.jsx(ComponentItem, _extends({}, item.props, {
2254
+ value: value ? get__default["default"](value.get(item.props.name), 'value') : item.props.value,
2255
+ onChange: onChange ? value => onChange({
2256
+ name: item.props.name,
2257
+ label: item.props.label,
2258
+ value
2259
+ }) : item.props.onChange
2260
+ }))
2261
+ })]
2262
+ }, item.key || item.props.name || index);
865
2263
  })
866
- }, more.map(function (item, index) {
867
- return React.cloneElement(item, {
868
- key: index,
869
- isMore: true,
870
- moreTrigger: moreTrigger
871
- });
872
- })))) : null;
873
- return /*#__PURE__*/React__default["default"].createElement(Provider$1, {
874
- value: {
875
- value: value,
876
- onChange: changeHandler,
877
- emitter: emitter
878
- }
879
- }, /*#__PURE__*/React__default["default"].createElement("div", {
880
- className: "react-filter"
881
- }, /*#__PURE__*/React__default["default"].createElement("div", {
882
- className: "react-filter-inner"
883
- }, /*#__PURE__*/React__default["default"].createElement("div", null, labelHidden ? null : /*#__PURE__*/React__default["default"].createElement(antd.Space, null, /*#__PURE__*/React__default["default"].createElement(FilterItem, {
884
- className: "react-filter-selected",
885
- label: label
886
- }, Object.keys(value).map(function (key) {
887
- var item = value[key];
888
- if (!item) return null;
889
- if (Array.isArray(item) && item.length === 0) return null;
890
- return /*#__PURE__*/React__default["default"].createElement(antd.Tag, {
891
- key: key,
892
- closable: true,
893
- onClose: function onClose() {
894
- changeHandler(key, null);
895
- }
896
- }, Array.isArray(item) ? item.map(function (_ref2) {
897
- var label = _ref2.label;
898
- return label;
899
- }).join(",") : item.label);
900
- })), /*#__PURE__*/React__default["default"].createElement("div", null, extra))), renderList(isExtra ? basicList : list), moreList.length === 0 || isExtra === false ? moreFilter : null), display && isExtra ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(antd.Divider, {
901
- className: "react-filter-divider"
902
- }), /*#__PURE__*/React__default["default"].createElement("div", {
903
- className: "react-filter-inner"
904
- }, renderList(moreList)), moreList.length > 0 ? moreFilter : null) : /*#__PURE__*/React__default["default"].createElement("div", {
905
- className: "react-filter-divider-close"
906
- }), isExtra && list.length > displayLine ? /*#__PURE__*/React__default["default"].createElement(antd.Row, {
907
- className: "react-filter-switch-btn",
908
- justify: "end"
909
- }, /*#__PURE__*/React__default["default"].createElement(antd.Col, null, /*#__PURE__*/React__default["default"].createElement(antd.Button, {
910
- type: "link",
911
- onClick: function onClick() {
912
- setDisplay(function (display) {
913
- return !display;
914
- });
915
- }
916
- }, display ? foldText : unfoldText))) : null));
917
- };
918
-
919
- Filter.type = {
920
- City: City,
921
- List: List,
922
- Range: Range,
923
- Text: Text,
924
- Selector: Selector,
925
- Check: Check,
926
- RadioList: RadioList,
927
- CheckboxList: CheckboxList,
928
- DateTime: DateTime
929
- };
930
- Filter.defaultProps = {
931
- label: '筛选项',
932
- labelHidden: false,
933
- itemLabelHidden: false,
934
- unfoldText: '展开',
935
- foldText: '收起',
936
- displayLine: 2,
937
- defaultDisplay: false,
938
- isExtra: true,
939
- list: [[]],
940
- more: [],
941
- moreTrigger: 'hover',
942
- moreLabel: '更多',
943
- value: {},
944
- extra: null,
945
- onChange: function onChange() {}
946
- };
947
-
948
- var _excluded = ["name", "value", "children"],
949
- _excluded2 = ["type"];
950
- var withMoreExtraButton = function withMoreExtraButton(WrappedComponent) {
951
- return function (_ref) {
952
- var name = _ref.name,
953
- children = _ref.children,
954
- props = _objectWithoutPropertiesLoose(_ref, _excluded);
955
-
956
- var _useState = React.useState(false),
957
- isEdit = _useState[0],
958
- setIsEdit = _useState[1];
959
-
960
- return isEdit ? /*#__PURE__*/React__default["default"].createElement(WrappedComponent, _extends({
961
- defaultActive: true
962
- }, props, {
963
- name: name,
964
- onBlur: function onBlur() {
965
- setIsEdit(false);
966
- }
967
- })) : /*#__PURE__*/React__default["default"].createElement(List.Item, {
968
- onClick: function onClick(e) {
969
- e.stopPropagation();
970
- setIsEdit(true);
971
- },
972
- label: children || "其他"
973
- });
974
- };
2264
+ });
975
2265
  };
976
- var RangeButton = withMoreExtraButton(RangeInner);
977
- var TextButton = withMoreExtraButton(TextInner);
978
- var SelectorButton = withMoreExtraButton(SelectorInner);
979
- var createExtraButton = function createExtraButton(_ref2) {
980
- var type = _ref2.type,
981
- props = _objectWithoutPropertiesLoose(_ref2, _excluded2);
982
-
983
- return function (innerProps) {
984
- var mapping = {
985
- range: RangeButton,
986
- text: TextButton,
987
- selector: SelectorButton
988
- };
989
- var ExtraButtonComponent = mapping[type];
990
-
991
- if (!ExtraButtonComponent) {
992
- return null;
2266
+ const AdvancedFilter = withLocale(props => {
2267
+ const _useIntl = reactIntl.useIntl({
2268
+ moduleName: 'Filter'
2269
+ }),
2270
+ formatMessage = _useIntl.formatMessage;
2271
+ return /*#__PURE__*/jsxRuntime.jsx(FilterOuter, _extends({}, props, {
2272
+ children: _ref2 => {
2273
+ let value = _ref2.value,
2274
+ onChange = _ref2.onChange,
2275
+ _ref2$props = _ref2.props,
2276
+ filterProps = _ref2$props === void 0 ? {} : _ref2$props;
2277
+ const list = filterProps.list,
2278
+ more = filterProps.more;
2279
+ return /*#__PURE__*/jsxRuntime.jsxs("div", {
2280
+ children: [/*#__PURE__*/jsxRuntime.jsxs(antd.Flex, {
2281
+ gap: 8,
2282
+ vertical: true,
2283
+ className: style$1['filter-advanced'],
2284
+ children: [list && list.map((item, index) => {
2285
+ return /*#__PURE__*/jsxRuntime.jsx(Line, {
2286
+ list: item
2287
+ }, index);
2288
+ }), more && /*#__PURE__*/jsxRuntime.jsx(FilterLines, {
2289
+ className: style$1['filter-advanced-more'],
2290
+ label: formatMessage({
2291
+ id: 'moreText'
2292
+ }) + ":",
2293
+ list: [more]
2294
+ })]
2295
+ }), value && value.length > 0 && /*#__PURE__*/jsxRuntime.jsx(FilterValueDisplay, {
2296
+ value: value,
2297
+ onChange: onChange
2298
+ })]
2299
+ });
993
2300
  }
2301
+ }));
2302
+ });
2303
+ AdvancedFilter.fields = fields;
994
2304
 
995
- return /*#__PURE__*/React__default["default"].createElement(ExtraButtonComponent, _extends({}, props, innerProps));
996
- };
2305
+ const _excluded = ["children"];
2306
+ const FilterItemContainer = _ref => {
2307
+ let children = _ref.children,
2308
+ props = _objectWithoutPropertiesLoose(_ref, _excluded);
2309
+ return children(props);
997
2310
  };
998
2311
 
2312
+ Filter.fields = fields$1;
2313
+ Filter.getFilterValue = getFilterValue;
2314
+ Filter.useFilter = useContext;
2315
+ Filter.SearchInput = SearchInput;
2316
+ Filter.withFilterValue = withFilterValue;
2317
+ Filter.FilterProvider = FilterProvider;
2318
+ Filter.pickSelectValues = pickSelectValues;
2319
+ Filter.createFilterValueMapper = createFilterValueMapper;
2320
+ Filter.useUrlFilter = useUrlFilter;
2321
+ Filter.useUrlFilterValue = useUrlFilterValue;
2322
+ Filter.createUrlParamsReader = createUrlParamsReader;
2323
+ Filter.stripConsumedUrlParams = stripConsumedUrlParams;
2324
+ Filter.filterToUrlParams = filterToUrlParams;
2325
+ Filter.parseFilterEntry = parseFilterEntry;
2326
+ Filter.takeFilterEntry = takeFilterEntry;
2327
+ Filter.createUrlFilterReader = createUrlFilterReader;
2328
+ Filter.filterInterceptors = filterInterceptors;
2329
+ Filter.singleSelectInterceptor = singleSelectInterceptor;
2330
+ Filter.multiSelectInterceptor = multiSelectInterceptor;
2331
+
2332
+ exports.AdvancedFilter = AdvancedFilter;
2333
+ exports.DatePickerFilterItem = DatePickerFilterItem;
2334
+ exports.DateRangePickerFilterItem = DateRangePickerFilterItem;
999
2335
  exports.FilterItem = FilterItem;
1000
- exports.SearchButton = SearchButton;
1001
- exports.createExtraButton = createExtraButton;
2336
+ exports.FilterItemContainer = FilterItemContainer;
2337
+ exports.FilterLines = FilterLines;
2338
+ exports.FilterProvider = FilterProvider;
2339
+ exports.FilterValueDisplay = FilterValueDisplay;
2340
+ exports.InputFilterItem = InputFilterItem$1;
2341
+ exports.NumberRangeFilterItem = NumberRangeFilterItem;
2342
+ exports.PopoverItem = PopoverItem;
2343
+ exports.SearchInput = SearchInput;
2344
+ exports.SelectAddressFilterItem = SelectAddressFilterItem;
2345
+ exports.SelectFunctionFilterItem = SelectFunctionFilterItem;
2346
+ exports.SelectIndustryFilterItem = SelectIndustryFilterItem;
2347
+ exports.SuperSelectFilterItem = SuperSelectFilterItem;
2348
+ exports.TypeDateRangePickerField = TypeDateRangePickerField;
2349
+ exports.TypeDateRangePickerFilterItem = TypeDateRangePickerFilterItem;
2350
+ exports.createFilterValueMapper = createFilterValueMapper;
2351
+ exports.createUrlFilterReader = createUrlFilterReader;
2352
+ exports.createUrlParamsReader = createUrlParamsReader;
1002
2353
  exports["default"] = Filter;
1003
- exports.useFilterContext = useConsumer;
1004
- exports.withFilterItem = withFilterItem;
1005
- exports.withMoreExtraButton = withMoreExtraButton;
2354
+ exports.fields = fields$1;
2355
+ exports.filterInterceptors = filterInterceptors;
2356
+ exports.filterToUrlParams = filterToUrlParams;
2357
+ exports.getFilterValue = getFilterValue;
2358
+ exports.multiSelectInterceptor = multiSelectInterceptor;
2359
+ exports.parseFilterEntry = parseFilterEntry;
2360
+ exports.pickSelectValues = pickSelectValues;
2361
+ exports.singleSelectInterceptor = singleSelectInterceptor;
2362
+ exports.stripConsumedUrlParams = stripConsumedUrlParams;
2363
+ exports.takeFilterEntry = takeFilterEntry;
2364
+ exports.useFilter = useContext;
2365
+ exports.useUrlFilter = useUrlFilter;
2366
+ exports.useUrlFilterValue = useUrlFilterValue;
2367
+ exports.withFieldItem = withFieldItem;
2368
+ exports.withFilterValue = withFilterValue;
1006
2369
  //# sourceMappingURL=index.js.map