@robot-admin/naive-ui-components 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/{C_AntV-DGjscTWa.css.map → C_AntV-A3NXx_sF.css.map} +1 -1
  2. package/dist/C_AntV.js.map +1 -1
  3. package/dist/C_AntV2.js +1 -1
  4. package/dist/C_AntV2.js.map +1 -1
  5. package/dist/{C_FilePreview-B4XgTv-h.css.map → C_FilePreview-DHGlV4OR.css.map} +1 -1
  6. package/dist/C_FilePreview.js.map +1 -1
  7. package/dist/C_FilePreview2.js +1 -1
  8. package/dist/C_FilePreview2.js.map +1 -1
  9. package/dist/{C_Form-DLb9FtAb.css.map → C_Form-CKHvXL3O.css.map} +1 -1
  10. package/dist/C_Form.js.map +1 -1
  11. package/dist/C_Form2.js +1 -1
  12. package/dist/C_Form2.js.map +1 -1
  13. package/dist/{C_FormSearch-DlIEoh7X.css.map → C_FormSearch-DBNtnjaL.css.map} +1 -1
  14. package/dist/C_FormSearch.js.map +1 -1
  15. package/dist/C_FormSearch2.js +1 -1
  16. package/dist/C_FormSearch2.js.map +1 -1
  17. package/dist/C_FullCalendar-DLUdCtqf.css.map +1 -0
  18. package/dist/C_FullCalendar.js.map +1 -1
  19. package/dist/C_FullCalendar2.js +1 -1
  20. package/dist/C_FullCalendar2.js.map +1 -1
  21. package/dist/C_Guide.js.map +1 -1
  22. package/dist/C_Guide2.js.map +1 -1
  23. package/dist/C_Icon.js.map +1 -1
  24. package/dist/C_Icon2.js.map +1 -1
  25. package/dist/C_Language.js.map +1 -1
  26. package/dist/C_Language2.js.map +1 -1
  27. package/dist/{C_Markdown-C2uiBVSW.css.map → C_Markdown-BbTvdFCl.css.map} +1 -1
  28. package/dist/C_Markdown.js.map +1 -1
  29. package/dist/C_Markdown2.js +1 -1
  30. package/dist/C_Markdown2.js.map +1 -1
  31. package/dist/{C_Table-C55H4kPr.css.map → C_Table-tbUx-R4H.css.map} +1 -1
  32. package/dist/C_Table.js.map +1 -1
  33. package/dist/C_Table2.js +1 -1
  34. package/dist/C_Table2.js.map +1 -1
  35. package/dist/C_Theme.js.map +1 -1
  36. package/dist/C_Theme2.js.map +1 -1
  37. package/dist/{C_WorkFlow-CSO86Cuc.css.map → C_WorkFlow-7F6op6qN.css.map} +1 -1
  38. package/dist/C_WorkFlow.js.map +1 -1
  39. package/dist/C_WorkFlow2.js +1 -1
  40. package/dist/C_WorkFlow2.js.map +1 -1
  41. package/dist/constants.d.ts +2 -2
  42. package/dist/constants2.d.ts +2 -2
  43. package/dist/constants3.d.ts +3 -3
  44. package/dist/constants4.d.ts +4 -4
  45. package/dist/constants5.d.ts +4 -4
  46. package/dist/data.d.ts +3 -3
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/index10.vue.d.ts +4 -4
  50. package/dist/index12.vue.d.ts +3 -3
  51. package/dist/index13.vue.d.ts +2 -2
  52. package/dist/index14.vue.d.ts +3 -3
  53. package/dist/index15.vue.d.ts +1 -1
  54. package/dist/index16.vue.d.ts +3 -3
  55. package/dist/index2.vue.d.ts +2 -2
  56. package/dist/index3.vue.d.ts +5 -5
  57. package/dist/index8.vue.d.ts +3 -3
  58. package/dist/index9.vue.d.ts +1 -1
  59. package/dist/style.css +447 -447
  60. package/dist/useCalendarEvents.d.ts +1 -1
  61. package/dist/useCropperCore.d.ts +8 -8
  62. package/dist/useDraggableLayout.d.ts +8 -8
  63. package/dist/useDynamicFormState.d.ts +6 -6
  64. package/dist/useEdgeInteraction.d.ts +4 -12
  65. package/dist/useFullscreen.d.ts +2 -2
  66. package/dist/useInfiniteScroll.d.ts +1 -1
  67. package/dist/useModalEdit.d.ts +44 -20
  68. package/dist/useQRCode.d.ts +1 -1
  69. package/dist/useSearchState.d.ts +4 -4
  70. package/dist/useSignatureHistory.d.ts +2 -2
  71. package/dist/useSplitResize.d.ts +1 -1
  72. package/dist/useTreeOperations.d.ts +2 -2
  73. package/dist/useWorkflowValidation.d.ts +3 -3
  74. package/package.json +1 -1
  75. package/dist/C_FullCalendar-BULCIlVK.css.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"C_FullCalendar.js","names":["dayGridPlugin","interactionPlugin","listPlugin","zhCn"],"sources":["../src/components/C_FullCalendar/data.ts","../src/components/C_FullCalendar/composables/useCalendarEvents.ts","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue"],"sourcesContent":["import type { CalendarEditForm } from \"./types\";\r\n\r\nexport const EVENT_COLORS = [\r\n \"#3f86ff\",\r\n \"#ff6b6b\",\r\n \"#67c23a\",\r\n \"#e6a23c\",\r\n \"#9c27b0\",\r\n \"#00bcd4\",\r\n \"#ff5722\",\r\n];\r\n\r\nexport const DEFAULT_EDIT_FORM: CalendarEditForm = {\r\n id: \"\",\r\n title: \"\",\r\n date: Date.now(),\r\n startTime: \"09:00\",\r\n endTime: \"10:00\",\r\n color: \"#3f86ff\",\r\n};\r\n\r\nexport const HEADER_TOOLBAR = {\r\n left: \"prev,next today\",\r\n center: \"title\",\r\n right: \"dayGridMonth,dayGridWeek,dayGridDay,listWeek\",\r\n};\r\n\r\nexport const BUTTON_TEXT = {\r\n today: \"今天\",\r\n month: \"月\",\r\n week: \"周\",\r\n day: \"日\",\r\n list: \"列表\",\r\n};\r\n","import { ref, watch } from \"vue\";\r\nimport { useMessage } from \"naive-ui\";\r\nimport type { Ref } from \"vue\";\r\nimport type { CalendarEvent, CalendarProps, CalendarEditForm } from \"../types\";\r\nimport {\r\n EVENT_COLORS,\r\n DEFAULT_EDIT_FORM,\r\n HEADER_TOOLBAR,\r\n BUTTON_TEXT,\r\n} from \"../data\";\r\nimport dayGridPlugin from \"@fullcalendar/daygrid\";\r\nimport interactionPlugin from \"@fullcalendar/interaction\";\r\nimport listPlugin from \"@fullcalendar/list\";\r\nimport type { CalendarOptions } from \"@fullcalendar/core\";\r\nimport zhCn from \"@fullcalendar/core/locales/zh-cn\";\r\n\r\ntype EmitFn = {\r\n (event: \"update:events\", events: CalendarEvent[]): void;\r\n (event: \"event-added\", eventData: CalendarEvent): void;\r\n (event: \"event-updated\", eventData: Partial<CalendarEvent>): void;\r\n (event: \"event-deleted\", eventData: { id: string; title: string }): void;\r\n (event: \"event-dropped\", eventData: Partial<CalendarEvent>): void;\r\n};\r\n\r\nexport function useCalendarEvents(props: CalendarProps, emit: EmitFn) {\r\n const message = useMessage();\r\n const calendarRef = ref();\r\n\r\n const internalEvents = ref<CalendarEvent[]>([...(props.events ?? [])]);\r\n\r\n const showActionDialog = ref(false);\r\n const showEditModal = ref(false);\r\n const isEditing = ref(false);\r\n const selectedEvent = ref<any>(null);\r\n const editForm = ref<CalendarEditForm>({ ...DEFAULT_EDIT_FORM });\r\n\r\n const addEventToArray = (event: CalendarEvent) => {\r\n internalEvents.value = [...internalEvents.value, event];\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n const updateEventInArray = (eventData: Partial<CalendarEvent>) => {\r\n const index = internalEvents.value.findIndex((e) => e.id === eventData.id);\r\n if (index !== -1) {\r\n internalEvents.value = internalEvents.value.map((event, i) =>\r\n i === index ? { ...event, ...eventData } : event,\r\n );\r\n emit(\"update:events\", internalEvents.value);\r\n }\r\n };\r\n\r\n const removeEventFromArray = (eventId: string) => {\r\n internalEvents.value = internalEvents.value.filter((e) => e.id !== eventId);\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n function handleEventClick(info: any) {\r\n if (!props.editable) return;\r\n info.jsEvent.preventDefault();\r\n selectedEvent.value = info.event;\r\n if (props.showEditDialog) showActionDialog.value = true;\r\n }\r\n\r\n function handleDateClick(info: any) {\r\n if (!props.editable || !props.showAddDialog) return;\r\n openAddModal(new Date(info.dateStr));\r\n }\r\n\r\n function handleEventDrop(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-dropped\", payload);\r\n message.success(`事件 \"${info.event.title}\" 时间已更新`);\r\n }\r\n\r\n function handleEventResize(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-updated\", payload);\r\n }\r\n\r\n function openAddModal(date: Date) {\r\n isEditing.value = false;\r\n editForm.value = {\r\n ...DEFAULT_EDIT_FORM,\r\n date: date.getTime(),\r\n color: EVENT_COLORS[Math.floor(Math.random() * EVENT_COLORS.length)],\r\n };\r\n showEditModal.value = true;\r\n }\r\n\r\n function openEditModal() {\r\n if (!selectedEvent.value) return;\r\n isEditing.value = true;\r\n const event = selectedEvent.value;\r\n const startDate = new Date(event.start);\r\n const endDate = event.end\r\n ? new Date(event.end)\r\n : new Date(event.start.getTime() + 3600000);\r\n\r\n editForm.value = {\r\n id: event.id,\r\n title: event.title,\r\n date: startDate.getTime(),\r\n startTime: `${String(startDate.getHours()).padStart(2, \"0\")}:${String(startDate.getMinutes()).padStart(2, \"0\")}`,\r\n endTime: `${String(endDate.getHours()).padStart(2, \"0\")}:${String(endDate.getMinutes()).padStart(2, \"0\")}`,\r\n color: event.backgroundColor || \"#3f86ff\",\r\n };\r\n showActionDialog.value = false;\r\n showEditModal.value = true;\r\n }\r\n\r\n function saveEvent() {\r\n if (!editForm.value.title.trim()) {\r\n message.error(\"请输入事件标题\");\r\n return false;\r\n }\r\n if (editForm.value.startTime >= editForm.value.endTime) {\r\n message.error(\"结束时间必须晚于开始时间\");\r\n return false;\r\n }\r\n\r\n const dateStr = new Date(editForm.value.date).toISOString().split(\"T\")[0];\r\n const eventData: CalendarEvent = {\r\n id: isEditing.value ? editForm.value.id : Date.now().toString(),\r\n title: editForm.value.title,\r\n start: new Date(`${dateStr}T${editForm.value.startTime}:00`),\r\n end: new Date(`${dateStr}T${editForm.value.endTime}:00`),\r\n color: editForm.value.color,\r\n };\r\n\r\n if (isEditing.value) {\r\n updateEventInArray(eventData);\r\n emit(\"event-updated\", eventData);\r\n message.success(\"事件已更新\");\r\n } else {\r\n addEventToArray(eventData);\r\n emit(\"event-added\", eventData);\r\n message.success(\"事件已添加\");\r\n }\r\n\r\n showEditModal.value = false;\r\n return true;\r\n }\r\n\r\n function deleteEvent() {\r\n if (!selectedEvent.value) return;\r\n const { id, title } = selectedEvent.value;\r\n removeEventFromArray(id);\r\n emit(\"event-deleted\", { id, title });\r\n showActionDialog.value = false;\r\n message.success(`已删除事件: ${title}`);\r\n }\r\n\r\n const calendarOptions: Ref<CalendarOptions> = ref({\r\n plugins: [dayGridPlugin, interactionPlugin, listPlugin],\r\n locale: zhCn,\r\n initialView: props.initialView ?? \"dayGridMonth\",\r\n events: internalEvents.value as any,\r\n headerToolbar: HEADER_TOOLBAR,\r\n buttonText: BUTTON_TEXT,\r\n editable: props.editable ?? true,\r\n eventClick: handleEventClick,\r\n dateClick: handleDateClick,\r\n eventDrop: handleEventDrop,\r\n eventResize: handleEventResize,\r\n });\r\n\r\n watch(\r\n () => props.events,\r\n (newEvents) => {\r\n internalEvents.value = [...(newEvents ?? [])];\r\n },\r\n { deep: true },\r\n );\r\n\r\n watch(\r\n internalEvents,\r\n (newEvents) => {\r\n calendarOptions.value.events = newEvents as any;\r\n },\r\n { deep: true },\r\n );\r\n\r\n return {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors: EVENT_COLORS,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose: {\r\n getApi: () => calendarRef.value?.getApi(),\r\n addEvent: addEventToArray,\r\n updateEvent: updateEventInArray,\r\n deleteEvent: removeEventFromArray,\r\n getEvents: () => internalEvents.value,\r\n },\r\n };\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar ref=\"calendarRef\" :options=\"calendarOptions\" />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton type=\"error\" @click=\"deleteEvent\" size=\"small\"> 删除 </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput v-model:value=\"editForm.title\" placeholder=\"请输入事件标题\" />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n type=\"time\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n type=\"time\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NModal, NButton, NInput, NDatePicker } from \"naive-ui\";\r\nimport FullCalendar from \"@fullcalendar/vue3\";\r\nimport { useCalendarEvents } from \"./composables/useCalendarEvents\";\r\nimport type { CalendarProps, CalendarEmits, CalendarExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FullCalendar\" });\r\n\r\nconst props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: \"dayGridMonth\",\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n});\r\n\r\nconst emit = defineEmits<CalendarEmits>();\r\n\r\nconst {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n} = useCalendarEvents(props, emit);\r\n\r\ndefineExpose<CalendarExpose>(expose);\r\n</script>\r\n\r\n<style scoped>\r\n.c-full-calendar {\r\n width: 100%;\r\n}\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar ref=\"calendarRef\" :options=\"calendarOptions\" />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton type=\"error\" @click=\"deleteEvent\" size=\"small\"> 删除 </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput v-model:value=\"editForm.title\" placeholder=\"请输入事件标题\" />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n type=\"time\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n type=\"time\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NModal, NButton, NInput, NDatePicker } from \"naive-ui\";\r\nimport FullCalendar from \"@fullcalendar/vue3\";\r\nimport { useCalendarEvents } from \"./composables/useCalendarEvents\";\r\nimport type { CalendarProps, CalendarEmits, CalendarExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FullCalendar\" });\r\n\r\nconst props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: \"dayGridMonth\",\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n});\r\n\r\nconst emit = defineEmits<CalendarEmits>();\r\n\r\nconst {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n} = useCalendarEvents(props, emit);\r\n\r\ndefineExpose<CalendarExpose>(expose);\r\n</script>\r\n\r\n<style scoped>\r\n.c-full-calendar {\r\n width: 100%;\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar ref=\"calendarRef\" :options=\"calendarOptions\" />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton type=\"error\" @click=\"deleteEvent\" size=\"small\"> 删除 </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput v-model:value=\"editForm.title\" placeholder=\"请输入事件标题\" />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n type=\"time\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n type=\"time\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NModal, NButton, NInput, NDatePicker } from \"naive-ui\";\r\nimport FullCalendar from \"@fullcalendar/vue3\";\r\nimport { useCalendarEvents } from \"./composables/useCalendarEvents\";\r\nimport type { CalendarProps, CalendarEmits, CalendarExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FullCalendar\" });\r\n\r\nconst props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: \"dayGridMonth\",\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n});\r\n\r\nconst emit = defineEmits<CalendarEmits>();\r\n\r\nconst {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n} = useCalendarEvents(props, emit);\r\n\r\ndefineExpose<CalendarExpose>(expose);\r\n</script>\r\n\r\n<style scoped>\r\n.c-full-calendar {\r\n width: 100%;\r\n}\r\n</style>\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"C_FullCalendar.js","names":["dayGridPlugin","interactionPlugin","listPlugin","zhCn"],"sources":["../src/components/C_FullCalendar/data.ts","../src/components/C_FullCalendar/composables/useCalendarEvents.ts","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue"],"sourcesContent":["import type { CalendarEditForm } from \"./types\";\r\n\r\nexport const EVENT_COLORS = [\r\n \"#3f86ff\",\r\n \"#ff6b6b\",\r\n \"#67c23a\",\r\n \"#e6a23c\",\r\n \"#9c27b0\",\r\n \"#00bcd4\",\r\n \"#ff5722\",\r\n];\r\n\r\nexport const DEFAULT_EDIT_FORM: CalendarEditForm = {\r\n id: \"\",\r\n title: \"\",\r\n date: Date.now(),\r\n startTime: \"09:00\",\r\n endTime: \"10:00\",\r\n color: \"#3f86ff\",\r\n};\r\n\r\nexport const HEADER_TOOLBAR = {\r\n left: \"prev,next today\",\r\n center: \"title\",\r\n right: \"dayGridMonth,dayGridWeek,dayGridDay,listWeek\",\r\n};\r\n\r\nexport const BUTTON_TEXT = {\r\n today: \"今天\",\r\n month: \"月\",\r\n week: \"周\",\r\n day: \"日\",\r\n list: \"列表\",\r\n};\r\n","import { ref, watch } from \"vue\";\r\nimport { useMessage } from \"naive-ui\";\r\nimport type { Ref } from \"vue\";\r\nimport type { CalendarEvent, CalendarProps, CalendarEditForm } from \"../types\";\r\nimport {\r\n EVENT_COLORS,\r\n DEFAULT_EDIT_FORM,\r\n HEADER_TOOLBAR,\r\n BUTTON_TEXT,\r\n} from \"../data\";\r\nimport dayGridPlugin from \"@fullcalendar/daygrid\";\r\nimport interactionPlugin from \"@fullcalendar/interaction\";\r\nimport listPlugin from \"@fullcalendar/list\";\r\nimport type { CalendarOptions } from \"@fullcalendar/core\";\r\nimport zhCn from \"@fullcalendar/core/locales/zh-cn\";\r\n\r\ntype EmitFn = {\r\n (event: \"update:events\", events: CalendarEvent[]): void;\r\n (event: \"event-added\", eventData: CalendarEvent): void;\r\n (event: \"event-updated\", eventData: Partial<CalendarEvent>): void;\r\n (event: \"event-deleted\", eventData: { id: string; title: string }): void;\r\n (event: \"event-dropped\", eventData: Partial<CalendarEvent>): void;\r\n};\r\n\r\nexport function useCalendarEvents(props: CalendarProps, emit: EmitFn) {\r\n const message = useMessage();\r\n const calendarRef = ref();\r\n\r\n const internalEvents = ref<CalendarEvent[]>([...(props.events ?? [])]);\r\n\r\n const showActionDialog = ref(false);\r\n const showEditModal = ref(false);\r\n const isEditing = ref(false);\r\n const selectedEvent = ref<any>(null);\r\n const editForm = ref<CalendarEditForm>({ ...DEFAULT_EDIT_FORM });\r\n\r\n const addEventToArray = (event: CalendarEvent) => {\r\n internalEvents.value = [...internalEvents.value, event];\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n const updateEventInArray = (eventData: Partial<CalendarEvent>) => {\r\n const index = internalEvents.value.findIndex((e) => e.id === eventData.id);\r\n if (index !== -1) {\r\n internalEvents.value = internalEvents.value.map((event, i) =>\r\n i === index ? { ...event, ...eventData } : event,\r\n );\r\n emit(\"update:events\", internalEvents.value);\r\n }\r\n };\r\n\r\n const removeEventFromArray = (eventId: string) => {\r\n internalEvents.value = internalEvents.value.filter((e) => e.id !== eventId);\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n function handleEventClick(info: any) {\r\n if (!props.editable) return;\r\n info.jsEvent.preventDefault();\r\n selectedEvent.value = info.event;\r\n if (props.showEditDialog) showActionDialog.value = true;\r\n }\r\n\r\n function handleDateClick(info: any) {\r\n if (!props.editable || !props.showAddDialog) return;\r\n openAddModal(new Date(info.dateStr));\r\n }\r\n\r\n function handleEventDrop(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-dropped\", payload);\r\n message.success(`事件 \"${info.event.title}\" 时间已更新`);\r\n }\r\n\r\n function handleEventResize(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-updated\", payload);\r\n }\r\n\r\n function openAddModal(date: Date) {\r\n isEditing.value = false;\r\n editForm.value = {\r\n ...DEFAULT_EDIT_FORM,\r\n date: date.getTime(),\r\n color: EVENT_COLORS[Math.floor(Math.random() * EVENT_COLORS.length)],\r\n };\r\n showEditModal.value = true;\r\n }\r\n\r\n function openEditModal() {\r\n if (!selectedEvent.value) return;\r\n isEditing.value = true;\r\n const event = selectedEvent.value;\r\n const startDate = new Date(event.start);\r\n const endDate = event.end\r\n ? new Date(event.end)\r\n : new Date(event.start.getTime() + 3600000);\r\n\r\n editForm.value = {\r\n id: event.id,\r\n title: event.title,\r\n date: startDate.getTime(),\r\n startTime: `${String(startDate.getHours()).padStart(2, \"0\")}:${String(startDate.getMinutes()).padStart(2, \"0\")}`,\r\n endTime: `${String(endDate.getHours()).padStart(2, \"0\")}:${String(endDate.getMinutes()).padStart(2, \"0\")}`,\r\n color: event.backgroundColor || \"#3f86ff\",\r\n };\r\n showActionDialog.value = false;\r\n showEditModal.value = true;\r\n }\r\n\r\n function saveEvent() {\r\n if (!editForm.value.title.trim()) {\r\n message.error(\"请输入事件标题\");\r\n return false;\r\n }\r\n if (editForm.value.startTime >= editForm.value.endTime) {\r\n message.error(\"结束时间必须晚于开始时间\");\r\n return false;\r\n }\r\n\r\n const dateStr = new Date(editForm.value.date).toISOString().split(\"T\")[0];\r\n const eventData: CalendarEvent = {\r\n id: isEditing.value ? editForm.value.id : Date.now().toString(),\r\n title: editForm.value.title,\r\n start: new Date(`${dateStr}T${editForm.value.startTime}:00`),\r\n end: new Date(`${dateStr}T${editForm.value.endTime}:00`),\r\n color: editForm.value.color,\r\n };\r\n\r\n if (isEditing.value) {\r\n updateEventInArray(eventData);\r\n emit(\"event-updated\", eventData);\r\n message.success(\"事件已更新\");\r\n } else {\r\n addEventToArray(eventData);\r\n emit(\"event-added\", eventData);\r\n message.success(\"事件已添加\");\r\n }\r\n\r\n showEditModal.value = false;\r\n return true;\r\n }\r\n\r\n function deleteEvent() {\r\n if (!selectedEvent.value) return;\r\n const { id, title } = selectedEvent.value;\r\n removeEventFromArray(id);\r\n emit(\"event-deleted\", { id, title });\r\n showActionDialog.value = false;\r\n message.success(`已删除事件: ${title}`);\r\n }\r\n\r\n const calendarOptions: Ref<CalendarOptions> = ref({\r\n plugins: [dayGridPlugin, interactionPlugin, listPlugin],\r\n locale: zhCn,\r\n initialView: props.initialView ?? \"dayGridMonth\",\r\n events: internalEvents.value as any,\r\n headerToolbar: HEADER_TOOLBAR,\r\n buttonText: BUTTON_TEXT,\r\n editable: props.editable ?? true,\r\n eventClick: handleEventClick,\r\n dateClick: handleDateClick,\r\n eventDrop: handleEventDrop,\r\n eventResize: handleEventResize,\r\n });\r\n\r\n watch(\r\n () => props.events,\r\n (newEvents) => {\r\n internalEvents.value = [...(newEvents ?? [])];\r\n },\r\n { deep: true },\r\n );\r\n\r\n watch(\r\n internalEvents,\r\n (newEvents) => {\r\n calendarOptions.value.events = newEvents as any;\r\n },\r\n { deep: true },\r\n );\r\n\r\n return {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors: EVENT_COLORS,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose: {\r\n getApi: () => calendarRef.value?.getApi(),\r\n addEvent: addEventToArray,\r\n updateEvent: updateEventInArray,\r\n deleteEvent: removeEventFromArray,\r\n getEvents: () => internalEvents.value,\r\n },\r\n };\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar\r\n ref=\"calendarRef\"\r\n :options=\"calendarOptions\"\r\n />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton\r\n type=\"error\"\r\n @click=\"deleteEvent\"\r\n size=\"small\"\r\n >\r\n 删除\r\n </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.title\"\r\n placeholder=\"请输入事件标题\"\r\n />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NModal, NButton, NInput, NDatePicker } from 'naive-ui'\r\n import FullCalendar from '@fullcalendar/vue3'\r\n import { useCalendarEvents } from './composables/useCalendarEvents'\r\n import type { CalendarProps, CalendarEmits, CalendarExpose } from './types'\r\n\r\n defineOptions({ name: 'C_FullCalendar' })\r\n\r\n const props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: 'dayGridMonth',\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n })\r\n\r\n const emit = defineEmits<CalendarEmits>()\r\n\r\n const {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n } = useCalendarEvents(props, emit)\r\n\r\n defineExpose<CalendarExpose>(expose)\r\n</script>\r\n\r\n<style scoped>\r\n .c-full-calendar {\r\n width: 100%;\r\n }\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar\r\n ref=\"calendarRef\"\r\n :options=\"calendarOptions\"\r\n />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton\r\n type=\"error\"\r\n @click=\"deleteEvent\"\r\n size=\"small\"\r\n >\r\n 删除\r\n </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.title\"\r\n placeholder=\"请输入事件标题\"\r\n />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NModal, NButton, NInput, NDatePicker } from 'naive-ui'\r\n import FullCalendar from '@fullcalendar/vue3'\r\n import { useCalendarEvents } from './composables/useCalendarEvents'\r\n import type { CalendarProps, CalendarEmits, CalendarExpose } from './types'\r\n\r\n defineOptions({ name: 'C_FullCalendar' })\r\n\r\n const props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: 'dayGridMonth',\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n })\r\n\r\n const emit = defineEmits<CalendarEmits>()\r\n\r\n const {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n } = useCalendarEvents(props, emit)\r\n\r\n defineExpose<CalendarExpose>(expose)\r\n</script>\r\n\r\n<style scoped>\r\n .c-full-calendar {\r\n width: 100%;\r\n }\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar\r\n ref=\"calendarRef\"\r\n :options=\"calendarOptions\"\r\n />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton\r\n type=\"error\"\r\n @click=\"deleteEvent\"\r\n size=\"small\"\r\n >\r\n 删除\r\n </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.title\"\r\n placeholder=\"请输入事件标题\"\r\n />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NModal, NButton, NInput, NDatePicker } from 'naive-ui'\r\n import FullCalendar from '@fullcalendar/vue3'\r\n import { useCalendarEvents } from './composables/useCalendarEvents'\r\n import type { CalendarProps, CalendarEmits, CalendarExpose } from './types'\r\n\r\n defineOptions({ name: 'C_FullCalendar' })\r\n\r\n const props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: 'dayGridMonth',\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n })\r\n\r\n const emit = defineEmits<CalendarEmits>()\r\n\r\n const {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n } = useCalendarEvents(props, emit)\r\n\r\n defineExpose<CalendarExpose>(expose)\r\n</script>\r\n\r\n<style scoped>\r\n .c-full-calendar {\r\n width: 100%;\r\n }\r\n</style>\r\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./export-helper.js";import{NButton as t,NDatePicker as n,NInput as r,NModal as i,useMessage as a}from"naive-ui";import{Fragment as o,createBlock as s,createCommentVNode as c,createElementBlock as l,createElementVNode as u,createTextVNode as d,createVNode as f,defineComponent as p,isRef as m,normalizeStyle as h,openBlock as g,ref as _,renderList as v,unref as y,watch as b,withCtx as x}from"vue";import S from"@fullcalendar/vue3";import C from"@fullcalendar/daygrid";import w from"@fullcalendar/interaction";import T from"@fullcalendar/list";import E from"@fullcalendar/core/locales/zh-cn";const D=[`#3f86ff`,`#ff6b6b`,`#67c23a`,`#e6a23c`,`#9c27b0`,`#00bcd4`,`#ff5722`],O={id:``,title:``,date:Date.now(),startTime:`09:00`,endTime:`10:00`,color:`#3f86ff`},k={left:`prev,next today`,center:`title`,right:`dayGridMonth,dayGridWeek,dayGridDay,listWeek`},A={today:`今天`,month:`月`,week:`周`,day:`日`,list:`列表`};function j(e,t){let n=a(),r=_(),i=_([...e.events??[]]),o=_(!1),s=_(!1),c=_(!1),l=_(null),u=_({...O}),d=e=>{i.value=[...i.value,e],t(`update:events`,i.value)},f=e=>{let n=i.value.findIndex(t=>t.id===e.id);n!==-1&&(i.value=i.value.map((t,r)=>r===n?{...t,...e}:t),t(`update:events`,i.value))},p=e=>{i.value=i.value.filter(t=>t.id!==e),t(`update:events`,i.value)};function m(t){e.editable&&(t.jsEvent.preventDefault(),l.value=t.event,e.showEditDialog&&(o.value=!0))}function h(t){!e.editable||!e.showAddDialog||y(new Date(t.dateStr))}function g(e){let r={id:e.event.id,start:e.event.start,end:e.event.end};f(r),t(`event-dropped`,r),n.success(`事件 "${e.event.title}" 时间已更新`)}function v(e){let n={id:e.event.id,start:e.event.start,end:e.event.end};f(n),t(`event-updated`,n)}function y(e){c.value=!1,u.value={...O,date:e.getTime(),color:D[Math.floor(Math.random()*D.length)]},s.value=!0}function x(){if(!l.value)return;c.value=!0;let e=l.value,t=new Date(e.start),n=e.end?new Date(e.end):new Date(e.start.getTime()+36e5);u.value={id:e.id,title:e.title,date:t.getTime(),startTime:`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`,endTime:`${String(n.getHours()).padStart(2,`0`)}:${String(n.getMinutes()).padStart(2,`0`)}`,color:e.backgroundColor||`#3f86ff`},o.value=!1,s.value=!0}function S(){if(!u.value.title.trim())return n.error(`请输入事件标题`),!1;if(u.value.startTime>=u.value.endTime)return n.error(`结束时间必须晚于开始时间`),!1;let e=new Date(u.value.date).toISOString().split(`T`)[0],r={id:c.value?u.value.id:Date.now().toString(),title:u.value.title,start:new Date(`${e}T${u.value.startTime}:00`),end:new Date(`${e}T${u.value.endTime}:00`),color:u.value.color};return c.value?(f(r),t(`event-updated`,r),n.success(`事件已更新`)):(d(r),t(`event-added`,r),n.success(`事件已添加`)),s.value=!1,!0}function j(){if(!l.value)return;let{id:e,title:r}=l.value;p(e),t(`event-deleted`,{id:e,title:r}),o.value=!1,n.success(`已删除事件: ${r}`)}let M=_({plugins:[C,w,T],locale:E,initialView:e.initialView??`dayGridMonth`,events:i.value,headerToolbar:k,buttonText:A,editable:e.editable??!0,eventClick:m,dateClick:h,eventDrop:g,eventResize:v});return b(()=>e.events,e=>{i.value=[...e??[]]},{deep:!0}),b(i,e=>{M.value.events=e},{deep:!0}),{calendarRef:r,calendarOptions:M,showActionDialog:o,showEditModal:s,isEditing:c,selectedEvent:l,editForm:u,eventColors:D,openEditModal:x,saveEvent:S,deleteEvent:j,expose:{getApi:()=>r.value?.getApi(),addEvent:d,updateEvent:f,deleteEvent:p,getEvents:()=>i.value}}}const M={class:`c-full-calendar`},N={class:`ml-10% mt-20px`},P={style:{padding:`20px`}},F={style:{"margin-bottom":`16px`}},I={style:{"margin-bottom":`16px`}},L={style:{display:`grid`,"grid-template-columns":`1fr 1fr`,gap:`16px`}},R={style:{"margin-top":`16px`}},z={style:{display:`flex`,gap:`8px`}},B=[`onClick`];var V=e(p({name:`C_FullCalendar`,__name:`index`,props:{events:{default:()=>[]},initialView:{default:`dayGridMonth`},editable:{type:Boolean,default:!0},showAddDialog:{type:Boolean,default:!0},showEditDialog:{type:Boolean,default:!0}},emits:[`update:events`,`event-added`,`event-updated`,`event-deleted`,`event-dropped`],setup(e,{expose:a,emit:p}){let{calendarRef:_,calendarOptions:b,showActionDialog:C,showEditModal:w,isEditing:T,selectedEvent:E,editForm:D,eventColors:O,openEditModal:k,saveEvent:A,deleteEvent:V,expose:H}=j(e,p);return a(H),(e,a)=>(g(),l(`div`,M,[f(y(S),{ref_key:`calendarRef`,ref:_,options:y(b)},null,8,[`options`]),y(C)?(g(),s(y(i),{key:0,show:y(C),"onUpdate:show":a[0]||=e=>m(C)?C.value=e:null,preset:`dialog`,title:`事件操作 - ${y(E)?.title}`,style:{width:`400px`}},{default:x(()=>[u(`div`,N,[f(y(t),{type:`primary`,onClick:y(k),style:{"margin-right":`12px`},size:`small`},{default:x(()=>a[6]||=[d(` 编辑 `,-1)]),_:1,__:[6]},8,[`onClick`]),f(y(t),{type:`error`,onClick:y(V),size:`small`},{default:x(()=>a[7]||=[d(` 删除 `,-1)]),_:1,__:[7]},8,[`onClick`])])]),_:1},8,[`show`,`title`])):c(`v-if`,!0),f(y(i),{show:y(w),"onUpdate:show":a[5]||=e=>m(w)?w.value=e:null,preset:`dialog`,title:y(T)?`编辑事件`:`添加事件`,"positive-text":`保存`,"negative-text":`取消`,onPositiveClick:y(A)},{default:x(()=>[u(`div`,P,[u(`div`,F,[a[8]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`事件标题`,-1),f(y(r),{value:y(D).title,"onUpdate:value":a[1]||=e=>y(D).title=e,placeholder:`请输入事件标题`},null,8,[`value`])]),u(`div`,I,[a[9]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`事件日期`,-1),f(y(n),{value:y(D).date,"onUpdate:value":a[2]||=e=>y(D).date=e,type:`date`,format:`yyyy-MM-dd`,style:{width:`100%`}},null,8,[`value`])]),u(`div`,L,[u(`div`,null,[a[10]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`开始时间`,-1),f(y(r),{value:y(D).startTime,"onUpdate:value":a[3]||=e=>y(D).startTime=e,type:`time`,placeholder:`09:00`},null,8,[`value`])]),u(`div`,null,[a[11]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`结束时间`,-1),f(y(r),{value:y(D).endTime,"onUpdate:value":a[4]||=e=>y(D).endTime=e,type:`time`,placeholder:`10:00`},null,8,[`value`])])]),u(`div`,R,[a[12]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`事件颜色`,-1),u(`div`,z,[(g(!0),l(o,null,v(y(O),e=>(g(),l(`div`,{key:e,style:h({width:`30px`,height:`30px`,backgroundColor:e,borderRadius:`50%`,cursor:`pointer`,border:y(D).color===e?`3px solid #000`:`2px solid #ddd`}),onClick:t=>y(D).color=e},null,12,B))),128))])])])]),_:1},8,[`show`,`title`,`onPositiveClick`])]))}}),[[`__scopeId`,`data-v-f993af8f`]]);export{D as a,O as i,j as n,k as o,A as r,V as t};
1
+ import{t as e}from"./export-helper.js";import{NButton as t,NDatePicker as n,NInput as r,NModal as i,useMessage as a}from"naive-ui";import{Fragment as o,createBlock as s,createCommentVNode as c,createElementBlock as l,createElementVNode as u,createTextVNode as d,createVNode as f,defineComponent as p,isRef as m,normalizeStyle as h,openBlock as g,ref as _,renderList as v,unref as y,watch as b,withCtx as x}from"vue";import S from"@fullcalendar/vue3";import C from"@fullcalendar/daygrid";import w from"@fullcalendar/interaction";import T from"@fullcalendar/list";import E from"@fullcalendar/core/locales/zh-cn";const D=[`#3f86ff`,`#ff6b6b`,`#67c23a`,`#e6a23c`,`#9c27b0`,`#00bcd4`,`#ff5722`],O={id:``,title:``,date:Date.now(),startTime:`09:00`,endTime:`10:00`,color:`#3f86ff`},k={left:`prev,next today`,center:`title`,right:`dayGridMonth,dayGridWeek,dayGridDay,listWeek`},A={today:`今天`,month:`月`,week:`周`,day:`日`,list:`列表`};function j(e,t){let n=a(),r=_(),i=_([...e.events??[]]),o=_(!1),s=_(!1),c=_(!1),l=_(null),u=_({...O}),d=e=>{i.value=[...i.value,e],t(`update:events`,i.value)},f=e=>{let n=i.value.findIndex(t=>t.id===e.id);n!==-1&&(i.value=i.value.map((t,r)=>r===n?{...t,...e}:t),t(`update:events`,i.value))},p=e=>{i.value=i.value.filter(t=>t.id!==e),t(`update:events`,i.value)};function m(t){e.editable&&(t.jsEvent.preventDefault(),l.value=t.event,e.showEditDialog&&(o.value=!0))}function h(t){!e.editable||!e.showAddDialog||y(new Date(t.dateStr))}function g(e){let r={id:e.event.id,start:e.event.start,end:e.event.end};f(r),t(`event-dropped`,r),n.success(`事件 "${e.event.title}" 时间已更新`)}function v(e){let n={id:e.event.id,start:e.event.start,end:e.event.end};f(n),t(`event-updated`,n)}function y(e){c.value=!1,u.value={...O,date:e.getTime(),color:D[Math.floor(Math.random()*D.length)]},s.value=!0}function x(){if(!l.value)return;c.value=!0;let e=l.value,t=new Date(e.start),n=e.end?new Date(e.end):new Date(e.start.getTime()+36e5);u.value={id:e.id,title:e.title,date:t.getTime(),startTime:`${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`,endTime:`${String(n.getHours()).padStart(2,`0`)}:${String(n.getMinutes()).padStart(2,`0`)}`,color:e.backgroundColor||`#3f86ff`},o.value=!1,s.value=!0}function S(){if(!u.value.title.trim())return n.error(`请输入事件标题`),!1;if(u.value.startTime>=u.value.endTime)return n.error(`结束时间必须晚于开始时间`),!1;let e=new Date(u.value.date).toISOString().split(`T`)[0],r={id:c.value?u.value.id:Date.now().toString(),title:u.value.title,start:new Date(`${e}T${u.value.startTime}:00`),end:new Date(`${e}T${u.value.endTime}:00`),color:u.value.color};return c.value?(f(r),t(`event-updated`,r),n.success(`事件已更新`)):(d(r),t(`event-added`,r),n.success(`事件已添加`)),s.value=!1,!0}function j(){if(!l.value)return;let{id:e,title:r}=l.value;p(e),t(`event-deleted`,{id:e,title:r}),o.value=!1,n.success(`已删除事件: ${r}`)}let M=_({plugins:[C,w,T],locale:E,initialView:e.initialView??`dayGridMonth`,events:i.value,headerToolbar:k,buttonText:A,editable:e.editable??!0,eventClick:m,dateClick:h,eventDrop:g,eventResize:v});return b(()=>e.events,e=>{i.value=[...e??[]]},{deep:!0}),b(i,e=>{M.value.events=e},{deep:!0}),{calendarRef:r,calendarOptions:M,showActionDialog:o,showEditModal:s,isEditing:c,selectedEvent:l,editForm:u,eventColors:D,openEditModal:x,saveEvent:S,deleteEvent:j,expose:{getApi:()=>r.value?.getApi(),addEvent:d,updateEvent:f,deleteEvent:p,getEvents:()=>i.value}}}const M={class:`c-full-calendar`},N={class:`ml-10% mt-20px`},P={style:{padding:`20px`}},F={style:{"margin-bottom":`16px`}},I={style:{"margin-bottom":`16px`}},L={style:{display:`grid`,"grid-template-columns":`1fr 1fr`,gap:`16px`}},R={style:{"margin-top":`16px`}},z={style:{display:`flex`,gap:`8px`}},B=[`onClick`];var V=e(p({name:`C_FullCalendar`,__name:`index`,props:{events:{default:()=>[]},initialView:{default:`dayGridMonth`},editable:{type:Boolean,default:!0},showAddDialog:{type:Boolean,default:!0},showEditDialog:{type:Boolean,default:!0}},emits:[`update:events`,`event-added`,`event-updated`,`event-deleted`,`event-dropped`],setup(e,{expose:a,emit:p}){let{calendarRef:_,calendarOptions:b,showActionDialog:C,showEditModal:w,isEditing:T,selectedEvent:E,editForm:D,eventColors:O,openEditModal:k,saveEvent:A,deleteEvent:V,expose:H}=j(e,p);return a(H),(e,a)=>(g(),l(`div`,M,[f(y(S),{ref_key:`calendarRef`,ref:_,options:y(b)},null,8,[`options`]),y(C)?(g(),s(y(i),{key:0,show:y(C),"onUpdate:show":a[0]||=e=>m(C)?C.value=e:null,preset:`dialog`,title:`事件操作 - ${y(E)?.title}`,style:{width:`400px`}},{default:x(()=>[u(`div`,N,[f(y(t),{type:`primary`,onClick:y(k),style:{"margin-right":`12px`},size:`small`},{default:x(()=>a[6]||=[d(` 编辑 `,-1)]),_:1,__:[6]},8,[`onClick`]),f(y(t),{type:`error`,onClick:y(V),size:`small`},{default:x(()=>a[7]||=[d(` 删除 `,-1)]),_:1,__:[7]},8,[`onClick`])])]),_:1},8,[`show`,`title`])):c(`v-if`,!0),f(y(i),{show:y(w),"onUpdate:show":a[5]||=e=>m(w)?w.value=e:null,preset:`dialog`,title:y(T)?`编辑事件`:`添加事件`,"positive-text":`保存`,"negative-text":`取消`,onPositiveClick:y(A)},{default:x(()=>[u(`div`,P,[u(`div`,F,[a[8]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`事件标题`,-1),f(y(r),{value:y(D).title,"onUpdate:value":a[1]||=e=>y(D).title=e,placeholder:`请输入事件标题`},null,8,[`value`])]),u(`div`,I,[a[9]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`事件日期`,-1),f(y(n),{value:y(D).date,"onUpdate:value":a[2]||=e=>y(D).date=e,type:`date`,format:`yyyy-MM-dd`,style:{width:`100%`}},null,8,[`value`])]),u(`div`,L,[u(`div`,null,[a[10]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`开始时间`,-1),f(y(r),{value:y(D).startTime,"onUpdate:value":a[3]||=e=>y(D).startTime=e,placeholder:`09:00`},null,8,[`value`])]),u(`div`,null,[a[11]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`结束时间`,-1),f(y(r),{value:y(D).endTime,"onUpdate:value":a[4]||=e=>y(D).endTime=e,placeholder:`10:00`},null,8,[`value`])])]),u(`div`,R,[a[12]||=u(`label`,{style:{display:`block`,"margin-bottom":`8px`,"font-weight":`500`}},`事件颜色`,-1),u(`div`,z,[(g(!0),l(o,null,v(y(O),e=>(g(),l(`div`,{key:e,style:h({width:`30px`,height:`30px`,backgroundColor:e,borderRadius:`50%`,cursor:`pointer`,border:y(D).color===e?`3px solid #000`:`2px solid #ddd`}),onClick:t=>y(D).color=e},null,12,B))),128))])])])]),_:1},8,[`show`,`title`,`onPositiveClick`])]))}}),[[`__scopeId`,`data-v-b00ec52e`]]);export{D as a,O as i,j as n,k as o,A as r,V as t};
2
2
  //# sourceMappingURL=C_FullCalendar2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"C_FullCalendar2.js","names":[],"sources":["../src/components/C_FullCalendar/data.ts","../src/components/C_FullCalendar/composables/useCalendarEvents.ts","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue"],"sourcesContent":["import type { CalendarEditForm } from \"./types\";\r\n\r\nexport const EVENT_COLORS = [\r\n \"#3f86ff\",\r\n \"#ff6b6b\",\r\n \"#67c23a\",\r\n \"#e6a23c\",\r\n \"#9c27b0\",\r\n \"#00bcd4\",\r\n \"#ff5722\",\r\n];\r\n\r\nexport const DEFAULT_EDIT_FORM: CalendarEditForm = {\r\n id: \"\",\r\n title: \"\",\r\n date: Date.now(),\r\n startTime: \"09:00\",\r\n endTime: \"10:00\",\r\n color: \"#3f86ff\",\r\n};\r\n\r\nexport const HEADER_TOOLBAR = {\r\n left: \"prev,next today\",\r\n center: \"title\",\r\n right: \"dayGridMonth,dayGridWeek,dayGridDay,listWeek\",\r\n};\r\n\r\nexport const BUTTON_TEXT = {\r\n today: \"今天\",\r\n month: \"月\",\r\n week: \"周\",\r\n day: \"日\",\r\n list: \"列表\",\r\n};\r\n","import { ref, watch } from \"vue\";\r\nimport { useMessage } from \"naive-ui\";\r\nimport type { Ref } from \"vue\";\r\nimport type { CalendarEvent, CalendarProps, CalendarEditForm } from \"../types\";\r\nimport {\r\n EVENT_COLORS,\r\n DEFAULT_EDIT_FORM,\r\n HEADER_TOOLBAR,\r\n BUTTON_TEXT,\r\n} from \"../data\";\r\nimport dayGridPlugin from \"@fullcalendar/daygrid\";\r\nimport interactionPlugin from \"@fullcalendar/interaction\";\r\nimport listPlugin from \"@fullcalendar/list\";\r\nimport type { CalendarOptions } from \"@fullcalendar/core\";\r\nimport zhCn from \"@fullcalendar/core/locales/zh-cn\";\r\n\r\ntype EmitFn = {\r\n (event: \"update:events\", events: CalendarEvent[]): void;\r\n (event: \"event-added\", eventData: CalendarEvent): void;\r\n (event: \"event-updated\", eventData: Partial<CalendarEvent>): void;\r\n (event: \"event-deleted\", eventData: { id: string; title: string }): void;\r\n (event: \"event-dropped\", eventData: Partial<CalendarEvent>): void;\r\n};\r\n\r\nexport function useCalendarEvents(props: CalendarProps, emit: EmitFn) {\r\n const message = useMessage();\r\n const calendarRef = ref();\r\n\r\n const internalEvents = ref<CalendarEvent[]>([...(props.events ?? [])]);\r\n\r\n const showActionDialog = ref(false);\r\n const showEditModal = ref(false);\r\n const isEditing = ref(false);\r\n const selectedEvent = ref<any>(null);\r\n const editForm = ref<CalendarEditForm>({ ...DEFAULT_EDIT_FORM });\r\n\r\n const addEventToArray = (event: CalendarEvent) => {\r\n internalEvents.value = [...internalEvents.value, event];\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n const updateEventInArray = (eventData: Partial<CalendarEvent>) => {\r\n const index = internalEvents.value.findIndex((e) => e.id === eventData.id);\r\n if (index !== -1) {\r\n internalEvents.value = internalEvents.value.map((event, i) =>\r\n i === index ? { ...event, ...eventData } : event,\r\n );\r\n emit(\"update:events\", internalEvents.value);\r\n }\r\n };\r\n\r\n const removeEventFromArray = (eventId: string) => {\r\n internalEvents.value = internalEvents.value.filter((e) => e.id !== eventId);\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n function handleEventClick(info: any) {\r\n if (!props.editable) return;\r\n info.jsEvent.preventDefault();\r\n selectedEvent.value = info.event;\r\n if (props.showEditDialog) showActionDialog.value = true;\r\n }\r\n\r\n function handleDateClick(info: any) {\r\n if (!props.editable || !props.showAddDialog) return;\r\n openAddModal(new Date(info.dateStr));\r\n }\r\n\r\n function handleEventDrop(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-dropped\", payload);\r\n message.success(`事件 \"${info.event.title}\" 时间已更新`);\r\n }\r\n\r\n function handleEventResize(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-updated\", payload);\r\n }\r\n\r\n function openAddModal(date: Date) {\r\n isEditing.value = false;\r\n editForm.value = {\r\n ...DEFAULT_EDIT_FORM,\r\n date: date.getTime(),\r\n color: EVENT_COLORS[Math.floor(Math.random() * EVENT_COLORS.length)],\r\n };\r\n showEditModal.value = true;\r\n }\r\n\r\n function openEditModal() {\r\n if (!selectedEvent.value) return;\r\n isEditing.value = true;\r\n const event = selectedEvent.value;\r\n const startDate = new Date(event.start);\r\n const endDate = event.end\r\n ? new Date(event.end)\r\n : new Date(event.start.getTime() + 3600000);\r\n\r\n editForm.value = {\r\n id: event.id,\r\n title: event.title,\r\n date: startDate.getTime(),\r\n startTime: `${String(startDate.getHours()).padStart(2, \"0\")}:${String(startDate.getMinutes()).padStart(2, \"0\")}`,\r\n endTime: `${String(endDate.getHours()).padStart(2, \"0\")}:${String(endDate.getMinutes()).padStart(2, \"0\")}`,\r\n color: event.backgroundColor || \"#3f86ff\",\r\n };\r\n showActionDialog.value = false;\r\n showEditModal.value = true;\r\n }\r\n\r\n function saveEvent() {\r\n if (!editForm.value.title.trim()) {\r\n message.error(\"请输入事件标题\");\r\n return false;\r\n }\r\n if (editForm.value.startTime >= editForm.value.endTime) {\r\n message.error(\"结束时间必须晚于开始时间\");\r\n return false;\r\n }\r\n\r\n const dateStr = new Date(editForm.value.date).toISOString().split(\"T\")[0];\r\n const eventData: CalendarEvent = {\r\n id: isEditing.value ? editForm.value.id : Date.now().toString(),\r\n title: editForm.value.title,\r\n start: new Date(`${dateStr}T${editForm.value.startTime}:00`),\r\n end: new Date(`${dateStr}T${editForm.value.endTime}:00`),\r\n color: editForm.value.color,\r\n };\r\n\r\n if (isEditing.value) {\r\n updateEventInArray(eventData);\r\n emit(\"event-updated\", eventData);\r\n message.success(\"事件已更新\");\r\n } else {\r\n addEventToArray(eventData);\r\n emit(\"event-added\", eventData);\r\n message.success(\"事件已添加\");\r\n }\r\n\r\n showEditModal.value = false;\r\n return true;\r\n }\r\n\r\n function deleteEvent() {\r\n if (!selectedEvent.value) return;\r\n const { id, title } = selectedEvent.value;\r\n removeEventFromArray(id);\r\n emit(\"event-deleted\", { id, title });\r\n showActionDialog.value = false;\r\n message.success(`已删除事件: ${title}`);\r\n }\r\n\r\n const calendarOptions: Ref<CalendarOptions> = ref({\r\n plugins: [dayGridPlugin, interactionPlugin, listPlugin],\r\n locale: zhCn,\r\n initialView: props.initialView ?? \"dayGridMonth\",\r\n events: internalEvents.value as any,\r\n headerToolbar: HEADER_TOOLBAR,\r\n buttonText: BUTTON_TEXT,\r\n editable: props.editable ?? true,\r\n eventClick: handleEventClick,\r\n dateClick: handleDateClick,\r\n eventDrop: handleEventDrop,\r\n eventResize: handleEventResize,\r\n });\r\n\r\n watch(\r\n () => props.events,\r\n (newEvents) => {\r\n internalEvents.value = [...(newEvents ?? [])];\r\n },\r\n { deep: true },\r\n );\r\n\r\n watch(\r\n internalEvents,\r\n (newEvents) => {\r\n calendarOptions.value.events = newEvents as any;\r\n },\r\n { deep: true },\r\n );\r\n\r\n return {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors: EVENT_COLORS,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose: {\r\n getApi: () => calendarRef.value?.getApi(),\r\n addEvent: addEventToArray,\r\n updateEvent: updateEventInArray,\r\n deleteEvent: removeEventFromArray,\r\n getEvents: () => internalEvents.value,\r\n },\r\n };\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar ref=\"calendarRef\" :options=\"calendarOptions\" />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton type=\"error\" @click=\"deleteEvent\" size=\"small\"> 删除 </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput v-model:value=\"editForm.title\" placeholder=\"请输入事件标题\" />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n type=\"time\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n type=\"time\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NModal, NButton, NInput, NDatePicker } from \"naive-ui\";\r\nimport FullCalendar from \"@fullcalendar/vue3\";\r\nimport { useCalendarEvents } from \"./composables/useCalendarEvents\";\r\nimport type { CalendarProps, CalendarEmits, CalendarExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FullCalendar\" });\r\n\r\nconst props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: \"dayGridMonth\",\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n});\r\n\r\nconst emit = defineEmits<CalendarEmits>();\r\n\r\nconst {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n} = useCalendarEvents(props, emit);\r\n\r\ndefineExpose<CalendarExpose>(expose);\r\n</script>\r\n\r\n<style scoped>\r\n.c-full-calendar {\r\n width: 100%;\r\n}\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar ref=\"calendarRef\" :options=\"calendarOptions\" />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton type=\"error\" @click=\"deleteEvent\" size=\"small\"> 删除 </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput v-model:value=\"editForm.title\" placeholder=\"请输入事件标题\" />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n type=\"time\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n type=\"time\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NModal, NButton, NInput, NDatePicker } from \"naive-ui\";\r\nimport FullCalendar from \"@fullcalendar/vue3\";\r\nimport { useCalendarEvents } from \"./composables/useCalendarEvents\";\r\nimport type { CalendarProps, CalendarEmits, CalendarExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FullCalendar\" });\r\n\r\nconst props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: \"dayGridMonth\",\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n});\r\n\r\nconst emit = defineEmits<CalendarEmits>();\r\n\r\nconst {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n} = useCalendarEvents(props, emit);\r\n\r\ndefineExpose<CalendarExpose>(expose);\r\n</script>\r\n\r\n<style scoped>\r\n.c-full-calendar {\r\n width: 100%;\r\n}\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar ref=\"calendarRef\" :options=\"calendarOptions\" />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton type=\"error\" @click=\"deleteEvent\" size=\"small\"> 删除 </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput v-model:value=\"editForm.title\" placeholder=\"请输入事件标题\" />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n type=\"time\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n type=\"time\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { NModal, NButton, NInput, NDatePicker } from \"naive-ui\";\r\nimport FullCalendar from \"@fullcalendar/vue3\";\r\nimport { useCalendarEvents } from \"./composables/useCalendarEvents\";\r\nimport type { CalendarProps, CalendarEmits, CalendarExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FullCalendar\" });\r\n\r\nconst props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: \"dayGridMonth\",\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n});\r\n\r\nconst emit = defineEmits<CalendarEmits>();\r\n\r\nconst {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n} = useCalendarEvents(props, emit);\r\n\r\ndefineExpose<CalendarExpose>(expose);\r\n</script>\r\n\r\n<style scoped>\r\n.c-full-calendar {\r\n width: 100%;\r\n}\r\n</style>\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"C_FullCalendar2.js","names":[],"sources":["../src/components/C_FullCalendar/data.ts","../src/components/C_FullCalendar/composables/useCalendarEvents.ts","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue","../src/components/C_FullCalendar/index.vue"],"sourcesContent":["import type { CalendarEditForm } from \"./types\";\r\n\r\nexport const EVENT_COLORS = [\r\n \"#3f86ff\",\r\n \"#ff6b6b\",\r\n \"#67c23a\",\r\n \"#e6a23c\",\r\n \"#9c27b0\",\r\n \"#00bcd4\",\r\n \"#ff5722\",\r\n];\r\n\r\nexport const DEFAULT_EDIT_FORM: CalendarEditForm = {\r\n id: \"\",\r\n title: \"\",\r\n date: Date.now(),\r\n startTime: \"09:00\",\r\n endTime: \"10:00\",\r\n color: \"#3f86ff\",\r\n};\r\n\r\nexport const HEADER_TOOLBAR = {\r\n left: \"prev,next today\",\r\n center: \"title\",\r\n right: \"dayGridMonth,dayGridWeek,dayGridDay,listWeek\",\r\n};\r\n\r\nexport const BUTTON_TEXT = {\r\n today: \"今天\",\r\n month: \"月\",\r\n week: \"周\",\r\n day: \"日\",\r\n list: \"列表\",\r\n};\r\n","import { ref, watch } from \"vue\";\r\nimport { useMessage } from \"naive-ui\";\r\nimport type { Ref } from \"vue\";\r\nimport type { CalendarEvent, CalendarProps, CalendarEditForm } from \"../types\";\r\nimport {\r\n EVENT_COLORS,\r\n DEFAULT_EDIT_FORM,\r\n HEADER_TOOLBAR,\r\n BUTTON_TEXT,\r\n} from \"../data\";\r\nimport dayGridPlugin from \"@fullcalendar/daygrid\";\r\nimport interactionPlugin from \"@fullcalendar/interaction\";\r\nimport listPlugin from \"@fullcalendar/list\";\r\nimport type { CalendarOptions } from \"@fullcalendar/core\";\r\nimport zhCn from \"@fullcalendar/core/locales/zh-cn\";\r\n\r\ntype EmitFn = {\r\n (event: \"update:events\", events: CalendarEvent[]): void;\r\n (event: \"event-added\", eventData: CalendarEvent): void;\r\n (event: \"event-updated\", eventData: Partial<CalendarEvent>): void;\r\n (event: \"event-deleted\", eventData: { id: string; title: string }): void;\r\n (event: \"event-dropped\", eventData: Partial<CalendarEvent>): void;\r\n};\r\n\r\nexport function useCalendarEvents(props: CalendarProps, emit: EmitFn) {\r\n const message = useMessage();\r\n const calendarRef = ref();\r\n\r\n const internalEvents = ref<CalendarEvent[]>([...(props.events ?? [])]);\r\n\r\n const showActionDialog = ref(false);\r\n const showEditModal = ref(false);\r\n const isEditing = ref(false);\r\n const selectedEvent = ref<any>(null);\r\n const editForm = ref<CalendarEditForm>({ ...DEFAULT_EDIT_FORM });\r\n\r\n const addEventToArray = (event: CalendarEvent) => {\r\n internalEvents.value = [...internalEvents.value, event];\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n const updateEventInArray = (eventData: Partial<CalendarEvent>) => {\r\n const index = internalEvents.value.findIndex((e) => e.id === eventData.id);\r\n if (index !== -1) {\r\n internalEvents.value = internalEvents.value.map((event, i) =>\r\n i === index ? { ...event, ...eventData } : event,\r\n );\r\n emit(\"update:events\", internalEvents.value);\r\n }\r\n };\r\n\r\n const removeEventFromArray = (eventId: string) => {\r\n internalEvents.value = internalEvents.value.filter((e) => e.id !== eventId);\r\n emit(\"update:events\", internalEvents.value);\r\n };\r\n\r\n function handleEventClick(info: any) {\r\n if (!props.editable) return;\r\n info.jsEvent.preventDefault();\r\n selectedEvent.value = info.event;\r\n if (props.showEditDialog) showActionDialog.value = true;\r\n }\r\n\r\n function handleDateClick(info: any) {\r\n if (!props.editable || !props.showAddDialog) return;\r\n openAddModal(new Date(info.dateStr));\r\n }\r\n\r\n function handleEventDrop(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-dropped\", payload);\r\n message.success(`事件 \"${info.event.title}\" 时间已更新`);\r\n }\r\n\r\n function handleEventResize(info: any) {\r\n const payload = {\r\n id: info.event.id,\r\n start: info.event.start,\r\n end: info.event.end,\r\n };\r\n updateEventInArray(payload);\r\n emit(\"event-updated\", payload);\r\n }\r\n\r\n function openAddModal(date: Date) {\r\n isEditing.value = false;\r\n editForm.value = {\r\n ...DEFAULT_EDIT_FORM,\r\n date: date.getTime(),\r\n color: EVENT_COLORS[Math.floor(Math.random() * EVENT_COLORS.length)],\r\n };\r\n showEditModal.value = true;\r\n }\r\n\r\n function openEditModal() {\r\n if (!selectedEvent.value) return;\r\n isEditing.value = true;\r\n const event = selectedEvent.value;\r\n const startDate = new Date(event.start);\r\n const endDate = event.end\r\n ? new Date(event.end)\r\n : new Date(event.start.getTime() + 3600000);\r\n\r\n editForm.value = {\r\n id: event.id,\r\n title: event.title,\r\n date: startDate.getTime(),\r\n startTime: `${String(startDate.getHours()).padStart(2, \"0\")}:${String(startDate.getMinutes()).padStart(2, \"0\")}`,\r\n endTime: `${String(endDate.getHours()).padStart(2, \"0\")}:${String(endDate.getMinutes()).padStart(2, \"0\")}`,\r\n color: event.backgroundColor || \"#3f86ff\",\r\n };\r\n showActionDialog.value = false;\r\n showEditModal.value = true;\r\n }\r\n\r\n function saveEvent() {\r\n if (!editForm.value.title.trim()) {\r\n message.error(\"请输入事件标题\");\r\n return false;\r\n }\r\n if (editForm.value.startTime >= editForm.value.endTime) {\r\n message.error(\"结束时间必须晚于开始时间\");\r\n return false;\r\n }\r\n\r\n const dateStr = new Date(editForm.value.date).toISOString().split(\"T\")[0];\r\n const eventData: CalendarEvent = {\r\n id: isEditing.value ? editForm.value.id : Date.now().toString(),\r\n title: editForm.value.title,\r\n start: new Date(`${dateStr}T${editForm.value.startTime}:00`),\r\n end: new Date(`${dateStr}T${editForm.value.endTime}:00`),\r\n color: editForm.value.color,\r\n };\r\n\r\n if (isEditing.value) {\r\n updateEventInArray(eventData);\r\n emit(\"event-updated\", eventData);\r\n message.success(\"事件已更新\");\r\n } else {\r\n addEventToArray(eventData);\r\n emit(\"event-added\", eventData);\r\n message.success(\"事件已添加\");\r\n }\r\n\r\n showEditModal.value = false;\r\n return true;\r\n }\r\n\r\n function deleteEvent() {\r\n if (!selectedEvent.value) return;\r\n const { id, title } = selectedEvent.value;\r\n removeEventFromArray(id);\r\n emit(\"event-deleted\", { id, title });\r\n showActionDialog.value = false;\r\n message.success(`已删除事件: ${title}`);\r\n }\r\n\r\n const calendarOptions: Ref<CalendarOptions> = ref({\r\n plugins: [dayGridPlugin, interactionPlugin, listPlugin],\r\n locale: zhCn,\r\n initialView: props.initialView ?? \"dayGridMonth\",\r\n events: internalEvents.value as any,\r\n headerToolbar: HEADER_TOOLBAR,\r\n buttonText: BUTTON_TEXT,\r\n editable: props.editable ?? true,\r\n eventClick: handleEventClick,\r\n dateClick: handleDateClick,\r\n eventDrop: handleEventDrop,\r\n eventResize: handleEventResize,\r\n });\r\n\r\n watch(\r\n () => props.events,\r\n (newEvents) => {\r\n internalEvents.value = [...(newEvents ?? [])];\r\n },\r\n { deep: true },\r\n );\r\n\r\n watch(\r\n internalEvents,\r\n (newEvents) => {\r\n calendarOptions.value.events = newEvents as any;\r\n },\r\n { deep: true },\r\n );\r\n\r\n return {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors: EVENT_COLORS,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose: {\r\n getApi: () => calendarRef.value?.getApi(),\r\n addEvent: addEventToArray,\r\n updateEvent: updateEventInArray,\r\n deleteEvent: removeEventFromArray,\r\n getEvents: () => internalEvents.value,\r\n },\r\n };\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar\r\n ref=\"calendarRef\"\r\n :options=\"calendarOptions\"\r\n />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton\r\n type=\"error\"\r\n @click=\"deleteEvent\"\r\n size=\"small\"\r\n >\r\n 删除\r\n </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.title\"\r\n placeholder=\"请输入事件标题\"\r\n />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NModal, NButton, NInput, NDatePicker } from 'naive-ui'\r\n import FullCalendar from '@fullcalendar/vue3'\r\n import { useCalendarEvents } from './composables/useCalendarEvents'\r\n import type { CalendarProps, CalendarEmits, CalendarExpose } from './types'\r\n\r\n defineOptions({ name: 'C_FullCalendar' })\r\n\r\n const props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: 'dayGridMonth',\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n })\r\n\r\n const emit = defineEmits<CalendarEmits>()\r\n\r\n const {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n } = useCalendarEvents(props, emit)\r\n\r\n defineExpose<CalendarExpose>(expose)\r\n</script>\r\n\r\n<style scoped>\r\n .c-full-calendar {\r\n width: 100%;\r\n }\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar\r\n ref=\"calendarRef\"\r\n :options=\"calendarOptions\"\r\n />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton\r\n type=\"error\"\r\n @click=\"deleteEvent\"\r\n size=\"small\"\r\n >\r\n 删除\r\n </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.title\"\r\n placeholder=\"请输入事件标题\"\r\n />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NModal, NButton, NInput, NDatePicker } from 'naive-ui'\r\n import FullCalendar from '@fullcalendar/vue3'\r\n import { useCalendarEvents } from './composables/useCalendarEvents'\r\n import type { CalendarProps, CalendarEmits, CalendarExpose } from './types'\r\n\r\n defineOptions({ name: 'C_FullCalendar' })\r\n\r\n const props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: 'dayGridMonth',\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n })\r\n\r\n const emit = defineEmits<CalendarEmits>()\r\n\r\n const {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n } = useCalendarEvents(props, emit)\r\n\r\n defineExpose<CalendarExpose>(expose)\r\n</script>\r\n\r\n<style scoped>\r\n .c-full-calendar {\r\n width: 100%;\r\n }\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-19\r\n * @Description: 全局日历组件 — 薄 UI 壳,逻辑由 useCalendarEvents 驱动\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-full-calendar\">\r\n <FullCalendar\r\n ref=\"calendarRef\"\r\n :options=\"calendarOptions\"\r\n />\r\n\r\n <NModal\r\n v-if=\"showActionDialog\"\r\n v-model:show=\"showActionDialog\"\r\n preset=\"dialog\"\r\n :title=\"`事件操作 - ${selectedEvent?.title}`\"\r\n style=\"width: 400px\"\r\n >\r\n <div class=\"ml-10% mt-20px\">\r\n <NButton\r\n type=\"primary\"\r\n @click=\"openEditModal\"\r\n style=\"margin-right: 12px\"\r\n size=\"small\"\r\n >\r\n 编辑\r\n </NButton>\r\n <NButton\r\n type=\"error\"\r\n @click=\"deleteEvent\"\r\n size=\"small\"\r\n >\r\n 删除\r\n </NButton>\r\n </div>\r\n </NModal>\r\n\r\n <NModal\r\n v-model:show=\"showEditModal\"\r\n preset=\"dialog\"\r\n :title=\"isEditing ? '编辑事件' : '添加事件'\"\r\n positive-text=\"保存\"\r\n negative-text=\"取消\"\r\n @positive-click=\"saveEvent\"\r\n >\r\n <div style=\"padding: 20px\">\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件标题</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.title\"\r\n placeholder=\"请输入事件标题\"\r\n />\r\n </div>\r\n\r\n <div style=\"margin-bottom: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件日期</label\r\n >\r\n <NDatePicker\r\n v-model:value=\"editForm.date\"\r\n type=\"date\"\r\n format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\"\r\n />\r\n </div>\r\n\r\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 16px\">\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >开始时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.startTime\"\r\n placeholder=\"09:00\"\r\n />\r\n </div>\r\n <div>\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >结束时间</label\r\n >\r\n <NInput\r\n v-model:value=\"editForm.endTime\"\r\n placeholder=\"10:00\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-top: 16px\">\r\n <label style=\"display: block; margin-bottom: 8px; font-weight: 500\"\r\n >事件颜色</label\r\n >\r\n <div style=\"display: flex; gap: 8px\">\r\n <div\r\n v-for=\"color in eventColors\"\r\n :key=\"color\"\r\n :style=\"{\r\n width: '30px',\r\n height: '30px',\r\n backgroundColor: color,\r\n borderRadius: '50%',\r\n cursor: 'pointer',\r\n border:\r\n editForm.color === color\r\n ? '3px solid #000'\r\n : '2px solid #ddd',\r\n }\"\r\n @click=\"editForm.color = color\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </NModal>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NModal, NButton, NInput, NDatePicker } from 'naive-ui'\r\n import FullCalendar from '@fullcalendar/vue3'\r\n import { useCalendarEvents } from './composables/useCalendarEvents'\r\n import type { CalendarProps, CalendarEmits, CalendarExpose } from './types'\r\n\r\n defineOptions({ name: 'C_FullCalendar' })\r\n\r\n const props = withDefaults(defineProps<CalendarProps>(), {\r\n events: () => [],\r\n initialView: 'dayGridMonth',\r\n editable: true,\r\n showAddDialog: true,\r\n showEditDialog: true,\r\n })\r\n\r\n const emit = defineEmits<CalendarEmits>()\r\n\r\n const {\r\n calendarRef,\r\n calendarOptions,\r\n showActionDialog,\r\n showEditModal,\r\n isEditing,\r\n selectedEvent,\r\n editForm,\r\n eventColors,\r\n openEditModal,\r\n saveEvent,\r\n deleteEvent,\r\n expose,\r\n } = useCalendarEvents(props, emit)\r\n\r\n defineExpose<CalendarExpose>(expose)\r\n</script>\r\n\r\n<style scoped>\r\n .c-full-calendar {\r\n width: 100%;\r\n }\r\n</style>\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Guide.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-01\n * @Description: 用户引导组件(基于 driver.js)\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NTooltip placement=\"bottom\" trigger=\"hover\">\n <template #trigger>\n <NButton text @click=\"startGuide\">\n <C_Icon name=\"mdi:sign-routes\" :size=\"18\" />\n </NButton>\n </template>\n <span>功能引导</span>\n </NTooltip>\n</template>\n\n<script setup lang=\"ts\">\nimport { NTooltip, NButton } from \"naive-ui\";\nimport C_Icon from \"../C_Icon/index.vue\";\nimport { driver } from \"driver.js\";\nimport \"driver.js/dist/driver.css\";\n\ndefineOptions({ name: \"C_Guide\" });\n\nexport interface GuideStep {\n element: string;\n popover: {\n title: string;\n description: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n };\n}\n\nconst props = withDefaults(\n defineProps<{\n steps?: GuideStep[];\n doneBtnText?: string;\n nextBtnText?: string;\n prevBtnText?: string;\n }>(),\n {\n steps: () => [],\n doneBtnText: \"完成\",\n nextBtnText: \"下一步\",\n prevBtnText: \"上一步\",\n },\n);\n\nconst startGuide = () => {\n if (!props.steps.length) {\n console.warn('[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。');\n return;\n }\n\n const driverObj = driver({\n popoverClass: \"driverjs-theme\",\n animate: true,\n showProgress: true,\n doneBtnText: props.doneBtnText,\n nextBtnText: props.nextBtnText,\n prevBtnText: props.prevBtnText,\n steps: props.steps,\n });\n\n driverObj.drive();\n};\n\ndefineExpose({ startGuide });\n</script>\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-01\n * @Description: 用户引导组件(基于 driver.js)\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NTooltip placement=\"bottom\" trigger=\"hover\">\n <template #trigger>\n <NButton text @click=\"startGuide\">\n <C_Icon name=\"mdi:sign-routes\" :size=\"18\" />\n </NButton>\n </template>\n <span>功能引导</span>\n </NTooltip>\n</template>\n\n<script setup lang=\"ts\">\nimport { NTooltip, NButton } from \"naive-ui\";\nimport C_Icon from \"../C_Icon/index.vue\";\nimport { driver } from \"driver.js\";\nimport \"driver.js/dist/driver.css\";\n\ndefineOptions({ name: \"C_Guide\" });\n\nexport interface GuideStep {\n element: string;\n popover: {\n title: string;\n description: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n };\n}\n\nconst props = withDefaults(\n defineProps<{\n steps?: GuideStep[];\n doneBtnText?: string;\n nextBtnText?: string;\n prevBtnText?: string;\n }>(),\n {\n steps: () => [],\n doneBtnText: \"完成\",\n nextBtnText: \"下一步\",\n prevBtnText: \"上一步\",\n },\n);\n\nconst startGuide = () => {\n if (!props.steps.length) {\n console.warn('[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。');\n return;\n }\n\n const driverObj = driver({\n popoverClass: \"driverjs-theme\",\n animate: true,\n showProgress: true,\n doneBtnText: props.doneBtnText,\n nextBtnText: props.nextBtnText,\n prevBtnText: props.prevBtnText,\n steps: props.steps,\n });\n\n driverObj.drive();\n};\n\ndefineExpose({ startGuide });\n</script>\n","<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-01\n * @Description: 用户引导组件(基于 driver.js)\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NTooltip placement=\"bottom\" trigger=\"hover\">\n <template #trigger>\n <NButton text @click=\"startGuide\">\n <C_Icon name=\"mdi:sign-routes\" :size=\"18\" />\n </NButton>\n </template>\n <span>功能引导</span>\n </NTooltip>\n</template>\n\n<script setup lang=\"ts\">\nimport { NTooltip, NButton } from \"naive-ui\";\nimport C_Icon from \"../C_Icon/index.vue\";\nimport { driver } from \"driver.js\";\nimport \"driver.js/dist/driver.css\";\n\ndefineOptions({ name: \"C_Guide\" });\n\nexport interface GuideStep {\n element: string;\n popover: {\n title: string;\n description: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n };\n}\n\nconst props = withDefaults(\n defineProps<{\n steps?: GuideStep[];\n doneBtnText?: string;\n nextBtnText?: string;\n prevBtnText?: string;\n }>(),\n {\n steps: () => [],\n doneBtnText: \"完成\",\n nextBtnText: \"下一步\",\n prevBtnText: \"上一步\",\n },\n);\n\nconst startGuide = () => {\n if (!props.steps.length) {\n console.warn('[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。');\n return;\n }\n\n const driverObj = driver({\n popoverClass: \"driverjs-theme\",\n animate: true,\n showProgress: true,\n doneBtnText: props.doneBtnText,\n nextBtnText: props.nextBtnText,\n prevBtnText: props.prevBtnText,\n steps: props.steps,\n });\n\n driverObj.drive();\n};\n\ndefineExpose({ startGuide });\n</script>\n"],"mappings":"6VEmCA,IAAM,EAAQ,EAeR,MAAmB,CACvB,GAAI,CAAC,EAAM,MAAM,OAAQ,CACvB,QAAQ,KAAK,+CAA+C,CAC5D,QAaF,EAAA,EAAA,QAVyB,CACvB,aAAc,iBACd,QAAS,GACT,aAAc,GACd,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAM,MACd,CAAC,CAEQ,OAAO,SAGnB,EAAa,CAAE,aAAY,CAAC,yDAtDf,EAAA,SAAA,CAAA,CAPD,UAAU,SAAS,QAAQ,UACxB,SAAA,EAAA,EAAA,aAGC,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,QAAA,CAAA,CAFD,KAAA,GAAM,QAAO,8BACwB,EAAA,EAAA,EAAA,aAAA,EAAA,EAAA,CAApC,KAAK,kBAAmB,KAAM,yCAGzB,CAAA,AAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,OAAA,KAAX,OAAI,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"C_Guide.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n"],"mappings":"6VE4CE,IAAM,EAAQ,EAeR,MAAmB,CACvB,GAAI,CAAC,EAAM,MAAM,OAAQ,CACvB,QAAQ,KACN,+CACD,CACD,QAaF,EAAA,EAAA,QAVyB,CACvB,aAAc,iBACd,QAAS,GACT,aAAc,GACd,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAM,MACd,CAAC,CAEQ,OAAO,SAGnB,EAAa,CAAE,aAAY,CAAC,yDAxDjB,EAAA,SAAA,CAAA,CAfT,UAAU,SACV,QAAQ,UAEG,SAAA,EAAA,EAAA,aASC,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,QAAA,CAAA,CAPR,KAAA,GACC,QAAO,8BAKN,EAAA,EAAA,EAAA,aAAA,EAAA,EAAA,CAFA,KAAK,kBACJ,KAAM,yCAII,CAAA,AAAA,EAAA,MAAA,EAAA,EAAA,oBAAA,OAAA,KAAX,OAAI,GAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Guide2.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-01\n * @Description: 用户引导组件(基于 driver.js)\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NTooltip placement=\"bottom\" trigger=\"hover\">\n <template #trigger>\n <NButton text @click=\"startGuide\">\n <C_Icon name=\"mdi:sign-routes\" :size=\"18\" />\n </NButton>\n </template>\n <span>功能引导</span>\n </NTooltip>\n</template>\n\n<script setup lang=\"ts\">\nimport { NTooltip, NButton } from \"naive-ui\";\nimport C_Icon from \"../C_Icon/index.vue\";\nimport { driver } from \"driver.js\";\nimport \"driver.js/dist/driver.css\";\n\ndefineOptions({ name: \"C_Guide\" });\n\nexport interface GuideStep {\n element: string;\n popover: {\n title: string;\n description: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n };\n}\n\nconst props = withDefaults(\n defineProps<{\n steps?: GuideStep[];\n doneBtnText?: string;\n nextBtnText?: string;\n prevBtnText?: string;\n }>(),\n {\n steps: () => [],\n doneBtnText: \"完成\",\n nextBtnText: \"下一步\",\n prevBtnText: \"上一步\",\n },\n);\n\nconst startGuide = () => {\n if (!props.steps.length) {\n console.warn('[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。');\n return;\n }\n\n const driverObj = driver({\n popoverClass: \"driverjs-theme\",\n animate: true,\n showProgress: true,\n doneBtnText: props.doneBtnText,\n nextBtnText: props.nextBtnText,\n prevBtnText: props.prevBtnText,\n steps: props.steps,\n });\n\n driverObj.drive();\n};\n\ndefineExpose({ startGuide });\n</script>\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-01\n * @Description: 用户引导组件(基于 driver.js)\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NTooltip placement=\"bottom\" trigger=\"hover\">\n <template #trigger>\n <NButton text @click=\"startGuide\">\n <C_Icon name=\"mdi:sign-routes\" :size=\"18\" />\n </NButton>\n </template>\n <span>功能引导</span>\n </NTooltip>\n</template>\n\n<script setup lang=\"ts\">\nimport { NTooltip, NButton } from \"naive-ui\";\nimport C_Icon from \"../C_Icon/index.vue\";\nimport { driver } from \"driver.js\";\nimport \"driver.js/dist/driver.css\";\n\ndefineOptions({ name: \"C_Guide\" });\n\nexport interface GuideStep {\n element: string;\n popover: {\n title: string;\n description: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n };\n}\n\nconst props = withDefaults(\n defineProps<{\n steps?: GuideStep[];\n doneBtnText?: string;\n nextBtnText?: string;\n prevBtnText?: string;\n }>(),\n {\n steps: () => [],\n doneBtnText: \"完成\",\n nextBtnText: \"下一步\",\n prevBtnText: \"上一步\",\n },\n);\n\nconst startGuide = () => {\n if (!props.steps.length) {\n console.warn('[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。');\n return;\n }\n\n const driverObj = driver({\n popoverClass: \"driverjs-theme\",\n animate: true,\n showProgress: true,\n doneBtnText: props.doneBtnText,\n nextBtnText: props.nextBtnText,\n prevBtnText: props.prevBtnText,\n steps: props.steps,\n });\n\n driverObj.drive();\n};\n\ndefineExpose({ startGuide });\n</script>\n","<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-01\n * @Description: 用户引导组件(基于 driver.js)\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NTooltip placement=\"bottom\" trigger=\"hover\">\n <template #trigger>\n <NButton text @click=\"startGuide\">\n <C_Icon name=\"mdi:sign-routes\" :size=\"18\" />\n </NButton>\n </template>\n <span>功能引导</span>\n </NTooltip>\n</template>\n\n<script setup lang=\"ts\">\nimport { NTooltip, NButton } from \"naive-ui\";\nimport C_Icon from \"../C_Icon/index.vue\";\nimport { driver } from \"driver.js\";\nimport \"driver.js/dist/driver.css\";\n\ndefineOptions({ name: \"C_Guide\" });\n\nexport interface GuideStep {\n element: string;\n popover: {\n title: string;\n description: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n };\n}\n\nconst props = withDefaults(\n defineProps<{\n steps?: GuideStep[];\n doneBtnText?: string;\n nextBtnText?: string;\n prevBtnText?: string;\n }>(),\n {\n steps: () => [],\n doneBtnText: \"完成\",\n nextBtnText: \"下一步\",\n prevBtnText: \"上一步\",\n },\n);\n\nconst startGuide = () => {\n if (!props.steps.length) {\n console.warn('[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。');\n return;\n }\n\n const driverObj = driver({\n popoverClass: \"driverjs-theme\",\n animate: true,\n showProgress: true,\n doneBtnText: props.doneBtnText,\n nextBtnText: props.nextBtnText,\n prevBtnText: props.prevBtnText,\n steps: props.steps,\n });\n\n driverObj.drive();\n};\n\ndefineExpose({ startGuide });\n</script>\n"],"mappings":"2cEmCA,IAAM,EAAQ,EAeR,MAAmB,CACvB,GAAI,CAAC,EAAM,MAAM,OAAQ,CACvB,QAAQ,KAAK,+CAA+C,CAC5D,OAGgB,EAAO,CACvB,aAAc,iBACd,QAAS,GACT,aAAc,GACd,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAM,MACd,CAAC,CAEQ,OAAO,SAGnB,EAAa,CAAE,aAAY,CAAC,aA7D1B,EAOW,EAAA,EAAA,CAAA,CAPD,UAAU,SAAS,QAAQ,UACxB,QAAO,MAGN,CAFV,EAEU,EAAA,EAAA,CAAA,CAFD,KAAA,GAAM,QAAO,kBACwB,CAA5C,EAA4C,EAAA,CAApC,KAAK,kBAAmB,KAAM,6BAGzB,CAAA,AAAA,EAAA,KAAjB,EAAiB,OAAA,KAAX,OAAI,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"C_Guide2.js","names":[],"sources":["../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue","../src/components/C_Guide/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 用户引导组件(基于 driver.js)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NTooltip\r\n placement=\"bottom\"\r\n trigger=\"hover\"\r\n >\r\n <template #trigger>\r\n <NButton\r\n text\r\n @click=\"startGuide\"\r\n >\r\n <C_Icon\r\n name=\"mdi:sign-routes\"\r\n :size=\"18\"\r\n />\r\n </NButton>\r\n </template>\r\n <span>功能引导</span>\r\n </NTooltip>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { NTooltip, NButton } from 'naive-ui'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { driver } from 'driver.js'\r\n import 'driver.js/dist/driver.css'\r\n\r\n defineOptions({ name: 'C_Guide' })\r\n\r\n export interface GuideStep {\r\n element: string\r\n popover: {\r\n title: string\r\n description: string\r\n side?: 'top' | 'right' | 'bottom' | 'left'\r\n }\r\n }\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n steps?: GuideStep[]\r\n doneBtnText?: string\r\n nextBtnText?: string\r\n prevBtnText?: string\r\n }>(),\r\n {\r\n steps: () => [],\r\n doneBtnText: '完成',\r\n nextBtnText: '下一步',\r\n prevBtnText: '上一步',\r\n }\r\n )\r\n\r\n const startGuide = () => {\r\n if (!props.steps.length) {\r\n console.warn(\r\n '[C_Guide] 未提供引导步骤(steps),请通过 :steps prop 传入。'\r\n )\r\n return\r\n }\r\n\r\n const driverObj = driver({\r\n popoverClass: 'driverjs-theme',\r\n animate: true,\r\n showProgress: true,\r\n doneBtnText: props.doneBtnText,\r\n nextBtnText: props.nextBtnText,\r\n prevBtnText: props.prevBtnText,\r\n steps: props.steps,\r\n })\r\n\r\n driverObj.drive()\r\n }\r\n\r\n defineExpose({ startGuide })\r\n</script>\r\n"],"mappings":"2cE4CE,IAAM,EAAQ,EAeR,MAAmB,CACvB,GAAI,CAAC,EAAM,MAAM,OAAQ,CACvB,QAAQ,KACN,+CACD,CACD,OAGgB,EAAO,CACvB,aAAc,iBACd,QAAS,GACT,aAAc,GACd,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,MAAO,EAAM,MACd,CAAC,CAEQ,OAAO,SAGnB,EAAa,CAAE,aAAY,CAAC,aAxE5B,EAgBW,EAAA,EAAA,CAAA,CAfT,UAAU,SACV,QAAQ,UAEG,QAAO,MASN,CARV,EAQU,EAAA,EAAA,CAAA,CAPR,KAAA,GACC,QAAO,kBAKN,CAHF,EAGE,EAAA,CAFA,KAAK,kBACJ,KAAM,6BAII,CAAA,AAAA,EAAA,KAAjB,EAAiB,OAAA,KAAX,OAAI,GAAA,CAAA,CAAA"}