@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.
Files changed (34) hide show
  1. package/@Docs-yoka/exports.generated.md +3 -3
  2. package/dist/es/business/DrawerPageInfo/index.js +2 -2
  3. package/dist/es/business/DrawerPageInfo/index.js.map +2 -2
  4. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +9 -60
  5. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
  6. package/dist/es/components/YkRangeDateWithVS/index.d.ts +2 -2
  7. package/dist/es/components/YkRangeDateWithVS/index.js +3 -2
  8. package/dist/es/components/YkRangeDateWithVS/index.js.map +2 -2
  9. package/dist/es/components/YkRangeDateWithVS/index.module.less +4 -23
  10. package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +18 -1
  11. package/dist/es/components/YkRangeTimeWithRecent/index.js +7 -27
  12. package/dist/es/components/YkRangeTimeWithRecent/index.js.map +2 -2
  13. package/dist/es/index.less +1 -1
  14. package/dist/es/layout/YkDrawer/index.js +1 -2
  15. package/dist/es/layout/YkDrawer/index.js.map +2 -2
  16. package/dist/es/utils/ykStorybookDoc.js +1 -1
  17. package/dist/es/utils/ykStorybookDoc.js.map +1 -1
  18. package/dist/lib/business/DrawerPageInfo/index.js +1 -1
  19. package/dist/lib/business/DrawerPageInfo/index.js.map +2 -2
  20. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +8 -59
  21. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
  22. package/dist/lib/components/YkRangeDateWithVS/index.d.ts +2 -2
  23. package/dist/lib/components/YkRangeDateWithVS/index.js +5 -4
  24. package/dist/lib/components/YkRangeDateWithVS/index.js.map +3 -3
  25. package/dist/lib/components/YkRangeDateWithVS/index.module.less +4 -23
  26. package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +18 -1
  27. package/dist/lib/components/YkRangeTimeWithRecent/index.js +7 -27
  28. package/dist/lib/components/YkRangeTimeWithRecent/index.js.map +2 -2
  29. package/dist/lib/index.less +1 -1
  30. package/dist/lib/layout/YkDrawer/index.js +1 -2
  31. package/dist/lib/layout/YkDrawer/index.js.map +2 -2
  32. package/dist/lib/utils/ykStorybookDoc.js +1 -1
  33. package/dist/lib/utils/ykStorybookDoc.js.map +1 -1
  34. 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 { ClockCircleOutlined } from "@ant-design/icons";
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, "data-yk-range-time-with-recent-content": true }, !timeTypes && noTimeFilter ? null : /* @__PURE__ */ React.createElement("div", { className: styles.header }, timeTypes && timeTypes.length > 0 && /* @__PURE__ */ React.createElement(
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, ref: triggerWrapRef }, 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(
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
  }
@@ -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(CloseOutlined, null)
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 { CloseOutlined } from '@ant-design/icons';\nimport { 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 <CloseOutlined />\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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",
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-ui/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka-ui/ui/dist/index.less`(以 README 为准)。";
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-ui/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka-ui/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"],
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(import_icons.CloseOutlined, null)),
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 { CloseOutlined, 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 <CloseOutlined />\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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",
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
  }