@yoka-ui/ui 1.0.3 → 1.0.4
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/@Docs-yoka/exports.generated.md +3 -3
- package/dist/es/business/DrawerPageInfo/index.js +2 -2
- package/dist/es/business/DrawerPageInfo/index.js.map +2 -2
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +9 -60
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
- package/dist/es/components/YkRangeDateWithVS/index.d.ts +2 -2
- package/dist/es/components/YkRangeDateWithVS/index.js +3 -2
- package/dist/es/components/YkRangeDateWithVS/index.js.map +2 -2
- package/dist/es/components/YkRangeDateWithVS/index.module.less +4 -23
- package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +18 -1
- package/dist/es/components/YkRangeTimeWithRecent/index.js +7 -27
- package/dist/es/components/YkRangeTimeWithRecent/index.js.map +2 -2
- package/dist/es/index.less +1 -1
- package/dist/es/layout/YkDrawer/index.js +1 -2
- package/dist/es/layout/YkDrawer/index.js.map +2 -2
- package/dist/es/utils/ykStorybookDoc.js +1 -1
- package/dist/es/utils/ykStorybookDoc.js.map +1 -1
- package/dist/lib/business/DrawerPageInfo/index.js +1 -1
- package/dist/lib/business/DrawerPageInfo/index.js.map +2 -2
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +8 -59
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
- package/dist/lib/components/YkRangeDateWithVS/index.d.ts +2 -2
- package/dist/lib/components/YkRangeDateWithVS/index.js +5 -4
- package/dist/lib/components/YkRangeDateWithVS/index.js.map +3 -3
- package/dist/lib/components/YkRangeDateWithVS/index.module.less +4 -23
- package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +18 -1
- package/dist/lib/components/YkRangeTimeWithRecent/index.js +7 -27
- package/dist/lib/components/YkRangeTimeWithRecent/index.js.map +2 -2
- package/dist/lib/index.less +1 -1
- package/dist/lib/layout/YkDrawer/index.js +1 -2
- package/dist/lib/layout/YkDrawer/index.js.map +2 -2
- package/dist/lib/utils/ykStorybookDoc.js +1 -1
- package/dist/lib/utils/ykStorybookDoc.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,7 +19,7 @@ var __spreadValues = (a, b) => {
|
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
20
|
|
|
21
21
|
// src/components/YkRangeTimeWithRecent/index.tsx
|
|
22
|
-
import {
|
|
22
|
+
import React, { useState, useEffect, useMemo } from "react";
|
|
23
23
|
import {
|
|
24
24
|
Button,
|
|
25
25
|
ConfigProvider,
|
|
@@ -34,14 +34,14 @@ import {
|
|
|
34
34
|
} from "antd";
|
|
35
35
|
import datePickerZhCN from "antd/es/date-picker/locale/zh_CN";
|
|
36
36
|
import zhCN from "antd/locale/zh_CN";
|
|
37
|
-
import classNames from "classnames";
|
|
38
37
|
import dayjs from "dayjs";
|
|
39
38
|
import "dayjs/locale/zh-cn";
|
|
40
39
|
import isoWeek from "dayjs/plugin/isoWeek";
|
|
41
40
|
import weekOfYear from "dayjs/plugin/weekOfYear";
|
|
42
|
-
import React, { useEffect, useMemo, useRef, useState } from "react";
|
|
43
|
-
import { endTimeOptions, optionsMap, pickerMap, recentOptionsMap, startTimeOptions } from "./constants";
|
|
44
41
|
import styles from "./index.module.less";
|
|
42
|
+
import classNames from "classnames";
|
|
43
|
+
import { ClockCircleOutlined } from "@ant-design/icons";
|
|
44
|
+
import { startTimeOptions, endTimeOptions, optionsMap, pickerMap, recentOptionsMap } from "./constants";
|
|
45
45
|
dayjs.extend(isoWeek);
|
|
46
46
|
dayjs.extend(weekOfYear);
|
|
47
47
|
dayjs.locale(__spreadProps(__spreadValues({}, dayjs.Ls["zh-cn"]), {
|
|
@@ -89,7 +89,6 @@ var YkRangeTimeWithRecent = ({
|
|
|
89
89
|
}
|
|
90
90
|
};
|
|
91
91
|
const [open, setOpen] = useState(false);
|
|
92
|
-
const triggerWrapRef = useRef(null);
|
|
93
92
|
const [active, setActive] = useState("start");
|
|
94
93
|
const [timeFilterType, setTimeFilterType] = useState(0);
|
|
95
94
|
const [localValue, setLocalValue] = useState(null);
|
|
@@ -248,23 +247,6 @@ var YkRangeTimeWithRecent = ({
|
|
|
248
247
|
setTimeFilterType(1);
|
|
249
248
|
}
|
|
250
249
|
}, [value == null ? void 0 : value.recent_day]);
|
|
251
|
-
useEffect(() => {
|
|
252
|
-
if (!open)
|
|
253
|
-
return;
|
|
254
|
-
const onPointerDownCapture = (e) => {
|
|
255
|
-
var _a;
|
|
256
|
-
const el = e.target;
|
|
257
|
-
if (!(el instanceof Element))
|
|
258
|
-
return;
|
|
259
|
-
if ((_a = triggerWrapRef.current) == null ? void 0 : _a.contains(el))
|
|
260
|
-
return;
|
|
261
|
-
if (el.closest("[data-yk-range-time-with-recent-content]"))
|
|
262
|
-
return;
|
|
263
|
-
setOpen(false);
|
|
264
|
-
};
|
|
265
|
-
document.addEventListener("pointerdown", onPointerDownCapture, true);
|
|
266
|
-
return () => document.removeEventListener("pointerdown", onPointerDownCapture, true);
|
|
267
|
-
}, [open]);
|
|
268
250
|
useEffect(() => {
|
|
269
251
|
var _a, _b;
|
|
270
252
|
if (open) {
|
|
@@ -425,7 +407,7 @@ var YkRangeTimeWithRecent = ({
|
|
|
425
407
|
}
|
|
426
408
|
return /* @__PURE__ */ React.createElement("div", { className: "ant-picker-cell-inner", style: { width: 36 }, onClick: () => cellClick(current, info.type) }, current.date());
|
|
427
409
|
};
|
|
428
|
-
const content = /* @__PURE__ */ React.createElement("div", { className: styles.popoverContent
|
|
410
|
+
const content = /* @__PURE__ */ React.createElement("div", { className: styles.popoverContent }, !timeTypes && noTimeFilter ? null : /* @__PURE__ */ React.createElement("div", { className: styles.header }, timeTypes && timeTypes.length > 0 && /* @__PURE__ */ React.createElement(
|
|
429
411
|
Tabs,
|
|
430
412
|
{
|
|
431
413
|
activeKey: localTimeTypeName,
|
|
@@ -511,7 +493,7 @@ var YkRangeTimeWithRecent = ({
|
|
|
511
493
|
locale: datePickerZhCN,
|
|
512
494
|
className: styles.rangePicker,
|
|
513
495
|
getPopupContainer: (triggerNode) => triggerNode.parentElement,
|
|
514
|
-
open,
|
|
496
|
+
open: true,
|
|
515
497
|
cellRender,
|
|
516
498
|
picker,
|
|
517
499
|
autoFocus: true,
|
|
@@ -530,7 +512,6 @@ var YkRangeTimeWithRecent = ({
|
|
|
530
512
|
defaultValue: startTimeOptions[0].value,
|
|
531
513
|
prefix: /* @__PURE__ */ React.createElement(ClockCircleOutlined, null),
|
|
532
514
|
className: styles.timeSelectItem,
|
|
533
|
-
getPopupContainer: (triggerNode) => triggerNode.parentElement,
|
|
534
515
|
onChange: (hour) => {
|
|
535
516
|
timeChange(hour, "start");
|
|
536
517
|
}
|
|
@@ -543,7 +524,6 @@ var YkRangeTimeWithRecent = ({
|
|
|
543
524
|
defaultValue: endTimeOptions[endTimeOptions.length - 1].value,
|
|
544
525
|
prefix: /* @__PURE__ */ React.createElement(ClockCircleOutlined, null),
|
|
545
526
|
className: styles.timeSelectItem,
|
|
546
|
-
getPopupContainer: (triggerNode) => triggerNode.parentElement,
|
|
547
527
|
onChange: (hour) => {
|
|
548
528
|
timeChange(hour, "end");
|
|
549
529
|
}
|
|
@@ -624,7 +604,7 @@ var YkRangeTimeWithRecent = ({
|
|
|
624
604
|
trigger: "click",
|
|
625
605
|
styles: { body: { borderRadius: 2, padding: 0 } }
|
|
626
606
|
},
|
|
627
|
-
/* @__PURE__ */ React.createElement("div", { className: styles.btnRange, style
|
|
607
|
+
/* @__PURE__ */ React.createElement("div", { className: styles.btnRange, style }, timeTypes && timeTypes.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: styles.btnTimeType }, timeTypeKeys[normalizeTimeTypeForTimeTypes(value.time_type, timeTypes)]), /* @__PURE__ */ React.createElement(Divider, { type: "vertical" })), dateFieldOptionName && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: styles.btnTimeType }, dateFieldOptionName), /* @__PURE__ */ React.createElement(Divider, { type: "vertical" })), !noIcon && /* @__PURE__ */ React.createElement("i", { className: "iconfont icon-date", style: { color: "#3B86F9" } }), showRangeTime ? /* @__PURE__ */ React.createElement("span", { className: styles.btnRangeValue, style: !noIcon ? { marginLeft: 5 } : void 0 }, showRangeTime) : placeholder ? /* @__PURE__ */ React.createElement("div", { className: styles.placeholder }, placeholder) : null, clearable && (value.time_range || value.recent_day) && /* @__PURE__ */ React.createElement(
|
|
628
608
|
"i",
|
|
629
609
|
{
|
|
630
610
|
onClick: (e) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/YkRangeTimeWithRecent/index.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * 组件名称:YkRangeTimeWithRecent\n * 组件描述:时间范围 + 动态「最近 N 天」等能力的时间筛选(Range + Recent)\n * 组件使用场景:在需要选择时间范围的场景中使用,如筛选、排序等\n * 组件参数说明:\n * - value: {\n * time_range: [string, string] | null | undefined;\n * recent_day: string | null | undefined;\n * time_type: number | undefined;\n * }\n * - timeTypes: 时间类型选项\n * - onChange: 时间范围变化回调\n * - placement: 弹层位置\n * - placeholder: 占位符\n * - noTimeFilter: 是否禁用动态时间\n * - noIcon: 是否禁用图标\n */\nimport { ClockCircleOutlined } from '@ant-design/icons';\nimport {\n Button,\n ConfigProvider,\n DatePicker,\n DatePickerProps,\n Divider,\n InputNumber,\n message,\n Popover,\n Radio,\n Select,\n Tabs,\n} from 'antd';\nimport datePickerZhCN from 'antd/es/date-picker/locale/zh_CN';\nimport zhCN from 'antd/locale/zh_CN';\nimport classNames from 'classnames';\nimport dayjs, { Dayjs } from 'dayjs';\nimport 'dayjs/locale/zh-cn';\nimport isoWeek from 'dayjs/plugin/isoWeek';\nimport weekOfYear from 'dayjs/plugin/weekOfYear';\nimport React, { FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { endTimeOptions, optionsMap, pickerMap, recentOptionsMap, startTimeOptions } from './constants';\nimport styles from './index.module.less';\n\ndayjs.extend(isoWeek);\ndayjs.extend(weekOfYear);\ndayjs.locale({\n ...dayjs.Ls['zh-cn'],\n weekStart: 1,\n});\n\nconst { RangePicker } = DatePicker;\n\nexport type YkRangeTimeWithRecentTimeType = '合计' | '按小时' | '按天' | '按周' | '按月';\nexport interface YkRangeTimeWithRecentProps {\n style?: React.CSSProperties;\n clearable?: boolean;\n value: {\n time_range: [string, string] | null | undefined;\n recent_day: string | null | undefined;\n time_type: number | undefined;\n };\n timeTypes?: YkRangeTimeWithRecentTimeType[];\n onChange: (value: {\n time_range: [string, string] | null | undefined;\n recent_day: string | null | undefined;\n time_type: number | undefined;\n }) => void;\n placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight';\n placeholder?: string | React.ReactNode;\n noTimeFilter?: boolean;\n noIcon?: boolean;\n disabled?: boolean;\n dateFieldOptionName?: string;\n}\n\ntype RangeValue = [string, string] | null;\n\nconst timeTypeKeys = {\n 0: '合计',\n 1: '按小时',\n 2: '按天',\n 3: '按周',\n 4: '按月',\n};\n\n/** 未提供「合计」Tab 时,不应使用 time_type 0,回落为按天 */\nfunction normalizeTimeTypeForTimeTypes(\n timeType: number | undefined,\n timeTypes: YkRangeTimeWithRecentTimeType[] | undefined,\n): number {\n const raw = typeof timeType === 'number' ? timeType : 2;\n if (Array.isArray(timeTypes) && !timeTypes.includes('合计') && raw === 0) {\n return 2;\n }\n return raw;\n}\n\nconst YkRangeTimeWithRecent: FC<YkRangeTimeWithRecentProps> = ({\n value,\n onChange,\n timeTypes,\n style,\n clearable,\n placement = 'bottomLeft',\n placeholder = '开始时间 ~ 结束时间',\n noTimeFilter = false,\n noIcon = false,\n dateFieldOptionName = '',\n}) => {\n // 格式化时间\n const formatTime = (time: string) => {\n switch (normalizeTimeTypeForTimeTypes(value.time_type, timeTypes)) {\n case 1: // 按小时\n return dayjs(time).format('YYYY-MM-DD HH:mm');\n case 3: // 按周\n return dayjs(time).format('YYYY-MM-DD');\n case 4: // 按月\n return dayjs(time).format('YYYY-MM');\n case 2: // 按天\n case 0: // 合计\n default:\n return dayjs(time).format('YYYY-MM-DD');\n }\n };\n\n const [open, setOpen] = useState(false);\n /** 外层 Popover 与内层 RangePicker 均基于 rc-trigger,嵌套时外层常收不到「点击外部」;用捕获阶段统一判定 */\n const triggerWrapRef = useRef<HTMLDivElement>(null);\n const [active, setActive] = useState<'start' | 'end'>('start');\n // 是否静态时间 默认是静态时间\n const [timeFilterType, setTimeFilterType] = useState(0);\n // 弹层内时间\n const [localValue, setLocalValue] = useState<[Dayjs, Dayjs] | null>(null);\n // dayjs.isoWeek存在跨年问题,d=2025-12-30时,d.isoWeekYear()=2026\n const [startWeekDate, setStartWeekDate] = useState<Dayjs | null>(null);\n const [startMonth, setStartMonth] = useState<Dayjs | null>(null);\n // 弹层内时间类型\n const [localTimeType, setLocalTimeType] = useState<number | undefined>(() =>\n normalizeTimeTypeForTimeTypes(value?.time_type, timeTypes),\n );\n // 弹层内时间类型名称\n const localTimeTypeName = useMemo(() => {\n const type = typeof localTimeType === 'number' ? localTimeType : 2;\n return timeTypeKeys[type as keyof typeof timeTypeKeys] || timeTypeKeys[2];\n }, [localTimeType]);\n\n const getFormattedTimeRange = (recent: number, type: 'start' | 'end') => {\n const today = dayjs();\n switch (localTimeType) {\n case 1: // 按小时\n return today.subtract(recent, 'day').format(`YYYY-MM-DD ${type === 'start' ? '00:00' : '23:59'}`);\n case 3: // 按周\n return `${today.subtract(recent, 'week').format('YYYY')}年-${today.subtract(recent, 'week').week()}周 (${today.subtract(recent, 'week').startOf('week').format('MM.DD')}-${today.subtract(recent, 'week').endOf('week').format('MM.DD')})`;\n case 4: // 按月\n return today.subtract(recent, 'month').format('YYYY-MM月');\n default:\n return today.subtract(recent, 'day').format('YYYY-MM-DD');\n }\n };\n\n // 外部格式化\n const getFormattedRecentTime = (recent: number, type: 'start' | 'end') => {\n const today = dayjs();\n switch (localTimeType) {\n case 1: // 按小时\n return today.subtract(recent, 'day').format(`YYYY-MM-DD ${type === 'start' ? '00:00' : '23:59'}`);\n case 3: // 按周\n return `${today.subtract(recent, 'week').format('YYYY')}年-${today.subtract(recent, 'week').week()}周`;\n case 4: // 按月\n return today.subtract(recent, 'month').format('YYYY-MM月');\n default:\n return today.subtract(recent, 'day').format('YYYY-MM-DD');\n }\n };\n\n // 动态时间\n const [recentStart, setRecentStart] = useState<number>(0);\n const [recentEnd, setRecentEnd] = useState<number>(0);\n\n useEffect(() => {\n setRecentStart(value?.recent_day ? Number(value.recent_day.split('|')[1]) : 0);\n setRecentEnd(value?.recent_day ? Number(value.recent_day.split('|')[2]) : 0);\n }, [value?.recent_day]);\n\n // 显示时间\n const showRangeTime = useMemo(() => {\n if (value?.time_range && value?.time_range.length === 2) {\n return formatTime(value.time_range[0]) + ' ~ ' + formatTime(value.time_range[1]);\n } else if (value?.recent_day) {\n const [type, start, end] = value.recent_day.split('|');\n let showTimeText = '';\n const unit = type === 'D' ? '天' : type === 'W' ? '周' : '月';\n const options = recentOptionsMap[localTimeType || 2].options;\n if (options.map((m) => m.value).includes(value.recent_day)) {\n showTimeText = options.find((m) => m.value === value.recent_day)?.label || '';\n } else if (end === '0') {\n showTimeText = '近' + (Number(start) - Number(end) + 1) + unit;\n } else {\n showTimeText = start + unit + '前 ~ ' + end + unit + '前';\n }\n // 合计、按小时、按天 里本周上周本月上月特殊处理\n if (\n value.time_type !== undefined &&\n [0, 1, 2].includes(normalizeTimeTypeForTimeTypes(value.time_type, timeTypes)) &&\n (value.recent_day.split('|')[0] === 'W' || value.recent_day.split('|')[0] === 'M')\n ) {\n const today = dayjs();\n const lastDayOfLastMonth = today.subtract(1, 'month').endOf('month');\n const daysToLastMonthStart = today.diff(lastDayOfLastMonth.startOf('month'), 'day');\n const daysToLastMonthEnd = today.diff(lastDayOfLastMonth, 'day') + 1;\n let startNum, endNum;\n switch (value.recent_day) {\n case 'W|0|0':\n startNum = today.day() === 0 ? 6 : today.day() - 1;\n endNum = 0;\n showTimeText = '本周';\n break;\n case 'W|1|1':\n startNum = today.day() === 0 ? 13 : today.day() + 6;\n endNum = today.day() === 0 ? 7 : today.day();\n showTimeText = '上周';\n break;\n case 'M|0|0':\n startNum = today.date() - 1;\n endNum = 0;\n showTimeText = '本月';\n break;\n case 'M|1|1':\n startNum = daysToLastMonthStart;\n endNum = daysToLastMonthEnd;\n showTimeText = '上月';\n break;\n default:\n startNum = 0;\n endNum = 0;\n showTimeText = '';\n break;\n }\n return (\n <>\n {showTimeText}\n <Divider type=\"vertical\" />\n {getFormattedRecentTime(startNum, 'start')} ~ {getFormattedRecentTime(endNum, 'end')}\n </>\n );\n }\n return (\n <>\n {showTimeText}\n <Divider type=\"vertical\" />\n {getFormattedRecentTime(Number(start), 'start')} ~ {getFormattedRecentTime(Number(end), 'end')}\n </>\n );\n }\n return '';\n }, [value, timeTypes, localTimeType]);\n\n const recentType = useMemo(() => {\n switch (localTimeType) {\n case 3:\n return 'W';\n case 4:\n return 'M';\n default:\n return 'D';\n }\n }, [localTimeType]);\n\n // 显示的开始时间\n const showRecentStart = useMemo(() => {\n return getFormattedTimeRange(recentStart, 'start');\n }, [recentStart, localTimeType]);\n\n // 显示的结束时间\n const showRecentEnd = useMemo(() => {\n return getFormattedTimeRange(recentEnd, 'end');\n }, [recentEnd, localTimeType]);\n\n // 时间类型选项\n const timeTypeOptions = useMemo(() => {\n return (\n timeTypes?.map((item) => ({\n key: item,\n label: item,\n children: null,\n })) || []\n );\n }, [timeTypes]);\n\n // 时间类型 'date' | 'week' | 'month'\n const picker = useMemo(() => {\n return localTimeType ? pickerMap[localTimeType] : 'date';\n }, [localTimeType]);\n\n // 预选时间\n const presetsTime = useMemo(() => {\n if (timeFilterType === 1) {\n return recentOptionsMap[localTimeType || 2];\n }\n return optionsMap[localTimeType || 2];\n }, [localTimeType, timeFilterType]);\n\n const startTime = useMemo(() => {\n return Number(localValue?.[0]?.format('HH')) || 0;\n }, [localValue]);\n\n const endTime = useMemo(() => {\n return Number(localValue?.[1]?.format('HH')) || 0;\n }, [localValue]);\n\n // 过滤禁用开始时间\n const disabledStartHours = useMemo(() => {\n if (localValue?.[0] && dayjs(localValue[0]).isSame(dayjs(), 'day')) {\n const currentHour = dayjs().hour();\n return startTimeOptions.filter((option) => option.value <= currentHour);\n }\n return startTimeOptions;\n }, [localValue]);\n\n // 过滤禁用结束时间\n const disabledEndHours = useMemo(() => {\n if (localValue?.[1] && dayjs(localValue[1]).isSame(dayjs(), 'day')) {\n const currentHour = dayjs().hour();\n return endTimeOptions.filter((option) => option.value <= currentHour);\n }\n return endTimeOptions;\n }, [localValue]);\n\n useEffect(() => {\n if (value?.recent_day) {\n setTimeFilterType(1);\n }\n }, [value?.recent_day]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDownCapture = (e: PointerEvent) => {\n const el = e.target;\n if (!(el instanceof Element)) return;\n if (triggerWrapRef.current?.contains(el)) return;\n if (el.closest('[data-yk-range-time-with-recent-content]')) return;\n setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDownCapture, true);\n return () => document.removeEventListener('pointerdown', onPointerDownCapture, true);\n }, [open]);\n\n // 打开时,初始化时间范围和时间类型\n useEffect(() => {\n if (open) {\n setActive('start');\n setStartWeekDate(null);\n setStartMonth(null);\n const rangeStart = document.getElementById('RangeStart');\n setTimeout(() => {\n rangeStart?.focus();\n }, 10);\n setLocalTimeType(normalizeTimeTypeForTimeTypes(value?.time_type, timeTypes));\n if (value?.recent_day) {\n // 合计、按小时、按天 里本周上周本月上月特殊处理\n if (\n value.time_type !== undefined &&\n [0, 1, 2].includes(normalizeTimeTypeForTimeTypes(value.time_type, timeTypes)) &&\n (value.recent_day.split('|')[0] === 'W' || value.recent_day.split('|')[0] === 'M')\n ) {\n const today = dayjs();\n const lastDayOfLastMonth = today.subtract(1, 'month').endOf('month');\n const daysToLastMonthStart = today.diff(lastDayOfLastMonth.startOf('month'), 'day');\n const daysToLastMonthEnd = today.diff(lastDayOfLastMonth, 'day') + 1;\n switch (value.recent_day) {\n case 'W|0|0':\n setRecentStart(today.day() === 0 ? 6 : today.day() - 1);\n setRecentEnd(0);\n break;\n case 'W|1|1':\n setRecentStart(today.day() === 0 ? 13 : today.day() + 6);\n setRecentEnd(today.day() === 0 ? 7 : today.day());\n break;\n case 'M|0|0':\n setRecentStart(today.date() - 1);\n setRecentEnd(0);\n break;\n case 'M|1|1':\n setRecentStart(daysToLastMonthStart);\n setRecentEnd(daysToLastMonthEnd);\n break;\n default:\n setRecentStart(0);\n setRecentEnd(0);\n break;\n }\n } else {\n setRecentStart(Number(value.recent_day.split('|')[1]));\n setRecentEnd(Number(value.recent_day.split('|')[2]));\n }\n } else {\n setLocalValue([dayjs(value?.time_range?.[0]), dayjs(value?.time_range?.[1])]);\n }\n }\n }, [open]);\n\n const timeChange = (hour: number, type: 'start' | 'end') => {\n const [start, end] = localValue || [];\n if (type === 'start') {\n setLocalValue([dayjs(start).hour(hour), end]);\n } else {\n setLocalValue([start, dayjs(end).hour(hour)]);\n }\n };\n\n // 预选时间点击\n const presetClick = (item: { value: () => RangeValue }) => {\n setLocalValue(item.value()?.map((time) => dayjs(time)) as [Dayjs, Dayjs] | null);\n switch (localTimeType) {\n case 1:\n onChange({\n time_range: [\n dayjs(item.value()?.[0]).format('YYYY-MM-DD HH:00'),\n dayjs(item.value()?.[1]).format('YYYY-MM-DD HH:59'),\n ],\n recent_day: null,\n time_type: localTimeType,\n });\n break;\n default:\n onChange({\n time_range: [dayjs(item.value()?.[0]).format('YYYY-MM-DD'), dayjs(item.value()?.[1]).format('YYYY-MM-DD')],\n recent_day: null,\n time_type: localTimeType,\n });\n }\n setOpen(false);\n };\n\n // 点击日期\n const cellClick = (current: Dayjs, type: string) => {\n // 提取公共方法\n const handleInputFocus = (isStart: boolean) => {\n const element = document.getElementById('YkRangeTimeWithRecent');\n const inputs = element?.querySelectorAll('input');\n inputs?.[isStart ? 0 : 1].focus();\n };\n const handleDateChange = (start: Dayjs, end: Dayjs, closePopup = true) => {\n setLocalValue([start, end]);\n setActive(active === 'start' ? 'end' : 'start');\n handleInputFocus(active === 'end');\n if (closePopup) {\n const format = localTimeType === 4 ? 'YYYY-MM' : 'YYYY-MM-DD';\n onChange({\n time_range: [dayjs(start).format(format), dayjs(end).format(format)],\n recent_day: null,\n time_type: localTimeType,\n });\n setOpen(false);\n }\n };\n\n // 处理不同类型的日期选择\n const dateTypeHandlers = {\n month: () => {\n const selectedMonth = current.startOf('month');\n if (active === 'start') {\n setStartMonth(selectedMonth);\n setActive('end');\n handleInputFocus(false);\n } else {\n if (!startMonth) return;\n const endMonth = selectedMonth;\n const [start, end] =\n endMonth.isAfter(startMonth) || endMonth.isSame(startMonth)\n ? [startMonth, endMonth]\n : [endMonth, startMonth.endOf('month')];\n handleDateChange(start, end);\n }\n },\n week: () => {\n if (active === 'start') {\n setStartWeekDate(current.startOf('week'));\n setActive('end');\n handleInputFocus(false);\n } else {\n if (!startWeekDate) return;\n const startWeekStart = startWeekDate;\n const endWeekStart = current.startOf('week');\n if (endWeekStart.isAfter(startWeekStart) || endWeekStart.isSame(startWeekStart)) {\n const start = startWeekStart;\n const end = endWeekStart.isSame(dayjs().startOf('week')) ? dayjs() : endWeekStart.endOf('week');\n handleDateChange(start, end);\n } else {\n const start = endWeekStart;\n const end = startWeekStart.endOf('week');\n const finalEnd = end.isAfter(dayjs()) ? dayjs() : end;\n handleDateChange(start, finalEnd);\n }\n }\n },\n date: () => {\n if (active === 'start') {\n handleDateChange(current, localValue?.[1] || current, false);\n } else {\n if (!localValue?.[0]) return;\n const [start, end] = localValue[0] > current ? [current, localValue[0]] : [localValue[0], current];\n handleDateChange(start, end, localTimeType !== 1);\n }\n },\n };\n\n const handler = dateTypeHandlers[type as keyof typeof dateTypeHandlers];\n if (handler) handler();\n };\n\n // 日期单元格渲染\n const cellRender: DatePickerProps<Dayjs>['cellRender'] = (current, info) => {\n if (typeof current === 'number' || typeof current === 'string') {\n // 不确定什么时候会是number或string\n return <div className=\"ant-picker-cell-inner\">{current}</div>;\n }\n if (info.type !== 'date') {\n return (\n <div style={{ width: 36 }} onClick={() => cellClick(current, info.type)}>\n {info.originNode}\n </div>\n );\n }\n return (\n <div className=\"ant-picker-cell-inner\" style={{ width: 36 }} onClick={() => cellClick(current, info.type)}>\n {current.date()}\n </div>\n );\n };\n\n const content = (\n <div className={styles.popoverContent} data-yk-range-time-with-recent-content>\n {!timeTypes && noTimeFilter ? null : (\n <div className={styles.header}>\n {timeTypes && timeTypes.length > 0 && (\n <Tabs\n activeKey={localTimeTypeName}\n items={timeTypeOptions}\n onChange={(key) => {\n const timeTypeKey = Object.entries(timeTypeKeys).find(([_, label]) => label === key)?.[0];\n setLocalTimeType(Number(timeTypeKey));\n setLocalValue(\n optionsMap[timeTypeKey !== undefined ? Number(timeTypeKey) : 2]\n .default()\n ?.map((time) => dayjs(time)) as [Dayjs, Dayjs] | null,\n );\n }}\n />\n )}\n {!noTimeFilter && (\n <Radio.Group\n optionType=\"button\"\n value={timeFilterType}\n style={{\n marginLeft: 'auto',\n }}\n onChange={(e) => {\n setTimeFilterType(e.target.value);\n }}\n >\n <Radio\n value={0}\n style={{\n borderRadius: '2px 0 0 2px',\n height: 26,\n lineHeight: '24px',\n padding: '0 10px',\n }}\n >\n 静态时间\n </Radio>\n <Radio\n value={1}\n style={{\n borderRadius: '0 2px 2px 0',\n height: 26,\n lineHeight: '24px',\n padding: '0 10px',\n }}\n >\n 动态时间\n </Radio>\n </Radio.Group>\n )}\n </div>\n )}\n <div\n className={classNames(styles.body, {\n [styles.showTimes]: localTimeType === 1 && timeFilterType === 0,\n })}\n >\n <div className={styles.left}>\n {presetsTime.options.map((item) => (\n <Button\n key={item.label}\n className={styles.presetBtn}\n onClick={() => {\n if (timeFilterType === 1) {\n onChange({\n time_range: null,\n recent_day: item.value as string,\n time_type: localTimeType,\n });\n setOpen(false);\n } else {\n presetClick(item as { value: () => RangeValue });\n }\n }}\n >\n {item.label}\n </Button>\n ))}\n </div>\n {timeFilterType === 0 ? (\n <div className={styles.right} id=\"YkRangeTimeWithRecent\" key={open ? 'open' : 'close'}>\n <RangePicker\n id=\"RangeStart\"\n locale={datePickerZhCN}\n className={styles.rangePicker}\n getPopupContainer={(triggerNode) => triggerNode.parentElement as HTMLElement}\n open={open}\n cellRender={cellRender}\n picker={picker}\n autoFocus\n showWeek={false}\n onOpenChange={() => {}}\n classNames={{ popup: { root: styles.rangePickerPopup } }}\n value={localValue}\n placement=\"bottomLeft\"\n />\n {localTimeType === 1 && (\n <div className={styles.boxTimes}>\n <Select\n options={disabledStartHours}\n value={startTime}\n defaultValue={startTimeOptions[0].value}\n prefix={<ClockCircleOutlined />}\n className={styles.timeSelectItem}\n getPopupContainer={(triggerNode) => triggerNode.parentElement as HTMLElement}\n onChange={(hour) => {\n timeChange(hour, 'start');\n }}\n />\n <Select\n options={disabledEndHours}\n value={endTime}\n defaultValue={endTimeOptions[endTimeOptions.length - 1].value}\n prefix={<ClockCircleOutlined />}\n className={styles.timeSelectItem}\n getPopupContainer={(triggerNode) => triggerNode.parentElement as HTMLElement}\n onChange={(hour) => {\n timeChange(hour, 'end');\n }}\n />\n </div>\n )}\n </div>\n ) : (\n <div className={styles.rightDynamic}>\n <div className={styles.dynamicItem}>\n <div className={styles.dynamicItemTitle}>\n <span>开始时间:{showRecentStart}</span>\n </div>\n <div className={styles.dynamicItemContent}>\n <InputNumber\n min={0}\n className={styles.inputNumber}\n value={recentStart}\n onChange={(next) => {\n const newStart = next || 0;\n // 确保开始时间大于等于结束时间\n if (newStart < recentEnd) {\n setRecentStart(newStart);\n setRecentEnd(newStart);\n } else {\n setRecentStart(newStart);\n }\n }}\n />\n <span style={{ color: '#333' }}>{recentType === 'D' ? '天' : recentType === 'W' ? '周' : '月'}前</span>\n </div>\n </div>\n <div className={styles.dynamicItem}>\n <div className={styles.dynamicItemTitle}>\n <span>结束时间:{showRecentEnd}</span>\n </div>\n <div className={styles.dynamicItemContent}>\n <InputNumber\n min={0}\n className={styles.inputNumber}\n value={recentEnd}\n onChange={(next) => {\n const newEnd = next || 0;\n // 确保结束时间小于等于开始时间\n if (newEnd > recentStart) {\n setRecentEnd(newEnd);\n setRecentStart(newEnd);\n } else {\n setRecentEnd(newEnd);\n }\n }}\n />\n <span style={{ color: '#333' }}>{recentType === 'D' ? '天' : recentType === 'W' ? '周' : '月'}前</span>\n </div>\n </div>\n </div>\n )}\n </div>\n {(localTimeType === 1 || timeFilterType === 1) && (\n <div className={styles.footer}>\n <Button\n onClick={() => {\n if (timeFilterType === 1) {\n // 动态时间\n onChange({\n time_range: null,\n recent_day: `${recentType}|${recentStart}|${recentEnd}`,\n time_type: localTimeType,\n });\n } else {\n // 如果是按小时,结束时间不能早于开始时间\n if (localTimeType === 1) {\n if (dayjs(localValue?.[1]).isBefore(dayjs(localValue?.[0]))) {\n message.warning('结束时间不能早于开始时间');\n return;\n }\n }\n // 静态时间\n onChange({\n time_range: [\n dayjs(localValue?.[0]).format('YYYY-MM-DD HH:00'),\n dayjs(localValue?.[1]).format('YYYY-MM-DD HH:59'),\n ],\n recent_day: null,\n time_type: localTimeType,\n });\n }\n setOpen(false);\n }}\n type=\"primary\"\n >\n 确认\n </Button>\n </div>\n )}\n </div>\n );\n return (\n <ConfigProvider locale={zhCN}>\n <Popover\n open={open}\n onOpenChange={setOpen}\n content={content}\n arrow={false}\n placement={placement}\n trigger=\"click\"\n styles={{ body: { borderRadius: 2, padding: 0 } }}\n >\n <div className={styles.btnRange} style={style} ref={triggerWrapRef}>\n {timeTypes && timeTypes.length > 0 && (\n <>\n <span className={styles.btnTimeType}>\n {timeTypeKeys[normalizeTimeTypeForTimeTypes(value.time_type, timeTypes) as keyof typeof timeTypeKeys]}\n </span>\n <Divider type=\"vertical\" />\n </>\n )}\n {dateFieldOptionName && (\n <>\n <span className={styles.btnTimeType}>{dateFieldOptionName}</span>\n <Divider type=\"vertical\" />\n </>\n )}\n {!noIcon && <i className=\"iconfont icon-date\" style={{ color: '#3B86F9' }} />}\n {/* 显示时间 */}\n {showRangeTime ? (\n <span className={styles.btnRangeValue} style={!noIcon ? { marginLeft: 5 } : undefined}>\n {showRangeTime}\n </span>\n ) : placeholder ? (\n <div className={styles.placeholder}>{placeholder}</div>\n ) : null}\n {/* 清除 */}\n {clearable && (value.time_range || value.recent_day) && (\n <i\n onClick={(e) => {\n e.stopPropagation();\n onChange({\n time_range: null,\n recent_day: null,\n time_type: localTimeType,\n });\n }}\n className={classNames(styles.clearIcon, 'iconfont icon-guanbi1')}\n />\n )}\n </div>\n </Popover>\n </ConfigProvider>\n );\n};\n\nexport default YkRangeTimeWithRecent;\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * 组件名称:YkRangeTimeWithRecent\n * 组件描述:时间范围 + 动态「最近 N 天」等能力的时间筛选(Range + Recent)\n * 组件使用场景:在需要选择时间范围的场景中使用,如筛选、排序等\n * 组件参数说明:\n * - value: {\n * time_range: [string, string] | null | undefined;\n * recent_day: string | null | undefined;\n * time_type: number | undefined;\n * }\n * - timeTypes: 时间类型选项\n * - onChange: 时间范围变化回调\n * - placement: 弹层位置\n * - placeholder: 占位符\n * - noTimeFilter: 是否禁用动态时间\n * - noIcon: 是否禁用图标\n */\nimport React, { FC, useState, useEffect, useMemo } from 'react';\nimport {\n Button,\n ConfigProvider,\n DatePicker,\n DatePickerProps,\n Divider,\n InputNumber,\n message,\n Popover,\n Radio,\n Select,\n Tabs,\n} from 'antd';\nimport datePickerZhCN from 'antd/es/date-picker/locale/zh_CN';\nimport zhCN from 'antd/locale/zh_CN';\nimport dayjs, { Dayjs } from 'dayjs';\nimport 'dayjs/locale/zh-cn';\nimport isoWeek from 'dayjs/plugin/isoWeek';\nimport weekOfYear from 'dayjs/plugin/weekOfYear';\n\ndayjs.extend(isoWeek);\ndayjs.extend(weekOfYear);\ndayjs.locale({\n ...dayjs.Ls['zh-cn'],\n weekStart: 1,\n});\nimport styles from './index.module.less';\nimport classNames from 'classnames';\nimport { ClockCircleOutlined } from '@ant-design/icons';\nimport { startTimeOptions, endTimeOptions, optionsMap, pickerMap, recentOptionsMap } from './constants';\n\nconst { RangePicker } = DatePicker;\n\nexport type YkRangeTimeWithRecentTimeType = '合计' | '按小时' | '按天' | '按周' | '按月';\nexport interface YkRangeTimeWithRecentProps {\n style?: React.CSSProperties;\n clearable?: boolean;\n value: {\n time_range: [string, string] | null | undefined;\n recent_day: string | null | undefined;\n time_type: number | undefined;\n };\n timeTypes?: YkRangeTimeWithRecentTimeType[];\n onChange: (value: {\n time_range: [string, string] | null | undefined;\n recent_day: string | null | undefined;\n time_type: number | undefined;\n }) => void;\n placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight';\n placeholder?: string | React.ReactNode;\n noTimeFilter?: boolean;\n noIcon?: boolean;\n disabled?: boolean;\n dateFieldOptionName?: string;\n}\n\ntype RangeValue = [string, string] | null;\n\nconst timeTypeKeys = {\n 0: '合计',\n 1: '按小时',\n 2: '按天',\n 3: '按周',\n 4: '按月',\n};\n\n/** 未提供「合计」Tab 时,不应使用 time_type 0,回落为按天 */\nfunction normalizeTimeTypeForTimeTypes(\n timeType: number | undefined,\n timeTypes: YkRangeTimeWithRecentTimeType[] | undefined,\n): number {\n const raw = typeof timeType === 'number' ? timeType : 2;\n if (Array.isArray(timeTypes) && !timeTypes.includes('合计') && raw === 0) {\n return 2;\n }\n return raw;\n}\n\nconst YkRangeTimeWithRecent: FC<YkRangeTimeWithRecentProps> = ({\n value,\n onChange,\n timeTypes,\n style,\n clearable,\n placement = 'bottomLeft',\n placeholder = '开始时间 ~ 结束时间',\n noTimeFilter = false,\n noIcon = false,\n dateFieldOptionName = '',\n}) => {\n // 格式化时间\n const formatTime = (time: string) => {\n switch (normalizeTimeTypeForTimeTypes(value.time_type, timeTypes)) {\n case 1: // 按小时\n return dayjs(time).format('YYYY-MM-DD HH:mm');\n case 3: // 按周\n return dayjs(time).format('YYYY-MM-DD');\n case 4: // 按月\n return dayjs(time).format('YYYY-MM');\n case 2: // 按天\n case 0: // 合计\n default:\n return dayjs(time).format('YYYY-MM-DD');\n }\n };\n\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState<'start' | 'end'>('start');\n // 是否静态时间 默认是静态时间\n const [timeFilterType, setTimeFilterType] = useState(0);\n // 弹层内时间\n const [localValue, setLocalValue] = useState<[Dayjs, Dayjs] | null>(null);\n // dayjs.isoWeek存在跨年问题,d=2025-12-30时,d.isoWeekYear()=2026\n const [startWeekDate, setStartWeekDate] = useState<Dayjs | null>(null);\n const [startMonth, setStartMonth] = useState<Dayjs | null>(null);\n // 弹层内时间类型\n const [localTimeType, setLocalTimeType] = useState<number | undefined>(() =>\n normalizeTimeTypeForTimeTypes(value?.time_type, timeTypes),\n );\n // 弹层内时间类型名称\n const localTimeTypeName = useMemo(() => {\n const type = typeof localTimeType === 'number' ? localTimeType : 2;\n return timeTypeKeys[type as keyof typeof timeTypeKeys] || timeTypeKeys[2];\n }, [localTimeType]);\n\n const getFormattedTimeRange = (recent: number, type: 'start' | 'end') => {\n const today = dayjs();\n switch (localTimeType) {\n case 1: // 按小时\n return today.subtract(recent, 'day').format(`YYYY-MM-DD ${type === 'start' ? '00:00' : '23:59'}`);\n case 3: // 按周\n return `${today.subtract(recent, 'week').format('YYYY')}年-${today.subtract(recent, 'week').week()}周 (${today.subtract(recent, 'week').startOf('week').format('MM.DD')}-${today.subtract(recent, 'week').endOf('week').format('MM.DD')})`;\n case 4: // 按月\n return today.subtract(recent, 'month').format('YYYY-MM月');\n default:\n return today.subtract(recent, 'day').format('YYYY-MM-DD');\n }\n };\n\n // 外部格式化\n const getFormattedRecentTime = (recent: number, type: 'start' | 'end') => {\n const today = dayjs();\n switch (localTimeType) {\n case 1: // 按小时\n return today.subtract(recent, 'day').format(`YYYY-MM-DD ${type === 'start' ? '00:00' : '23:59'}`);\n case 3: // 按周\n return `${today.subtract(recent, 'week').format('YYYY')}年-${today.subtract(recent, 'week').week()}周`;\n case 4: // 按月\n return today.subtract(recent, 'month').format('YYYY-MM月');\n default:\n return today.subtract(recent, 'day').format('YYYY-MM-DD');\n }\n };\n\n // 动态时间\n const [recentStart, setRecentStart] = useState<number>(0);\n const [recentEnd, setRecentEnd] = useState<number>(0);\n\n useEffect(() => {\n setRecentStart(value?.recent_day ? Number(value.recent_day.split('|')[1]) : 0);\n setRecentEnd(value?.recent_day ? Number(value.recent_day.split('|')[2]) : 0);\n }, [value?.recent_day]);\n\n // 显示时间\n const showRangeTime = useMemo(() => {\n if (value?.time_range && value?.time_range.length === 2) {\n return formatTime(value.time_range[0]) + ' ~ ' + formatTime(value.time_range[1]);\n } else if (value?.recent_day) {\n const [type, start, end] = value.recent_day.split('|');\n let showTimeText = '';\n const unit = type === 'D' ? '天' : type === 'W' ? '周' : '月';\n const options = recentOptionsMap[localTimeType || 2].options;\n if (options.map((m) => m.value).includes(value.recent_day)) {\n showTimeText = options.find((m) => m.value === value.recent_day)?.label || '';\n } else if (end === '0') {\n showTimeText = '近' + (Number(start) - Number(end) + 1) + unit;\n } else {\n showTimeText = start + unit + '前 ~ ' + end + unit + '前';\n }\n // 合计、按小时、按天 里本周上周本月上月特殊处理\n if (\n value.time_type !== undefined &&\n [0, 1, 2].includes(normalizeTimeTypeForTimeTypes(value.time_type, timeTypes)) &&\n (value.recent_day.split('|')[0] === 'W' || value.recent_day.split('|')[0] === 'M')\n ) {\n const today = dayjs();\n const lastDayOfLastMonth = today.subtract(1, 'month').endOf('month');\n const daysToLastMonthStart = today.diff(lastDayOfLastMonth.startOf('month'), 'day');\n const daysToLastMonthEnd = today.diff(lastDayOfLastMonth, 'day') + 1;\n let startNum, endNum;\n switch (value.recent_day) {\n case 'W|0|0':\n startNum = today.day() === 0 ? 6 : today.day() - 1;\n endNum = 0;\n showTimeText = '本周';\n break;\n case 'W|1|1':\n startNum = today.day() === 0 ? 13 : today.day() + 6;\n endNum = today.day() === 0 ? 7 : today.day();\n showTimeText = '上周';\n break;\n case 'M|0|0':\n startNum = today.date() - 1;\n endNum = 0;\n showTimeText = '本月';\n break;\n case 'M|1|1':\n startNum = daysToLastMonthStart;\n endNum = daysToLastMonthEnd;\n showTimeText = '上月';\n break;\n default:\n startNum = 0;\n endNum = 0;\n showTimeText = '';\n break;\n }\n return (\n <>\n {showTimeText}\n <Divider type='vertical' />\n {getFormattedRecentTime(startNum, 'start')} ~ {getFormattedRecentTime(endNum, 'end')}\n </>\n );\n }\n return (\n <>\n {showTimeText}\n <Divider type='vertical' />\n {getFormattedRecentTime(Number(start), 'start')} ~ {getFormattedRecentTime(Number(end), 'end')}\n </>\n );\n }\n return '';\n }, [value, timeTypes, localTimeType]);\n\n const recentType = useMemo(() => {\n switch (localTimeType) {\n case 3:\n return 'W';\n case 4:\n return 'M';\n default:\n return 'D';\n }\n }, [localTimeType]);\n\n // 显示的开始时间\n const showRecentStart = useMemo(() => {\n return getFormattedTimeRange(recentStart, 'start');\n }, [recentStart, localTimeType]);\n\n // 显示的结束时间\n const showRecentEnd = useMemo(() => {\n return getFormattedTimeRange(recentEnd, 'end');\n }, [recentEnd, localTimeType]);\n\n // 时间类型选项\n const timeTypeOptions = useMemo(() => {\n return (\n timeTypes?.map((item) => ({\n key: item,\n label: item,\n children: null,\n })) || []\n );\n }, [timeTypes]);\n\n // 时间类型 'date' | 'week' | 'month'\n const picker = useMemo(() => {\n return localTimeType ? pickerMap[localTimeType] : 'date';\n }, [localTimeType]);\n\n // 预选时间\n const presetsTime = useMemo(() => {\n if (timeFilterType === 1) {\n return recentOptionsMap[localTimeType || 2];\n }\n return optionsMap[localTimeType || 2];\n }, [localTimeType, timeFilterType]);\n\n const startTime = useMemo(() => {\n return Number(localValue?.[0]?.format('HH')) || 0;\n }, [localValue]);\n\n const endTime = useMemo(() => {\n return Number(localValue?.[1]?.format('HH')) || 0;\n }, [localValue]);\n\n // 过滤禁用开始时间\n const disabledStartHours = useMemo(() => {\n if (localValue?.[0] && dayjs(localValue[0]).isSame(dayjs(), 'day')) {\n const currentHour = dayjs().hour();\n return startTimeOptions.filter((option) => option.value <= currentHour);\n }\n return startTimeOptions;\n }, [localValue]);\n\n // 过滤禁用结束时间\n const disabledEndHours = useMemo(() => {\n if (localValue?.[1] && dayjs(localValue[1]).isSame(dayjs(), 'day')) {\n const currentHour = dayjs().hour();\n return endTimeOptions.filter((option) => option.value <= currentHour);\n }\n return endTimeOptions;\n }, [localValue]);\n\n useEffect(() => {\n if (value?.recent_day) {\n setTimeFilterType(1);\n }\n }, [value?.recent_day]);\n\n // 打开时,初始化时间范围和时间类型\n useEffect(() => {\n if (open) {\n setActive('start');\n setStartWeekDate(null);\n setStartMonth(null);\n const rangeStart = document.getElementById('RangeStart');\n setTimeout(() => {\n rangeStart?.focus();\n }, 10);\n setLocalTimeType(normalizeTimeTypeForTimeTypes(value?.time_type, timeTypes));\n if (value?.recent_day) {\n // 合计、按小时、按天 里本周上周本月上月特殊处理\n if (\n value.time_type !== undefined &&\n [0, 1, 2].includes(normalizeTimeTypeForTimeTypes(value.time_type, timeTypes)) &&\n (value.recent_day.split('|')[0] === 'W' || value.recent_day.split('|')[0] === 'M')\n ) {\n const today = dayjs();\n const lastDayOfLastMonth = today.subtract(1, 'month').endOf('month');\n const daysToLastMonthStart = today.diff(lastDayOfLastMonth.startOf('month'), 'day');\n const daysToLastMonthEnd = today.diff(lastDayOfLastMonth, 'day') + 1;\n switch (value.recent_day) {\n case 'W|0|0':\n setRecentStart(today.day() === 0 ? 6 : today.day() - 1);\n setRecentEnd(0);\n break;\n case 'W|1|1':\n setRecentStart(today.day() === 0 ? 13 : today.day() + 6);\n setRecentEnd(today.day() === 0 ? 7 : today.day());\n break;\n case 'M|0|0':\n setRecentStart(today.date() - 1);\n setRecentEnd(0);\n break;\n case 'M|1|1':\n setRecentStart(daysToLastMonthStart);\n setRecentEnd(daysToLastMonthEnd);\n break;\n default:\n setRecentStart(0);\n setRecentEnd(0);\n break;\n }\n } else {\n setRecentStart(Number(value.recent_day.split('|')[1]));\n setRecentEnd(Number(value.recent_day.split('|')[2]));\n }\n } else {\n setLocalValue([dayjs(value?.time_range?.[0]), dayjs(value?.time_range?.[1])]);\n }\n }\n }, [open]);\n\n const timeChange = (hour: number, type: 'start' | 'end') => {\n const [start, end] = localValue || [];\n if (type === 'start') {\n setLocalValue([dayjs(start).hour(hour), end]);\n } else {\n setLocalValue([start, dayjs(end).hour(hour)]);\n }\n };\n\n // 预选时间点击\n const presetClick = (item: { value: () => RangeValue }) => {\n setLocalValue(item.value()?.map((time) => dayjs(time)) as [Dayjs, Dayjs] | null);\n switch (localTimeType) {\n case 1:\n onChange({\n time_range: [\n dayjs(item.value()?.[0]).format('YYYY-MM-DD HH:00'),\n dayjs(item.value()?.[1]).format('YYYY-MM-DD HH:59'),\n ],\n recent_day: null,\n time_type: localTimeType,\n });\n break;\n default:\n onChange({\n time_range: [dayjs(item.value()?.[0]).format('YYYY-MM-DD'), dayjs(item.value()?.[1]).format('YYYY-MM-DD')],\n recent_day: null,\n time_type: localTimeType,\n });\n }\n setOpen(false);\n };\n\n // 点击日期\n const cellClick = (current: Dayjs, type: string) => {\n // 提取公共方法\n const handleInputFocus = (isStart: boolean) => {\n const element = document.getElementById('YkRangeTimeWithRecent');\n const inputs = element?.querySelectorAll('input');\n inputs?.[isStart ? 0 : 1].focus();\n };\n const handleDateChange = (start: Dayjs, end: Dayjs, closePopup = true) => {\n setLocalValue([start, end]);\n setActive(active === 'start' ? 'end' : 'start');\n handleInputFocus(active === 'end');\n if (closePopup) {\n const format = localTimeType === 4 ? 'YYYY-MM' : 'YYYY-MM-DD';\n onChange({\n time_range: [dayjs(start).format(format), dayjs(end).format(format)],\n recent_day: null,\n time_type: localTimeType,\n });\n setOpen(false);\n }\n };\n\n // 处理不同类型的日期选择\n const dateTypeHandlers = {\n month: () => {\n const selectedMonth = current.startOf('month');\n if (active === 'start') {\n setStartMonth(selectedMonth);\n setActive('end');\n handleInputFocus(false);\n } else {\n if (!startMonth) return;\n const endMonth = selectedMonth;\n const [start, end] =\n endMonth.isAfter(startMonth) || endMonth.isSame(startMonth)\n ? [startMonth, endMonth]\n : [endMonth, startMonth.endOf('month')];\n handleDateChange(start, end);\n }\n },\n week: () => {\n if (active === 'start') {\n setStartWeekDate(current.startOf('week'));\n setActive('end');\n handleInputFocus(false);\n } else {\n if (!startWeekDate) return;\n const startWeekStart = startWeekDate;\n const endWeekStart = current.startOf('week');\n if (endWeekStart.isAfter(startWeekStart) || endWeekStart.isSame(startWeekStart)) {\n const start = startWeekStart;\n const end = endWeekStart.isSame(dayjs().startOf('week')) ? dayjs() : endWeekStart.endOf('week');\n handleDateChange(start, end);\n } else {\n const start = endWeekStart;\n const end = startWeekStart.endOf('week');\n const finalEnd = end.isAfter(dayjs()) ? dayjs() : end;\n handleDateChange(start, finalEnd);\n }\n }\n },\n date: () => {\n if (active === 'start') {\n handleDateChange(current, localValue?.[1] || current, false);\n } else {\n if (!localValue?.[0]) return;\n const [start, end] = localValue[0] > current ? [current, localValue[0]] : [localValue[0], current];\n handleDateChange(start, end, localTimeType !== 1);\n }\n },\n };\n\n const handler = dateTypeHandlers[type as keyof typeof dateTypeHandlers];\n if (handler) handler();\n };\n\n // 日期单元格渲染\n const cellRender: DatePickerProps<Dayjs>['cellRender'] = (current, info) => {\n if (typeof current === 'number' || typeof current === 'string') {\n // 不确定什么时候会是number或string\n return <div className='ant-picker-cell-inner'>{current}</div>;\n }\n if (info.type !== 'date') {\n return (\n <div style={{ width: 36 }} onClick={() => cellClick(current, info.type)}>\n {info.originNode}\n </div>\n );\n }\n return (\n <div className='ant-picker-cell-inner' style={{ width: 36 }} onClick={() => cellClick(current, info.type)}>\n {current.date()}\n </div>\n );\n };\n\n const content = (\n <div className={styles.popoverContent}>\n {!timeTypes && noTimeFilter ? null : (\n <div className={styles.header}>\n {timeTypes && timeTypes.length > 0 && (\n <Tabs\n activeKey={localTimeTypeName}\n items={timeTypeOptions}\n onChange={(key) => {\n const timeTypeKey = Object.entries(timeTypeKeys).find(([_, label]) => label === key)?.[0];\n setLocalTimeType(Number(timeTypeKey));\n setLocalValue(\n optionsMap[timeTypeKey !== undefined ? Number(timeTypeKey) : 2]\n .default()\n ?.map((time) => dayjs(time)) as [Dayjs, Dayjs] | null,\n );\n }}\n />\n )}\n {!noTimeFilter && (\n <Radio.Group\n optionType='button'\n value={timeFilterType}\n style={{\n marginLeft: 'auto',\n }}\n onChange={(e) => {\n setTimeFilterType(e.target.value);\n }}\n >\n <Radio\n value={0}\n style={{\n borderRadius: '2px 0 0 2px',\n height: 26,\n lineHeight: '24px',\n padding: '0 10px',\n }}\n >\n 静态时间\n </Radio>\n <Radio\n value={1}\n style={{\n borderRadius: '0 2px 2px 0',\n height: 26,\n lineHeight: '24px',\n padding: '0 10px',\n }}\n >\n 动态时间\n </Radio>\n </Radio.Group>\n )}\n </div>\n )}\n <div\n className={classNames(styles.body, {\n [styles.showTimes]: localTimeType === 1 && timeFilterType === 0,\n })}\n >\n <div className={styles.left}>\n {presetsTime.options.map((item) => (\n <Button\n key={item.label}\n className={styles.presetBtn}\n onClick={() => {\n if (timeFilterType === 1) {\n onChange({\n time_range: null,\n recent_day: item.value as string,\n time_type: localTimeType,\n });\n setOpen(false);\n } else {\n presetClick(item as { value: () => RangeValue });\n }\n }}\n >\n {item.label}\n </Button>\n ))}\n </div>\n {timeFilterType === 0 ? (\n <div className={styles.right} id='YkRangeTimeWithRecent' key={open ? 'open' : 'close'}>\n <RangePicker\n id='RangeStart'\n locale={datePickerZhCN}\n className={styles.rangePicker}\n getPopupContainer={(triggerNode) => triggerNode.parentElement as HTMLElement}\n open={true}\n cellRender={cellRender}\n picker={picker}\n autoFocus\n showWeek={false}\n onOpenChange={() => {}}\n classNames={{ popup: { root: styles.rangePickerPopup } }}\n value={localValue}\n placement='bottomLeft'\n />\n {localTimeType === 1 && (\n <div className={styles.boxTimes}>\n <Select\n options={disabledStartHours}\n value={startTime}\n defaultValue={startTimeOptions[0].value}\n prefix={<ClockCircleOutlined />}\n className={styles.timeSelectItem}\n onChange={(hour) => {\n timeChange(hour, 'start');\n }}\n />\n <Select\n options={disabledEndHours}\n value={endTime}\n defaultValue={endTimeOptions[endTimeOptions.length - 1].value}\n prefix={<ClockCircleOutlined />}\n className={styles.timeSelectItem}\n onChange={(hour) => {\n timeChange(hour, 'end');\n }}\n />\n </div>\n )}\n </div>\n ) : (\n <div className={styles.rightDynamic}>\n <div className={styles.dynamicItem}>\n <div className={styles.dynamicItemTitle}>\n <span>开始时间:{showRecentStart}</span>\n </div>\n <div className={styles.dynamicItemContent}>\n <InputNumber\n min={0}\n className={styles.inputNumber}\n value={recentStart}\n onChange={(next) => {\n const newStart = next || 0;\n // 确保开始时间大于等于结束时间\n if (newStart < recentEnd) {\n setRecentStart(newStart);\n setRecentEnd(newStart);\n } else {\n setRecentStart(newStart);\n }\n }}\n />\n <span style={{ color: '#333' }}>{recentType === 'D' ? '天' : recentType === 'W' ? '周' : '月'}前</span>\n </div>\n </div>\n <div className={styles.dynamicItem}>\n <div className={styles.dynamicItemTitle}>\n <span>结束时间:{showRecentEnd}</span>\n </div>\n <div className={styles.dynamicItemContent}>\n <InputNumber\n min={0}\n className={styles.inputNumber}\n value={recentEnd}\n onChange={(next) => {\n const newEnd = next || 0;\n // 确保结束时间小于等于开始时间\n if (newEnd > recentStart) {\n setRecentEnd(newEnd);\n setRecentStart(newEnd);\n } else {\n setRecentEnd(newEnd);\n }\n }}\n />\n <span style={{ color: '#333' }}>{recentType === 'D' ? '天' : recentType === 'W' ? '周' : '月'}前</span>\n </div>\n </div>\n </div>\n )}\n </div>\n {(localTimeType === 1 || timeFilterType === 1) && (\n <div className={styles.footer}>\n <Button\n onClick={() => {\n if (timeFilterType === 1) {\n // 动态时间\n onChange({\n time_range: null,\n recent_day: `${recentType}|${recentStart}|${recentEnd}`,\n time_type: localTimeType,\n });\n } else {\n // 如果是按小时,结束时间不能早于开始时间\n if (localTimeType === 1) {\n if (dayjs(localValue?.[1]).isBefore(dayjs(localValue?.[0]))) {\n message.warning('结束时间不能早于开始时间');\n return;\n }\n }\n // 静态时间\n onChange({\n time_range: [\n dayjs(localValue?.[0]).format('YYYY-MM-DD HH:00'),\n dayjs(localValue?.[1]).format('YYYY-MM-DD HH:59'),\n ],\n recent_day: null,\n time_type: localTimeType,\n });\n }\n setOpen(false);\n }}\n type='primary'\n >\n 确认\n </Button>\n </div>\n )}\n </div>\n );\n return (\n <ConfigProvider locale={zhCN}>\n <Popover\n open={open}\n onOpenChange={setOpen}\n content={content}\n arrow={false}\n placement={placement}\n trigger='click'\n styles={{ body: { borderRadius: 2, padding: 0 } }}\n >\n <div className={styles.btnRange} style={style}>\n {timeTypes && timeTypes.length > 0 && (\n <>\n <span className={styles.btnTimeType}>\n {timeTypeKeys[normalizeTimeTypeForTimeTypes(value.time_type, timeTypes) as keyof typeof timeTypeKeys]}\n </span>\n <Divider type='vertical' />\n </>\n )}\n {dateFieldOptionName && (\n <>\n <span className={styles.btnTimeType}>{dateFieldOptionName}</span>\n <Divider type='vertical' />\n </>\n )}\n {!noIcon && <i className='iconfont icon-date' style={{ color: '#3B86F9' }} />}\n {/* 显示时间 */}\n {showRangeTime ? (\n <span className={styles.btnRangeValue} style={!noIcon ? { marginLeft: 5 } : undefined}>\n {showRangeTime}\n </span>\n ) : placeholder ? (\n <div className={styles.placeholder}>{placeholder}</div>\n ) : null}\n {/* 清除 */}\n {clearable && (value.time_range || value.recent_day) && (\n <i\n onClick={(e) => {\n e.stopPropagation();\n onChange({\n time_range: null,\n recent_day: null,\n time_type: localTimeType,\n });\n }}\n className={classNames(styles.clearIcon, 'iconfont icon-guanbi1')}\n />\n )}\n </div>\n </Popover>\n </ConfigProvider>\n );\n};\n\nexport default YkRangeTimeWithRecent;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/es/index.less
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
// 自动聚合的样式文件
|
|
8
|
-
@import "../../src/Themes/TableTheme/index.less";
|
|
9
8
|
@import "../../src/assets/less/ant-reset.less";
|
|
10
9
|
@import "../../src/assets/less/index.less";
|
|
11
10
|
@import "../../src/assets/less/variables.less";
|
|
@@ -26,6 +25,7 @@
|
|
|
26
25
|
@import "../../src/creative/ButtonRadioWithInfo/index.less";
|
|
27
26
|
@import "../../src/creative/ButtonWithProgress/index.less";
|
|
28
27
|
@import "../../src/layout/YkDrawer/index.module.less";
|
|
28
|
+
@import "../../src/Themes/TableTheme/index.less";
|
|
29
29
|
@import "../../src/ui/LogicOperator/index.module.less";
|
|
30
30
|
@import "../../src/ui/YkCard/index.module.less";
|
|
31
31
|
@import "../../src/ui/YkCheckbox/index.module.less";
|
|
@@ -31,7 +31,6 @@ var __objRest = (source, exclude) => {
|
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
// src/layout/YkDrawer/index.tsx
|
|
34
|
-
import { CloseOutlined } from "@ant-design/icons";
|
|
35
34
|
import { ConfigProvider, Drawer } from "antd";
|
|
36
35
|
import classNames from "classnames";
|
|
37
36
|
import React, { useCallback } from "react";
|
|
@@ -119,7 +118,7 @@ var YkDrawer = (_a) => {
|
|
|
119
118
|
tabIndex: 0,
|
|
120
119
|
"aria-label": "关闭"
|
|
121
120
|
},
|
|
122
|
-
/* @__PURE__ */ React.createElement(
|
|
121
|
+
/* @__PURE__ */ React.createElement("i", { className: "iconfont icon-guanbi" })
|
|
123
122
|
) : null;
|
|
124
123
|
const mergedExtra = showOuterCloseEffective ? /* @__PURE__ */ React.createElement("div", { className: styles.extraWrap }, extra, outerClose) : extra;
|
|
125
124
|
const mergedClosable = showOuterCloseEffective ? false : isVerticalPlacement ? closable === false ? false : __spreadValues({ placement: "end" }, closable === true || closable === void 0 ? {} : closable) : closable;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/layout/YkDrawer/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { ConfigProvider, Drawer, DrawerProps } from 'antd';\nimport classNames from 'classnames';\nimport React, { useCallback } from 'react';\nimport styles from './index.module.less';\n\n/** 预设尺寸(px):左右抽屉为 `width`,上下抽屉为 `height` */\nexport const YK_DRAWER_SIZE_PX = {\n small: 378,\n medium: 550,\n large: 736,\n xlarge: 1000,\n} as const;\n\nexport type YkDrawerSize = keyof typeof YK_DRAWER_SIZE_PX;\n\nexport type YkDrawerMaskEffect = 'blur' | 'dimmed' | 'none';\n\nexport type YkDrawerPlacement = NonNullable<DrawerProps['placement']>;\n\nexport type YkDrawerProps = Omit<DrawerProps, 'size'> & {\n /** 预设宽高;不配 `width`/`height` 时按 `placement` 自动套用 */\n drawerSize?: YkDrawerSize;\n /** 遮罩:`blur` 毛玻璃+浅遮罩,`dimmed` 默认变暗,`none` 透明(仍拦截点击背后) */\n maskEffect?: YkDrawerMaskEffect;\n /** 是否展示外侧关闭标签(参考 DrawerPageInfo),默认 true;仅 **left/right** 生效,top/bottom 不展示外侧钮、使用 antd 默认关闭;为 true 且为左右抽屉时关闭内置标题栏关闭钮 */\n showOuterClose?: boolean;\n};\n\nconst MASK_BASE: Record<YkDrawerMaskEffect, React.CSSProperties> = {\n blur: {\n background: 'rgba(0, 0, 0, 0.28)',\n backdropFilter: 'blur(6px)',\n WebkitBackdropFilter: 'blur(6px)',\n },\n dimmed: {},\n none: {\n background: 'transparent',\n backdropFilter: 'none',\n WebkitBackdropFilter: 'none',\n },\n};\n\nfunction resolveDimension(\n placement: YkDrawerPlacement,\n drawerSize: YkDrawerSize | undefined,\n widthProp: DrawerProps['width'],\n heightProp: DrawerProps['height'],\n): Pick<DrawerProps, 'width' | 'height'> {\n const preset = drawerSize ? YK_DRAWER_SIZE_PX[drawerSize] : undefined;\n const vertical = placement === 'top' || placement === 'bottom';\n return {\n width: widthProp ?? (vertical ? undefined : (preset ?? YK_DRAWER_SIZE_PX.medium)),\n height: heightProp ?? (vertical ? (preset ?? YK_DRAWER_SIZE_PX.medium) : undefined),\n };\n}\n\nconst YkDrawer: React.FC<YkDrawerProps> = ({\n drawerSize = 'medium',\n maskEffect = 'dimmed',\n placement = 'right',\n showOuterClose = true,\n extra,\n styles: userStyles,\n className,\n rootClassName,\n closable,\n mask = true,\n /** 默认 false:点击遮罩不关闭(与 DrawerPageInfo 一致);需要时点遮罩关闭请传 `true` */\n maskClosable = false,\n width: widthProp,\n height: heightProp,\n onClose,\n ...rest\n}) => {\n const { width, height } = resolveDimension(placement, drawerSize, widthProp, heightProp);\n\n const maskStyle: React.CSSProperties = {\n ...MASK_BASE[maskEffect],\n ...userStyles?.mask,\n };\n\n const handleExtraKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClose?.(e);\n }\n },\n [onClose],\n );\n\n const isVerticalPlacement = placement === 'top' || placement === 'bottom';\n /** 外侧关闭条仅在左右抽屉展示 */\n const showOuterCloseEffective = showOuterClose && !isVerticalPlacement;\n\n const outerClose = showOuterCloseEffective ? (\n <div\n className={classNames(styles.extraClose, styles[`extraClose--${placement}`])}\n onClick={(e) => onClose?.(e)}\n onKeyDown={handleExtraKeyDown}\n role=\"button\"\n tabIndex={0}\n aria-label=\"关闭\"\n >\n <i className=\"iconfont icon-guanbi\" />\n </div>\n ) : null;\n\n const mergedExtra = showOuterCloseEffective ? (\n <div className={styles.extraWrap}>\n {extra}\n {outerClose}\n </div>\n ) : (\n extra\n );\n\n /** top/bottom:内置关闭钮默认在标题栏右侧(antd `closable.placement: 'end'`) */\n const mergedClosable: DrawerProps['closable'] = showOuterCloseEffective\n ? false\n : isVerticalPlacement\n ? closable === false\n ? false\n : { placement: 'end', ...(closable === true || closable === undefined ? {} : closable) }\n : closable;\n\n return (\n <ConfigProvider\n theme={{\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Drawer\n placement={placement}\n width={width}\n height={height}\n mask={mask}\n maskClosable={maskClosable}\n closable={mergedClosable}\n extra={mergedExtra}\n onClose={onClose}\n styles={{\n ...userStyles,\n mask: maskStyle,\n }}\n className={className}\n rootClassName={classNames(showOuterCloseEffective && styles.drawerRootHideBuiltinClose, rootClassName)}\n {...rest}\n />\n </ConfigProvider>\n );\n};\n\nexport default React.memo(YkDrawer);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/utils/ykStorybookDoc.ts
|
|
2
|
-
var YK_STORYBOOK_PLATFORM_NOTE = "业务侧使用 `@yoka
|
|
2
|
+
var YK_STORYBOOK_PLATFORM_NOTE = "业务侧使用 `@yoka/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka/ui/dist/index.less`(以 README 为准)。";
|
|
3
3
|
function ykStoryDoc(input) {
|
|
4
4
|
var _a;
|
|
5
5
|
const deps = input.dependencies.length > 0 ? input.dependencies.join("、") : "`react`、`antd`(具体见源码 import)";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/utils/ykStorybookDoc.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Storybook Autodocs 统一文案:**描述** / **依赖** / **备注**。\n * 用于各 `*.stories.tsx` 的 `meta.parameters.docs.description.component`。\n */\nexport type YkStoryDocInput = {\n /** 一句话概括组件用途(建议以句号结尾) */\n summary: string;\n /**\n * 运行时主要依赖:`npm 包(用到的子模块)` 或 `本库 · 模块名`\n */\n dependencies: string[];\n /**\n * 组件特有备注(交互、API、Story 限制等);环境类说明由函数自动追加。\n */\n notes?: string[];\n};\n\nconst YK_STORYBOOK_PLATFORM_NOTE =\n '业务侧使用 `@yoka
|
|
4
|
+
"sourcesContent": ["/**\n * Storybook Autodocs 统一文案:**描述** / **依赖** / **备注**。\n * 用于各 `*.stories.tsx` 的 `meta.parameters.docs.description.component`。\n */\nexport type YkStoryDocInput = {\n /** 一句话概括组件用途(建议以句号结尾) */\n summary: string;\n /**\n * 运行时主要依赖:`npm 包(用到的子模块)` 或 `本库 · 模块名`\n */\n dependencies: string[];\n /**\n * 组件特有备注(交互、API、Story 限制等);环境类说明由函数自动追加。\n */\n notes?: string[];\n};\n\nconst YK_STORYBOOK_PLATFORM_NOTE =\n '业务侧使用 `@yoka/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka/ui/dist/index.less`(以 README 为准)。';\n\nexport function ykStoryDoc(input: YkStoryDocInput): string {\n const deps = input.dependencies.length > 0 ? input.dependencies.join('、') : '`react`、`antd`(具体见源码 import)';\n\n const extra = (input.notes ?? []).filter(Boolean);\n const remarks = [...extra, YK_STORYBOOK_PLATFORM_NOTE];\n\n return `**描述**:${input.summary}\\n\\n**依赖**:${deps}\\n\\n**备注**:\\n${remarks.map((line) => `- ${line}`).join('\\n')}`;\n}\n"],
|
|
5
5
|
"mappings": ";AAiBA,IAAM,6BACJ;AAEK,SAAS,WAAW,OAAgC;AApB3D;AAqBE,QAAM,OAAO,MAAM,aAAa,SAAS,IAAI,MAAM,aAAa,KAAK,GAAG,IAAI;AAE5E,QAAM,UAAS,WAAM,UAAN,YAAe,CAAC,GAAG,OAAO,OAAO;AAChD,QAAM,UAAU,CAAC,GAAG,OAAO,0BAA0B;AAErD,SAAO,UAAU,MAAM;AAAA;AAAA,SAAqB;AAAA;AAAA;AAAA,EAAoB,QAAQ,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,KAAK,IAAI;AAC9G;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -117,7 +117,7 @@ var DrawerPageInfo = ({ id, open, onOpenChange, loadData, onFeedback }) => {
|
|
|
117
117
|
width: 600,
|
|
118
118
|
open,
|
|
119
119
|
onClose,
|
|
120
|
-
extra: /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.pageInfoDrawerExtraClose, onClick: onClose, role: "button", tabIndex: 0 }, /* @__PURE__ */ import_react.default.createElement(
|
|
120
|
+
extra: /* @__PURE__ */ import_react.default.createElement("div", { className: import_index_module.default.pageInfoDrawerExtraClose, onClick: onClose, role: "button", tabIndex: 0 }, /* @__PURE__ */ import_react.default.createElement("i", { className: "iconfont icon-guanbi" })),
|
|
121
121
|
maskClosable: false,
|
|
122
122
|
className: import_index_module.default.drawerTipInfo
|
|
123
123
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/business/DrawerPageInfo/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { DislikeOutlined, LikeOutlined } from '@ant-design/icons';\nimport { Button, Divider, Drawer, Modal, Skeleton } from 'antd';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport styles from './index.module.less';\n\n/** 提示内容数据结构,与 loadData 返回一致 */\nexport interface TipContentData {\n tip_id: number;\n tip_name: string;\n content: string;\n stared: boolean;\n unstared: boolean;\n}\n\n/** 反馈接口参数 */\nexport interface FeedbackParams {\n stared?: boolean;\n unstared?: boolean;\n}\n\n/**\n * DrawerPageInfo 组件的 Props\n * 数据与请求通过 loadData / onFeedback 由父组件负责,组件仅负责展示与交互。\n */\nexport type PropsType = {\n /** 当前提示页 id,用于 loadData / onFeedback 入参 */\n id: number | string;\n /** 抽屉是否打开 */\n open: boolean;\n /** 抽屉打开状态变化回调(关闭时由组件调用) */\n onOpenChange?: (open: boolean) => void;\n /** 加载内容:抽屉打开且 id 有效时由组件调用,父组件请求后返回数据 */\n loadData: (id: number) => Promise<TipContentData>;\n /** 提交反馈(点赞/点踩):父组件请求接口,组件在成功后更新本地状态 */\n onFeedback: (id: number, params: FeedbackParams) => Promise<void>;\n};\n\nconst FEEDBACK_RESET_DELAY = 200;\n\n/**\n * 抽屉式提示页:展示富文本内容与点赞/点踩反馈,内容与反馈请求通过 props 回调解耦。\n */\nconst DrawerPageInfo: React.FC<PropsType> = ({ id, open, onOpenChange, loadData, onFeedback }) => {\n const numericId = Number(id);\n const onOpenChangeFn = onOpenChange ?? (() => {});\n const [title, setTitle] = useState('');\n const [content, setContent] = useState('');\n const [stared, setStared] = useState(false);\n const [unstared, setUnstared] = useState(false);\n const [loading, setLoading] = useState(false);\n const [feedbackLoading, setFeedbackLoading] = useState(false);\n\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewSrc, setPreviewSrc] = useState('');\n const richTextRef = useRef<HTMLDivElement>(null);\n\n /** 打开时根据 id 拉取内容 */\n useEffect(() => {\n if (!open || !numericId || Number.isNaN(numericId)) return;\n setLoading(true);\n loadData(numericId)\n .then((data) => {\n setTitle(data.tip_name);\n setContent(data.content);\n setStared(data.stared);\n setUnstared(data.unstared);\n })\n .finally(() => setLoading(false));\n }, [open, numericId, loadData]);\n\n const onClose = useCallback(() => {\n setContent('');\n onOpenChangeFn(false);\n }, [onOpenChangeFn]);\n\n /** 点赞:若已点踩则先取消点踩再点赞,否则直接点赞 */\n const handleLike = useCallback(() => {\n setFeedbackLoading(true);\n const nextStared = !stared;\n const run = unstared\n ? onFeedback(numericId, { unstared: false }).then(() => onFeedback(numericId, { stared: nextStared }))\n : onFeedback(numericId, { stared: nextStared });\n\n run\n .then(() => {\n setStared(nextStared);\n if (unstared) setUnstared(false);\n })\n .finally(() => {\n setTimeout(() => setFeedbackLoading(false), FEEDBACK_RESET_DELAY);\n });\n }, [numericId, stared, unstared, onFeedback]);\n\n /** 点踩:若已点赞则先取消点赞再点踩,否则直接点踩 */\n const handleDislike = useCallback(() => {\n setFeedbackLoading(true);\n const nextUnstared = !unstared;\n const run = stared\n ? onFeedback(numericId, { stared: false }).then(() => onFeedback(numericId, { unstared: nextUnstared }))\n : onFeedback(numericId, { unstared: nextUnstared });\n\n run\n .then(() => {\n setUnstared(nextUnstared);\n if (stared) setStared(false);\n })\n .finally(() => {\n setTimeout(() => setFeedbackLoading(false), FEEDBACK_RESET_DELAY);\n });\n }, [numericId, stared, unstared, onFeedback]);\n\n /** 富文本内图片点击放大:content 变化后重新绑定 */\n useEffect(() => {\n const el = richTextRef.current;\n if (!el || !content) return;\n const images = el.querySelectorAll<HTMLImageElement>('img');\n const handler = (e: Event) => {\n const img = e.currentTarget as HTMLImageElement;\n if (img?.src) {\n setPreviewSrc(img.src);\n setPreviewOpen(true);\n }\n };\n images.forEach((img) => {\n img.style.cursor = 'pointer';\n img.addEventListener('click', handler);\n });\n return () => images.forEach((img) => img.removeEventListener('click', handler));\n }, [content]);\n\n const showThanks = (stared || unstared) && !feedbackLoading;\n\n if (!numericId || Number.isNaN(numericId)) return null;\n\n return (\n <Drawer\n title={title}\n width={600}\n open={open}\n onClose={onClose}\n extra={\n <div className={styles.pageInfoDrawerExtraClose} onClick={onClose} role='button' tabIndex={0}>\n <i className='iconfont icon-guanbi' />\n </div>\n }\n maskClosable={false}\n className={styles.drawerTipInfo}\n >\n {loading ? (\n <Skeleton active />\n ) : (\n <>\n <div ref={richTextRef} className={styles.boxTipHtml} dangerouslySetInnerHTML={{ __html: content }} />\n <div className={styles.boxStared}>\n <Divider plain style={{ margin: '10px 0' }}>\n 此内容是否有帮助\n </Divider>\n <div className={styles.btnsStared}>\n <Button\n type={stared ? 'primary' : 'default'}\n shape='circle'\n loading={feedbackLoading}\n disabled={feedbackLoading}\n icon={<LikeOutlined />}\n onClick={handleLike}\n />\n <Button\n type={unstared ? 'primary' : 'default'}\n shape='circle'\n loading={feedbackLoading}\n disabled={feedbackLoading}\n icon={<DislikeOutlined />}\n onClick={handleDislike}\n />\n </div>\n <div className={styles.thanksTip} style={{ cursor: 'default', opacity: showThanks ? 1 : 0 }}>\n 感谢您的反馈\n </div>\n </div>\n </>\n )}\n <Modal\n title='图片'\n style={{ top: 20 }}\n open={previewOpen}\n onCancel={() => {\n setPreviewOpen(false);\n setPreviewSrc('');\n }}\n footer={null}\n width='80%'\n >\n <img src={previewSrc} alt='预览' style={{ width: '100%' }} />\n </Modal>\n </Drawer>\n );\n};\n\nexport default DrawerPageInfo;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["React", "styles"]
|
|
7
7
|
}
|