@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.
- package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/style.module.scss.js +9 -9
- package/dist/components/Empty/Empty.d.ts +16 -0
- package/dist/components/Empty/Empty.js +33 -0
- package/dist/components/Empty/Empty.js.map +1 -0
- package/dist/components/Empty/index.d.ts +2 -0
- package/dist/components/Empty/style.module.scss.js +7 -0
- package/dist/components/Empty/style.module.scss.js.map +1 -0
- package/dist/components/Filter/FilterDatePicker/index.d.ts +31 -0
- package/dist/components/Filter/FilterDatePicker/index.js +128 -0
- package/dist/components/Filter/FilterDatePicker/index.js.map +1 -0
- package/dist/components/Filter/FilterDatePicker/style.module.scss.js +10 -0
- package/dist/components/Filter/FilterDatePicker/style.module.scss.js.map +1 -0
- package/dist/components/Filter/FilterDateRange/index.d.ts +7 -2
- package/dist/components/Filter/FilterDateRange/index.js +96 -68
- package/dist/components/Filter/FilterDateRange/index.js.map +1 -1
- package/dist/components/Filter/index.d.ts +3 -0
- package/dist/components/TooltipInfo/TooltipInfo.js +11 -10
- package/dist/components/TooltipInfo/TooltipInfo.js.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +375 -367
- package/dist/index.js.map +1 -1
- package/dist/marsun-components-core.css +1 -1
- package/dist/styles/global.css +1 -1
- package/dist/theme/theme.js +1 -3
- package/dist/theme/theme.js.map +1 -1
- package/dist/utils/pickerDate.d.ts +9 -0
- package/dist/utils/pickerDate.js +33 -0
- package/dist/utils/pickerDate.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
const a = {
|
|
2
|
-
"chat-agent-fab": "_chat-agent-
|
|
3
|
-
"chat-agent-fab-button": "_chat-agent-fab-
|
|
4
|
-
"chat-agent-fab-button--active": "_chat-agent-fab-button--
|
|
5
|
-
"chat-agent-fab-icon": "_chat-agent-fab-
|
|
6
|
-
"chat-agent-fab-panel": "_chat-agent-fab-
|
|
7
|
-
"chat-agent-fab-panel-body": "_chat-agent-fab-panel-
|
|
8
|
-
"chat-agent-fab-panel--expanded": "_chat-agent-fab-panel--
|
|
9
|
-
"chat-agent-fab-panel--fullscreen": "_chat-agent-fab-panel--
|
|
10
|
-
"chat-agent-fab-panel-body--expanded": "_chat-agent-fab-panel-body--
|
|
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 @@
|
|
|
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":";;;;;;;;;;AAqCA,SAASA,EAAuBC,GAAoD;AAClF,QAAMC,IAAMC,EAAA;AACZ,SAAIF,MAAW,SACN,CAAC,EAAE,KAAK,YAAY,OAAO,MAAM,UAAU,MAAMC,EAAI,QAAQ,MAAM,EAAA,CAAG,IAE3ED,MAAW,UACN,CAAC,EAAE,KAAK,aAAa,OAAO,MAAM,UAAU,MAAMC,EAAI,QAAQ,OAAO,EAAA,CAAG,IAE1E,CAAC,EAAE,KAAK,SAAS,OAAO,MAAM,UAAU,MAAMA,EAAI,QAAQ,KAAK,EAAA,CAAG;AAC3E;AAEA,SAASE,EAAkBC,GAAmBC,GAAqB;AACjE,SAAI,CAACD,KAAK,CAACC,IAAU,KACjB,CAACD,KAAK,CAACC,IAAU,KACdD,MAAMC;AACf;AAEA,SAASC,EACPC,GACAP,GACAQ,GACe;AACf,MAAI,CAACD,EAAO,QAAO;AACnB,QAAME,IAAUC,EAAiBH,GAAOP,CAAM;AAC9C,MAAI,CAACS,EAAQ,QAAA,EAAW,QAAO;AAC/B,aAAWE,KAAOH,GAAM;AACtB,UAAMI,IAAYD,EAAI,SAAA,GAChBE,IAAOb,MAAW,SAAS,SAASA,MAAW,UAAU,UAAU;AACzE,QAAIY,EAAU,OAAOH,GAASI,CAAI,UAAUF,EAAI;AAAA,EAClD;AACA,SAAO;AACT;AAEA,MAAMG,KAAoD,CAAC;AAAA,EACzD,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,OAAAT;AAAA,EACA,UAAAU;AAAA,EACA,QAAAjB,IAAS;AAAA,EACT,cAAAkB;AAAA,EACA,uBAAAC,IAAwB;AAAA,EACxB,kBAAAC,IAAmB;AAAA,EACnB,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChC,CAACC,GAAOC,CAAQ,IAAIF,EAAuBrB,IAAQG,EAAiBH,GAAOP,CAAM,IAAI,IAAI,GACzF,CAAC+B,GAAgBC,CAAiB,IAAIJ,EAAwB,IAAI,GAElEK,IAAaC,EAAA,GACb1B,IAAO2B;AAAA,IACX,MAAMd,MAAiBD,IAAmBrB,EAAuBC,CAAM,IAAI,CAAA;AAAA,IAC3E,CAACqB,GAAcD,GAAkBpB,CAAM;AAAA,EAAA,GAGnCoC,IAAqB,CAACC,MAAyC;AACnE,IAAAL,EAAkB1B,EAAqB+B,GAAWrC,GAAQQ,CAAI,CAAC;AAAA,EACjE,GAEM8B,IAAoB,MAAM;AAC9B,IAAI/B,KACFuB,EAASpB,EAAiBH,GAAOP,CAAM,CAAC,GACxCoC,EAAmB7B,CAAK,MAExBuB,EAAS,IAAI,GACbE,EAAkB,IAAI;AAAA,EAE1B;AAEA,EAAAO,EAAU,MAAM;AACd,IAAIhC,KACFuB,EAASpB,EAAiBH,GAAOP,CAAM,CAAC,GACxCoC,EAAmB7B,CAAK,MAExBuB,EAAS,IAAI,GACbE,EAAkB,IAAI;AAAA,EAG1B,GAAG,CAACzB,GAAOP,GAAQQ,CAAI,CAAC;AAExB,QAAMgC,IAAqBrB,IACvB,CAAC,CAACZ,IACF,CAAC,CAACA,KAAS,CAACJ,EAAkBI,GAAOW,CAAY,GAE/CuB,IAAaN,EAAQ,MACrB,CAACK,KAAsB,CAACjC,IAAc,KACnCA,GACN,CAACiC,GAAoBjC,CAAK,CAAC;AAgB9B,SAdAgC,EAAU,MAAM;AACd,QAAKN,GACL;AAAA,UAAIS,EAAcjB,CAAM,GAAG;AACzB,QAAAQ,EAAW,WAAWlB,CAAS;AAC/B;AAAA,MACF;AACA,MAAI0B,IACFR,EAAW,SAASlB,GAAW,EAAE,OAAAC,GAAO,YAAAyB,GAAY,UAAU,MAAMxB,KAAA,gBAAAA,EAAW,OAAO,IAEtFgB,EAAW,WAAWlB,CAAS;AAAA;AAAA,EAGnC,GAAG,CAAC0B,GAAY1B,GAAWC,GAAOS,CAAM,CAAC,GAErCiB,EAAcjB,CAAM,IAAU,OAsBhC,gBAAAkB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAA5B;AAAA,MACA,QAAQQ,KAAUgB;AAAA,MAClB,MAAAd;AAAA,MACA,cAVqB,CAACmB,MAAsB;AAC9C,QAAAP,EAAA,GACAX,EAAQkB,CAAQ;AAAA,MAClB;AAAA,MAQI,WAzBkB,MAAM;AAC1B,QAAIhB,IACFZ,KAAA,QAAAA,EAAW6B,EAAkBjB,GAAO7B,CAAM,KAE1CiB,KAAA,QAAAA,EAAW,OAEbU,EAAQ,EAAK;AAAA,MACf;AAAA,MAmBI,SAjBuB,MAAM;AAC/B,QAAAW,EAAA,GACAX,EAAQ,EAAK;AAAA,MACf;AAAA,MAgBK,UAAA;AAAA,QAAAnB,EAAK,SAAS,IACb,gBAAAuC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACAC,EAAO,kCAAkC;AAAA,YAAA;AAAA,YAG1C,UAAAzC,EAAK,IAAI,CAACG,MACT,gBAAAoC;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAWC;AAAA,kBACT;AAAA,kBACAC,EAAO,iCAAiC;AAAA,kBACxClB,MAAmBpB,EAAI,OAAO;AAAA,kBAC9BoB,MAAmBpB,EAAI,OAAOsC,EAAO,wCAAwC;AAAA,gBAAA;AAAA,gBAE/E,SAAS,MAAM;AACb,wBAAMC,IAAOvC,EAAI,SAAA;AACjB,kBAAAmB,EAASoB,CAAI,GACblB,EAAkBrB,EAAI,GAAG;AAAA,gBAC3B;AAAA,gBAEC,UAAAA,EAAI;AAAA,cAAA;AAAA,cAbAA,EAAI;AAAA,YAAA,CAeZ;AAAA,UAAA;AAAA,QAAA,IAED;AAAA,QACJ,gBAAAoC;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,WAAWH,EAAW,sBAAsBC,EAAO,oBAAoB,CAAC;AAAA,YACxE,QAAAjD;AAAA,YACA,OAAO6B;AAAA,YACP,aAAAP;AAAA,YACA,cAAAC;AAAA,YACA,UAAU,CAAC2B,MAAS;AAClB,cAAApB,EAASoB,CAAI,GACblB,EAAkB,IAAI;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -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
|
|
2
|
-
import { DatePicker as
|
|
3
|
-
import
|
|
4
|
-
import { useState as
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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: () => [
|
|
23
|
+
getValue: () => [d().startOf("week"), d().endOf("week")]
|
|
23
24
|
}
|
|
24
25
|
];
|
|
25
|
-
function
|
|
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
|
|
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
|
|
31
|
-
for (const
|
|
32
|
-
const
|
|
33
|
-
if (
|
|
34
|
-
return
|
|
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
|
|
58
|
+
const it = ({
|
|
39
59
|
filterKey: e,
|
|
40
60
|
label: r,
|
|
41
61
|
value: t,
|
|
42
|
-
onChange:
|
|
62
|
+
onChange: i,
|
|
63
|
+
picker: n = "date",
|
|
43
64
|
defaultValue: k,
|
|
44
|
-
showDefaultAsSelected:
|
|
45
|
-
showQuickOptions:
|
|
46
|
-
quickOptions:
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
showDefaultAsSelected: y = !1,
|
|
66
|
+
showQuickOptions: c = !0,
|
|
67
|
+
quickOptions: R,
|
|
68
|
+
disabledDate: M,
|
|
69
|
+
active: Q,
|
|
70
|
+
hidden: p
|
|
49
71
|
}) => {
|
|
50
|
-
const [
|
|
51
|
-
t ? [
|
|
52
|
-
), [
|
|
53
|
-
|
|
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]) ? (
|
|
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
|
-
|
|
58
|
-
t != null && t[0] && (t != null && t[1]) ? (
|
|
59
|
-
}, [t,
|
|
60
|
-
const
|
|
61
|
-
return
|
|
62
|
-
if (
|
|
63
|
-
if (
|
|
64
|
-
|
|
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
|
-
|
|
92
|
+
N ? u.register(e, { label: r, valueLabel: N, onRemove: () => i == null ? void 0 : i(null) }) : u.unregister(e);
|
|
68
93
|
}
|
|
69
|
-
}, [
|
|
70
|
-
|
|
94
|
+
}, [N, e, r, p]), A(p) ? null : /* @__PURE__ */ _(
|
|
95
|
+
L,
|
|
71
96
|
{
|
|
72
97
|
label: r,
|
|
73
|
-
active:
|
|
74
|
-
open:
|
|
75
|
-
onOpenChange: (
|
|
76
|
-
S(), D(
|
|
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]) ?
|
|
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
|
-
|
|
110
|
+
O.length > 0 && /* @__PURE__ */ a(
|
|
86
111
|
"div",
|
|
87
112
|
{
|
|
88
|
-
className:
|
|
113
|
+
className: P(
|
|
89
114
|
"filter-date-range-quick-options",
|
|
90
|
-
|
|
115
|
+
V["filter-date-range-quick-options"]
|
|
91
116
|
),
|
|
92
|
-
children:
|
|
117
|
+
children: O.map((s) => /* @__PURE__ */ a(
|
|
93
118
|
"span",
|
|
94
119
|
{
|
|
95
|
-
className:
|
|
120
|
+
className: P(
|
|
96
121
|
"filter-date-range-quick-option",
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
103
|
-
|
|
127
|
+
const F = s.getValue();
|
|
128
|
+
F && (m(F), l(s.key));
|
|
104
129
|
},
|
|
105
|
-
children:
|
|
130
|
+
children: s.label
|
|
106
131
|
},
|
|
107
|
-
|
|
132
|
+
s.key
|
|
108
133
|
))
|
|
109
134
|
}
|
|
110
135
|
),
|
|
111
|
-
/* @__PURE__ */
|
|
112
|
-
|
|
136
|
+
/* @__PURE__ */ a(
|
|
137
|
+
W,
|
|
113
138
|
{
|
|
114
|
-
className:
|
|
139
|
+
className: P("filter-date-range-picker", V["filter-date-range-picker"]),
|
|
140
|
+
picker: n,
|
|
115
141
|
value: o,
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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":"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"}
|