@yoka-ui/ui 1.0.2 → 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/YkDateRangePicker/YkDateRangePicker.mdx +14 -0
- package/dist/es/components/YkDateRangePicker/index.d.ts +4 -0
- package/dist/es/components/YkDateRangePicker/index.js +13 -3
- package/dist/es/components/YkDateRangePicker/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/YkDateRangePicker/YkDateRangePicker.mdx +14 -0
- package/dist/lib/components/YkDateRangePicker/index.d.ts +4 -0
- package/dist/lib/components/YkDateRangePicker/index.js +13 -3
- package/dist/lib/components/YkDateRangePicker/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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/YkDateRangePicker/index.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * YkDateRangePicker\n *\n * 带「紧凑预设 tag」与「完整 RangePicker」双模式切换的日期范围选择器。\n *\n * 功能特性:\n * - 默认紧凑模式:以 tag 形式展示「预设标签 + 格式化时间」或「起止时间」\n * - mount 时若无初始值,自动选中「近5分钟」预设\n * - 点击 tag 后展开内嵌的完整 RangePicker,失焦后自动收起\n * - 8 个内置快捷预设,2 列 Grid 布局渲染,当前激活项高亮\n * - 受控组件:区分「用户操作」与「外部赋值」,仅用户操作触发 onChange\n * - 禁用日期:仅允许过去 7 天(含今天)\n * - allowClear:支持一键清除,清除后重置预设状态\n * - 通过 forwardRef + useImperativeHandle 对外暴露 toggleFirstPreset()\n *\n * @example\n * ```tsx\n * const pickerRef = useRef<YkDateRangePickerRef>(null);\n *\n * <YkDateRangePicker\n * value={range}\n * onChange={(val) => setRange(val)}\n * ref={pickerRef}\n * />\n *\n * // 外部强制切换到「近5分钟」\n * pickerRef.current?.toggleFirstPreset();\n * ```\n */\n\nimport { DatePicker } from 'antd';\nimport classNames from 'classnames';\nimport dayjs, { Dayjs } from 'dayjs';\nimport React, {\n type ComponentRef,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styles from './index.module.less';\nconst { RangePicker } = DatePicker;\n\n// ─── 类型 ─────────────────────────────────────────────────────────────────────\n\n/** 时间范围值 */\nexport type DateRangeValue = [Dayjs, Dayjs];\n\n/**\n * 预设项定义\n * - value() 每次调用都返回最新时间,避免闭包缓存旧值\n * - format() 可选,控制紧凑 tag 中的格式化展示文本\n */\ninterface RangePreset {\n label: string;\n /** 工厂函数,返回实时时间范围 */\n value: () => DateRangeValue;\n /** 自定义紧凑模式格式化:返回单个字符串或 [start, end] 数组 */\n format?: (value: DateRangeValue) => string | [string, string];\n}\n\nexport interface YkDateRangePickerProps {\n /** 受控值 */\n value?: DateRangeValue | [];\n /** 用户操作改变时触发(外部 setValue 不会触发) */\n onChange?: (value: DateRangeValue | null) => void;\n /**\n * 是否允许清除。\n * - false(默认):隐藏清除按钮,与 Vue 原版行为一致\n * - true:显示清除按钮,清除后重置预设状态并触发 onChange(null)\n */\n allowClear?: boolean;\n /**\n * 紧凑 tag 无值/清空时的占位文本。\n * 默认:「请选择时间范围」\n */\n placeholder?: string;\n /** 是否禁用选择器 */\n disabled?: boolean;\n /** 校验状态 */\n status?: '' | 'error' | 'warning';\n}\n\n/** 通过 ref 对父组件暴露的方法 */\nexport interface YkDateRangePickerRef {\n /** 强制切换到第一个预设(近5分钟)并触发 onChange */\n toggleFirstPreset: () => void;\n}\n\n// ─── 工具函数 ─────────────────────────────────────────────────────────────────\n\n/** 精确到分钟的过去时间区间 */\nfunction pastTime(n: number, unit: dayjs.ManipulateType): DateRangeValue {\n const fmt = 'YYYY-MM-DD HH:mm:00';\n return [dayjs(dayjs().subtract(n, unit).format(fmt)), dayjs(dayjs().format(fmt))];\n}\n\nconst DISPLAY_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\n/** 格式化 Dayjs 为紧凑模式展示字符串 / 预设匹配字符串 */\nfunction formatToKey(d: Dayjs): string {\n return dayjs(d).format(DISPLAY_FORMAT);\n}\n\n/** 深度比较两个 value 是否「语义相同」(忽略 Dayjs 引用差异) */\nfunction isValueEqual(a: DateRangeValue | [] | undefined, b: DateRangeValue | [] | undefined): boolean {\n if (a === b) return true;\n if (!a || !b) return a === b;\n if (a.length !== b.length) return false;\n if (a.length < 2 || b.length < 2) return a.length === b.length;\n return (\n formatToKey(a[0] as Dayjs) === formatToKey(b[0] as Dayjs) &&\n formatToKey(a[1] as Dayjs) === formatToKey(b[1] as Dayjs)\n );\n}\n\n// ─── 内置预设列表 ─────────────────────────────────────────────────────────────\n\n/**\n * 8 个内置快捷预设。\n * value 始终是工厂函数,保证每次点击都获取最新的当前时间。\n */\nconst RANGE_PRESETS: RangePreset[] = [\n {\n label: '近5分钟',\n value: () => pastTime(5, 'minute'),\n },\n {\n label: '近15分钟',\n value: () => pastTime(15, 'minute'),\n },\n {\n label: '近30分钟',\n value: () => pastTime(30, 'minute'),\n },\n {\n label: '近1小时',\n value: () => pastTime(1, 'hour'),\n },\n {\n label: '近2小时',\n value: () => pastTime(2, 'hour'),\n },\n {\n label: '近6小时',\n value: () => pastTime(6, 'hour'),\n },\n {\n label: '今天',\n value: () =>\n [\n dayjs(dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss')),\n dayjs(dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')),\n ] as DateRangeValue,\n // 紧凑模式只展示日期,如「03-25」\n format: (v) => v[0].format('MM-DD'),\n },\n {\n label: '昨天',\n value: () =>\n [\n dayjs(dayjs().subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')),\n dayjs(dayjs().subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')),\n ] as DateRangeValue,\n format: (v) => v[0].format('MM-DD'),\n },\n {\n label: '近7天',\n value: () =>\n [\n dayjs(dayjs().subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')),\n dayjs(dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')),\n ] as DateRangeValue,\n // 紧凑模式展示完整日期区间,如「2024-03-19 ~ 2024-03-25」\n format: (v) => [v[0].format('YYYY-MM-DD'), v[1].format('YYYY-MM-DD')],\n },\n];\n\n// ─── 主组件 ───────────────────────────────────────────────────────────────────\n\nconst YkDateRangePicker = forwardRef<YkDateRangePickerRef, YkDateRangePickerProps>(function YkDateRangePicker(\n { value, onChange, allowClear = false, placeholder = '请选择时间范围', disabled = false, status = '' },\n ref,\n) {\n // ── 内部状态 ───────────────────────────────────────────────────────────────\n\n /** 是否展示完整 RangePicker(false = 紧凑 tag 模式) */\n const [showFullPicker, setShowFullPicker] = useState(false);\n\n /** RangePicker 下拉面板是否展开 */\n const [open, setOpen] = useState(false);\n\n /**\n * 当前激活的预设定义引用。\n * undefined 表示用户手动选了自定义时间范围。\n */\n const [activePreset, setActivePreset] = useState<RangePreset | undefined>(undefined);\n\n /**\n * 紧凑 tag 中预设的格式化文本。\n * 例:「12:00:00 ~ 13:00:00」或「03-25」或「2024-03-19 ~ 2024-03-25」\n */\n const [presetFormatText, setPresetFormatText] = useState<string | undefined>(undefined);\n\n // ── Refs ───────────────────────────────────────────────────────────────────\n\n /**\n * 标记本次 value 变化是否由用户操作触发(非外部赋值)。\n * 用 ref 而非 state,避免触发额外的重渲染。\n * 与 Vue 版 selfChange 逻辑一致。\n */\n const selfChangeRef = useRef(false);\n\n /**\n * 标记当前 RangePicker.onChange 是否由预设点击触发。\n * 用于区分「预设点击」vs「手动选择」,避免手动选择时错误保留预设状态。\n */\n const isPresetClickRef = useRef(false);\n\n /** 管理 setTimeout,防止竞态 */\n const collapseTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n /** 组件根元素,用作 getPopupContainer */\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n /** RangePicker 实例 ref,用于编程式展开面板 */\n const pickerRef = useRef<ComponentRef<typeof RangePicker>>(null);\n\n /** 缓存上一次的 value,用于判断是否是外部变更 */\n const prevValueRef = useRef(value);\n\n /** 延迟收起完整 picker,清除旧定时器避免竞态 */\n const scheduleCollapse = useCallback((delay?: number) => {\n clearTimeout(collapseTimerRef.current);\n collapseTimerRef.current = setTimeout(() => {\n setOpen(false);\n setShowFullPicker(false);\n }, delay ?? 0);\n }, []);\n\n /** 卸载时清理定时器 */\n useEffect(() => () => clearTimeout(collapseTimerRef.current), []);\n\n // ── 默认值:mount 时无初始 value 则自动选中「近5分钟」 ───────────────────\n\n useEffect(() => {\n // 仅在外部未传有效初始值时执行一次\n if (value && (value as DateRangeValue).length === 2) return;\n\n const first = RANGE_PRESETS[0];\n const currentValue = first.value();\n const formatText = currentValue.map((v) => dayjs(v).format('HH:mm:ss')).join(' ~ ');\n\n setActivePreset(first);\n setPresetFormatText(formatText);\n\n // 标记为用户操作,避免被下方的外部 value 监听 effect 清空预设状态\n selfChangeRef.current = true;\n onChange?.(currentValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── 外部 value 变化同步 ────────────────────────────────────────────────────\n\n useEffect(() => {\n // 跳过初始 mount(value 未真正变化)\n if (isValueEqual(prevValueRef.current, value)) return;\n prevValueRef.current = value;\n\n if (!selfChangeRef.current) {\n // 外部 setField 赋值:清空预设状态(无法得知外部值对应哪个预设)\n setActivePreset(undefined);\n setPresetFormatText(undefined);\n }\n // 消费掉标记,等待下次用户操作重新置位\n selfChangeRef.current = false;\n }, [value]);\n\n // ── 紧凑 tag 展示文本 ──────────────────────────────────────────────────────\n\n /**\n * 紧凑模式下起止时间的字符串表示。\n * 与 Vue showState 计算属性逻辑一致。\n */\n const showState = useMemo<[string, string] | []>(() => {\n if (!value || value.length < 2) return [];\n return [formatToKey(value[0] as Dayjs), formatToKey(value[1] as Dayjs)];\n }, [value]);\n\n // ── 预设激活项检测 ─────────────────────────────────────────────────────────\n\n /**\n * 根据当前 value 匹配激活的预设 index(用于高亮渲染)。\n * 将 value 和预设值都格式化为同一字符串后比对,与 Vue presetsNode computed 一致。\n * 依赖 open,确保面板打开时(时间流逝后)重新计算。\n */\n const activePresetIndex = useMemo<number>(() => {\n if (!value || value.length < 2) return -1;\n const [v0, v1] = value as DateRangeValue;\n const valKeys = [formatToKey(v0), formatToKey(v1)];\n return RANGE_PRESETS.findIndex((preset) => {\n const presetVal = preset.value();\n const presetKeys = [formatToKey(presetVal[0]), formatToKey(presetVal[1])];\n return valKeys[0] === presetKeys[0] && valKeys[1] === presetKeys[1];\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, open]);\n\n // ── 事件处理 ──────────────────────────────────────────────────────────────\n\n /**\n * 点击预设项。\n * 对应 Vue handleTogglePreset。\n */\n const handlePresetClick = useCallback(\n (preset: RangePreset) => {\n isPresetClickRef.current = true;\n\n const currentValue = preset.value();\n\n // 计算紧凑 tag 中的格式化文本\n let formatText: string;\n if (preset.format) {\n const res = preset.format(currentValue);\n formatText = Array.isArray(res) ? res.join(' ~ ') : res;\n } else {\n // 无自定义 format:默认展示时间部分,如「12:00:00 ~ 13:00:00」\n formatText = currentValue.map((v) => dayjs(v).format('HH:mm:ss')).join(' ~ ');\n }\n\n setActivePreset(preset);\n setPresetFormatText(formatText);\n\n // 向父组件通知新值\n selfChangeRef.current = true;\n onChange?.(currentValue);\n\n // 选完预设后收起 picker\n scheduleCollapse();\n },\n [onChange],\n );\n\n /**\n * RangePicker onChange(用户手动选择日期或点击清除后触发)。\n * 对应 Vue handleChange。\n */\n const handlePickerChange = useCallback(\n (dates: [Dayjs | null, Dayjs | null] | null) => {\n // 无论是否预设点击,只要触发 change 都先清空预设状态\n setActivePreset(undefined);\n setPresetFormatText(undefined);\n isPresetClickRef.current = false;\n\n selfChangeRef.current = true;\n\n if (dates?.[0] && dates?.[1]) {\n // 正常选择\n onChange?.(dates as DateRangeValue);\n } else {\n // 点击清除:value 置为 [](空数组),并退回紧凑 tag 模式显示 placeholder\n onChange?.(null);\n scheduleCollapse();\n }\n },\n [onChange],\n );\n\n /**\n * 点击紧凑 tag → 展开完整 RangePicker 并聚焦。\n * 对应 Vue handleClickPresetPicker。\n */\n /** 模拟按钮激活行为,同时支持鼠标点击和键盘回车/空格 */\n const activateCompactTag = useCallback(() => {\n setShowFullPicker(true);\n // 等待 DOM 渲染后再触发 picker 展开\n setTimeout(() => {\n const el = pickerRef.current?.nativeElement;\n if (el) {\n // 触发第一个 input 的点击,使 antd RangePicker 展开面板\n const input = el.querySelector<HTMLInputElement>('input');\n input?.click();\n input?.focus();\n }\n }, 0);\n }, []);\n\n /**\n * RangePicker 面板开关回调。\n * 面板关闭时延迟退回紧凑模式(避免与选择操作冲突)。\n */\n const handleOpenChange = useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen);\n if (!isOpen) {\n scheduleCollapse(150);\n }\n },\n [scheduleCollapse],\n );\n\n /**\n * 禁用日期规则:只允许过去 7 天(含今天)。\n * 对应 Vue disabledDate。\n */\n const disabledDate = useCallback((current: Dayjs) => {\n return current && (current > dayjs().endOf('day') || current < dayjs().subtract(6, 'day').startOf('day'));\n }, []);\n\n /**\n * Popup 挂载容器:挂在组件自身 wrapper 内,避免全局定位错乱。\n * 对应 Vue getPopupContainer。\n */\n const getPopupContainer = useCallback((): HTMLElement => {\n return wrapperRef.current ?? document.body;\n }, []);\n\n // ── antd presets 节点 ──────────────────────────────────────────────────────\n\n /**\n * 构建传入 RangePicker 的 presets prop。\n * - label 为自定义 ReactNode,实现点击处理与高亮样式\n * - value 传实时值供 antd 内部使用(如 disabledDate 校验)\n * antd 5.x presets 格式:{ label: ReactNode; value: [Dayjs, Dayjs] }[]\n */\n const presetsNode = useMemo(() => {\n return RANGE_PRESETS.map((preset, index) => {\n const isActive = activePresetIndex === index;\n return {\n label: (\n <div\n className={classNames(styles.yokaPresetItem, {\n [styles.yokaPresetItemActive]: isActive,\n })}\n role=\"option\"\n tabIndex={0}\n aria-selected={isActive}\n onClick={(e) => {\n e.stopPropagation();\n handlePresetClick(preset);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n handlePresetClick(preset);\n }\n }}\n >\n {preset.label}\n </div>\n ),\n value: preset.value() as [Dayjs, Dayjs],\n };\n });\n }, [activePresetIndex, handlePresetClick]);\n\n // ── 对外暴露方法 ───────────────────────────────────────────────────────────\n\n /**\n * 通过 ref 暴露 toggleFirstPreset(),供父组件调用。\n * 对应 Vue defineExpose({ toggleFirstPreset })。\n */\n useImperativeHandle(\n ref,\n () => ({\n toggleFirstPreset() {\n handlePresetClick(RANGE_PRESETS[0]);\n },\n }),\n [handlePresetClick],\n );\n\n // ── 渲染 ──────────────────────────────────────────────────────────────────\n\n // 完整 picker 的可见性:展开状态 或 下拉面板打开时均显示\n const pickerVisible = showFullPicker || open;\n\n return (\n <div\n className={classNames(styles.YkDateRangePicker, {\n [styles.yokaDisabled]: disabled,\n })}\n ref={wrapperRef}\n >\n {/* ── 紧凑 Tag 模式 ── */}\n {!showFullPicker && (\n <span\n className={styles.yokaCompactTag}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-disabled={disabled}\n onClick={disabled ? undefined : activateCompactTag}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n activateCompactTag();\n }\n }}\n >\n {/* 图标:绝对定位固定在左侧 */}\n <i className={classNames('iconfont icon-riqi1', styles.yokaCompactTagIcon)} />\n {/* 内容区:flex:1 + justify-content:center 实现视觉居中 */}\n <span className={styles.yokaCompactTagContent}>\n {activePreset ? (\n // 已选预设:「预设名称 (格式化时间)」\n <>\n <span className={styles.yokaCompactTagPresetLabel}>{activePreset.label}</span>\n <span className={styles.yokaCompactTagPresetFormat}>({presetFormatText})</span>\n </>\n ) : showState.length === 2 ? (\n // 自定义时间:「起始时间 ~ 结束时间」\n <>\n <span className={styles.yokaCompactTagDatetime}>{showState[0]}</span>\n <span className={styles.yokaCompactTagSeparator}>~</span>\n <span className={styles.yokaCompactTagDatetime}>{showState[1]}</span>\n </>\n ) : (\n // 无值/清空:placeholder 居中显示\n <span className={styles.yokaCompactTagPlaceholder}>{placeholder}</span>\n )}\n </span>\n </span>\n )}\n\n {/* ── 完整 RangePicker(display 切换以保持 DOM 挂载,避免 focus 闪烁) ── */}\n <div className={styles.yokaPickerWrapper} style={{ display: pickerVisible ? 'flex' : 'none' }}>\n <i className={classNames('iconfont icon-riqi1', styles.yokaPickerWrapperIcon)} />\n <RangePicker\n ref={pickerRef}\n // 值与回调\n value={value && value.length === 2 ? (value as [Dayjs, Dayjs]) : undefined}\n onChange={handlePickerChange}\n open={open}\n onOpenChange={handleOpenChange}\n // 外观\n variant=\"borderless\"\n allowClear={allowClear}\n disabled={disabled}\n status={status || undefined}\n suffixIcon={null}\n // 时间选择(支持秒)\n showTime={{\n format: 'HH:mm:ss',\n hideDisabledOptions: true,\n defaultValue: [dayjs('00:00', 'HH:mm'), dayjs('23:59', 'HH:mm')],\n }}\n format=\"YYYY-MM-DD HH:mm:ss\"\n // 禁用日期\n disabledDate={disabledDate}\n // 预设(自定义渲染)\n presets={presetsNode}\n // Popup 容器\n getPopupContainer={getPopupContainer}\n classNames={{ popup: { root: 'yoka-daterangepicker-popup' } }}\n />\n </div>\n </div>\n );\n});\n\nYkDateRangePicker.displayName = 'YkDateRangePicker';\n\nexport default YkDateRangePicker;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BA,kBAA2B;AAC3B,wBAAuB;AACvB,mBAA6B;AAC7B,mBASO;AACP,0BAAmB;AACnB,IAAM,EAAE,YAAY,IAAI;
|
|
4
|
+
"sourcesContent": ["/**\n * YkDateRangePicker\n *\n * 带「紧凑预设 tag」与「完整 RangePicker」双模式切换的日期范围选择器。\n *\n * 功能特性:\n * - 默认紧凑模式:以 tag 形式展示「预设标签 + 格式化时间」或「起止时间」\n * - mount 时若无初始值,自动选中「近5分钟」预设\n * - 点击 tag 后展开内嵌的完整 RangePicker,失焦后自动收起\n * - 8 个内置快捷预设,2 列 Grid 布局渲染,当前激活项高亮\n * - 受控组件:区分「用户操作」与「外部赋值」,仅用户操作触发 onChange\n * - 禁用日期:仅允许过去 7 天(含今天)\n * - allowClear:支持一键清除,清除后重置预设状态\n * - 通过 forwardRef + useImperativeHandle 对外暴露 toggleFirstPreset()\n *\n * @example\n * ```tsx\n * const pickerRef = useRef<YkDateRangePickerRef>(null);\n *\n * <YkDateRangePicker\n * value={range}\n * onChange={(val) => setRange(val)}\n * ref={pickerRef}\n * />\n *\n * // 外部强制切换到「近5分钟」\n * pickerRef.current?.toggleFirstPreset();\n * ```\n */\n\nimport { DatePicker } from 'antd';\nimport classNames from 'classnames';\nimport dayjs, { Dayjs } from 'dayjs';\nimport React, {\n type ComponentRef,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport styles from './index.module.less';\nconst { RangePicker } = DatePicker;\n\n// ─── 类型 ─────────────────────────────────────────────────────────────────────\n\n/** 时间范围值 */\nexport type DateRangeValue = [Dayjs, Dayjs];\n\n/**\n * 预设项定义\n * - value() 每次调用都返回最新时间,避免闭包缓存旧值\n * - format() 可选,控制紧凑 tag 中的格式化展示文本\n */\ninterface RangePreset {\n label: string;\n /** 工厂函数,返回实时时间范围 */\n value: () => DateRangeValue;\n /** 自定义紧凑模式格式化:返回单个字符串或 [start, end] 数组 */\n format?: (value: DateRangeValue) => string | [string, string];\n}\n\nexport interface YkDateRangePickerProps {\n /** 受控值 */\n value?: DateRangeValue | [];\n /** 用户操作改变时触发(外部 setValue 不会触发) */\n onChange?: (value: DateRangeValue | null) => void;\n /**\n * 是否允许清除。\n * - false(默认):隐藏清除按钮,与 Vue 原版行为一致\n * - true:显示清除按钮,清除后重置预设状态并触发 onChange(null)\n */\n allowClear?: boolean;\n /**\n * 紧凑 tag 无值/清空时的占位文本。\n * 默认:「请选择时间范围」\n */\n placeholder?: string;\n /** 是否禁用选择器 */\n disabled?: boolean;\n /** 校验状态 */\n status?: '' | 'error' | 'warning';\n /** 自定义类名 */\n className?: string;\n /** 自定义内联样式 */\n style?: React.CSSProperties;\n}\n\n/** 通过 ref 对父组件暴露的方法 */\nexport interface YkDateRangePickerRef {\n /** 强制切换到第一个预设(近5分钟)并触发 onChange */\n toggleFirstPreset: () => void;\n}\n\n// ─── 工具函数 ─────────────────────────────────────────────────────────────────\n\n/** 精确到分钟的过去时间区间 */\nfunction pastTime(n: number, unit: dayjs.ManipulateType): DateRangeValue {\n const fmt = 'YYYY-MM-DD HH:mm:ss';\n return [dayjs(dayjs().subtract(n, unit).format(fmt)), dayjs(dayjs().format(fmt))];\n}\n\nconst DISPLAY_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\n/** 格式化 Dayjs 为紧凑模式展示字符串 / 预设匹配字符串 */\nfunction formatToKey(d: Dayjs): string {\n return dayjs(d).format(DISPLAY_FORMAT);\n}\n\n/** 深度比较两个 value 是否「语义相同」(忽略 Dayjs 引用差异) */\nfunction isValueEqual(a: DateRangeValue | [] | undefined, b: DateRangeValue | [] | undefined): boolean {\n if (a === b) return true;\n if (!a || !b) return a === b;\n if (a.length !== b.length) return false;\n if (a.length < 2 || b.length < 2) return a.length === b.length;\n return (\n formatToKey(a[0] as Dayjs) === formatToKey(b[0] as Dayjs) &&\n formatToKey(a[1] as Dayjs) === formatToKey(b[1] as Dayjs)\n );\n}\n\n// ─── 内置预设列表 ─────────────────────────────────────────────────────────────\n\n/**\n * 8 个内置快捷预设。\n * value 始终是工厂函数,保证每次点击都获取最新的当前时间。\n */\nconst RANGE_PRESETS: RangePreset[] = [\n {\n label: '近5分钟',\n value: () => pastTime(5, 'minute'),\n },\n {\n label: '近15分钟',\n value: () => pastTime(15, 'minute'),\n },\n {\n label: '近30分钟',\n value: () => pastTime(30, 'minute'),\n },\n {\n label: '近1小时',\n value: () => pastTime(1, 'hour'),\n },\n {\n label: '近2小时',\n value: () => pastTime(2, 'hour'),\n },\n {\n label: '近6小时',\n value: () => pastTime(6, 'hour'),\n },\n {\n label: '今天',\n value: () =>\n [\n dayjs(dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss')),\n dayjs(dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')),\n ] as DateRangeValue,\n // 紧凑模式只展示日期,如「03-25」\n format: (v) => v[0].format('MM-DD'),\n },\n {\n label: '昨天',\n value: () =>\n [\n dayjs(dayjs().subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')),\n dayjs(dayjs().subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')),\n ] as DateRangeValue,\n format: (v) => v[0].format('MM-DD'),\n },\n {\n label: '近7天',\n value: () =>\n [\n dayjs(dayjs().subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')),\n dayjs(dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')),\n ] as DateRangeValue,\n // 紧凑模式展示完整日期区间,如「2024-03-19 ~ 2024-03-25」\n format: (v) => [v[0].format('YYYY-MM-DD'), v[1].format('YYYY-MM-DD')],\n },\n];\n\n// ─── 主组件 ───────────────────────────────────────────────────────────────────\n\nconst YkDateRangePicker = forwardRef<YkDateRangePickerRef, YkDateRangePickerProps>(function YkDateRangePicker(\n {\n value,\n onChange,\n allowClear = false,\n placeholder = '请选择时间范围',\n disabled = false,\n status = '',\n className,\n style,\n },\n ref,\n) {\n // ── 内部状态 ───────────────────────────────────────────────────────────────\n\n /** 是否展示完整 RangePicker(false = 紧凑 tag 模式) */\n const [showFullPicker, setShowFullPicker] = useState(false);\n\n /** RangePicker 下拉面板是否展开 */\n const [open, setOpen] = useState(false);\n\n /**\n * 当前激活的预设定义引用。\n * undefined 表示用户手动选了自定义时间范围。\n */\n const [activePreset, setActivePreset] = useState<RangePreset | undefined>(undefined);\n\n /**\n * 紧凑 tag 中预设的格式化文本。\n * 例:「12:00:00 ~ 13:00:00」或「03-25」或「2024-03-19 ~ 2024-03-25」\n */\n const [presetFormatText, setPresetFormatText] = useState<string | undefined>(undefined);\n\n // ── Refs ───────────────────────────────────────────────────────────────────\n\n /**\n * 标记本次 value 变化是否由用户操作触发(非外部赋值)。\n * 用 ref 而非 state,避免触发额外的重渲染。\n * 与 Vue 版 selfChange 逻辑一致。\n */\n const selfChangeRef = useRef(false);\n\n /**\n * 标记当前 RangePicker.onChange 是否由预设点击触发。\n * 用于区分「预设点击」vs「手动选择」,避免手动选择时错误保留预设状态。\n */\n const isPresetClickRef = useRef(false);\n\n /** 管理 setTimeout,防止竞态 */\n const collapseTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n /** 组件根元素,用作 getPopupContainer */\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n /** RangePicker 实例 ref,用于编程式展开面板 */\n const pickerRef = useRef<ComponentRef<typeof RangePicker>>(null);\n\n /** 缓存上一次的 value,用于判断是否是外部变更 */\n const prevValueRef = useRef(value);\n\n /** 延迟收起完整 picker,清除旧定时器避免竞态 */\n const scheduleCollapse = useCallback((delay?: number) => {\n clearTimeout(collapseTimerRef.current);\n collapseTimerRef.current = setTimeout(() => {\n setOpen(false);\n setShowFullPicker(false);\n }, delay ?? 0);\n }, []);\n\n /** 卸载时清理定时器 */\n useEffect(() => () => clearTimeout(collapseTimerRef.current), []);\n\n // ── 默认值:mount 时无初始 value 则自动选中「近5分钟」 ───────────────────\n\n useEffect(() => {\n // 仅在外部未传有效初始值时执行一次\n if (value && (value as DateRangeValue).length === 2) return;\n\n const first = RANGE_PRESETS[0];\n const currentValue = first.value();\n const formatText = currentValue.map((v) => dayjs(v).format('HH:mm:ss')).join(' ~ ');\n\n setActivePreset(first);\n setPresetFormatText(formatText);\n\n // 标记为用户操作,避免被下方的外部 value 监听 effect 清空预设状态\n selfChangeRef.current = true;\n onChange?.(currentValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── 外部 value 变化同步 ────────────────────────────────────────────────────\n\n useEffect(() => {\n // 跳过初始 mount(value 未真正变化)\n if (isValueEqual(prevValueRef.current, value)) return;\n prevValueRef.current = value;\n\n if (!selfChangeRef.current) {\n // 外部 setField 赋值:清空预设状态(无法得知外部值对应哪个预设)\n setActivePreset(undefined);\n setPresetFormatText(undefined);\n }\n // 消费掉标记,等待下次用户操作重新置位\n selfChangeRef.current = false;\n }, [value]);\n\n // ── 紧凑 tag 展示文本 ──────────────────────────────────────────────────────\n\n /**\n * 紧凑模式下起止时间的字符串表示。\n * 与 Vue showState 计算属性逻辑一致。\n */\n const showState = useMemo<[string, string] | []>(() => {\n if (!value || value.length < 2) return [];\n return [formatToKey(value[0] as Dayjs), formatToKey(value[1] as Dayjs)];\n }, [value]);\n\n // ── 预设激活项检测 ─────────────────────────────────────────────────────────\n\n /**\n * 根据当前 value 匹配激活的预设 index(用于高亮渲染)。\n * 将 value 和预设值都格式化为同一字符串后比对,与 Vue presetsNode computed 一致。\n * 依赖 open,确保面板打开时(时间流逝后)重新计算。\n */\n const activePresetIndex = useMemo<number>(() => {\n if (!value || value.length < 2) return -1;\n const [v0, v1] = value as DateRangeValue;\n const valKeys = [formatToKey(v0), formatToKey(v1)];\n return RANGE_PRESETS.findIndex((preset) => {\n const presetVal = preset.value();\n const presetKeys = [formatToKey(presetVal[0]), formatToKey(presetVal[1])];\n return valKeys[0] === presetKeys[0] && valKeys[1] === presetKeys[1];\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, open]);\n\n // ── 事件处理 ──────────────────────────────────────────────────────────────\n\n /**\n * 点击预设项。\n * 对应 Vue handleTogglePreset。\n */\n const handlePresetClick = useCallback(\n (preset: RangePreset) => {\n isPresetClickRef.current = true;\n\n const currentValue = preset.value();\n\n // 计算紧凑 tag 中的格式化文本\n let formatText: string;\n if (preset.format) {\n const res = preset.format(currentValue);\n formatText = Array.isArray(res) ? res.join(' ~ ') : res;\n } else {\n // 无自定义 format:默认展示时间部分,如「12:00:00 ~ 13:00:00」\n formatText = currentValue.map((v) => dayjs(v).format('HH:mm:ss')).join(' ~ ');\n }\n\n setActivePreset(preset);\n setPresetFormatText(formatText);\n\n // 向父组件通知新值\n selfChangeRef.current = true;\n onChange?.(currentValue);\n\n // 选完预设后收起 picker\n scheduleCollapse();\n },\n [onChange],\n );\n\n /**\n * RangePicker onChange(用户手动选择日期或点击清除后触发)。\n * 对应 Vue handleChange。\n */\n const handlePickerChange = useCallback(\n (dates: [Dayjs | null, Dayjs | null] | null) => {\n // 无论是否预设点击,只要触发 change 都先清空预设状态\n setActivePreset(undefined);\n setPresetFormatText(undefined);\n isPresetClickRef.current = false;\n\n selfChangeRef.current = true;\n\n if (dates?.[0] && dates?.[1]) {\n // 正常选择\n onChange?.(dates as DateRangeValue);\n } else {\n // 点击清除:value 置为 [](空数组),并退回紧凑 tag 模式显示 placeholder\n onChange?.(null);\n scheduleCollapse();\n }\n },\n [onChange],\n );\n\n /**\n * 点击紧凑 tag → 展开完整 RangePicker 并聚焦。\n * 对应 Vue handleClickPresetPicker。\n */\n /** 模拟按钮激活行为,同时支持鼠标点击和键盘回车/空格 */\n const activateCompactTag = useCallback(() => {\n setShowFullPicker(true);\n // 等待 DOM 渲染后再触发 picker 展开\n setTimeout(() => {\n const el = pickerRef.current?.nativeElement;\n if (el) {\n // 触发第一个 input 的点击,使 antd RangePicker 展开面板\n const input = el.querySelector<HTMLInputElement>('input');\n input?.click();\n input?.focus();\n }\n }, 0);\n }, []);\n\n /**\n * RangePicker 面板开关回调。\n * 面板关闭时延迟退回紧凑模式(避免与选择操作冲突)。\n */\n const handleOpenChange = useCallback(\n (isOpen: boolean) => {\n setOpen(isOpen);\n if (!isOpen) {\n scheduleCollapse(150);\n }\n },\n [scheduleCollapse],\n );\n\n /**\n * 禁用日期规则:只允许过去 7 天(含今天)。\n * 对应 Vue disabledDate。\n */\n const disabledDate = useCallback((current: Dayjs) => {\n return current && (current > dayjs().endOf('day') || current < dayjs().subtract(6, 'day').startOf('day'));\n }, []);\n\n /**\n * Popup 挂载容器:挂在组件自身 wrapper 内,避免全局定位错乱。\n * 对应 Vue getPopupContainer。\n */\n const getPopupContainer = useCallback((): HTMLElement => {\n return wrapperRef.current ?? document.body;\n }, []);\n\n // ── antd presets 节点 ──────────────────────────────────────────────────────\n\n /**\n * 构建传入 RangePicker 的 presets prop。\n * - label 为自定义 ReactNode,实现点击处理与高亮样式\n * - value 传实时值供 antd 内部使用(如 disabledDate 校验)\n * antd 5.x presets 格式:{ label: ReactNode; value: [Dayjs, Dayjs] }[]\n */\n const presetsNode = useMemo(() => {\n return RANGE_PRESETS.map((preset, index) => {\n const isActive = activePresetIndex === index;\n return {\n label: (\n <div\n className={classNames(styles.yokaPresetItem, {\n [styles.yokaPresetItemActive]: isActive,\n })}\n role=\"option\"\n tabIndex={0}\n aria-selected={isActive}\n onClick={(e) => {\n e.stopPropagation();\n handlePresetClick(preset);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n handlePresetClick(preset);\n }\n }}\n >\n {preset.label}\n </div>\n ),\n value: preset.value() as [Dayjs, Dayjs],\n };\n });\n }, [activePresetIndex, handlePresetClick]);\n\n // ── 对外暴露方法 ───────────────────────────────────────────────────────────\n\n /**\n * 通过 ref 暴露 toggleFirstPreset(),供父组件调用。\n * 对应 Vue defineExpose({ toggleFirstPreset })。\n */\n useImperativeHandle(\n ref,\n () => ({\n toggleFirstPreset() {\n handlePresetClick(RANGE_PRESETS[0]);\n },\n }),\n [handlePresetClick],\n );\n\n // ── 渲染 ──────────────────────────────────────────────────────────────────\n\n // 完整 picker 的可见性:展开状态 或 下拉面板打开时均显示\n const pickerVisible = showFullPicker || open;\n\n return (\n <div\n className={classNames(styles.YkDateRangePicker, className, {\n [styles.yokaDisabled]: disabled,\n })}\n style={style}\n ref={wrapperRef}\n >\n {/* ── 紧凑 Tag 模式 ── */}\n {!showFullPicker && (\n <span\n className={styles.yokaCompactTag}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-disabled={disabled}\n onClick={disabled ? undefined : activateCompactTag}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n activateCompactTag();\n }\n }}\n >\n {/* 图标:绝对定位固定在左侧 */}\n <i className={classNames('iconfont icon-riqi1', styles.yokaCompactTagIcon)} />\n {/* 内容区:flex:1 + justify-content:center 实现视觉居中 */}\n <span className={styles.yokaCompactTagContent}>\n {activePreset ? (\n // 已选预设:「预设名称 (格式化时间)」\n <>\n <span className={styles.yokaCompactTagPresetLabel}>{activePreset.label}</span>\n <span className={styles.yokaCompactTagPresetFormat}>({presetFormatText})</span>\n </>\n ) : showState.length === 2 ? (\n // 自定义时间:「起始时间 ~ 结束时间」\n <>\n <span className={styles.yokaCompactTagDatetime}>{showState[0]}</span>\n <span className={styles.yokaCompactTagSeparator}>~</span>\n <span className={styles.yokaCompactTagDatetime}>{showState[1]}</span>\n </>\n ) : (\n // 无值/清空:placeholder 居中显示\n <span className={styles.yokaCompactTagPlaceholder}>{placeholder}</span>\n )}\n </span>\n </span>\n )}\n\n {/* ── 完整 RangePicker(display 切换以保持 DOM 挂载,避免 focus 闪烁) ── */}\n <div className={styles.yokaPickerWrapper} style={{ display: pickerVisible ? 'flex' : 'none' }}>\n <i className={classNames('iconfont icon-riqi1', styles.yokaPickerWrapperIcon)} />\n <RangePicker\n ref={pickerRef}\n // 值与回调\n value={value && value.length === 2 ? (value as [Dayjs, Dayjs]) : undefined}\n onChange={handlePickerChange}\n open={open}\n onOpenChange={handleOpenChange}\n // 外观\n variant=\"borderless\"\n allowClear={allowClear}\n disabled={disabled}\n status={status || undefined}\n suffixIcon={null}\n // 时间选择(支持秒)\n showTime={{\n format: 'HH:mm:ss',\n hideDisabledOptions: true,\n defaultValue: [dayjs('00:00', 'HH:mm'), dayjs('23:59', 'HH:mm')],\n }}\n format=\"YYYY-MM-DD HH:mm:ss\"\n // 禁用日期\n disabledDate={disabledDate}\n // 预设(自定义渲染)\n presets={presetsNode}\n // Popup 容器\n getPopupContainer={getPopupContainer}\n classNames={{ popup: { root: 'yoka-daterangepicker-popup' } }}\n />\n </div>\n </div>\n );\n});\n\nYkDateRangePicker.displayName = 'YkDateRangePicker';\n\nexport default YkDateRangePicker;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["dayjs", "YkDateRangePicker", "React", "classNames", "styles"]
|
|
7
7
|
}
|
|
@@ -221,7 +221,6 @@ var YkRangeDateWithVSRange = ({
|
|
|
221
221
|
}) => {
|
|
222
222
|
const { token } = import_antd.theme.useToken();
|
|
223
223
|
const hasCustomRangeDisplay = rangeDisplayLabel != null;
|
|
224
|
-
const triggerWrapRef = (0, import_react.useRef)(null);
|
|
225
224
|
const [groupOpen, setGroupOpen] = (0, import_react.useState)(false);
|
|
226
225
|
const [isChange, setIsChange] = (0, import_react.useState)(false);
|
|
227
226
|
const filterType = milestoneFilterType;
|
|
@@ -263,25 +262,6 @@ var YkRangeDateWithVSRange = ({
|
|
|
263
262
|
(0, import_react.useEffect)(() => {
|
|
264
263
|
initRangeDate();
|
|
265
264
|
}, [rangeDate, timeType]);
|
|
266
|
-
(0, import_react.useEffect)(() => {
|
|
267
|
-
if (!groupOpen)
|
|
268
|
-
return;
|
|
269
|
-
const onPointerDownCapture = (e) => {
|
|
270
|
-
var _a;
|
|
271
|
-
const el = e.target;
|
|
272
|
-
if (!(el instanceof Element))
|
|
273
|
-
return;
|
|
274
|
-
if ((_a = triggerWrapRef.current) == null ? void 0 : _a.contains(el))
|
|
275
|
-
return;
|
|
276
|
-
if (el.closest("[data-yk-range-date-with-vs-panel]"))
|
|
277
|
-
return;
|
|
278
|
-
if (import_styles.default.globalItemDatePanel && el.closest(`.${import_styles.default.globalItemDatePanel}`))
|
|
279
|
-
return;
|
|
280
|
-
setGroupOpen(false);
|
|
281
|
-
};
|
|
282
|
-
window.addEventListener("pointerdown", onPointerDownCapture, true);
|
|
283
|
-
return () => window.removeEventListener("pointerdown", onPointerDownCapture, true);
|
|
284
|
-
}, [groupOpen]);
|
|
285
265
|
const customFormat = (value) => {
|
|
286
266
|
return `${(0, import_dayjs.default)(value).format("YYYY-MM-DD")}`;
|
|
287
267
|
};
|
|
@@ -371,7 +351,7 @@ var YkRangeDateWithVSRange = ({
|
|
|
371
351
|
);
|
|
372
352
|
}));
|
|
373
353
|
const dateGourpRender = (panelNode) => {
|
|
374
|
-
return /* @__PURE__ */ import_react.default.createElement("div",
|
|
354
|
+
return /* @__PURE__ */ import_react.default.createElement("div", null, dateCompare && /* @__PURE__ */ import_react.default.createElement("div", { className: import_styles.default.ykRangeDateWithVsHeader }, /* @__PURE__ */ import_react.default.createElement(
|
|
375
355
|
import_antd.Anchor,
|
|
376
356
|
{
|
|
377
357
|
className: import_styles.default.ykRangeDateWithVsHeaderAnchor,
|
|
@@ -380,7 +360,6 @@ var YkRangeDateWithVSRange = ({
|
|
|
380
360
|
getCurrentAnchor: () => cacheTimeType,
|
|
381
361
|
onClick: (event, link) => {
|
|
382
362
|
event.preventDefault();
|
|
383
|
-
event.stopPropagation();
|
|
384
363
|
setCacheTimeType(link.href);
|
|
385
364
|
const defaultFn = optionsMap[link.href] ? optionsMap[link.href].default : optionsMap["按日"].default;
|
|
386
365
|
setCacheRangeDate(defaultFn());
|
|
@@ -414,7 +393,7 @@ var YkRangeDateWithVSRange = ({
|
|
|
414
393
|
value: v.value
|
|
415
394
|
};
|
|
416
395
|
});
|
|
417
|
-
const resolvePopupContainer = getPopupContainer
|
|
396
|
+
const resolvePopupContainer = getPopupContainer ? getPopupContainer : (triggerNode) => triggerNode.parentNode;
|
|
418
397
|
const dateTags = (milestoneListFilter || []).concat(holidays || []).map((m) => {
|
|
419
398
|
return {
|
|
420
399
|
...m,
|
|
@@ -517,43 +496,13 @@ var YkRangeDateWithVSRange = ({
|
|
|
517
496
|
separator: "~",
|
|
518
497
|
className: import_styles.default.globalItemDate,
|
|
519
498
|
suffixIcon: false,
|
|
520
|
-
onCalendarChange: (dates) => {
|
|
521
|
-
if (!dates)
|
|
522
|
-
return;
|
|
523
|
-
const [v0, v1] = dates;
|
|
524
|
-
setIsChange(true);
|
|
525
|
-
const start = v0 ? v0.startOf(picker) : null;
|
|
526
|
-
let end = null;
|
|
527
|
-
if (v1) {
|
|
528
|
-
const endRaw = v1.endOf(picker);
|
|
529
|
-
end = endRaw > (0, import_dayjs.default)() ? (0, import_dayjs.default)() : endRaw;
|
|
530
|
-
}
|
|
531
|
-
setCacheRangeDate([start, end]);
|
|
532
|
-
},
|
|
533
499
|
onChange: (val) => {
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
timeType: cacheTimeType
|
|
540
|
-
});
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
const [v0, v1] = val;
|
|
544
|
-
if (v0 && !v1) {
|
|
545
|
-
setIsChange(true);
|
|
546
|
-
setCacheRangeDate([v0.startOf(picker), null]);
|
|
547
|
-
return;
|
|
548
|
-
}
|
|
549
|
-
if (!v0 && v1) {
|
|
550
|
-
setIsChange(true);
|
|
551
|
-
const end2 = v1.endOf(picker) > (0, import_dayjs.default)() ? (0, import_dayjs.default)() : v1.endOf(picker);
|
|
552
|
-
setCacheRangeDate([null, end2]);
|
|
553
|
-
return;
|
|
500
|
+
let start = null;
|
|
501
|
+
let end = null;
|
|
502
|
+
if (val && val[0] && val[1]) {
|
|
503
|
+
start = val[0].startOf(picker);
|
|
504
|
+
end = val[1].endOf(picker) > (0, import_dayjs.default)() ? (0, import_dayjs.default)() : val[1].endOf(picker);
|
|
554
505
|
}
|
|
555
|
-
const start = v0.startOf(picker);
|
|
556
|
-
const end = v1.endOf(picker) > (0, import_dayjs.default)() ? (0, import_dayjs.default)() : v1.endOf(picker);
|
|
557
506
|
setIsChange(true);
|
|
558
507
|
setCacheRangeDate([start, end]);
|
|
559
508
|
onChange({
|
|
@@ -566,7 +515,7 @@ var YkRangeDateWithVSRange = ({
|
|
|
566
515
|
}
|
|
567
516
|
}
|
|
568
517
|
);
|
|
569
|
-
return /* @__PURE__ */ import_react.default.createElement("div", {
|
|
518
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_classnames.default)(import_styles.default.globalMl, import_styles.default.globalItem) }, dateCompare && !!options.length && /* @__PURE__ */ import_react.default.createElement("label", { onClick: () => setGroupOpen(true), className: import_styles.default.globalItemDateTerm }, /* @__PURE__ */ import_react.default.createElement("span", { style: { marginRight: "5px", fontSize: 14 } }, timeType), /* @__PURE__ */ import_react.default.createElement("i", { style: { marginRight: "10px" }, className: (0, import_classnames.default)("iconfont icon-xiala1") })), /* @__PURE__ */ import_react.default.createElement("i", { className: itemCheckIconClass("icon-riqi1"), style: { fontSize: 14 } }), /* @__PURE__ */ import_react.default.createElement(
|
|
570
519
|
import_antd.ConfigProvider,
|
|
571
520
|
{
|
|
572
521
|
theme: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/YkRangeDateWithVS/YkRangeDateWithVSRange.tsx"],
|
|
4
|
-
"sourcesContent": ["import type { DatePickerProps, TimeRangePickerProps } from 'antd';\nimport { Anchor, ConfigProvider, DatePicker, Flex, Popover, Tooltip, theme } from 'antd';\nimport classNames from 'classnames';\nimport dayjs, { Dayjs } from 'dayjs';\nimport { findIndex, isEqual } from 'lodash';\nimport React, { useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport styles from './styles';\n\ntype DateValue = Dayjs | null;\ntype RangeValue = [DateValue, DateValue] | null;\ntype dateOptionType = {\n label: string;\n value: () => RangeValue;\n};\n\nexport type YkRangeDateWithVSRangeProps = {\n timeType: string;\n rangeDate: RangeValue;\n timeOptions: string[];\n dateCompare: boolean;\n onChange: (value: { timeType: string; rangeDate: RangeValue }) => void;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n disabledDate?: DatePickerProps['disabledDate'];\n presetsOptions?: { label: string; value: () => [Dayjs, Dayjs] }[];\n /** 1: 运营节点 2: 广告节点 */\n milestoneFilterType?: 1 | 2;\n /** 项目节点列表(日历侧栏与日期标记) */\n milestone?: ProjectNodeItem[];\n /** 节假日(与里程碑一并用于日期 cell 标记) */\n holidays?: ProjectNodeItem[];\n /** 自定义主区间输入框展示文案(string / ReactNode);传入后默认日期格式文案由覆盖层展示,仍通过面板改期 */\n rangeDisplayLabel?: ReactNode;\n};\n\nconst itemCheckIconClass = (className: string) => {\n return classNames('iconfont', className, styles.active);\n};\n\nconst past: (n: number, picker: 'week' | 'day' | 'month' | 'year', today?: boolean) => RangeValue = (\n n,\n picker,\n today = false,\n) => [dayjs().subtract(n, picker).startOf(picker), today ? dayjs() : dayjs().subtract(n, picker).endOf(picker)];\n\nconst dateOptions: dateOptionType[] = [\n { label: '今天', value: () => past(0, 'day', true) },\n { label: '昨天', value: () => past(1, 'day') },\n { label: '本周', value: () => past(0, 'week', true) },\n { label: '上周', value: () => past(1, 'week') },\n { label: '本月', value: () => past(0, 'month', true) },\n { label: '上月', value: () => past(1, 'month') },\n { label: '今年', value: () => past(0, 'year', true) },\n { label: '去年', value: () => past(1, 'year') },\n { label: '近7天', value: () => past(6, 'day', true) },\n { label: '近14天', value: () => past(13, 'day', true) },\n { label: '近30天', value: () => past(29, 'day', true) },\n { label: '近60天', value: () => past(59, 'day', true) },\n { label: '近90天', value: () => past(89, 'day', true) },\n { label: '近180天', value: () => past(179, 'day', true) },\n {\n label: '前7天',\n value: () => [dayjs().subtract(7, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n {\n label: '前14天',\n value: () => [dayjs().subtract(14, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n {\n label: '前30天',\n value: () => [dayjs().subtract(30, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n {\n label: '前60天',\n value: () => [dayjs().subtract(60, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n];\nconst weekOptions: dateOptionType[] = [\n { label: '本周', value: () => past(0, 'week', true) },\n { label: '上周', value: () => past(1, 'week') },\n { label: '近3周', value: () => past(2, 'week', true) },\n { label: '近4周', value: () => past(3, 'week', true) },\n { label: '近5周', value: () => past(4, 'week', true) },\n { label: '近6周', value: () => past(5, 'week', true) },\n { label: '近7周', value: () => past(6, 'week', true) },\n { label: '近14周', value: () => past(13, 'week', true) },\n { label: '近30周', value: () => past(29, 'week', true) },\n { label: '近60周', value: () => past(59, 'week', true) },\n {\n label: '前2周',\n value: () => [dayjs().subtract(2, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n {\n label: '前3周',\n value: () => [dayjs().subtract(3, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n {\n label: '前4周',\n value: () => [dayjs().subtract(4, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n {\n label: '前5周',\n value: () => [dayjs().subtract(5, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n];\nconst monthOptions: dateOptionType[] = [\n { label: '本月', value: () => past(0, 'month', true) },\n { label: '上月', value: () => past(1, 'month') },\n { label: '今年', value: () => past(0, 'year', true) },\n { label: '去年', value: () => past(1, 'year') },\n { label: '近3月', value: () => past(2, 'month', true) },\n { label: '近4月', value: () => past(3, 'month', true) },\n { label: '近5月', value: () => past(4, 'month', true) },\n { label: '近6月', value: () => past(5, 'month', true) },\n { label: '近7月', value: () => past(6, 'month', true) },\n { label: '近8月', value: () => past(7, 'month', true) },\n { label: '近9月', value: () => past(8, 'month', true) },\n { label: '近10月', value: () => past(9, 'month', true) },\n { label: '近11月', value: () => past(10, 'month', true) },\n { label: '近12月', value: () => past(11, 'month', true) },\n {\n label: '前2月',\n value: () => [dayjs().subtract(2, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前3月',\n value: () => [dayjs().subtract(3, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前4月',\n value: () => [dayjs().subtract(4, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前5月',\n value: () => [dayjs().subtract(5, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前6月',\n value: () => [dayjs().subtract(6, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前7月',\n value: () => [dayjs().subtract(7, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前8月',\n value: () => [dayjs().subtract(8, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前9月',\n value: () => [dayjs().subtract(9, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前10月',\n value: () => [dayjs().subtract(10, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前11月',\n value: () => [dayjs().subtract(11, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前12月',\n value: () => [dayjs().subtract(12, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n];\nconst startWeekOption: dateOptionType[] = [\n { label: '近7天', value: () => past(6, 'day', true) },\n { label: '近14天', value: () => past(13, 'day', true) },\n { label: '近21天', value: () => past(20, 'day', true) },\n { label: '近28天', value: () => past(27, 'day', true) },\n { label: '近98天', value: () => past(97, 'day', true) },\n { label: '近210天', value: () => past(209, 'day', true) },\n];\nconst startMonthOption: dateOptionType[] = [\n { label: '近30天', value: () => past(29, 'day', true) },\n { label: '近60天', value: () => past(59, 'day', true) },\n { label: '近90天', value: () => past(89, 'day', true) },\n { label: '近120天', value: () => past(119, 'day', true) },\n { label: '近150天', value: () => past(149, 'day', true) },\n { label: '近180天', value: () => past(179, 'day', true) },\n { label: '近210天', value: () => past(209, 'day', true) },\n { label: '近240天', value: () => past(239, 'day', true) },\n { label: '近270天', value: () => past(269, 'day', true) },\n { label: '近300天', value: () => past(299, 'day', true) },\n { label: '近330天', value: () => past(329, 'day', true) },\n { label: '近360天', value: () => past(359, 'day', true) },\n];\n\nconst pickerMap: {\n [key: string]: 'date' | 'week' | 'month';\n} = {\n 按自然周: 'week',\n 按自然月: 'month',\n 按周: 'week',\n 按月: 'month',\n};\n\nconst optionsMap: {\n [key: string]: {\n options: dateOptionType[];\n default: () => RangeValue;\n };\n} = {\n 按日: { options: dateOptions, default: () => past(14, 'day', true) },\n 按周: { options: weekOptions, default: () => past(13, 'week', true) },\n 按月: { options: monthOptions, default: () => past(11, 'month', true) },\n 按自然周: { options: weekOptions, default: () => past(13, 'week', true) },\n 按自然月: { options: monthOptions, default: () => past(11, 'month', true) },\n 按起始周: {\n options: startWeekOption,\n default: () => past(14 * 7 - 1, 'day', true),\n },\n 按起始月: {\n options: startMonthOption,\n default: () => past(12 * 30 - 1, 'day', true),\n },\n};\n\nconst YkRangeDateWithVSRange: React.FC<YkRangeDateWithVSRangeProps> = ({\n timeType,\n rangeDate,\n timeOptions,\n dateCompare,\n getPopupContainer,\n onChange,\n disabledDate = undefined,\n presetsOptions = undefined,\n milestoneFilterType = 1,\n milestone = [],\n holidays = [],\n rangeDisplayLabel,\n}) => {\n const { token } = theme.useToken();\n const hasCustomRangeDisplay = rangeDisplayLabel != null;\n const triggerWrapRef = useRef<HTMLDivElement>(null);\n const [groupOpen, setGroupOpen] = useState(false);\n // 判断数据是否变更,若未变更,则初始化日期\n const [isChange, setIsChange] = useState(false);\n const filterType = milestoneFilterType;\n const [cacheRangeDate, setCacheRangeDate] = useState<RangeValue>([null, null]);\n const [cacheTimeType, setCacheTimeType] = useState<string>(timeType);\n const [groupIndex, setGroupIndex] = useState<number | null>(null);\n const picker = cacheTimeType && pickerMap[cacheTimeType] ? pickerMap[cacheTimeType] : 'date';\n const options = presetsOptions\n ? presetsOptions\n : optionsMap[cacheTimeType]\n ? optionsMap[cacheTimeType].options\n : optionsMap['按日'].options;\n\n // 周报月报不显示项目节点(但外面选了周月,里面有按日的type,选按日时依旧可以显示项目节点,例如分包详情里的日期组件)\n const showProjectNode = useMemo(() => {\n return (\n (!timeType.includes('周') &&\n !timeType.includes('月') &&\n !cacheTimeType.includes('周') &&\n !cacheTimeType.includes('月')) ||\n cacheTimeType.includes('日')\n );\n }, [timeType, cacheTimeType]);\n\n const timeOptionAnchors =\n timeOptions?.map((v) => {\n return {\n key: v,\n title: v,\n href: v,\n };\n }) || [];\n\n // 初始化日期与日周月\n const initRangeDate = () => {\n setCacheRangeDate(rangeDate);\n setCacheTimeType(timeType);\n setIsChange(false);\n };\n\n useEffect(() => {\n if (groupOpen) {\n setGroupIndex(\n findIndex(options, (item) => {\n return isEqual(\n item.value()?.map((v) => v?.format('YYYY-MM-DD')),\n cacheRangeDate?.map((v) => v?.format('YYYY-MM-DD')),\n );\n }),\n );\n } else if (!isChange) {\n initRangeDate();\n }\n }, [cacheTimeType, groupOpen]);\n\n useEffect(() => {\n initRangeDate();\n }, [rangeDate, timeType]);\n\n /** 切换日/周/月后 rc-picker 嵌套面板偶发无法收到「点击外部」;与 window 捕获阶段兜底关闭对齐 */\n useEffect(() => {\n if (!groupOpen) 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-date-with-vs-panel]')) return;\n if (styles.globalItemDatePanel && el.closest(`.${styles.globalItemDatePanel}`)) return;\n setGroupOpen(false);\n };\n window.addEventListener('pointerdown', onPointerDownCapture, true);\n return () => window.removeEventListener('pointerdown', onPointerDownCapture, true);\n }, [groupOpen]);\n\n const customFormat: DatePickerProps['format'] = (value) => {\n return `${dayjs(value).format('YYYY-MM-DD')}`;\n };\n\n const milestoneSelected = (id: number) => {\n const dates = milestone.find((m) => m.id === id)?.range_day.map((m) => dayjs(m)) || [];\n let [start, end] = dates;\n if (end > dayjs().endOf('day')) end = dayjs().endOf('day');\n setIsChange(true);\n setCacheRangeDate([start, end]);\n onChange({\n rangeDate: [start, end],\n timeType: cacheTimeType,\n });\n setGroupOpen(false);\n };\n\n const checkPresets = (v) => {\n if (\n cacheRangeDate &&\n dayjs(v[0]).format('YYYY-MM-DD') === dayjs(cacheRangeDate[0]).format('YYYY-MM-DD') &&\n dayjs(v[1]).format('YYYY-MM-DD') === dayjs(cacheRangeDate[1]).format('YYYY-MM-DD')\n ) {\n return true;\n } else {\n return false;\n }\n };\n\n // 活动详情内容\n const popoverContent = (event: ProjectNodeItem) => {\n return (\n <div\n style={{\n height: 30,\n lineHeight: '30px',\n textAlign: 'left',\n color: '#666',\n padding: '0 10px 0 10px',\n fontSize: 12,\n }}\n >\n {event.tag +\n ' ' +\n (event.range_day[0] === event.range_day[1] ? event.range_day[0] : event.range_day.join(' ~ '))}\n </div>\n );\n };\n\n const milestoneListFilter = milestone\n .filter((f) => f.type === filterType)\n .filter((f) => dayjs(f.range_day[0]) <= dayjs().endOf('day'))\n .filter((f) => dayjs(f.range_day[0]) >= dayjs().startOf('year').subtract(1, 'year'))\n .sort(\n (a: ProjectNodeItem, b: ProjectNodeItem) => dayjs(b.range_day[0]).valueOf() - dayjs(a.range_day[0]).valueOf(),\n );\n const milestoneList = (\n <div className={styles.milestoneListBox}>\n {milestoneListFilter.map((v) => {\n // Popover 须高于 DatePicker 弹层(约 zIndexPopupBase+50),否则悬停内容被挡在面板下\n return (\n <Popover\n key={v.id}\n trigger=\"hover\"\n placement=\"right\"\n zIndex={token.zIndexPopupBase + 120}\n getPopupContainer={() => document.body}\n styles={{\n root: {\n // width: 200,\n },\n body: {\n borderRadius: 2,\n padding: 0,\n },\n }}\n content={popoverContent(v)}\n >\n <div\n data-track\n id={`milestoneListItem-${v.id}`}\n key={v.id}\n className={classNames(\n styles.milestoneListItem,\n checkPresets(v.range_day.map((m) => dayjs(m))) && styles.milestoneListActive,\n )}\n style={{\n textAlign: 'left',\n padding: '0 10px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n onClick={() => {\n milestoneSelected(v.id as number);\n }}\n >\n {v.tag}\n </div>\n </Popover>\n );\n })}\n </div>\n );\n\n const dateGourpRender = (panelNode: React.ReactNode) => {\n return (\n <div data-yk-range-date-with-vs-panel>\n {dateCompare && (\n <div className={styles.ykRangeDateWithVsHeader}>\n <Anchor\n className={styles.ykRangeDateWithVsHeaderAnchor}\n direction=\"horizontal\"\n items={timeOptionAnchors}\n getCurrentAnchor={() => cacheTimeType}\n onClick={(event, link) => {\n event.preventDefault();\n event.stopPropagation();\n setCacheTimeType(link.href);\n const defaultFn = optionsMap[link.href] ? optionsMap[link.href].default : optionsMap['按日'].default;\n setCacheRangeDate(defaultFn());\n }}\n />\n </div>\n )}\n <Flex>\n {milestoneListFilter && milestoneListFilter.length > 0 && showProjectNode ? (\n <div className={classNames(styles.milestoneList, 'scroll-reset')}>{milestoneList}</div>\n ) : null}\n <div className={styles.ykRangeDateWithVsGroup}>\n <div className={styles.ykRangeDateWithVsPanel}>{panelNode}</div>\n </div>\n </Flex>\n </div>\n );\n };\n\n // 当节点有已选时,不高亮presetsNode\n let hasSelect = false;\n if (milestoneListFilter && milestoneListFilter.length > 0) {\n milestoneListFilter.forEach((item) => {\n if (checkPresets(item.range_day.map((m) => dayjs(m))) && picker === 'date' && showProjectNode) {\n hasSelect = true;\n }\n });\n }\n\n const presetsNode = options.map((v, i) => {\n return {\n label: (\n <div\n className={classNames(\n 'ant-picker-presets-li',\n groupIndex === i && !hasSelect && 'ant-picker-presets-li-item',\n )}\n onClick={() => {\n setGroupIndex(i);\n }}\n >\n {v.label}\n </div>\n ),\n value: v.value,\n };\n }) as TimeRangePickerProps['presets'];\n\n /** 默认挂到 body,避免父级 overflow/transform/弹层导致点击判定异常或面板误关;业务可继续覆盖 */\n const resolvePopupContainer = getPopupContainer ?? (() => document.body);\n\n // 项目节点与节假日\n const dateTags: ProjectNodeItem[] = (milestoneListFilter || []).concat(holidays || []).map((m) => {\n return {\n ...m,\n date: m.range_day[0],\n };\n });\n const dateTagsMap = {};\n dateTags.forEach((m: any) => {\n if (dateTagsMap[m.date]) {\n dateTagsMap[m.date].push(m);\n } else {\n dateTagsMap[m.date] = [m];\n }\n });\n\n const eventsTooltips = (date: Dayjs) => {\n const dateStr = dayjs(date).format('YYYY-MM-DD');\n const tags = dateTagsMap[dateStr] || [];\n // 只展示最新创建的节点\n const lastTag =\n tags.length > 0\n ? tags.reduce((prev: ProjectNodeItem, curr: ProjectNodeItem) =>\n dayjs(prev.created_at).isAfter(dayjs(curr.created_at)) ? prev : curr,\n )\n : null;\n return lastTag ? (\n <Tooltip\n placement=\"right\"\n title={\n lastTag.tag +\n ' ' +\n (lastTag.range_day[0] === lastTag.range_day[1] ? lastTag.range_day[0] : lastTag.range_day.join(' ~ '))\n }\n color=\"#fff\"\n styles={{\n root: {\n maxWidth: 270,\n },\n body: {\n borderRadius: 2,\n color: '#666',\n },\n }}\n >\n <div key={lastTag.id} className={styles.ykRangeDateWithVsTag}>\n {lastTag.tag}\n </div>\n </Tooltip>\n ) : (\n <></>\n );\n };\n\n const cellRender: DatePickerProps<Dayjs>['cellRender'] = (current, info) => {\n if (info.type !== 'date') {\n return info.originNode;\n }\n if (typeof current === 'number' || typeof current === 'string') {\n return <div className=\"ant-picker-cell-inner\">{current}</div>;\n }\n return (\n <div\n className={classNames('ant-picker-cell-inner')}\n style={{ width: 45, height: 40, lineHeight: holidays && holidays.length > 0 ? '26px' : '40px', fontSize: 12 }}\n >\n {current.date()}\n {holidays && holidays.length > 0 && (\n <div\n style={{\n position: 'absolute',\n bottom: 2,\n height: 16,\n width: '100%',\n fontSize: '12px',\n lineHeight: '16px',\n whiteSpace: 'nowrap',\n }}\n >\n {eventsTooltips(current)}\n </div>\n )}\n </div>\n );\n };\n\n const rangePicker = (\n <DatePicker.RangePicker\n id=\"ykRangeDateWithVsRange\"\n classNames={{\n popup: {\n root: styles.globalItemDatePanel,\n },\n }}\n styles={{\n root: {\n opacity: hasCustomRangeDisplay ? 0 : 1,\n },\n }}\n getPopupContainer={resolvePopupContainer}\n disabledDate={\n disabledDate\n ? disabledDate\n : (current) => {\n return current && current > dayjs().endOf('day');\n }\n }\n inputReadOnly={hasCustomRangeDisplay}\n open={groupOpen}\n picker={picker}\n cellRender={cellRender}\n value={cacheRangeDate}\n panelRender={dateGourpRender}\n presets={presetsNode}\n variant=\"borderless\"\n allowClear={false}\n format={customFormat}\n showWeek={false}\n separator=\"~\"\n className={styles.globalItemDate}\n suffixIcon={false}\n onCalendarChange={(dates) => {\n if (!dates) return;\n const [v0, v1] = dates;\n setIsChange(true);\n const start = v0 ? v0.startOf(picker) : null;\n let end: DateValue = null;\n if (v1) {\n const endRaw = v1.endOf(picker);\n end = endRaw > dayjs() ? dayjs() : endRaw;\n }\n setCacheRangeDate([start, end]);\n }}\n onChange={(val) => {\n if (!val || (!val[0] && !val[1])) {\n setIsChange(true);\n setCacheRangeDate([null, null]);\n onChange({\n rangeDate: [null, null],\n timeType: cacheTimeType,\n });\n return;\n }\n const [v0, v1] = val;\n if (v0 && !v1) {\n setIsChange(true);\n setCacheRangeDate([v0.startOf(picker), null]);\n return;\n }\n if (!v0 && v1) {\n setIsChange(true);\n const end = v1.endOf(picker) > dayjs() ? dayjs() : v1.endOf(picker);\n setCacheRangeDate([null, end]);\n return;\n }\n const start = v0.startOf(picker);\n const end = v1.endOf(picker) > dayjs() ? dayjs() : v1.endOf(picker);\n setIsChange(true);\n setCacheRangeDate([start, end]);\n onChange({\n rangeDate: [start, end],\n timeType: cacheTimeType,\n });\n }}\n onOpenChange={(open) => {\n setGroupOpen(open);\n }}\n />\n );\n\n return (\n <div ref={triggerWrapRef} className={classNames(styles.globalMl, styles.globalItem)}>\n {dateCompare && !!options.length && (\n <label onClick={() => setGroupOpen(true)} className={styles.globalItemDateTerm}>\n <span style={{ marginRight: '5px', fontSize: 14 }}>{timeType}</span>\n <i style={{ marginRight: '10px' }} className={classNames('iconfont icon-xiala1')}></i>\n </label>\n )}\n <i className={itemCheckIconClass('icon-riqi1')} style={{ fontSize: 14 }} />\n <ConfigProvider\n theme={{\n components: {\n DatePicker: {\n cellWidth: 60,\n cellHeight: 40,\n timeColumnWidth: 40,\n },\n },\n token: {},\n }}\n >\n {hasCustomRangeDisplay ? (\n <div className={styles.rangePickerCustomDisplay}>\n <span className={styles.rangePickerCustomDisplayLabel}>{rangeDisplayLabel}</span>\n {rangePicker}\n </div>\n ) : (\n rangePicker\n )}\n </ConfigProvider>\n </div>\n );\n};\n\nexport default YkRangeDateWithVSRange;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["classNames", "styles", "dayjs", "React"
|
|
4
|
+
"sourcesContent": ["import type { DatePickerProps, TimeRangePickerProps } from 'antd';\nimport { Anchor, ConfigProvider, DatePicker, Flex, Popover, Tooltip, theme } from 'antd';\nimport classNames from 'classnames';\nimport dayjs, { Dayjs } from 'dayjs';\nimport { findIndex, isEqual } from 'lodash';\nimport React, { useEffect, useMemo, useState, type ReactNode } from 'react';\nimport styles from './styles';\n\ntype DateValue = Dayjs | null;\ntype RangeValue = [DateValue, DateValue] | null;\ntype dateOptionType = {\n label: string;\n value: () => RangeValue;\n};\n\nexport type YkRangeDateWithVSRangeProps = {\n timeType: string;\n rangeDate: RangeValue;\n timeOptions: string[];\n dateCompare: boolean;\n onChange: (value: { timeType: string; rangeDate: RangeValue }) => void;\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n disabledDate?: DatePickerProps['disabledDate'];\n presetsOptions?: { label: string; value: () => [Dayjs, Dayjs] }[];\n /** 1: 运营节点 2: 广告节点 */\n milestoneFilterType?: 1 | 2;\n /** 项目节点列表(日历侧栏与日期标记) */\n milestone?: ProjectNodeItem[];\n /** 节假日(与里程碑一并用于日期 cell 标记) */\n holidays?: ProjectNodeItem[];\n /** 自定义主区间输入框展示文案(string / ReactNode);传入后默认日期格式文案由覆盖层展示,仍通过面板改期 */\n rangeDisplayLabel?: ReactNode;\n};\n\nconst itemCheckIconClass = (className: string) => {\n return classNames('iconfont', className, styles.active);\n};\n\nconst past: (n: number, picker: 'week' | 'day' | 'month' | 'year', today?: boolean) => RangeValue = (\n n,\n picker,\n today = false,\n) => [dayjs().subtract(n, picker).startOf(picker), today ? dayjs() : dayjs().subtract(n, picker).endOf(picker)];\n\nconst dateOptions: dateOptionType[] = [\n { label: '今天', value: () => past(0, 'day', true) },\n { label: '昨天', value: () => past(1, 'day') },\n { label: '本周', value: () => past(0, 'week', true) },\n { label: '上周', value: () => past(1, 'week') },\n { label: '本月', value: () => past(0, 'month', true) },\n { label: '上月', value: () => past(1, 'month') },\n { label: '今年', value: () => past(0, 'year', true) },\n { label: '去年', value: () => past(1, 'year') },\n { label: '近7天', value: () => past(6, 'day', true) },\n { label: '近14天', value: () => past(13, 'day', true) },\n { label: '近30天', value: () => past(29, 'day', true) },\n { label: '近60天', value: () => past(59, 'day', true) },\n { label: '近90天', value: () => past(89, 'day', true) },\n { label: '近180天', value: () => past(179, 'day', true) },\n {\n label: '前7天',\n value: () => [dayjs().subtract(7, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n {\n label: '前14天',\n value: () => [dayjs().subtract(14, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n {\n label: '前30天',\n value: () => [dayjs().subtract(30, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n {\n label: '前60天',\n value: () => [dayjs().subtract(60, 'day').startOf('day'), dayjs().subtract(1, 'day').endOf('day')],\n },\n];\nconst weekOptions: dateOptionType[] = [\n { label: '本周', value: () => past(0, 'week', true) },\n { label: '上周', value: () => past(1, 'week') },\n { label: '近3周', value: () => past(2, 'week', true) },\n { label: '近4周', value: () => past(3, 'week', true) },\n { label: '近5周', value: () => past(4, 'week', true) },\n { label: '近6周', value: () => past(5, 'week', true) },\n { label: '近7周', value: () => past(6, 'week', true) },\n { label: '近14周', value: () => past(13, 'week', true) },\n { label: '近30周', value: () => past(29, 'week', true) },\n { label: '近60周', value: () => past(59, 'week', true) },\n {\n label: '前2周',\n value: () => [dayjs().subtract(2, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n {\n label: '前3周',\n value: () => [dayjs().subtract(3, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n {\n label: '前4周',\n value: () => [dayjs().subtract(4, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n {\n label: '前5周',\n value: () => [dayjs().subtract(5, 'week').startOf('week'), dayjs().subtract(1, 'week').endOf('week')],\n },\n];\nconst monthOptions: dateOptionType[] = [\n { label: '本月', value: () => past(0, 'month', true) },\n { label: '上月', value: () => past(1, 'month') },\n { label: '今年', value: () => past(0, 'year', true) },\n { label: '去年', value: () => past(1, 'year') },\n { label: '近3月', value: () => past(2, 'month', true) },\n { label: '近4月', value: () => past(3, 'month', true) },\n { label: '近5月', value: () => past(4, 'month', true) },\n { label: '近6月', value: () => past(5, 'month', true) },\n { label: '近7月', value: () => past(6, 'month', true) },\n { label: '近8月', value: () => past(7, 'month', true) },\n { label: '近9月', value: () => past(8, 'month', true) },\n { label: '近10月', value: () => past(9, 'month', true) },\n { label: '近11月', value: () => past(10, 'month', true) },\n { label: '近12月', value: () => past(11, 'month', true) },\n {\n label: '前2月',\n value: () => [dayjs().subtract(2, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前3月',\n value: () => [dayjs().subtract(3, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前4月',\n value: () => [dayjs().subtract(4, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前5月',\n value: () => [dayjs().subtract(5, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前6月',\n value: () => [dayjs().subtract(6, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前7月',\n value: () => [dayjs().subtract(7, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前8月',\n value: () => [dayjs().subtract(8, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前9月',\n value: () => [dayjs().subtract(9, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前10月',\n value: () => [dayjs().subtract(10, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前11月',\n value: () => [dayjs().subtract(11, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n {\n label: '前12月',\n value: () => [dayjs().subtract(12, 'month').startOf('month'), dayjs().subtract(1, 'month').endOf('month')],\n },\n];\nconst startWeekOption: dateOptionType[] = [\n { label: '近7天', value: () => past(6, 'day', true) },\n { label: '近14天', value: () => past(13, 'day', true) },\n { label: '近21天', value: () => past(20, 'day', true) },\n { label: '近28天', value: () => past(27, 'day', true) },\n { label: '近98天', value: () => past(97, 'day', true) },\n { label: '近210天', value: () => past(209, 'day', true) },\n];\nconst startMonthOption: dateOptionType[] = [\n { label: '近30天', value: () => past(29, 'day', true) },\n { label: '近60天', value: () => past(59, 'day', true) },\n { label: '近90天', value: () => past(89, 'day', true) },\n { label: '近120天', value: () => past(119, 'day', true) },\n { label: '近150天', value: () => past(149, 'day', true) },\n { label: '近180天', value: () => past(179, 'day', true) },\n { label: '近210天', value: () => past(209, 'day', true) },\n { label: '近240天', value: () => past(239, 'day', true) },\n { label: '近270天', value: () => past(269, 'day', true) },\n { label: '近300天', value: () => past(299, 'day', true) },\n { label: '近330天', value: () => past(329, 'day', true) },\n { label: '近360天', value: () => past(359, 'day', true) },\n];\n\nconst pickerMap: {\n [key: string]: 'date' | 'week' | 'month';\n} = {\n 按自然周: 'week',\n 按自然月: 'month',\n 按周: 'week',\n 按月: 'month',\n};\n\nconst optionsMap: {\n [key: string]: {\n options: dateOptionType[];\n default: () => RangeValue;\n };\n} = {\n 按日: { options: dateOptions, default: () => past(14, 'day', true) },\n 按周: { options: weekOptions, default: () => past(13, 'week', true) },\n 按月: { options: monthOptions, default: () => past(11, 'month', true) },\n 按自然周: { options: weekOptions, default: () => past(13, 'week', true) },\n 按自然月: { options: monthOptions, default: () => past(11, 'month', true) },\n 按起始周: {\n options: startWeekOption,\n default: () => past(14 * 7 - 1, 'day', true),\n },\n 按起始月: {\n options: startMonthOption,\n default: () => past(12 * 30 - 1, 'day', true),\n },\n};\n\nconst YkRangeDateWithVSRange: React.FC<YkRangeDateWithVSRangeProps> = ({\n timeType,\n rangeDate,\n timeOptions,\n dateCompare,\n getPopupContainer,\n onChange,\n disabledDate = undefined,\n presetsOptions = undefined,\n milestoneFilterType = 1,\n milestone = [],\n holidays = [],\n rangeDisplayLabel,\n}) => {\n const { token } = theme.useToken();\n const hasCustomRangeDisplay = rangeDisplayLabel != null;\n const [groupOpen, setGroupOpen] = useState(false);\n // 判断数据是否变更,若未变更,则初始化日期\n const [isChange, setIsChange] = useState(false);\n const filterType = milestoneFilterType;\n const [cacheRangeDate, setCacheRangeDate] = useState<RangeValue>([null, null]);\n const [cacheTimeType, setCacheTimeType] = useState<string>(timeType);\n const [groupIndex, setGroupIndex] = useState<number | null>(null);\n const picker = cacheTimeType && pickerMap[cacheTimeType] ? pickerMap[cacheTimeType] : 'date';\n const options = presetsOptions\n ? presetsOptions\n : optionsMap[cacheTimeType]\n ? optionsMap[cacheTimeType].options\n : optionsMap['按日'].options;\n\n // 周报月报不显示项目节点(但外面选了周月,里面有按日的type,选按日时依旧可以显示项目节点,例如分包详情里的日期组件)\n const showProjectNode = useMemo(() => {\n return (\n (!timeType.includes('周') &&\n !timeType.includes('月') &&\n !cacheTimeType.includes('周') &&\n !cacheTimeType.includes('月')) ||\n cacheTimeType.includes('日')\n );\n }, [timeType, cacheTimeType]);\n\n const timeOptionAnchors =\n timeOptions?.map((v) => {\n return {\n key: v,\n title: v,\n href: v,\n };\n }) || [];\n\n // 初始化日期与日周月\n const initRangeDate = () => {\n setCacheRangeDate(rangeDate);\n setCacheTimeType(timeType);\n setIsChange(false);\n };\n\n useEffect(() => {\n if (groupOpen) {\n setGroupIndex(\n findIndex(options, (item) => {\n return isEqual(\n item.value()?.map((v) => v?.format('YYYY-MM-DD')),\n cacheRangeDate?.map((v) => v?.format('YYYY-MM-DD')),\n );\n }),\n );\n } else if (!isChange) {\n initRangeDate();\n }\n }, [cacheTimeType, groupOpen]);\n\n useEffect(() => {\n initRangeDate();\n }, [rangeDate, timeType]);\n\n const customFormat: DatePickerProps['format'] = (value) => {\n return `${dayjs(value).format('YYYY-MM-DD')}`;\n };\n\n const milestoneSelected = (id: number) => {\n const dates = milestone.find((m) => m.id === id)?.range_day.map((m) => dayjs(m)) || [];\n let [start, end] = dates;\n if (end > dayjs().endOf('day')) end = dayjs().endOf('day');\n setIsChange(true);\n setCacheRangeDate([start, end]);\n onChange({\n rangeDate: [start, end],\n timeType: cacheTimeType,\n });\n setGroupOpen(false);\n };\n\n const checkPresets = (v) => {\n if (\n cacheRangeDate &&\n dayjs(v[0]).format('YYYY-MM-DD') === dayjs(cacheRangeDate[0]).format('YYYY-MM-DD') &&\n dayjs(v[1]).format('YYYY-MM-DD') === dayjs(cacheRangeDate[1]).format('YYYY-MM-DD')\n ) {\n return true;\n } else {\n return false;\n }\n };\n\n // 活动详情内容\n const popoverContent = (event: ProjectNodeItem) => {\n return (\n <div\n style={{\n height: 30,\n lineHeight: '30px',\n textAlign: 'left',\n color: '#666',\n padding: '0 10px 0 10px',\n fontSize: 12,\n }}\n >\n {event.tag +\n ' ' +\n (event.range_day[0] === event.range_day[1] ? event.range_day[0] : event.range_day.join(' ~ '))}\n </div>\n );\n };\n\n const milestoneListFilter = milestone\n .filter((f) => f.type === filterType)\n .filter((f) => dayjs(f.range_day[0]) <= dayjs().endOf('day'))\n .filter((f) => dayjs(f.range_day[0]) >= dayjs().startOf('year').subtract(1, 'year'))\n .sort(\n (a: ProjectNodeItem, b: ProjectNodeItem) => dayjs(b.range_day[0]).valueOf() - dayjs(a.range_day[0]).valueOf(),\n );\n const milestoneList = (\n <div className={styles.milestoneListBox}>\n {milestoneListFilter.map((v) => {\n // Popover 须高于 DatePicker 弹层(约 zIndexPopupBase+50),否则悬停内容被挡在面板下\n return (\n <Popover\n key={v.id}\n trigger='hover'\n placement='right'\n zIndex={token.zIndexPopupBase + 120}\n getPopupContainer={() => document.body}\n styles={{\n root: {\n // width: 200,\n },\n body: {\n borderRadius: 2,\n padding: 0,\n },\n }}\n content={popoverContent(v)}\n >\n <div\n data-track\n id={`milestoneListItem-${v.id}`}\n key={v.id}\n className={classNames(\n styles.milestoneListItem,\n checkPresets(v.range_day.map((m) => dayjs(m))) && styles.milestoneListActive,\n )}\n style={{\n textAlign: 'left',\n padding: '0 10px',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n onClick={() => {\n milestoneSelected(v.id as number);\n }}\n >\n {v.tag}\n </div>\n </Popover>\n );\n })}\n </div>\n );\n\n const dateGourpRender = (panelNode: React.ReactNode) => {\n return (\n <div>\n {dateCompare && (\n <div className={styles.ykRangeDateWithVsHeader}>\n <Anchor\n className={styles.ykRangeDateWithVsHeaderAnchor}\n direction='horizontal'\n items={timeOptionAnchors}\n getCurrentAnchor={() => cacheTimeType}\n onClick={(event, link) => {\n event.preventDefault();\n setCacheTimeType(link.href);\n const defaultFn = optionsMap[link.href] ? optionsMap[link.href].default : optionsMap['按日'].default;\n setCacheRangeDate(defaultFn());\n }}\n />\n </div>\n )}\n <Flex>\n {milestoneListFilter && milestoneListFilter.length > 0 && showProjectNode ? (\n <div className={classNames(styles.milestoneList, 'scroll-reset')}>{milestoneList}</div>\n ) : null}\n <div className={styles.ykRangeDateWithVsGroup}>\n <div className={styles.ykRangeDateWithVsPanel}>{panelNode}</div>\n </div>\n </Flex>\n </div>\n );\n };\n\n // 当节点有已选时,不高亮presetsNode\n let hasSelect = false;\n if (milestoneListFilter && milestoneListFilter.length > 0) {\n milestoneListFilter.forEach((item) => {\n if (checkPresets(item.range_day.map((m) => dayjs(m))) && picker === 'date' && showProjectNode) {\n hasSelect = true;\n }\n });\n }\n\n const presetsNode = options.map((v, i) => {\n return {\n label: (\n <div\n className={classNames(\n 'ant-picker-presets-li',\n groupIndex === i && !hasSelect && 'ant-picker-presets-li-item',\n )}\n onClick={() => {\n setGroupIndex(i);\n }}\n >\n {v.label}\n </div>\n ),\n value: v.value,\n };\n }) as TimeRangePickerProps['presets'];\n\n const resolvePopupContainer = getPopupContainer\n ? getPopupContainer\n : (triggerNode: HTMLElement) => triggerNode.parentNode as HTMLElement;\n\n // 项目节点与节假日\n const dateTags: ProjectNodeItem[] = (milestoneListFilter || []).concat(holidays || []).map((m) => {\n return {\n ...m,\n date: m.range_day[0],\n };\n });\n const dateTagsMap = {};\n dateTags.forEach((m: any) => {\n if (dateTagsMap[m.date]) {\n dateTagsMap[m.date].push(m);\n } else {\n dateTagsMap[m.date] = [m];\n }\n });\n\n const eventsTooltips = (date: Dayjs) => {\n const dateStr = dayjs(date).format('YYYY-MM-DD');\n const tags = dateTagsMap[dateStr] || [];\n // 只展示最新创建的节点\n const lastTag =\n tags.length > 0\n ? tags.reduce((prev: ProjectNodeItem, curr: ProjectNodeItem) =>\n dayjs(prev.created_at).isAfter(dayjs(curr.created_at)) ? prev : curr,\n )\n : null;\n return lastTag ? (\n <Tooltip\n placement='right'\n title={\n lastTag.tag +\n ' ' +\n (lastTag.range_day[0] === lastTag.range_day[1] ? lastTag.range_day[0] : lastTag.range_day.join(' ~ '))\n }\n color='#fff'\n styles={{\n root: {\n maxWidth: 270,\n },\n body: {\n borderRadius: 2,\n color: '#666',\n },\n }}\n >\n <div key={lastTag.id} className={styles.ykRangeDateWithVsTag}>\n {lastTag.tag}\n </div>\n </Tooltip>\n ) : (\n <></>\n );\n };\n\n const cellRender: DatePickerProps<Dayjs>['cellRender'] = (current, info) => {\n if (info.type !== 'date') {\n return info.originNode;\n }\n if (typeof current === 'number' || typeof current === 'string') {\n return <div className='ant-picker-cell-inner'>{current}</div>;\n }\n return (\n <div\n className={classNames('ant-picker-cell-inner')}\n style={{ width: 45, height: 40, lineHeight: holidays && holidays.length > 0 ? '26px' : '40px', fontSize: 12 }}\n >\n {current.date()}\n {holidays && holidays.length > 0 && (\n <div\n style={{\n position: 'absolute',\n bottom: 2,\n height: 16,\n width: '100%',\n fontSize: '12px',\n lineHeight: '16px',\n whiteSpace: 'nowrap',\n }}\n >\n {eventsTooltips(current)}\n </div>\n )}\n </div>\n );\n };\n\n const rangePicker = (\n <DatePicker.RangePicker\n id='ykRangeDateWithVsRange'\n classNames={{\n popup: {\n root: styles.globalItemDatePanel,\n },\n }}\n styles={{\n root: {\n opacity: hasCustomRangeDisplay ? 0 : 1,\n },\n }}\n getPopupContainer={resolvePopupContainer}\n disabledDate={\n disabledDate\n ? disabledDate\n : (current) => {\n return current && current > dayjs().endOf('day');\n }\n }\n inputReadOnly={hasCustomRangeDisplay}\n open={groupOpen}\n picker={picker}\n cellRender={cellRender}\n value={cacheRangeDate}\n panelRender={dateGourpRender}\n presets={presetsNode}\n variant='borderless'\n allowClear={false}\n format={customFormat}\n showWeek={false}\n separator='~'\n className={styles.globalItemDate}\n suffixIcon={false}\n onChange={(val) => {\n let start = null;\n let end = null;\n if (val && val[0] && val[1]) {\n start = val[0].startOf(picker);\n end = val[1].endOf(picker) > dayjs() ? dayjs() : val[1].endOf(picker);\n }\n setIsChange(true);\n setCacheRangeDate([start, end]);\n onChange({\n rangeDate: [start, end],\n timeType: cacheTimeType,\n });\n }}\n onOpenChange={(open) => {\n setGroupOpen(open);\n }}\n />\n );\n\n return (\n <div className={classNames(styles.globalMl, styles.globalItem)}>\n {dateCompare && !!options.length && (\n <label onClick={() => setGroupOpen(true)} className={styles.globalItemDateTerm}>\n <span style={{ marginRight: '5px', fontSize: 14 }}>{timeType}</span>\n <i style={{ marginRight: '10px' }} className={classNames('iconfont icon-xiala1')}></i>\n </label>\n )}\n <i className={itemCheckIconClass('icon-riqi1')} style={{ fontSize: 14 }} />\n <ConfigProvider\n theme={{\n components: {\n DatePicker: {\n cellWidth: 60,\n cellHeight: 40,\n timeColumnWidth: 40,\n },\n },\n token: {},\n }}\n >\n {hasCustomRangeDisplay ? (\n <div className={styles.rangePickerCustomDisplay}>\n <span className={styles.rangePickerCustomDisplayLabel}>{rangeDisplayLabel}</span>\n {rangePicker}\n </div>\n ) : (\n rangePicker\n )}\n </ConfigProvider>\n </div>\n );\n};\n\nexport default YkRangeDateWithVSRange;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["classNames", "styles", "dayjs", "React"]
|
|
7
7
|
}
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* - YkRangeDateWithVSRange:主 RangePicker,可选日/周/月维度 Tab(由 timeOptions 控制)
|
|
8
8
|
* - YkRangeDateWithVSCompare:对比区间,依赖主区间长度(dayLine)自动对齐结束日
|
|
9
9
|
*/
|
|
10
|
+
import 'dayjs/locale/zh-cn';
|
|
10
11
|
import type { DatePickerProps } from 'antd';
|
|
11
12
|
import { Dayjs } from 'dayjs';
|
|
12
|
-
import 'dayjs/locale/zh-cn';
|
|
13
13
|
import { FC, type ReactNode } from 'react';
|
|
14
14
|
/** 受控值:主区间字符串、对比区间、聚合维度(与后端约定的中文枚举,如「按日」) */
|
|
15
15
|
export type YkRangeDateWithVSValue = {
|
|
@@ -42,7 +42,7 @@ export type YkRangeDateWithVSProps = {
|
|
|
42
42
|
disableDateCompare?: boolean;
|
|
43
43
|
/** Tab 文案列表,如 ['按日','按周','按月'];空数组则主面板不显示维度切换 */
|
|
44
44
|
timeOptions?: string[];
|
|
45
|
-
/**
|
|
45
|
+
/** 弹层挂载容器,默认父节点 */
|
|
46
46
|
getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;
|
|
47
47
|
disabledDate?: DatePickerProps['disabledDate'];
|
|
48
48
|
/** 若传入则覆盖 value 推导出的主区间展示 */
|
|
@@ -32,12 +32,13 @@ __export(YkRangeDateWithVS_exports, {
|
|
|
32
32
|
default: () => YkRangeDateWithVS_default
|
|
33
33
|
});
|
|
34
34
|
module.exports = __toCommonJS(YkRangeDateWithVS_exports);
|
|
35
|
+
var import_zh_cn = require("dayjs/locale/zh-cn");
|
|
36
|
+
var import_react = __toESM(require("react"));
|
|
35
37
|
var import_antd = require("antd");
|
|
36
38
|
var import_zh_CN = __toESM(require("antd/locale/zh_CN"));
|
|
37
39
|
var import_classnames = __toESM(require("classnames"));
|
|
38
40
|
var import_dayjs = __toESM(require("dayjs"));
|
|
39
|
-
var
|
|
40
|
-
var import_react = __toESM(require("react"));
|
|
41
|
+
var import_react2 = require("react");
|
|
41
42
|
var import_styles = __toESM(require("./styles"));
|
|
42
43
|
var import_YkRangeDateWithVSCompare = __toESM(require("./YkRangeDateWithVSCompare"));
|
|
43
44
|
var import_YkRangeDateWithVSRange = __toESM(require("./YkRangeDateWithVSRange"));
|
|
@@ -68,13 +69,13 @@ var YkRangeDateWithVS = ({
|
|
|
68
69
|
const cmpStart = (value == null ? void 0 : value.cmpStart) ?? null;
|
|
69
70
|
const cmpEnd = (value == null ? void 0 : value.cmpEnd) ?? "";
|
|
70
71
|
const timeType = (value == null ? void 0 : value.timeType) ?? "";
|
|
71
|
-
const dayLine = (0,
|
|
72
|
+
const dayLine = (0, import_react2.useMemo)(() => {
|
|
72
73
|
if (start && end) {
|
|
73
74
|
return (0, import_dayjs.default)(end).diff((0, import_dayjs.default)(start), "day");
|
|
74
75
|
}
|
|
75
76
|
return 0;
|
|
76
77
|
}, [start, end]);
|
|
77
|
-
(0,
|
|
78
|
+
(0, import_react2.useEffect)(() => {
|
|
78
79
|
if (!timeCompare || !cmpStart || !cmpEnd)
|
|
79
80
|
return;
|
|
80
81
|
const endTime = (0, import_dayjs.default)(cmpStart).add(dayLine, "day") > (0, import_dayjs.default)().endOf("day") ? (0, import_dayjs.default)().format("YYYY-MM-DD") : (0, import_dayjs.default)(cmpStart).add(dayLine, "day").format("YYYY-MM-DD");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/YkRangeDateWithVS/index.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * YkRangeDateWithVS — 主时间区间 + 可选「日期对比」的组合筛选条(With Versus)。\n *\n * 设计为纯受控组件:不使用 dva `connect` / `dispatch`,由外层持有 `value` 并合并 `onChange` 返回的局部字段。\n *\n * 子组件:\n * - YkRangeDateWithVSRange:主 RangePicker,可选日/周/月维度 Tab(由 timeOptions 控制)\n * - YkRangeDateWithVSCompare:对比区间,依赖主区间长度(dayLine)自动对齐结束日\n */\nimport type { DatePickerProps } from 'antd';\nimport { ConfigProvider } from 'antd';\nimport zhCN from 'antd/locale/zh_CN';\nimport classNames from 'classnames';\nimport dayjs, { Dayjs } from 'dayjs';\nimport
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
6
|
-
"names": ["dayjs", "React", "zhCN", "classNames", "styles", "YkRangeDateWithVSRange", "YkRangeDateWithVSCompare"]
|
|
4
|
+
"sourcesContent": ["/**\n * YkRangeDateWithVS — 主时间区间 + 可选「日期对比」的组合筛选条(With Versus)。\n *\n * 设计为纯受控组件:不使用 dva `connect` / `dispatch`,由外层持有 `value` 并合并 `onChange` 返回的局部字段。\n *\n * 子组件:\n * - YkRangeDateWithVSRange:主 RangePicker,可选日/周/月维度 Tab(由 timeOptions 控制)\n * - YkRangeDateWithVSCompare:对比区间,依赖主区间长度(dayLine)自动对齐结束日\n */\nimport 'dayjs/locale/zh-cn';\nimport React from 'react';\nimport type { DatePickerProps } from 'antd';\nimport { ConfigProvider } from 'antd';\nimport zhCN from 'antd/locale/zh_CN';\nimport classNames from 'classnames';\nimport dayjs, { Dayjs } from 'dayjs';\nimport { FC, useEffect, useMemo, type ReactNode } from 'react';\nimport styles from './styles';\nimport YkRangeDateWithVSCompare from './YkRangeDateWithVSCompare';\nimport YkRangeDateWithVSRange from './YkRangeDateWithVSRange';\n\ndayjs.locale({\n ...dayjs.Ls['zh-cn'],\n weekStart: 1,\n});\n\n/** 受控值:主区间字符串、对比区间、聚合维度(与后端约定的中文枚举,如「按日」) */\nexport type YkRangeDateWithVSValue = {\n start?: string | null;\n end?: string | null;\n cmpStart?: string | null;\n cmpEnd?: string | null;\n timeType?: string | null;\n};\n\n/** onChange 推送的增量;外层应合并进完整 value */\nexport type YkRangeDateWithVSChange = {\n start?: string;\n end?: string;\n cmpStart?: string | null;\n cmpEnd?: string | null;\n timeType?: string | null;\n};\n\ntype RangeValue = [Dayjs | null, Dayjs | null] | null;\ntype DateValue = Dayjs | null;\n\nexport type YkRangeDateWithVSProps = {\n /** 当前筛选状态(必填) */\n value: YkRangeDateWithVSValue;\n /** 字段级增量更新 */\n onChange?: (patch: YkRangeDateWithVSChange) => void;\n /** 是否展示「日期对比」整块(含对比区间选择) */\n timeCompare?: boolean;\n className?: string;\n /** 是否启用主选择器顶部的日/周/月 Tab;需与 timeOptions 同时使用 */\n dateCompare: boolean;\n /** 禁用对比能力(置灰快捷入口) */\n disableDateCompare?: boolean;\n /** Tab 文案列表,如 ['按日','按周','按月'];空数组则主面板不显示维度切换 */\n timeOptions?: string[];\n /** 弹层挂载容器,默认父节点 */\n getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;\n disabledDate?: DatePickerProps['disabledDate'];\n /** 若传入则覆盖 value 推导出的主区间展示 */\n rangeDate?: RangeValue;\n presetsOptions?: { label: string; value: () => [Dayjs, Dayjs] }[];\n /** 1 运营节点 2 广告节点(日历旁里程碑列表筛选,与旧版 usePageInfo 行为对齐) */\n milestoneFilterType?: 1 | 2;\n milestone?: ProjectNodeItem[];\n holidays?: ProjectNodeItem[];\n /** 主区间 RangePicker 输入框自定义展示(string / ReactNode) */\n rangeDisplayLabel?: ReactNode;\n};\n\nconst YkRangeDateWithVS: FC<YkRangeDateWithVSProps> = ({\n value,\n onChange = () => {},\n timeCompare,\n dateCompare,\n timeOptions = [],\n className,\n getPopupContainer,\n disableDateCompare = false,\n disabledDate,\n rangeDate,\n presetsOptions,\n milestoneFilterType = 1,\n milestone = [],\n holidays = [],\n rangeDisplayLabel,\n}) => {\n const start = value?.start ?? null;\n const end = value?.end ?? null;\n const cmpStart = value?.cmpStart ?? null;\n const cmpEnd = value?.cmpEnd ?? '';\n const timeType = value?.timeType ?? '';\n\n const dayLine = useMemo(() => {\n if (start && end) {\n return dayjs(end).diff(dayjs(start), 'day');\n }\n return 0;\n }, [start, end]);\n\n useEffect(() => {\n if (!timeCompare || !cmpStart || !cmpEnd) return;\n const endTime =\n dayjs(cmpStart).add(dayLine, 'day') > dayjs().endOf('day')\n ? dayjs().format('YYYY-MM-DD')\n : dayjs(cmpStart).add(dayLine, 'day').format('YYYY-MM-DD');\n if (endTime !== cmpEnd) {\n onChange({ cmpEnd: endTime });\n }\n }, [dayLine, timeCompare, cmpStart, cmpEnd, onChange]);\n\n return (\n <ConfigProvider\n locale={zhCN}\n theme={{\n components: {\n DatePicker: {\n paddingInline: 0,\n },\n },\n }}\n >\n <div className={classNames(className, styles.ykRangeDateWithVs)}>\n <YkRangeDateWithVSRange\n rangeDisplayLabel={rangeDisplayLabel}\n milestone={milestone}\n holidays={holidays}\n milestoneFilterType={milestoneFilterType}\n timeType={timeType}\n disabledDate={disabledDate}\n rangeDate={rangeDate ? rangeDate : [start ? dayjs(start) : null, end ? dayjs(end) : null]}\n presetsOptions={presetsOptions}\n timeOptions={timeOptions}\n getPopupContainer={getPopupContainer}\n dateCompare={dateCompare && timeOptions.length > 0}\n onChange={(v) => {\n onChange({\n timeType: v.timeType,\n start: (v.rangeDate as [DateValue, DateValue])[0]?.format('YYYY-MM-DD'),\n end: (v.rangeDate as [DateValue, DateValue])[1]?.format('YYYY-MM-DD'),\n });\n }}\n />\n {timeCompare && (\n <YkRangeDateWithVSCompare\n timeType={timeType}\n disableCompare={disableDateCompare}\n rangeDate={[cmpStart ? dayjs(cmpStart) : null, cmpEnd ? dayjs(cmpEnd) : null]}\n originDate={[start ? dayjs(start) : null, end ? dayjs(end) : null]}\n dayLine={dayLine}\n onChange={(v) => {\n onChange({\n cmpStart: (v.rangeDate as [DateValue, DateValue])[0]?.format('YYYY-MM-DD'),\n cmpEnd: (v.rangeDate as [DateValue, DateValue])[1]?.format('YYYY-MM-DD'),\n });\n }}\n />\n )}\n </div>\n </ConfigProvider>\n );\n};\n\nexport default YkRangeDateWithVS;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "dayjs", "React", "zhCN", "classNames", "styles", "YkRangeDateWithVSRange", "YkRangeDateWithVSCompare"]
|
|
7
7
|
}
|