econtrol-tools-calendar 1.0.11 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -14
- package/dist/calendar.js +38 -49
- package/dist/calendar.js.map +1 -1
- package/dist/calendar.umd.cjs +38 -49
- package/dist/calendar.umd.cjs.map +1 -1
- package/dist/style.css +140 -140
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
- 🏷️ 支持节假日显示
|
|
12
12
|
- 🔒 支持权限控制(基于用户信息)
|
|
13
13
|
- 👤 支持用户信息管理(用户 ID 和用户名)
|
|
14
|
-
- ⚡
|
|
14
|
+
- ⚡ 支持快速添加事件(打开弹窗确认后保存)
|
|
15
15
|
- 📦 TypeScript 支持
|
|
16
16
|
- 🔄 单向数据流,所有操作通过事件通知父组件
|
|
17
17
|
|
|
@@ -181,8 +181,8 @@ app.mount("#app");
|
|
|
181
181
|
| `deviceId` | `string` | `''` | 设备 ID,用于标识事件所属的设备(关键字段) |
|
|
182
182
|
| `deviceInfo` | `DeviceInfo \| null` | `null` | 设备详细信息,用于显示设备名称 |
|
|
183
183
|
| `taskid` | `string` | `''` | 当前任务 ID,匹配的事件显示红色 |
|
|
184
|
-
| `quickAddTimeRange` | `{ start: string; end: string } \| null` | `null` | 快速添加的时间段(ISO
|
|
185
|
-
| `quickAddTaskName` | `string` | `''` |
|
|
184
|
+
| `quickAddTimeRange` | `{ start: string; end: string } \| null` | `null` | 快速添加的时间段(ISO 格式),设置后会显示"快速添加"按钮 |
|
|
185
|
+
| `quickAddTaskName` | `string` | `''` | 快速添加的任务名称,点击"快速添加"按钮后会填入表单 |
|
|
186
186
|
| `holidays` | `HolidayData \| null` | `null` | 节假日数据对象,格式: `{ "YYYY-MM-DD": "节假日名称" }` |
|
|
187
187
|
| `events` | `EventInput[]` | `[]` | 事件列表,从外部传入的任务数据 |
|
|
188
188
|
|
|
@@ -220,8 +220,8 @@ interface HolidayData {
|
|
|
220
220
|
|
|
221
221
|
| 事件名 | 参数 | 说明 |
|
|
222
222
|
| --------------- | ---------------------- | ------------------------------------ |
|
|
223
|
-
| `quickAddSaved` | `event: EventInput` |
|
|
224
|
-
| `eventAdded` | `event: EventInput` |
|
|
223
|
+
| `quickAddSaved` | `event: EventInput` | 快速添加事件保存后触发(已废弃,快速添加现在通过 `eventAdded` 触发) |
|
|
224
|
+
| `eventAdded` | `event: EventInput` | 事件添加后触发(包括快速添加确认保存后) |
|
|
225
225
|
| `eventUpdated` | `event: EventInput` | 事件更新后触发 |
|
|
226
226
|
| `eventDeleted` | `event: EventInput` | 事件删除后触发,包含完整的事件详情 |
|
|
227
227
|
| `eventsChange` | `events: EventInput[]` | 事件列表变化后触发,包含当前所有事件 |
|
|
@@ -262,8 +262,8 @@ interface EventInput {
|
|
|
262
262
|
<template>
|
|
263
263
|
<div>
|
|
264
264
|
<SCalendar
|
|
265
|
-
|
|
266
|
-
|
|
265
|
+
:is-occupied="isOccupied"
|
|
266
|
+
:allow-overlap="allowOverlap"
|
|
267
267
|
:userinfo="userinfo"
|
|
268
268
|
:device-id="deviceId"
|
|
269
269
|
:device-info="deviceInfo"
|
|
@@ -271,12 +271,12 @@ interface EventInput {
|
|
|
271
271
|
:holidays="holidays"
|
|
272
272
|
:events="events"
|
|
273
273
|
:quick-add-time-range="quickAddTimeRange"
|
|
274
|
-
quick-add-task-name="
|
|
274
|
+
:quick-add-task-name="quickAddTaskName"
|
|
275
275
|
@event-added="handleEventAdded"
|
|
276
276
|
@event-updated="handleEventUpdated"
|
|
277
277
|
@event-deleted="handleEventDeleted"
|
|
278
278
|
@events-change="handleEventsChange"
|
|
279
|
-
@
|
|
279
|
+
@device-click="handleDeviceClick"
|
|
280
280
|
/>
|
|
281
281
|
</div>
|
|
282
282
|
</template>
|
|
@@ -337,10 +337,14 @@ const events = ref<EventInput[]>([
|
|
|
337
337
|
const holidays = ref(getHolidays(2025));
|
|
338
338
|
|
|
339
339
|
// 快速添加配置
|
|
340
|
+
// 设置 quickAddTimeRange 和 quickAddTaskName 后,组件会显示"快速添加"按钮
|
|
341
|
+
// 点击"快速添加"按钮后,会将时间段和任务名称填入表单并打开弹窗
|
|
342
|
+
// 用户可以在弹窗中确认或修改后点击保存,保存后会触发 eventAdded 事件
|
|
340
343
|
const quickAddTimeRange = ref({
|
|
341
344
|
start: "2025-01-16T10:00:00",
|
|
342
345
|
end: "2025-01-16T12:00:00",
|
|
343
346
|
});
|
|
347
|
+
const quickAddTaskName = ref("快速添加任务");
|
|
344
348
|
|
|
345
349
|
// 事件处理函数
|
|
346
350
|
function handleEventAdded(event: EventInput) {
|
|
@@ -382,11 +386,6 @@ function handleDeviceClick(deviceId: string) {
|
|
|
382
386
|
// 可以在这里处理设备点击逻辑,比如打开设备详情页面、跳转路由等
|
|
383
387
|
// router.push(`/device/${deviceId}`);
|
|
384
388
|
}
|
|
385
|
-
|
|
386
|
-
function handleQuickAddSaved(event: EventInput) {
|
|
387
|
-
console.log("快速添加的事件:", event);
|
|
388
|
-
// 处理快速添加逻辑
|
|
389
|
-
}
|
|
390
389
|
</script>
|
|
391
390
|
```
|
|
392
391
|
|
|
@@ -561,6 +560,18 @@ pnpm preview
|
|
|
561
560
|
|
|
562
561
|
8. **节假日显示**:节假日数据格式为 `{ "YYYY-MM-DD": "节假日名称" }`,传入 `holidays` prop 后会在日历上高亮显示。
|
|
563
562
|
|
|
563
|
+
9. **快速添加功能**:
|
|
564
|
+
- 设置 `quickAddTimeRange` 和 `quickAddTaskName` props 后,组件会显示"快速添加"按钮
|
|
565
|
+
- 点击"快速添加"按钮后,会将时间段和任务名称填入表单并打开弹窗
|
|
566
|
+
- 用户可以在弹窗中确认或修改后点击保存
|
|
567
|
+
- 保存后会触发 `eventAdded` 事件,而不是直接保存
|
|
568
|
+
- 如果快速添加的时间段不在当前视图范围内,日历会自动导航到该时间段
|
|
569
|
+
|
|
570
|
+
10. **时间格式兼容**:组件支持多种时间格式输入:
|
|
571
|
+
- 如果传入的时间只包含日期(如 `"2025-01-15"`),会自动补全为 `"2025-01-15T00:00:00"`
|
|
572
|
+
- 支持 ISO 格式(`"2025-01-15T10:00:00"`)
|
|
573
|
+
- 支持 `YYYY-MM-DD HH:mm:ss` 格式(会自动转换为 ISO 格式)
|
|
574
|
+
|
|
564
575
|
## 📄 许可证
|
|
565
576
|
|
|
566
577
|
MIT
|
package/dist/calendar.js
CHANGED
|
@@ -878,13 +878,31 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
878
878
|
ElMessage.warning("未提供快速添加的任务名称");
|
|
879
879
|
return;
|
|
880
880
|
}
|
|
881
|
-
const
|
|
882
|
-
|
|
881
|
+
const normalizeQuickAddTime = (time) => {
|
|
882
|
+
if (!time) return time;
|
|
883
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(time)) {
|
|
884
|
+
return time + "T00:00:00";
|
|
885
|
+
}
|
|
886
|
+
if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(time)) {
|
|
887
|
+
return time.replace(" ", "T");
|
|
888
|
+
}
|
|
889
|
+
if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(time)) {
|
|
890
|
+
return time.replace(" ", "T") + ":00";
|
|
891
|
+
}
|
|
892
|
+
if (time.includes("T")) {
|
|
893
|
+
return time;
|
|
894
|
+
}
|
|
895
|
+
return time;
|
|
896
|
+
};
|
|
897
|
+
const normalizedStart = normalizeQuickAddTime(props.quickAddTimeRange.start);
|
|
898
|
+
const normalizedEnd = normalizeQuickAddTime(props.quickAddTimeRange.end);
|
|
899
|
+
const startStr = formatFromISO(normalizedStart);
|
|
900
|
+
const endStr = formatFromISO(normalizedEnd);
|
|
883
901
|
if (calendarRef.value) {
|
|
884
902
|
try {
|
|
885
903
|
const calendarApi = calendarRef.value.getApi();
|
|
886
904
|
const currentView = calendarApi.view;
|
|
887
|
-
const quickAddStartDate = new Date(
|
|
905
|
+
const quickAddStartDate = new Date(normalizedStart);
|
|
888
906
|
const viewStart = new Date(currentView.activeStart);
|
|
889
907
|
const viewEnd = new Date(currentView.activeEnd);
|
|
890
908
|
const isInView = quickAddStartDate >= viewStart && quickAddStartDate < viewEnd;
|
|
@@ -899,52 +917,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
899
917
|
ElMessage.warning("不能选择今天之前的时间进行预约");
|
|
900
918
|
return;
|
|
901
919
|
}
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
920
|
+
formData.start = startStr;
|
|
921
|
+
formData.end = endStr;
|
|
922
|
+
formData.title = props.quickAddTaskName;
|
|
923
|
+
formData.allDay = false;
|
|
924
|
+
formData.description = "";
|
|
925
|
+
formData.organizer = currentUser.value;
|
|
926
|
+
formData.username = currentUser.value;
|
|
927
|
+
formData.organizerId = currentUserId.value;
|
|
928
|
+
if (props.taskid) {
|
|
929
|
+
formData.taskid = props.taskid;
|
|
930
|
+
} else {
|
|
931
|
+
formData.taskid = "";
|
|
905
932
|
}
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
endStr,
|
|
911
|
-
void 0,
|
|
912
|
-
currentUser.value,
|
|
913
|
-
tempEventId,
|
|
914
|
-
// 传入临时ID用于颜色分配(如果taskid匹配)
|
|
915
|
-
taskId
|
|
916
|
-
// 传入 taskid 用于颜色分配
|
|
917
|
-
);
|
|
918
|
-
const startISO = formatToISO(startStr);
|
|
919
|
-
const endISO = endStr ? formatToISO(endStr) : void 0;
|
|
920
|
-
const eventUsername = currentUser.value;
|
|
921
|
-
const eventOrganizerId = currentUserId.value;
|
|
922
|
-
const editable = !currentUserId.value || eventOrganizerId === currentUserId.value;
|
|
923
|
-
const newEvent = {
|
|
924
|
-
// 不设置 id,由外部 App.vue 的事件列表提供
|
|
925
|
-
title: props.quickAddTaskName,
|
|
926
|
-
start: startISO,
|
|
927
|
-
end: endISO,
|
|
928
|
-
allDay: false,
|
|
929
|
-
backgroundColor: colorInfo.bg,
|
|
930
|
-
borderColor: colorInfo.border,
|
|
931
|
-
editable,
|
|
932
|
-
extendedProps: {
|
|
933
|
-
description: "",
|
|
934
|
-
organizer: eventUsername,
|
|
935
|
-
// 保留用于兼容
|
|
936
|
-
username: eventUsername,
|
|
937
|
-
organizerId: eventOrganizerId,
|
|
938
|
-
colorIndex: colorInfo.index,
|
|
939
|
-
deviceId: props.deviceId || "",
|
|
940
|
-
taskid: props.taskid || ""
|
|
941
|
-
// 如果存在 taskid,保存到事件数据中
|
|
942
|
-
}
|
|
943
|
-
};
|
|
944
|
-
emit("quickAddSaved", newEvent);
|
|
945
|
-
emit("eventAdded", newEvent);
|
|
946
|
-
const newEventsList = [...events.value, newEvent];
|
|
947
|
-
emit("eventsChange", newEventsList);
|
|
933
|
+
formData.deviceId = props.deviceId || "";
|
|
934
|
+
formData.userid = currentUserId.value;
|
|
935
|
+
editingEvent.value = null;
|
|
936
|
+
dialogVisible.value = true;
|
|
948
937
|
}
|
|
949
938
|
function formatFromISO(isoStr, useBeijingTime = false) {
|
|
950
939
|
if (!isoStr) return "";
|
|
@@ -1659,7 +1648,7 @@ const _export_sfc = (sfc, props) => {
|
|
|
1659
1648
|
}
|
|
1660
1649
|
return target;
|
|
1661
1650
|
};
|
|
1662
|
-
const SCalendarComponent = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
1651
|
+
const SCalendarComponent = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-92e02969"]]);
|
|
1663
1652
|
function getHolidays(year) {
|
|
1664
1653
|
const holidays = {};
|
|
1665
1654
|
if (year === 2026) {
|