up
This commit is contained in:
@@ -132,3 +132,16 @@
|
|||||||
|
|
||||||
**修复**(`CalendarDetail.vue` `handleKeyDown` Ctrl+C 分支):
|
**修复**(`CalendarDetail.vue` `handleKeyDown` Ctrl+C 分支):
|
||||||
- 检测 `end` 是否为 Date 实例,如果是则用本地日期方法转为 `YYYY-MM-DD` 字符串再存入 clipboard
|
- 检测 `end` 是否为 Date 实例,如果是则用本地日期方法转为 `YYYY-MM-DD` 字符串再存入 clipboard
|
||||||
|
|
||||||
|
## 新增:编辑事件窗口显示创建者
|
||||||
|
|
||||||
|
**功能**:编辑事件模态框标题居中显示「xxx 创建」
|
||||||
|
|
||||||
|
**实现**(参考 ScheduleView.vue):
|
||||||
|
- 导入 `useUsersStore`,添加 `usersStore`
|
||||||
|
- `pageData.eventBindUserID`:数组,每项 `{ eventID, userID }`
|
||||||
|
- `getUserIdFromEventID(eventID)`:通过事件ID查创建者用户ID
|
||||||
|
- `getUsernameFromUserID(userID)`:调用 `usersStore.getUsernameFromUserID(userID)`(有缓存)
|
||||||
|
- `getEvents` 中遍历事件时 `pageData.value.eventBindUserID.push({ eventID: item.ID, userID: item.UserID })`
|
||||||
|
- 模态框标题新增 `<h5 v-if="eventData.isEditing && getUserIdFromEventID(eventData.id)">` 居中显示
|
||||||
|
- i18n:`calendar.created_by` = "{name} 创建" / "Created by {name}"
|
||||||
|
|||||||
@@ -663,6 +663,7 @@
|
|||||||
"paste_event": "Paste Event",
|
"paste_event": "Paste Event",
|
||||||
"copy_success": "Event copied",
|
"copy_success": "Event copied",
|
||||||
"paste_success": "Event pasted",
|
"paste_success": "Event pasted",
|
||||||
"no_event_to_paste": "No event to paste"
|
"no_event_to_paste": "No event to paste",
|
||||||
|
"created_by": "Created by {name}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -664,6 +664,7 @@
|
|||||||
"paste_event": "粘贴日程",
|
"paste_event": "粘贴日程",
|
||||||
"copy_success": "日程已复制",
|
"copy_success": "日程已复制",
|
||||||
"paste_success": "日程已粘贴",
|
"paste_success": "日程已粘贴",
|
||||||
"no_event_to_paste": "没有可粘贴的日程"
|
"no_event_to_paste": "没有可粘贴的日程",
|
||||||
|
"created_by": "{name} 创建"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { useI18n } from "vue-i18n"
|
|||||||
import { usePageTitle } from "@/composables/usePageTitle"
|
import { usePageTitle } from "@/composables/usePageTitle"
|
||||||
import { useToastStore } from "@/stores/toast"
|
import { useToastStore } from "@/stores/toast"
|
||||||
import { useUserStore } from "@/stores/user"
|
import { useUserStore } from "@/stores/user"
|
||||||
|
import { useUsersStore } from "@/stores/users"
|
||||||
import { calendarApi } from "@/api/calendar"
|
import { calendarApi } from "@/api/calendar"
|
||||||
import { useDateUtils } from "@/composables/useDateUtils"
|
import { useDateUtils } from "@/composables/useDateUtils"
|
||||||
import DatatimePickerForFullCalendar from "@/components/datatimePickerForFullCalendar.vue"
|
import DatatimePickerForFullCalendar from "@/components/datatimePickerForFullCalendar.vue"
|
||||||
@@ -20,6 +21,7 @@ const router = useRouter()
|
|||||||
const { t, locale } = useI18n()
|
const { t, locale } = useI18n()
|
||||||
const toast = useToastStore()
|
const toast = useToastStore()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
const usersStore = useUsersStore()
|
||||||
const DateUtils = useDateUtils()
|
const DateUtils = useDateUtils()
|
||||||
|
|
||||||
const calendarId = ref(parseInt(route.params.id))
|
const calendarId = ref(parseInt(route.params.id))
|
||||||
@@ -62,6 +64,7 @@ const pageData = ref({
|
|||||||
lastEventClickID: 0,
|
lastEventClickID: 0,
|
||||||
submitChecked: false,
|
submitChecked: false,
|
||||||
lastEventsSnapshot: null,
|
lastEventsSnapshot: null,
|
||||||
|
eventBindUserID: [], // 事件ID → 创建者UserID 映射
|
||||||
})
|
})
|
||||||
|
|
||||||
const showDeleteModal = ref(false)
|
const showDeleteModal = ref(false)
|
||||||
@@ -103,6 +106,18 @@ function closeContextMenu() {
|
|||||||
contextMenu.value.visible = false
|
contextMenu.value.visible = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 通过事件ID获取创建者用户ID
|
||||||
|
function getUserIdFromEventID(eventID) {
|
||||||
|
const target = pageData.value.eventBindUserID.find(item => item.eventID === eventID)
|
||||||
|
return target ? target.userID : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通过用户ID获取用户名
|
||||||
|
function getUsernameFromUserID(userID) {
|
||||||
|
if (userID == 0) return ""
|
||||||
|
return usersStore.getUsernameFromUserID(userID)
|
||||||
|
}
|
||||||
|
|
||||||
function copyEvent() {
|
function copyEvent() {
|
||||||
if (!contextMenu.value.eventInfo) return
|
if (!contextMenu.value.eventInfo) return
|
||||||
clipboard.value = { ...contextMenu.value.eventInfo }
|
clipboard.value = { ...contextMenu.value.eventInfo }
|
||||||
@@ -297,8 +312,13 @@ async function getEvents() {
|
|||||||
|
|
||||||
if (errCode === 0) {
|
if (errCode === 0) {
|
||||||
calendarOptions.value.events = []
|
calendarOptions.value.events = []
|
||||||
|
pageData.value.eventBindUserID = []
|
||||||
;(data.list || []).forEach(item => {
|
;(data.list || []).forEach(item => {
|
||||||
const canEdit = item.canEdit === true
|
const canEdit = item.canEdit === true
|
||||||
|
pageData.value.eventBindUserID.push({
|
||||||
|
eventID: item.ID,
|
||||||
|
userID: item.UserID,
|
||||||
|
})
|
||||||
calendarOptions.value.events.push({
|
calendarOptions.value.events.push({
|
||||||
id: item.ID,
|
id: item.ID,
|
||||||
title: item.Title,
|
title: item.Title,
|
||||||
@@ -724,6 +744,19 @@ onMounted(() => {
|
|||||||
: t("calendar.view_event")
|
: t("calendar.view_event")
|
||||||
}}
|
}}
|
||||||
</h5>
|
</h5>
|
||||||
|
<div
|
||||||
|
v-if="eventData.isEditing && userStore.isLoggedIn && getUserIdFromEventID(eventData.id)"
|
||||||
|
class="absolute left-1/2 -translate-x-1/2 flex items-center gap-2"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
:src="usersStore.getAvatarUrlFromUserID(getUserIdFromEventID(eventData.id))"
|
||||||
|
class="h-6 w-6 rounded-full"
|
||||||
|
alt="avatar"
|
||||||
|
/>
|
||||||
|
<span class="text-sm text-gray-500">
|
||||||
|
{{ t("calendar.created_by", { name: getUsernameFromUserID(getUserIdFromEventID(eventData.id)) }) }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
<button
|
<button
|
||||||
@click="closeEventModal"
|
@click="closeEventModal"
|
||||||
class="btn-close text-gray-500 hover:text-gray-700"
|
class="btn-close text-gray-500 hover:text-gray-700"
|
||||||
|
|||||||
Reference in New Issue
Block a user