@hkyhy/marsun-components-core 0.1.21 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/style.module.scss.js +9 -9
  2. package/dist/components/Empty/Empty.d.ts +16 -0
  3. package/dist/components/Empty/Empty.js +33 -0
  4. package/dist/components/Empty/Empty.js.map +1 -0
  5. package/dist/components/Empty/index.d.ts +2 -0
  6. package/dist/components/Empty/style.module.scss.js +7 -0
  7. package/dist/components/Empty/style.module.scss.js.map +1 -0
  8. package/dist/components/Filter/FilterDatePicker/index.d.ts +31 -0
  9. package/dist/components/Filter/FilterDatePicker/index.js +128 -0
  10. package/dist/components/Filter/FilterDatePicker/index.js.map +1 -0
  11. package/dist/components/Filter/FilterDatePicker/style.module.scss.js +10 -0
  12. package/dist/components/Filter/FilterDatePicker/style.module.scss.js.map +1 -0
  13. package/dist/components/Filter/FilterDateRange/index.d.ts +7 -2
  14. package/dist/components/Filter/FilterDateRange/index.js +96 -68
  15. package/dist/components/Filter/FilterDateRange/index.js.map +1 -1
  16. package/dist/components/Filter/index.d.ts +3 -0
  17. package/dist/components/TooltipInfo/TooltipInfo.js +11 -10
  18. package/dist/components/TooltipInfo/TooltipInfo.js.map +1 -1
  19. package/dist/components/index.d.ts +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.js +375 -367
  22. package/dist/index.js.map +1 -1
  23. package/dist/marsun-components-core.css +1 -1
  24. package/dist/styles/global.css +1 -1
  25. package/dist/theme/theme.js +1 -3
  26. package/dist/theme/theme.js.map +1 -1
  27. package/dist/utils/pickerDate.d.ts +9 -0
  28. package/dist/utils/pickerDate.js +33 -0
  29. package/dist/utils/pickerDate.js.map +1 -0
  30. package/package.json +1 -1
@@ -1,13 +1,13 @@
1
1
  const a = {
2
- "chat-agent-fab": "_chat-agent-fab_2h3a2_1",
3
- "chat-agent-fab-button": "_chat-agent-fab-button_2h3a2_9",
4
- "chat-agent-fab-button--active": "_chat-agent-fab-button--active_2h3a2_24",
5
- "chat-agent-fab-icon": "_chat-agent-fab-icon_2h3a2_28",
6
- "chat-agent-fab-panel": "_chat-agent-fab-panel_2h3a2_34",
7
- "chat-agent-fab-panel-body": "_chat-agent-fab-panel-body_2h3a2_46",
8
- "chat-agent-fab-panel--expanded": "_chat-agent-fab-panel--expanded_2h3a2_51",
9
- "chat-agent-fab-panel--fullscreen": "_chat-agent-fab-panel--fullscreen_2h3a2_55",
10
- "chat-agent-fab-panel-body--expanded": "_chat-agent-fab-panel-body--expanded_2h3a2_60"
2
+ "chat-agent-fab": "_chat-agent-fab_14yq1_1",
3
+ "chat-agent-fab-button": "_chat-agent-fab-button_14yq1_9",
4
+ "chat-agent-fab-button--active": "_chat-agent-fab-button--active_14yq1_24",
5
+ "chat-agent-fab-icon": "_chat-agent-fab-icon_14yq1_28",
6
+ "chat-agent-fab-panel": "_chat-agent-fab-panel_14yq1_34",
7
+ "chat-agent-fab-panel-body": "_chat-agent-fab-panel-body_14yq1_45",
8
+ "chat-agent-fab-panel--expanded": "_chat-agent-fab-panel--expanded_14yq1_50",
9
+ "chat-agent-fab-panel--fullscreen": "_chat-agent-fab-panel--fullscreen_14yq1_54",
10
+ "chat-agent-fab-panel-body--expanded": "_chat-agent-fab-panel-body--expanded_14yq1_59"
11
11
  };
12
12
  export {
13
13
  a as default
@@ -0,0 +1,16 @@
1
+ import { EmptyProps } from 'antd';
2
+ import { ReactNode } from 'react';
3
+ export type EmptyIconType = 'default' | 'simple';
4
+ export interface MarsunEmptyProps extends Omit<EmptyProps, 'image' | 'description'> {
5
+ /** 是否展示图标,默认 true */
6
+ showIcon?: boolean;
7
+ /** 预设图标:default=antd 默认图,simple=PRESENTED_IMAGE_SIMPLE */
8
+ iconType?: EmptyIconType;
9
+ /** 自定义图标节点,优先级高于 iconType */
10
+ icon?: ReactNode;
11
+ /** 描述文案,不传则不渲染 description */
12
+ description?: ReactNode;
13
+ }
14
+ /** 基于 antd Empty 的空态展示,统一 Icon / description 可选语义 */
15
+ declare const MarsunEmpty: React.FC<MarsunEmptyProps>;
16
+ export default MarsunEmpty;
@@ -0,0 +1,33 @@
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import { Empty as s } from "antd";
3
+ import i from "classnames";
4
+ import u from "./style.module.scss.js";
5
+ function l({
6
+ showIcon: e,
7
+ iconType: m,
8
+ icon: r
9
+ }) {
10
+ if (e === !1) return !1;
11
+ if (r) return r;
12
+ if (m === "simple") return s.PRESENTED_IMAGE_SIMPLE;
13
+ }
14
+ const d = ({
15
+ showIcon: e = !0,
16
+ iconType: m = "default",
17
+ icon: r,
18
+ description: t,
19
+ className: a,
20
+ ...f
21
+ }) => /* @__PURE__ */ o(
22
+ s,
23
+ {
24
+ className: i("marsun-empty", u["marsun-empty"], a),
25
+ image: l({ showIcon: e, iconType: m, icon: r }),
26
+ description: t !== void 0 ? t : !1,
27
+ ...f
28
+ }
29
+ );
30
+ export {
31
+ d as default
32
+ };
33
+ //# sourceMappingURL=Empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Empty.js","sources":["../../../src/components/Empty/Empty.tsx"],"sourcesContent":["import { Empty as AntEmpty } from 'antd';\nimport type { EmptyProps } from 'antd';\nimport classNames from 'classnames';\nimport type { ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport type EmptyIconType = 'default' | 'simple';\n\nexport interface MarsunEmptyProps extends Omit<EmptyProps, 'image' | 'description'> {\n /** 是否展示图标,默认 true */\n showIcon?: boolean;\n /** 预设图标:default=antd 默认图,simple=PRESENTED_IMAGE_SIMPLE */\n iconType?: EmptyIconType;\n /** 自定义图标节点,优先级高于 iconType */\n icon?: ReactNode;\n /** 描述文案,不传则不渲染 description */\n description?: ReactNode;\n}\n\nfunction resolveImage({\n showIcon,\n iconType,\n icon,\n}: Pick<MarsunEmptyProps, 'showIcon' | 'iconType' | 'icon'>): EmptyProps['image'] {\n if (showIcon === false) return false;\n if (icon) return icon;\n if (iconType === 'simple') return AntEmpty.PRESENTED_IMAGE_SIMPLE;\n return undefined;\n}\n\n/** 基于 antd Empty 的空态展示,统一 Icon / description 可选语义 */\nconst MarsunEmpty: React.FC<MarsunEmptyProps> = ({\n showIcon = true,\n iconType = 'default',\n icon,\n description,\n className,\n ...rest\n}) => (\n <AntEmpty\n className={classNames('marsun-empty', styles['marsun-empty'], className)}\n image={resolveImage({ showIcon, iconType, icon })}\n description={description !== undefined ? description : false}\n {...rest}\n />\n);\n\nexport default MarsunEmpty;\n"],"names":["resolveImage","showIcon","iconType","icon","AntEmpty","MarsunEmpty","description","className","rest","jsx","classNames","styles"],"mappings":";;;;AAmBA,SAASA,EAAa;AAAA,EACpB,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AACF,GAAkF;AAChF,MAAIF,MAAa,GAAO,QAAO;AAC/B,MAAIE,EAAM,QAAOA;AACjB,MAAID,MAAa,SAAU,QAAOE,EAAS;AAE7C;AAGA,MAAMC,IAA0C,CAAC;AAAA,EAC/C,UAAAJ,IAAW;AAAA,EACX,UAAAC,IAAW;AAAA,EACX,MAAAC;AAAA,EACA,aAAAG;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MACE,gBAAAC;AAAA,EAACL;AAAAA,EAAA;AAAA,IACC,WAAWM,EAAW,gBAAgBC,EAAO,cAAc,GAAGJ,CAAS;AAAA,IACvE,OAAOP,EAAa,EAAE,UAAAC,GAAU,UAAAC,GAAU,MAAAC,GAAM;AAAA,IAChD,aAAaG,MAAgB,SAAYA,IAAc;AAAA,IACtD,GAAGE;AAAA,EAAA;AACN;"}
@@ -0,0 +1,2 @@
1
+ export { default as Empty } from './Empty';
2
+ export type { MarsunEmptyProps, EmptyIconType } from './Empty';
@@ -0,0 +1,7 @@
1
+ const s = {
2
+ "marsun-empty": "_marsun-empty_nos46_1"
3
+ };
4
+ export {
5
+ s as default
6
+ };
7
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -0,0 +1,31 @@
1
+ import { Dayjs } from 'dayjs';
2
+ import { default as React } from 'react';
3
+ import { DatePickerGranularity } from '../../../utils/pickerDate';
4
+ import { BaseFilterProps } from '../types';
5
+ /** 单值快捷选项 */
6
+ interface SingleQuickOption {
7
+ key: string;
8
+ label: string;
9
+ getValue: () => Dayjs;
10
+ }
11
+ interface FilterDatePickerProps extends BaseFilterProps {
12
+ value?: string | null;
13
+ onChange?: (value: string | null) => void;
14
+ /** 选择粒度:日 / 月 / 年 */
15
+ picker?: DatePickerGranularity;
16
+ /** 默认值:与默认相同时视为未筛选(除非 showDefaultAsSelected) */
17
+ defaultValue?: string;
18
+ /** 为 true 时,value 等于 defaultValue 仍展示在已选 Tag 中 */
19
+ showDefaultAsSelected?: boolean;
20
+ showQuickOptions?: boolean;
21
+ quickOptions?: SingleQuickOption[];
22
+ placeholder?: string;
23
+ disabledDate?: (current: Dayjs) => boolean;
24
+ }
25
+ declare function getBuiltInQuickOptions(picker: DatePickerGranularity): SingleQuickOption[];
26
+ declare function isSamePickerValue(a?: string | null, b?: string): boolean;
27
+ declare function findMatchingQuickKey(value: string | null | undefined, picker: DatePickerGranularity, opts: SingleQuickOption[]): string | null;
28
+ declare const FilterDatePicker: React.FC<FilterDatePickerProps>;
29
+ export default FilterDatePicker;
30
+ export type { FilterDatePickerProps, SingleQuickOption };
31
+ export { findMatchingQuickKey, getBuiltInQuickOptions, isSamePickerValue };
@@ -0,0 +1,128 @@
1
+ import { jsxs as E, jsx as h } from "react/jsx-runtime";
2
+ import { DatePicker as H } from "antd";
3
+ import I from "dayjs";
4
+ import { useState as O, useMemo as g, useEffect as j } from "react";
5
+ import { parsePickerValue as u, formatPickerValue as K } from "../../../utils/pickerDate.js";
6
+ import L from "../FilterPopover/index.js";
7
+ import { resolveHidden as M } from "../types.js";
8
+ import { useFilterRegister as T } from "../useFilterState.js";
9
+ import c from "./style.module.scss.js";
10
+ import P from "classnames";
11
+ function Y(r) {
12
+ const e = I();
13
+ return r === "year" ? [{ key: "thisYear", label: "今年", getValue: () => e.startOf("year") }] : r === "month" ? [{ key: "thisMonth", label: "本月", getValue: () => e.startOf("month") }] : [{ key: "today", label: "今天", getValue: () => e.startOf("day") }];
14
+ }
15
+ function w(r, e) {
16
+ return !r && !e ? !0 : !r || !e ? !1 : r === e;
17
+ }
18
+ function z(r, e, t) {
19
+ if (!r) return null;
20
+ const i = u(r, e);
21
+ if (!i.isValid()) return null;
22
+ for (const n of t) {
23
+ const m = n.getValue(), d = e === "year" ? "year" : e === "month" ? "month" : "day";
24
+ if (m.isSame(i, d)) return n.key;
25
+ }
26
+ return null;
27
+ }
28
+ const it = ({
29
+ filterKey: r,
30
+ label: e,
31
+ value: t,
32
+ onChange: i,
33
+ picker: n = "date",
34
+ defaultValue: m,
35
+ showDefaultAsSelected: d = !1,
36
+ showQuickOptions: q = !1,
37
+ quickOptions: N,
38
+ placeholder: R,
39
+ disabledDate: S,
40
+ active: A,
41
+ hidden: k
42
+ }) => {
43
+ const [b, p] = O(!1), [y, l] = O(t ? u(t, n) : null), [x, o] = O(null), f = T(), a = g(
44
+ () => N ?? (q ? Y(n) : []),
45
+ [N, q, n]
46
+ ), F = (s) => {
47
+ o(z(s, n, a));
48
+ }, Q = () => {
49
+ t ? (l(u(t, n)), F(t)) : (l(null), o(null));
50
+ };
51
+ j(() => {
52
+ t ? (l(u(t, n)), F(t)) : (l(null), o(null));
53
+ }, [t, n, a]);
54
+ const V = d ? !!t : !!t && !w(t, m), D = g(() => !V || !t ? "" : t, [V, t]);
55
+ return j(() => {
56
+ if (f) {
57
+ if (M(k)) {
58
+ f.unregister(r);
59
+ return;
60
+ }
61
+ D ? f.register(r, { label: e, valueLabel: D, onRemove: () => i == null ? void 0 : i(null) }) : f.unregister(r);
62
+ }
63
+ }, [D, r, e, k]), M(k) ? null : /* @__PURE__ */ E(
64
+ L,
65
+ {
66
+ label: e,
67
+ active: A || V,
68
+ open: b,
69
+ onOpenChange: (s) => {
70
+ Q(), p(s);
71
+ },
72
+ onConfirm: () => {
73
+ y ? i == null || i(K(y, n)) : i == null || i(null), p(!1);
74
+ },
75
+ onReset: () => {
76
+ Q(), p(!1);
77
+ },
78
+ children: [
79
+ a.length > 0 ? /* @__PURE__ */ h(
80
+ "div",
81
+ {
82
+ className: P(
83
+ "filter-date-picker-quick-options",
84
+ c["filter-date-picker-quick-options"]
85
+ ),
86
+ children: a.map((s) => /* @__PURE__ */ h(
87
+ "span",
88
+ {
89
+ className: P(
90
+ "filter-date-picker-quick-option",
91
+ c["filter-date-picker-quick-option"],
92
+ x === s.key && "filter-date-picker-quick-option-active",
93
+ x === s.key && c["filter-date-picker-quick-option-active"]
94
+ ),
95
+ onClick: () => {
96
+ const B = s.getValue();
97
+ l(B), o(s.key);
98
+ },
99
+ children: s.label
100
+ },
101
+ s.key
102
+ ))
103
+ }
104
+ ) : null,
105
+ /* @__PURE__ */ h(
106
+ H,
107
+ {
108
+ className: P("filter-date-picker", c["filter-date-picker"]),
109
+ picker: n,
110
+ value: y,
111
+ placeholder: R,
112
+ disabledDate: S,
113
+ onChange: (s) => {
114
+ l(s), o(null);
115
+ }
116
+ }
117
+ )
118
+ ]
119
+ }
120
+ );
121
+ };
122
+ export {
123
+ it as default,
124
+ z as findMatchingQuickKey,
125
+ Y as getBuiltInQuickOptions,
126
+ w as isSamePickerValue
127
+ };
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterDatePicker/index.tsx"],"sourcesContent":["import { DatePicker } from 'antd';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n formatPickerValue,\n parsePickerValue,\n type DatePickerGranularity,\n} from '@/utils/pickerDate';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps } from '../types';\nimport { resolveHidden } from '../types';\nimport { useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\n/** 单值快捷选项 */\ninterface SingleQuickOption {\n key: string;\n label: string;\n getValue: () => Dayjs;\n}\n\ninterface FilterDatePickerProps extends BaseFilterProps {\n value?: string | null;\n onChange?: (value: string | null) => void;\n /** 选择粒度:日 / 月 / 年 */\n picker?: DatePickerGranularity;\n /** 默认值:与默认相同时视为未筛选(除非 showDefaultAsSelected) */\n defaultValue?: string;\n /** 为 true 时,value 等于 defaultValue 仍展示在已选 Tag 中 */\n showDefaultAsSelected?: boolean;\n showQuickOptions?: boolean;\n quickOptions?: SingleQuickOption[];\n placeholder?: string;\n disabledDate?: (current: Dayjs) => boolean;\n}\n\nfunction getBuiltInQuickOptions(picker: DatePickerGranularity): SingleQuickOption[] {\n const now = dayjs();\n if (picker === 'year') {\n return [{ key: 'thisYear', label: '今年', getValue: () => now.startOf('year') }];\n }\n if (picker === 'month') {\n return [{ key: 'thisMonth', label: '本月', getValue: () => now.startOf('month') }];\n }\n return [{ key: 'today', label: '今天', getValue: () => now.startOf('day') }];\n}\n\nfunction isSamePickerValue(a?: string | null, b?: string): boolean {\n if (!a && !b) return true;\n if (!a || !b) return false;\n return a === b;\n}\n\nfunction findMatchingQuickKey(\n value: string | null | undefined,\n picker: DatePickerGranularity,\n opts: SingleQuickOption[],\n): string | null {\n if (!value) return null;\n const current = parsePickerValue(value, picker);\n if (!current.isValid()) return null;\n for (const opt of opts) {\n const candidate = opt.getValue();\n const unit = picker === 'year' ? 'year' : picker === 'month' ? 'month' : 'day';\n if (candidate.isSame(current, unit)) return opt.key;\n }\n return null;\n}\n\nconst FilterDatePicker: React.FC<FilterDatePickerProps> = ({\n filterKey,\n label,\n value,\n onChange,\n picker = 'date',\n defaultValue,\n showDefaultAsSelected = false,\n showQuickOptions = false,\n quickOptions,\n placeholder,\n disabledDate,\n active,\n hidden,\n}) => {\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState<Dayjs | null>(value ? parsePickerValue(value, picker) : null);\n const [activeQuickKey, setActiveQuickKey] = useState<string | null>(null);\n\n const registerFn = useFilterRegister();\n const opts = useMemo(\n () => quickOptions ?? (showQuickOptions ? getBuiltInQuickOptions(picker) : []),\n [quickOptions, showQuickOptions, picker],\n );\n\n const syncActiveQuickKey = (nextValue: string | null | undefined) => {\n setActiveQuickKey(findMatchingQuickKey(nextValue, picker, opts));\n };\n\n const revertToCommitted = () => {\n if (value) {\n setDraft(parsePickerValue(value, picker));\n syncActiveQuickKey(value);\n } else {\n setDraft(null);\n setActiveQuickKey(null);\n }\n };\n\n useEffect(() => {\n if (value) {\n setDraft(parsePickerValue(value, picker));\n syncActiveQuickKey(value);\n } else {\n setDraft(null);\n setActiveQuickKey(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, picker, opts]);\n\n const hasNonDefaultValue = showDefaultAsSelected\n ? !!value\n : !!value && !isSamePickerValue(value, defaultValue);\n\n const valueLabel = useMemo(() => {\n if (!hasNonDefaultValue || !value) return '';\n return value;\n }, [hasNonDefaultValue, value]);\n\n useEffect(() => {\n if (!registerFn) return;\n if (resolveHidden(hidden)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (valueLabel) {\n registerFn.register(filterKey, { label, valueLabel, onRemove: () => onChange?.(null) });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueLabel, filterKey, label, hidden]);\n\n if (resolveHidden(hidden)) return null;\n\n const handleConfirm = () => {\n if (draft) {\n onChange?.(formatPickerValue(draft, picker));\n } else {\n onChange?.(null);\n }\n setOpen(false);\n };\n\n const handleDiscardDraft = () => {\n revertToCommitted();\n setOpen(false);\n };\n\n const handleOpenChange = (nextOpen: boolean) => {\n revertToCommitted();\n setOpen(nextOpen);\n };\n\n return (\n <FilterPopover\n label={label}\n active={active || hasNonDefaultValue}\n open={open}\n onOpenChange={handleOpenChange}\n onConfirm={handleConfirm}\n onReset={handleDiscardDraft}\n >\n {opts.length > 0 ? (\n <div\n className={classNames(\n 'filter-date-picker-quick-options',\n styles['filter-date-picker-quick-options'],\n )}\n >\n {opts.map((opt) => (\n <span\n key={opt.key}\n className={classNames(\n 'filter-date-picker-quick-option',\n styles['filter-date-picker-quick-option'],\n activeQuickKey === opt.key && 'filter-date-picker-quick-option-active',\n activeQuickKey === opt.key && styles['filter-date-picker-quick-option-active'],\n )}\n onClick={() => {\n const next = opt.getValue();\n setDraft(next);\n setActiveQuickKey(opt.key);\n }}\n >\n {opt.label}\n </span>\n ))}\n </div>\n ) : null}\n <DatePicker\n className={classNames('filter-date-picker', styles['filter-date-picker'])}\n picker={picker}\n value={draft}\n placeholder={placeholder}\n disabledDate={disabledDate}\n onChange={(next) => {\n setDraft(next);\n setActiveQuickKey(null);\n }}\n />\n </FilterPopover>\n );\n};\n\nexport default FilterDatePicker;\nexport type { FilterDatePickerProps, SingleQuickOption };\nexport { findMatchingQuickKey, getBuiltInQuickOptions, isSamePickerValue };\n"],"names":["getBuiltInQuickOptions","picker","now","dayjs","isSamePickerValue","a","b","findMatchingQuickKey","value","opts","current","parsePickerValue","opt","candidate","unit","FilterDatePicker","filterKey","label","onChange","defaultValue","showDefaultAsSelected","showQuickOptions","quickOptions","placeholder","disabledDate","active","hidden","open","setOpen","useState","draft","setDraft","activeQuickKey","setActiveQuickKey","registerFn","useFilterRegister","useMemo","syncActiveQuickKey","nextValue","revertToCommitted","useEffect","hasNonDefaultValue","valueLabel","resolveHidden","jsxs","FilterPopover","nextOpen","formatPickerValue","jsx","classNames","styles","next","DatePicker"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ const i = {
2
+ "filter-date-picker-quick-options": "_filter-date-picker-quick-options_9zz2f_1",
3
+ "filter-date-picker-quick-option": "_filter-date-picker-quick-option_9zz2f_1",
4
+ "filter-date-picker-quick-option-active": "_filter-date-picker-quick-option-active_9zz2f_18",
5
+ "filter-date-picker": "_filter-date-picker_9zz2f_1"
6
+ };
7
+ export {
8
+ i as default
9
+ };
10
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,5 +1,6 @@
1
1
  import { Dayjs } from 'dayjs';
2
2
  import { default as React } from 'react';
3
+ import { DatePickerGranularity } from '../../../utils/pickerDate';
3
4
  import { BaseFilterProps } from '../types';
4
5
  /** 快捷选项配置类型 */
5
6
  interface QuickOption {
@@ -7,19 +8,23 @@ interface QuickOption {
7
8
  label: string;
8
9
  getValue: () => [Dayjs, Dayjs] | null;
9
10
  }
11
+ declare function getBuiltInMonthOptions(): QuickOption[];
10
12
  interface FilterDateRangeProps extends BaseFilterProps {
11
13
  value?: [string, string] | null;
12
14
  onChange?: (value: [string, string] | null) => void;
15
+ /** 选择粒度:日 / 月 / 年 */
16
+ picker?: DatePickerGranularity;
13
17
  /** 默认区间:与默认相同时视为未筛选(除非 showDefaultAsSelected) */
14
18
  defaultValue?: [string, string];
15
19
  /** 为 true 时,value 等于 defaultValue 仍展示在已选 Tag 中 */
16
20
  showDefaultAsSelected?: boolean;
17
21
  showQuickOptions?: boolean;
18
22
  quickOptions?: QuickOption[];
23
+ disabledDate?: (current: Dayjs) => boolean;
19
24
  }
20
25
  declare function isSameRange(a?: [string, string] | null, b?: [string, string]): boolean;
21
- declare function findMatchingQuickKey(range: [string, string] | null | undefined, opts: QuickOption[]): string | null;
26
+ declare function findMatchingQuickKey(range: [string, string] | null | undefined, opts: QuickOption[], picker: DatePickerGranularity): string | null;
22
27
  declare const FilterDateRange: React.FC<FilterDateRangeProps>;
23
28
  export default FilterDateRange;
24
29
  export type { FilterDateRangeProps, QuickOption };
25
- export { findMatchingQuickKey, isSameRange };
30
+ export { findMatchingQuickKey, isSameRange, getBuiltInMonthOptions };
@@ -1,120 +1,147 @@
1
- import { jsxs as T, jsx as N } from "react/jsx-runtime";
2
- import { DatePicker as A } from "antd";
3
- import s from "dayjs";
4
- import { useState as q, useEffect as F, useMemo as L } from "react";
5
- import W from "../FilterPopover/index.js";
6
- import { resolveHidden as P } from "../types.js";
7
- import { useFilterRegister as _ } from "../useFilterState.js";
8
- import l from "./style.module.scss.js";
9
- import w from "classnames";
10
- const { RangePicker: $ } = A, g = [
1
+ import { jsxs as _, jsx as a } from "react/jsx-runtime";
2
+ import { DatePicker as B } from "antd";
3
+ import d from "dayjs";
4
+ import { useState as g, useMemo as I, useEffect as j } from "react";
5
+ import { parsePickerValue as f, formatPickerValue as x } from "../../../utils/pickerDate.js";
6
+ import L from "../FilterPopover/index.js";
7
+ import { resolveHidden as A } from "../types.js";
8
+ import { useFilterRegister as U } from "../useFilterState.js";
9
+ import V from "./style.module.scss.js";
10
+ import P from "classnames";
11
+ const { RangePicker: W } = B, $ = [
11
12
  {
12
13
  key: "lastWeek",
13
14
  label: "上周",
14
15
  getValue: () => [
15
- s().subtract(1, "week").startOf("week"),
16
- s().subtract(1, "week").endOf("week")
16
+ d().subtract(1, "week").startOf("week"),
17
+ d().subtract(1, "week").endOf("week")
17
18
  ]
18
19
  },
19
20
  {
20
21
  key: "thisWeek",
21
22
  label: "本周",
22
- getValue: () => [s().startOf("week"), s().endOf("week")]
23
+ getValue: () => [d().startOf("week"), d().endOf("week")]
23
24
  }
24
25
  ];
25
- function h(e, r) {
26
+ function E() {
27
+ const e = d().startOf("month");
28
+ return [
29
+ { key: "1m", label: "近1月", getValue: () => [e, e] },
30
+ {
31
+ key: "3m",
32
+ label: "近3月",
33
+ getValue: () => [e.subtract(2, "month"), e]
34
+ },
35
+ {
36
+ key: "6m",
37
+ label: "近6月",
38
+ getValue: () => [e.subtract(5, "month"), e]
39
+ }
40
+ ];
41
+ }
42
+ function H(e, r) {
26
43
  return !(e != null && e[0]) || !(e != null && e[1]) ? !(r != null && r[0]) || !(r != null && r[1]) : !(r != null && r[0]) || !(r != null && r[1]) ? !1 : e[0] === r[0] && e[1] === r[1];
27
44
  }
28
- function u(e, r) {
45
+ function K(e) {
46
+ return e === "month" ? "month" : e === "year" ? "year" : "day";
47
+ }
48
+ function Y(e, r, t) {
29
49
  if (!(e != null && e[0]) || !(e != null && e[1])) return null;
30
- const t = s(e[0]), n = s(e[1]);
31
- for (const k of r) {
32
- const f = k.getValue();
33
- if (f && f[0].isSame(t, "day") && f[1].isSame(n, "day"))
34
- return k.key;
50
+ const i = f(e[0], t), n = f(e[1], t), k = K(t);
51
+ for (const y of r) {
52
+ const c = y.getValue();
53
+ if (c && c[0].isSame(i, k) && c[1].isSame(n, k))
54
+ return y.key;
35
55
  }
36
56
  return null;
37
57
  }
38
- const b = ({
58
+ const it = ({
39
59
  filterKey: e,
40
60
  label: r,
41
61
  value: t,
42
- onChange: n,
62
+ onChange: i,
63
+ picker: n = "date",
43
64
  defaultValue: k,
44
- showDefaultAsSelected: f = !1,
45
- showQuickOptions: Q = !0,
46
- quickOptions: j,
47
- active: x,
48
- hidden: y
65
+ showDefaultAsSelected: y = !1,
66
+ showQuickOptions: c = !0,
67
+ quickOptions: R,
68
+ disabledDate: M,
69
+ active: Q,
70
+ hidden: p
49
71
  }) => {
50
- const [I, D] = q(!1), [o, c] = q(
51
- t ? [s(t[0]), s(t[1])] : null
52
- ), [M, m] = q(null), d = _(), p = j ?? (Q ? g : []), R = (i) => {
53
- m(u(i, p));
72
+ const [T, D] = g(!1), [o, m] = g(
73
+ t ? [f(t[0], n), f(t[1], n)] : null
74
+ ), [q, l] = g(null), u = U(), O = I(
75
+ () => R ?? (c ? n === "month" ? E() : $ : []),
76
+ [R, c, n]
77
+ ), w = (s) => {
78
+ l(Y(s, O, n));
54
79
  }, S = () => {
55
- t != null && t[0] && (t != null && t[1]) ? (c([s(t[0]), s(t[1])]), R(t)) : (c(null), m(null));
80
+ t != null && t[0] && (t != null && t[1]) ? (m([f(t[0], n), f(t[1], n)]), w(t)) : (m(null), l(null));
56
81
  };
57
- F(() => {
58
- t != null && t[0] && (t != null && t[1]) ? (c([s(t[0]), s(t[1])]), R(t)) : (c(null), m(null));
59
- }, [t, p]);
60
- const O = f ? !!(t != null && t[0]) : !!(t != null && t[0]) && !h(t, k), Y = L(() => !O || !(t != null && t[0]) || !(t != null && t[1]) ? "" : `${t[0]} ~ ${t[1]}`, [O, t]);
61
- return F(() => {
62
- if (d) {
63
- if (P(y)) {
64
- d.unregister(e);
82
+ j(() => {
83
+ t != null && t[0] && (t != null && t[1]) ? (m([f(t[0], n), f(t[1], n)]), w(t)) : (m(null), l(null));
84
+ }, [t, O, n]);
85
+ const h = y ? !!(t != null && t[0]) : !!(t != null && t[0]) && !H(t, k), N = I(() => !h || !(t != null && t[0]) || !(t != null && t[1]) ? "" : `${t[0]} ~ ${t[1]}`, [h, t]);
86
+ return j(() => {
87
+ if (u) {
88
+ if (A(p)) {
89
+ u.unregister(e);
65
90
  return;
66
91
  }
67
- Y ? d.register(e, { label: r, valueLabel: Y, onRemove: () => n == null ? void 0 : n(null) }) : d.unregister(e);
92
+ N ? u.register(e, { label: r, valueLabel: N, onRemove: () => i == null ? void 0 : i(null) }) : u.unregister(e);
68
93
  }
69
- }, [Y, e, r, y]), P(y) ? null : /* @__PURE__ */ T(
70
- W,
94
+ }, [N, e, r, p]), A(p) ? null : /* @__PURE__ */ _(
95
+ L,
71
96
  {
72
97
  label: r,
73
- active: x || O,
74
- open: I,
75
- onOpenChange: (i) => {
76
- S(), D(i);
98
+ active: Q || h,
99
+ open: T,
100
+ onOpenChange: (s) => {
101
+ S(), D(s);
77
102
  },
78
103
  onConfirm: () => {
79
- o != null && o[0] && (o != null && o[1]) ? n == null || n([o[0].format("YYYY-MM-DD"), o[1].format("YYYY-MM-DD")]) : n == null || n(null), D(!1);
104
+ o != null && o[0] && (o != null && o[1]) ? i == null || i([x(o[0], n), x(o[1], n)]) : i == null || i(null), D(!1);
80
105
  },
81
106
  onReset: () => {
82
107
  S(), D(!1);
83
108
  },
84
109
  children: [
85
- p.length > 0 && /* @__PURE__ */ N(
110
+ O.length > 0 && /* @__PURE__ */ a(
86
111
  "div",
87
112
  {
88
- className: w(
113
+ className: P(
89
114
  "filter-date-range-quick-options",
90
- l["filter-date-range-quick-options"]
115
+ V["filter-date-range-quick-options"]
91
116
  ),
92
- children: p.map((i) => /* @__PURE__ */ N(
117
+ children: O.map((s) => /* @__PURE__ */ a(
93
118
  "span",
94
119
  {
95
- className: w(
120
+ className: P(
96
121
  "filter-date-range-quick-option",
97
- l["filter-date-range-quick-option"],
98
- M === i.key && "filter-date-range-quick-option-active",
99
- M === i.key && l["filter-date-range-quick-option-active"]
122
+ V["filter-date-range-quick-option"],
123
+ q === s.key && "filter-date-range-quick-option-active",
124
+ q === s.key && V["filter-date-range-quick-option-active"]
100
125
  ),
101
126
  onClick: () => {
102
- const V = i.getValue();
103
- V && (c(V), m(i.key));
127
+ const F = s.getValue();
128
+ F && (m(F), l(s.key));
104
129
  },
105
- children: i.label
130
+ children: s.label
106
131
  },
107
- i.key
132
+ s.key
108
133
  ))
109
134
  }
110
135
  ),
111
- /* @__PURE__ */ N(
112
- $,
136
+ /* @__PURE__ */ a(
137
+ W,
113
138
  {
114
- className: w("filter-date-range-picker", l["filter-date-range-picker"]),
139
+ className: P("filter-date-range-picker", V["filter-date-range-picker"]),
140
+ picker: n,
115
141
  value: o,
116
- onChange: (i) => {
117
- c(i), m(null);
142
+ disabledDate: M,
143
+ onChange: (s) => {
144
+ m(s), l(null);
118
145
  }
119
146
  }
120
147
  )
@@ -123,8 +150,9 @@ const b = ({
123
150
  );
124
151
  };
125
152
  export {
126
- b as default,
127
- u as findMatchingQuickKey,
128
- h as isSameRange
153
+ it as default,
154
+ Y as findMatchingQuickKey,
155
+ E as getBuiltInMonthOptions,
156
+ H as isSameRange
129
157
  };
130
158
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterDateRange/index.tsx"],"sourcesContent":["import { DatePicker } from 'antd';\nimport dayjs, { Dayjs } from 'dayjs';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps } from '../types';\nimport { resolveHidden } from '../types';\nimport { useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nconst { RangePicker } = DatePicker;\n\n/** 快捷选项配置类型 */\ninterface QuickOption {\n key: string;\n label: string;\n getValue: () => [Dayjs, Dayjs] | null;\n}\n\n/** 内置快捷选项 */\nconst BUILT_IN_OPTIONS: QuickOption[] = [\n {\n key: 'lastWeek',\n label: '上周',\n getValue: () => [\n dayjs().subtract(1, 'week').startOf('week'),\n dayjs().subtract(1, 'week').endOf('week'),\n ],\n },\n {\n key: 'thisWeek',\n label: '本周',\n getValue: () => [dayjs().startOf('week'), dayjs().endOf('week')],\n },\n];\n\ninterface FilterDateRangeProps extends BaseFilterProps {\n value?: [string, string] | null;\n onChange?: (value: [string, string] | null) => void;\n /** 默认区间:与默认相同时视为未筛选(除非 showDefaultAsSelected) */\n defaultValue?: [string, string];\n /** 为 true 时,value 等于 defaultValue 仍展示在已选 Tag 中 */\n showDefaultAsSelected?: boolean;\n showQuickOptions?: boolean;\n quickOptions?: QuickOption[];\n}\n\nfunction isSameRange(a?: [string, string] | null, b?: [string, string]): boolean {\n if (!a?.[0] || !a?.[1]) return !b?.[0] || !b?.[1];\n if (!b?.[0] || !b?.[1]) return false;\n return a[0] === b[0] && a[1] === b[1];\n}\n\nfunction findMatchingQuickKey(\n range: [string, string] | null | undefined,\n opts: QuickOption[],\n): string | null {\n if (!range?.[0] || !range?.[1]) return null;\n const start = dayjs(range[0]);\n const end = dayjs(range[1]);\n for (const opt of opts) {\n const v = opt.getValue();\n if (v && v[0].isSame(start, 'day') && v[1].isSame(end, 'day')) {\n return opt.key;\n }\n }\n return null;\n}\n\nconst FilterDateRange: React.FC<FilterDateRangeProps> = ({\n filterKey,\n label,\n value,\n onChange,\n defaultValue,\n showDefaultAsSelected = false,\n showQuickOptions = true,\n quickOptions,\n active,\n hidden,\n}) => {\n const [open, setOpen] = useState(false);\n const [dates, setDates] = useState<[Dayjs | null, Dayjs | null] | null>(\n value ? [dayjs(value[0]), dayjs(value[1])] : null,\n );\n const [activeQuickKey, setActiveQuickKey] = useState<string | null>(null);\n\n const registerFn = useFilterRegister();\n const opts = quickOptions ?? (showQuickOptions ? BUILT_IN_OPTIONS : []);\n\n const syncActiveQuickKey = (range: [string, string] | null | undefined) => {\n setActiveQuickKey(findMatchingQuickKey(range, opts));\n };\n\n const revertToCommitted = () => {\n if (value?.[0] && value?.[1]) {\n setDates([dayjs(value[0]), dayjs(value[1])]);\n syncActiveQuickKey(value);\n } else {\n setDates(null);\n setActiveQuickKey(null);\n }\n };\n\n useEffect(() => {\n if (value?.[0] && value?.[1]) {\n setDates([dayjs(value[0]), dayjs(value[1])]);\n syncActiveQuickKey(value);\n } else {\n setDates(null);\n setActiveQuickKey(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, opts]);\n\n const hasNonDefaultValue = showDefaultAsSelected\n ? !!value?.[0]\n : !!value?.[0] && !isSameRange(value, defaultValue);\n\n const valueLabel = useMemo(() => {\n if (!hasNonDefaultValue || !value?.[0] || !value?.[1]) return '';\n return `${value[0]} ~ ${value[1]}`;\n }, [hasNonDefaultValue, value]);\n\n useEffect(() => {\n if (!registerFn) return;\n if (resolveHidden(hidden)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (valueLabel) {\n registerFn.register(filterKey, { label, valueLabel, onRemove: () => onChange?.(null) });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueLabel, filterKey, label, hidden]);\n\n if (resolveHidden(hidden)) return null;\n\n const handleConfirm = () => {\n if (dates?.[0] && dates?.[1]) {\n onChange?.([dates[0].format('YYYY-MM-DD'), dates[1].format('YYYY-MM-DD')]);\n } else {\n onChange?.(null);\n }\n setOpen(false);\n };\n\n const handleDiscardDraft = () => {\n revertToCommitted();\n setOpen(false);\n };\n\n const handleOpenChange = (nextOpen: boolean) => {\n revertToCommitted();\n setOpen(nextOpen);\n };\n\n return (\n <FilterPopover\n label={label}\n active={active || hasNonDefaultValue}\n open={open}\n onOpenChange={handleOpenChange}\n onConfirm={handleConfirm}\n onReset={handleDiscardDraft}\n >\n {opts.length > 0 && (\n <div\n className={classNames(\n 'filter-date-range-quick-options',\n styles['filter-date-range-quick-options'],\n )}\n >\n {opts.map((opt) => (\n <span\n key={opt.key}\n className={classNames(\n 'filter-date-range-quick-option',\n styles['filter-date-range-quick-option'],\n activeQuickKey === opt.key && 'filter-date-range-quick-option-active',\n activeQuickKey === opt.key && styles['filter-date-range-quick-option-active'],\n )}\n onClick={() => {\n const v = opt.getValue();\n if (v) {\n setDates(v);\n setActiveQuickKey(opt.key);\n }\n }}\n >\n {opt.label}\n </span>\n ))}\n </div>\n )}\n <RangePicker\n className={classNames('filter-date-range-picker', styles['filter-date-range-picker'])}\n value={dates}\n onChange={(vals) => {\n setDates(vals as [Dayjs | null, Dayjs | null] | null);\n setActiveQuickKey(null);\n }}\n />\n </FilterPopover>\n );\n};\n\nexport default FilterDateRange;\nexport type { FilterDateRangeProps, QuickOption };\nexport { findMatchingQuickKey, isSameRange };\n"],"names":["RangePicker","DatePicker","BUILT_IN_OPTIONS","dayjs","isSameRange","a","b","findMatchingQuickKey","range","opts","start","end","opt","v","FilterDateRange","filterKey","label","value","onChange","defaultValue","showDefaultAsSelected","showQuickOptions","quickOptions","active","hidden","open","setOpen","useState","dates","setDates","activeQuickKey","setActiveQuickKey","registerFn","useFilterRegister","syncActiveQuickKey","revertToCommitted","useEffect","hasNonDefaultValue","valueLabel","useMemo","resolveHidden","jsxs","FilterPopover","nextOpen","jsx","classNames","styles","vals"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Filter/FilterDateRange/index.tsx"],"sourcesContent":["import { DatePicker } from 'antd';\nimport dayjs, { Dayjs } from 'dayjs';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {\n formatPickerValue,\n parsePickerValue,\n type DatePickerGranularity,\n} from '@/utils/pickerDate';\nimport FilterPopover from '../FilterPopover';\nimport type { BaseFilterProps } from '../types';\nimport { resolveHidden } from '../types';\nimport { useFilterRegister } from '../useFilterState';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nconst { RangePicker } = DatePicker;\n\n/** 快捷选项配置类型 */\ninterface QuickOption {\n key: string;\n label: string;\n getValue: () => [Dayjs, Dayjs] | null;\n}\n\n/** 内置快捷选项(日粒度) */\nconst BUILT_IN_DAY_OPTIONS: QuickOption[] = [\n {\n key: 'lastWeek',\n label: '上周',\n getValue: () => [\n dayjs().subtract(1, 'week').startOf('week'),\n dayjs().subtract(1, 'week').endOf('week'),\n ],\n },\n {\n key: 'thisWeek',\n label: '本周',\n getValue: () => [dayjs().startOf('week'), dayjs().endOf('week')],\n },\n];\n\nfunction getBuiltInMonthOptions(): QuickOption[] {\n const end = dayjs().startOf('month');\n return [\n { key: '1m', label: '近1月', getValue: () => [end, end] },\n {\n key: '3m',\n label: '近3月',\n getValue: () => [end.subtract(2, 'month'), end],\n },\n {\n key: '6m',\n label: '近6月',\n getValue: () => [end.subtract(5, 'month'), end],\n },\n ];\n}\n\ninterface FilterDateRangeProps extends BaseFilterProps {\n value?: [string, string] | null;\n onChange?: (value: [string, string] | null) => void;\n /** 选择粒度:日 / 月 / 年 */\n picker?: DatePickerGranularity;\n /** 默认区间:与默认相同时视为未筛选(除非 showDefaultAsSelected) */\n defaultValue?: [string, string];\n /** 为 true 时,value 等于 defaultValue 仍展示在已选 Tag 中 */\n showDefaultAsSelected?: boolean;\n showQuickOptions?: boolean;\n quickOptions?: QuickOption[];\n disabledDate?: (current: Dayjs) => boolean;\n}\n\nfunction isSameRange(a?: [string, string] | null, b?: [string, string]): boolean {\n if (!a?.[0] || !a?.[1]) return !b?.[0] || !b?.[1];\n if (!b?.[0] || !b?.[1]) return false;\n return a[0] === b[0] && a[1] === b[1];\n}\n\nfunction rangeUnit(picker: DatePickerGranularity): 'day' | 'month' | 'year' {\n if (picker === 'month') return 'month';\n if (picker === 'year') return 'year';\n return 'day';\n}\n\nfunction findMatchingQuickKey(\n range: [string, string] | null | undefined,\n opts: QuickOption[],\n picker: DatePickerGranularity,\n): string | null {\n if (!range?.[0] || !range?.[1]) return null;\n const start = parsePickerValue(range[0], picker);\n const end = parsePickerValue(range[1], picker);\n const unit = rangeUnit(picker);\n for (const opt of opts) {\n const v = opt.getValue();\n if (v && v[0].isSame(start, unit) && v[1].isSame(end, unit)) {\n return opt.key;\n }\n }\n return null;\n}\n\nconst FilterDateRange: React.FC<FilterDateRangeProps> = ({\n filterKey,\n label,\n value,\n onChange,\n picker = 'date',\n defaultValue,\n showDefaultAsSelected = false,\n showQuickOptions = true,\n quickOptions,\n disabledDate,\n active,\n hidden,\n}) => {\n const [open, setOpen] = useState(false);\n const [dates, setDates] = useState<[Dayjs | null, Dayjs | null] | null>(\n value ? [parsePickerValue(value[0], picker), parsePickerValue(value[1], picker)] : null,\n );\n const [activeQuickKey, setActiveQuickKey] = useState<string | null>(null);\n\n const registerFn = useFilterRegister();\n const opts = useMemo(\n () =>\n quickOptions ??\n (showQuickOptions\n ? picker === 'month'\n ? getBuiltInMonthOptions()\n : BUILT_IN_DAY_OPTIONS\n : []),\n [quickOptions, showQuickOptions, picker],\n );\n\n const syncActiveQuickKey = (range: [string, string] | null | undefined) => {\n setActiveQuickKey(findMatchingQuickKey(range, opts, picker));\n };\n\n const revertToCommitted = () => {\n if (value?.[0] && value?.[1]) {\n setDates([parsePickerValue(value[0], picker), parsePickerValue(value[1], picker)]);\n syncActiveQuickKey(value);\n } else {\n setDates(null);\n setActiveQuickKey(null);\n }\n };\n\n useEffect(() => {\n if (value?.[0] && value?.[1]) {\n setDates([parsePickerValue(value[0], picker), parsePickerValue(value[1], picker)]);\n syncActiveQuickKey(value);\n } else {\n setDates(null);\n setActiveQuickKey(null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, opts, picker]);\n\n const hasNonDefaultValue = showDefaultAsSelected\n ? !!value?.[0]\n : !!value?.[0] && !isSameRange(value, defaultValue);\n\n const valueLabel = useMemo(() => {\n if (!hasNonDefaultValue || !value?.[0] || !value?.[1]) return '';\n return `${value[0]} ~ ${value[1]}`;\n }, [hasNonDefaultValue, value]);\n\n useEffect(() => {\n if (!registerFn) return;\n if (resolveHidden(hidden)) {\n registerFn.unregister(filterKey);\n return;\n }\n if (valueLabel) {\n registerFn.register(filterKey, { label, valueLabel, onRemove: () => onChange?.(null) });\n } else {\n registerFn.unregister(filterKey);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [valueLabel, filterKey, label, hidden]);\n\n if (resolveHidden(hidden)) return null;\n\n const handleConfirm = () => {\n if (dates?.[0] && dates?.[1]) {\n onChange?.([formatPickerValue(dates[0], picker), formatPickerValue(dates[1], picker)]);\n } else {\n onChange?.(null);\n }\n setOpen(false);\n };\n\n const handleDiscardDraft = () => {\n revertToCommitted();\n setOpen(false);\n };\n\n const handleOpenChange = (nextOpen: boolean) => {\n revertToCommitted();\n setOpen(nextOpen);\n };\n\n return (\n <FilterPopover\n label={label}\n active={active || hasNonDefaultValue}\n open={open}\n onOpenChange={handleOpenChange}\n onConfirm={handleConfirm}\n onReset={handleDiscardDraft}\n >\n {opts.length > 0 && (\n <div\n className={classNames(\n 'filter-date-range-quick-options',\n styles['filter-date-range-quick-options'],\n )}\n >\n {opts.map((opt) => (\n <span\n key={opt.key}\n className={classNames(\n 'filter-date-range-quick-option',\n styles['filter-date-range-quick-option'],\n activeQuickKey === opt.key && 'filter-date-range-quick-option-active',\n activeQuickKey === opt.key && styles['filter-date-range-quick-option-active'],\n )}\n onClick={() => {\n const v = opt.getValue();\n if (v) {\n setDates(v);\n setActiveQuickKey(opt.key);\n }\n }}\n >\n {opt.label}\n </span>\n ))}\n </div>\n )}\n <RangePicker\n className={classNames('filter-date-range-picker', styles['filter-date-range-picker'])}\n picker={picker}\n value={dates}\n disabledDate={disabledDate}\n onChange={(vals) => {\n setDates(vals as [Dayjs | null, Dayjs | null] | null);\n setActiveQuickKey(null);\n }}\n />\n </FilterPopover>\n );\n};\n\nexport default FilterDateRange;\nexport type { FilterDateRangeProps, QuickOption };\nexport { findMatchingQuickKey, isSameRange, getBuiltInMonthOptions };\n"],"names":["RangePicker","DatePicker","BUILT_IN_DAY_OPTIONS","dayjs","getBuiltInMonthOptions","end","isSameRange","a","b","rangeUnit","picker","findMatchingQuickKey","range","opts","start","parsePickerValue","unit","opt","v","FilterDateRange","filterKey","label","value","onChange","defaultValue","showDefaultAsSelected","showQuickOptions","quickOptions","disabledDate","active","hidden","open","setOpen","useState","dates","setDates","activeQuickKey","setActiveQuickKey","registerFn","useFilterRegister","useMemo","syncActiveQuickKey","revertToCommitted","useEffect","hasNonDefaultValue","valueLabel","resolveHidden","jsxs","FilterPopover","nextOpen","formatPickerValue","jsx","classNames","styles","vals"],"mappings":";;;;;;;;;;AAeA,MAAM,EAAE,aAAAA,MAAgBC,GAUlBC,IAAsC;AAAA,EAC1C;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU,MAAM;AAAA,MACdC,IAAQ,SAAS,GAAG,MAAM,EAAE,QAAQ,MAAM;AAAA,MAC1CA,IAAQ,SAAS,GAAG,MAAM,EAAE,MAAM,MAAM;AAAA,IAAA;AAAA,EAC1C;AAAA,EAEF;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU,MAAM,CAACA,EAAA,EAAQ,QAAQ,MAAM,GAAGA,EAAA,EAAQ,MAAM,MAAM,CAAC;AAAA,EAAA;AAEnE;AAEA,SAASC,IAAwC;AAC/C,QAAMC,IAAMF,IAAQ,QAAQ,OAAO;AACnC,SAAO;AAAA,IACL,EAAE,KAAK,MAAM,OAAO,OAAO,UAAU,MAAM,CAACE,GAAKA,CAAG,EAAA;AAAA,IACpD;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,MAAM,CAACA,EAAI,SAAS,GAAG,OAAO,GAAGA,CAAG;AAAA,IAAA;AAAA,IAEhD;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,MAAM,CAACA,EAAI,SAAS,GAAG,OAAO,GAAGA,CAAG;AAAA,IAAA;AAAA,EAChD;AAEJ;AAgBA,SAASC,EAAYC,GAA6BC,GAA+B;AAC/E,SAAI,EAACD,KAAA,QAAAA,EAAI,OAAM,EAACA,KAAA,QAAAA,EAAI,MAAW,EAACC,KAAA,QAAAA,EAAI,OAAM,EAACA,KAAA,QAAAA,EAAI,MAC3C,EAACA,KAAA,QAAAA,EAAI,OAAM,EAACA,KAAA,QAAAA,EAAI,MAAW,KACxBD,EAAE,CAAC,MAAMC,EAAE,CAAC,KAAKD,EAAE,CAAC,MAAMC,EAAE,CAAC;AACtC;AAEA,SAASC,EAAUC,GAAyD;AAC1E,SAAIA,MAAW,UAAgB,UAC3BA,MAAW,SAAe,SACvB;AACT;AAEA,SAASC,EACPC,GACAC,GACAH,GACe;AACf,MAAI,EAACE,KAAA,QAAAA,EAAQ,OAAM,EAACA,KAAA,QAAAA,EAAQ,IAAI,QAAO;AACvC,QAAME,IAAQC,EAAiBH,EAAM,CAAC,GAAGF,CAAM,GACzCL,IAAMU,EAAiBH,EAAM,CAAC,GAAGF,CAAM,GACvCM,IAAOP,EAAUC,CAAM;AAC7B,aAAWO,KAAOJ,GAAM;AACtB,UAAMK,IAAID,EAAI,SAAA;AACd,QAAIC,KAAKA,EAAE,CAAC,EAAE,OAAOJ,GAAOE,CAAI,KAAKE,EAAE,CAAC,EAAE,OAAOb,GAAKW,CAAI;AACxD,aAAOC,EAAI;AAAA,EAEf;AACA,SAAO;AACT;AAEA,MAAME,KAAkD,CAAC;AAAA,EACvD,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAb,IAAS;AAAA,EACT,cAAAc;AAAA,EACA,uBAAAC,IAAwB;AAAA,EACxB,kBAAAC,IAAmB;AAAA,EACnB,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChC,CAACC,GAAOC,CAAQ,IAAIF;AAAA,IACxBX,IAAQ,CAACP,EAAiBO,EAAM,CAAC,GAAGZ,CAAM,GAAGK,EAAiBO,EAAM,CAAC,GAAGZ,CAAM,CAAC,IAAI;AAAA,EAAA,GAE/E,CAAC0B,GAAgBC,CAAiB,IAAIJ,EAAwB,IAAI,GAElEK,IAAaC,EAAA,GACb1B,IAAO2B;AAAA,IACX,MACEb,MACCD,IACGhB,MAAW,UACTN,EAAA,IACAF,IACF;IACN,CAACyB,GAAcD,GAAkBhB,CAAM;AAAA,EAAA,GAGnC+B,IAAqB,CAAC7B,MAA+C;AACzE,IAAAyB,EAAkB1B,EAAqBC,GAAOC,GAAMH,CAAM,CAAC;AAAA,EAC7D,GAEMgC,IAAoB,MAAM;AAC9B,IAAIpB,KAAA,QAAAA,EAAQ,OAAMA,KAAA,QAAAA,EAAQ,OACxBa,EAAS,CAACpB,EAAiBO,EAAM,CAAC,GAAGZ,CAAM,GAAGK,EAAiBO,EAAM,CAAC,GAAGZ,CAAM,CAAC,CAAC,GACjF+B,EAAmBnB,CAAK,MAExBa,EAAS,IAAI,GACbE,EAAkB,IAAI;AAAA,EAE1B;AAEA,EAAAM,EAAU,MAAM;AACd,IAAIrB,KAAA,QAAAA,EAAQ,OAAMA,KAAA,QAAAA,EAAQ,OACxBa,EAAS,CAACpB,EAAiBO,EAAM,CAAC,GAAGZ,CAAM,GAAGK,EAAiBO,EAAM,CAAC,GAAGZ,CAAM,CAAC,CAAC,GACjF+B,EAAmBnB,CAAK,MAExBa,EAAS,IAAI,GACbE,EAAkB,IAAI;AAAA,EAG1B,GAAG,CAACf,GAAOT,GAAMH,CAAM,CAAC;AAExB,QAAMkC,IAAqBnB,IACvB,CAAC,EAACH,KAAA,QAAAA,EAAQ,MACV,CAAC,EAACA,KAAA,QAAAA,EAAQ,OAAM,CAAChB,EAAYgB,GAAOE,CAAY,GAE9CqB,IAAaL,EAAQ,MACrB,CAACI,KAAsB,EAACtB,KAAA,QAAAA,EAAQ,OAAM,EAACA,KAAA,QAAAA,EAAQ,MAAW,KACvD,GAAGA,EAAM,CAAC,CAAC,MAAMA,EAAM,CAAC,CAAC,IAC/B,CAACsB,GAAoBtB,CAAK,CAAC;AAgB9B,SAdAqB,EAAU,MAAM;AACd,QAAKL,GACL;AAAA,UAAIQ,EAAchB,CAAM,GAAG;AACzB,QAAAQ,EAAW,WAAWlB,CAAS;AAC/B;AAAA,MACF;AACA,MAAIyB,IACFP,EAAW,SAASlB,GAAW,EAAE,OAAAC,GAAO,YAAAwB,GAAY,UAAU,MAAMtB,KAAA,gBAAAA,EAAW,OAAO,IAEtFe,EAAW,WAAWlB,CAAS;AAAA;AAAA,EAGnC,GAAG,CAACyB,GAAYzB,GAAWC,GAAOS,CAAM,CAAC,GAErCgB,EAAchB,CAAM,IAAU,OAsBhC,gBAAAiB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAA3B;AAAA,MACA,QAAQQ,KAAUe;AAAA,MAClB,MAAAb;AAAA,MACA,cAVqB,CAACkB,MAAsB;AAC9C,QAAAP,EAAA,GACAV,EAAQiB,CAAQ;AAAA,MAClB;AAAA,MAQI,WAzBkB,MAAM;AAC1B,QAAIf,KAAA,QAAAA,EAAQ,OAAMA,KAAA,QAAAA,EAAQ,MACxBX,KAAA,QAAAA,EAAW,CAAC2B,EAAkBhB,EAAM,CAAC,GAAGxB,CAAM,GAAGwC,EAAkBhB,EAAM,CAAC,GAAGxB,CAAM,CAAC,KAEpFa,KAAA,QAAAA,EAAW,OAEbS,EAAQ,EAAK;AAAA,MACf;AAAA,MAmBI,SAjBuB,MAAM;AAC/B,QAAAU,EAAA,GACAV,EAAQ,EAAK;AAAA,MACf;AAAA,MAgBK,UAAA;AAAA,QAAAnB,EAAK,SAAS,KACb,gBAAAsC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACAC,EAAO,iCAAiC;AAAA,YAAA;AAAA,YAGzC,UAAAxC,EAAK,IAAI,CAACI,MACT,gBAAAkC;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAWC;AAAA,kBACT;AAAA,kBACAC,EAAO,gCAAgC;AAAA,kBACvCjB,MAAmBnB,EAAI,OAAO;AAAA,kBAC9BmB,MAAmBnB,EAAI,OAAOoC,EAAO,uCAAuC;AAAA,gBAAA;AAAA,gBAE9E,SAAS,MAAM;AACb,wBAAMnC,IAAID,EAAI,SAAA;AACd,kBAAIC,MACFiB,EAASjB,CAAC,GACVmB,EAAkBpB,EAAI,GAAG;AAAA,gBAE7B;AAAA,gBAEC,UAAAA,EAAI;AAAA,cAAA;AAAA,cAfAA,EAAI;AAAA,YAAA,CAiBZ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGL,gBAAAkC;AAAA,UAACnD;AAAA,UAAA;AAAA,YACC,WAAWoD,EAAW,4BAA4BC,EAAO,0BAA0B,CAAC;AAAA,YACpF,QAAA3C;AAAA,YACA,OAAOwB;AAAA,YACP,cAAAN;AAAA,YACA,UAAU,CAAC0B,MAAS;AAClB,cAAAnB,EAASmB,CAA2C,GACpDjB,EAAkB,IAAI;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}