SepCalendar 日历组件 v1.0.0

月 / 年 / 十年 / 议程 四视图 · 单选 / 范围 / 多选 · 边界限制 / 只读 · 跨日事件条 / 异步加载 · 数据导入导出

1. 基础月视图

JS API 初始化
选中:无

2. 周起始日 / 显示其他月份

JS API 初始化

3. 显示周数(ISO)

JS API 初始化

4. 范围选择

JS API 初始化
范围:无

5. 禁用日期(周末)

JS API 初始化

6. 自定义单元格(日程标记)

JS API 初始化

7. 全屏模式

JS API 初始化

8. 年视图 / 十年视图(点击标题切换)

JS API 初始化

9. 实例方法

JS API 初始化
上一月 下一月 上一年 下一年 今天 选中今天 年视图 十年视图 月视图

10. 订阅与状态

JS API 初始化
状态变化:等待中…

12. 事件日程条

单元格内彩色事件条(按优先级排序,仅显示最高优先级,其余在 Popover 查看)+ 点击回调

13. 议程视图

panelMode: 'agenda' 按月事件列表,今天标记

14. 面板滑动动画

prev/next 带动画切换月份
← 上一月 下一月 → 今天

15. 日期详情 Popover

hover 事件日 200ms 弹出详情浮层,可点击事件行

16. 日历密度

compact / normal / comfortable 三档视觉密度
compact
normal
comfortable

17. 日历尺寸

small / default / large 三种整体尺寸
small
default
large

18. 农历 / 节气 / 节假日

复用 DatePicker 的农历与节假日工具,显示于日期数字下方
农历
农历 + 节气 + 节假日

19. 日期边界限制 minDate / maxDate

超出范围的日期禁用,导航按钮自动拦截边界

20. 只读模式 readonly

readonly=true 时不可点击选择,仅展示

21. 多日期选择 multiple

点击切换选中/取消,getValue 返回 Date[]
已选:无

22. 跨日事件条(多日事件)

事件配置 start/end 字段,跨多日渲染为连续色带

23. 事件异步加载 eventSource

切换月份时按需拉取事件,加载中显示 loading 遮罩
← 上月 下月 → 本月

24. 数据导入导出

节假日 / 纪念日 / 事件 支持 JSON & CSV 导入导出,可从本地文件导入
导出节假日 JSON 导出节假日 CSV 导入示例节假日 导出事件 JSON 导出事件 CSV 导出纪念日 JSON 导入示例事件
导入节假日文件 导入事件文件 导入纪念日文件 清空导入数据 支持 .json / .csv · 仅清空导入的数据
操作结果:无

详细说明

SepCalendar 零依赖原生日历面板组件,支持月/年/十年/议程四视图切换、单选/范围/多选三种选择模式、minDate/maxDate 日期边界、readonly 只读模式、自定义单元格渲染、日程标记点、键盘导航、单日/跨日事件日程条、eventSource 异步加载、Hover Popover、日历密度切换、节假日/纪念日/事件的 JSON & CSV 导入导出。基于 SepBase 组件工厂,遵循 a/b/c/d 四层拆分架构。

Props 配置项

参数类型默认值说明
valueDate | string | nullnull初始选中日期
panelDateDate | stringnew Date()初始面板日期
panelModestring'month'初始视图:month / year / decade / agenda
firstDayOfWeeknumber0周起始日:0=周日,1=周一
fullscreenbooleanfalse全屏模式,撑满容器
showWeekNumbersbooleanfalse显示 ISO 周数
showOtherMonthsbooleantrue显示非当前月份的日期
fixedWeekCountbooleanfalse固定显示 6 周
selectionModestring'single'选择模式:single / range / multiple
rangeDate[]null初始日期范围 [start, end]
multipleDatesDate[][]多选模式初始选中日期数组
minDateDate | stringnull最小可选日期,超出禁用
maxDateDate | stringnull最大可选日期,超出禁用
readonlybooleanfalse只读模式,不可点击选择
disabledDate(date) => booleannull禁用日期判定函数
dateRender(date) => string | nullnull自定义单元格文本
dateMark(date) => { colors } | nullnull自定义标记点
events{ date\|start, title, end?, color?, time?, id?, priority? }[][]事件日程列表。支持单日(date)和跨日(start/end)两种
maxVisibleEventsnumber1每格最多显示事件条数(按 priority 降序取前 N 条,其余在 Popover 查看)
showEventPopoverbooleantruehover 事件日是否弹出详情浮层
eventSource(start, end) => Promisenull事件异步数据源,切换月份时按需加载
showLunarbooleanfalse显示农历日期(复用 SepLunarUtils)
showSolarTermbooleanfalse显示二十四节气
showHolidaybooleanfalse显示公历/农历节日及法定节假日(含休/班角标)
showAnniversarybooleanfalse显示纪念日(如万圣节、圣诞节等,无节日时显示)
anniversaryDataObjectnull自定义纪念日数据,格式同 DatePicker
holidayDataobjectnull自定义法定节假日数据 `{ "MM-DD": { name, isOffDay } }`,未传时自动从 API 加载
densitystring'normal'密度:compact / normal / comfortable
sizestring'default'整体尺寸:small / default / large
onSelect(date, info) => voidnull选中回调
onPanelChange(date, mode) => voidnull面板变化回调
onRangeChange(range) => voidnull范围变化回调

Methods 方法

方法参数返回说明
getValue()-Date | null获取当前选中日期
setValue(date)Date | string | nullvoid设置选中日期
getRange()-[Date, Date] | null获取日期范围
setRange([s, e])Date[]void设置范围(自动排序)
getMultipleDates()-Date[]获取多选模式选中日期数组
setMultipleDates(dates)Date[]void设置多选模式选中日期
getPanelDate()-Date获取当前面板日期
setPanelDate(date)Date | stringvoid设置面板日期(切换月份)
getPanelMode()-string获取视图:month / year / decade / agenda
setPanelMode(mode)stringvoid切换视图模式
getEvents()-object[]获取当前事件列表
setEvents(events)object[]void设置事件列表(重新渲染)
setMaxVisibleEvents(n)numbervoid设置每格最多事件条数
setShowEventPopover(v)booleanvoid开关 Popover 详情浮层
setEventSource(fn)functionvoid设置事件异步数据源,立即触发当前月份加载
setMinDate(date)Date | string | nullvoid设置最小可选日期
setMaxDate(date)Date | string | nullvoid设置最大可选日期
setReadonly(v)booleanvoid切换只读模式
exportHolidayData(format)'json' | 'csv'string导出节假日数据
importHolidayData(input, options)string | object, {merge?}boolean导入节假日数据
exportAnniversaryData(format)'json' | 'csv'string导出纪念日数据
importAnniversaryData(input, options)string | object, {merge?}boolean导入纪念日数据
exportEvents(format)'json' | 'csv'string导出事件数据
importEvents(input, options)string | array, {merge?}boolean导入事件数据
download(name, content, mime)string, string, stringvoid触发浏览器下载文件
clearImportedHolidayData()-number清空导入的节假日数据(保留系统默认)
clearImportedAnniversaryData()-number清空导入的纪念日数据(保留系统默认)
clearImportedEvents()-number清空导入的事件数据(保留系统默认)
setDensity(v)stringvoid设置密度:compact / normal / comfortable
prev()-void切换到上一月
next()-void切换到下一月
prevYear()-void切换到上一年
nextYear()-void切换到下一年
today()-void切换到本月
subscribe(fn)(state) => voidunsubscribe订阅状态变化
destroy()-void销毁实例

Events 事件

事件回调参数说明
onSelect(date, info)single/range 选中时触发;multiple 模式返回 (dates[])
onPanelChange(date, mode)面板切换(上月/下月/年/十年)时触发
onRangeChange(range)范围选择完成时触发
onEventClick(event)事件条 / 议程行 / Popover 行点击时触发

i18n 国际化

日历内置文本均通过 $.t() 获取,支持中英文切换。已注册的语言包 key:

Keyzh-CNen-US用途
calendar.today今天Todaytoday 按钮文本
calendar.noEvents本月暂无日程安排No events this month空状态提示
calendar.offDay / workDay休 / 班Off / Work节假日角标
calendar.restDay / workdayLabel休息日 / 工作日Rest day / Workday角标 tooltip
calendar.eventsCount{count} 个事件{count} events事件计数 tooltip
calendar.agenda日程Agenda议程视图标题
calendar.week周(空)星期前缀
calendar.months1月~12月Jan~Dec年视图月份名
datePicker.today今天Todaytoday 按钮/标签
datePicker.prevMonth/nextMonth上/下个月Prev/Next Month导航按钮 title
datePicker.prevYear/nextYear上/下一年Prev/Next Year年导航按钮 title
datePicker.month/year/day月/年/日(空)日期格式片段
datePicker.weekdays.{0-6}日~六Su~Sa星期表头

开发路线图

阶段功能状态
P0-1minDate / maxDate 日期边界限制 + readonly 只读模式✅ 完成
P0-2multiple 多日期选择模式✅ 完成
P0-3跨日事件(多日事件条)start / end✅ 完成
P0-4事件异步加载 eventSource(防竞态 + 缓存)✅ 完成
P0-5数据导入导出:节假日 / 纪念日 / 事件 JSON & CSV✅ 完成
P0-6导入数据可清空(区分系统默认与导入数据)✅ 完成
P0-7i18n 国际化(中/英)✅ 完成
P0-8通用文件导入工具 SepBase._pickAndReadText✅ 完成
P0-9Popover 默认上方弹出✅ 完成
P1-1周视图 / 日视图(时间轴)📋 待开发
P1-2拖拽创建 / 调整事件📋 待开发
P1-3事件重复规则(RRULE)📋 待开发
P1-4iCal 格式导入导出📋 待开发
P1-5移动端手势(swipe 切换月)📋 待开发

架构

基于 SepBase 组件工厂,遵循 a/b/c/d 四层拆分架构:

层文件职责
a 工具层50a-calendar-utils.js纯函数无状态:日期计算、事件查询、CSV 解析
b 构建层50b-calendar-dom.jsDOM 骨架创建:根元素 + 头部/星期表头/主体容器
c 引擎层50c-calendar.js状态管理、渲染逻辑、事件处理、动画调度
d 工厂层50d-calendar.js对外 API、配置初始化、Setter/方法注册

自动化断言