@@ -125,6 +125,67 @@ const websiteConfig = reactive<WebsiteConfig>({
|
|||||||
enableMaxkb: true,
|
enableMaxkb: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 班级列表的顺序就是登录页、班级 PK、统计面板下拉框里的顺序,数组原样存进 options 表,
|
||||||
|
// 所以拖拽只改前端数组,点「保存」生效
|
||||||
|
const dragFrom = ref<number | null>(null)
|
||||||
|
const dragOver = ref<number | null>(null)
|
||||||
|
|
||||||
|
function moveClass(from: number, to: number) {
|
||||||
|
const list = [...websiteConfig.classList]
|
||||||
|
const [moved] = list.splice(from, 1)
|
||||||
|
list.splice(to, 0, moved)
|
||||||
|
websiteConfig.classList = list
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderClassTag(tag: string | { label: string }, index: number) {
|
||||||
|
const label = typeof tag === "string" ? tag : tag.label
|
||||||
|
return h(
|
||||||
|
NTag,
|
||||||
|
{
|
||||||
|
key: index,
|
||||||
|
closable: true,
|
||||||
|
draggable: true,
|
||||||
|
type: dragOver.value === index ? "primary" : "default",
|
||||||
|
style: {
|
||||||
|
cursor: "move",
|
||||||
|
opacity: dragFrom.value === index ? 0.4 : 1,
|
||||||
|
},
|
||||||
|
onClose: () => {
|
||||||
|
websiteConfig.classList = websiteConfig.classList.filter(
|
||||||
|
(_, i) => i !== index,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
onDragstart: (e: DragEvent) => {
|
||||||
|
dragFrom.value = index
|
||||||
|
// Firefox 不 setData 就不会开始拖
|
||||||
|
e.dataTransfer?.setData("text/plain", label)
|
||||||
|
if (e.dataTransfer) e.dataTransfer.effectAllowed = "move"
|
||||||
|
},
|
||||||
|
onDragover: (e: DragEvent) => {
|
||||||
|
if (dragFrom.value === null) return
|
||||||
|
e.preventDefault()
|
||||||
|
dragOver.value = index
|
||||||
|
},
|
||||||
|
onDragleave: () => {
|
||||||
|
if (dragOver.value === index) dragOver.value = null
|
||||||
|
},
|
||||||
|
onDrop: (e: DragEvent) => {
|
||||||
|
e.preventDefault()
|
||||||
|
if (dragFrom.value !== null && dragFrom.value !== index) {
|
||||||
|
moveClass(dragFrom.value, index)
|
||||||
|
}
|
||||||
|
dragFrom.value = null
|
||||||
|
dragOver.value = null
|
||||||
|
},
|
||||||
|
onDragend: () => {
|
||||||
|
dragFrom.value = null
|
||||||
|
dragOver.value = null
|
||||||
|
},
|
||||||
|
},
|
||||||
|
() => label,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
async function getWebsiteConfig() {
|
async function getWebsiteConfig() {
|
||||||
const res = await getWebsite()
|
const res = await getWebsite()
|
||||||
websiteConfig.websiteBaseUrl = res.websiteBaseUrl
|
websiteConfig.websiteBaseUrl = res.websiteBaseUrl
|
||||||
@@ -225,10 +286,14 @@ onMounted(() => {
|
|||||||
<n-form label-placement="left">
|
<n-form label-placement="left">
|
||||||
<n-form-item label="班级列表">
|
<n-form-item label="班级列表">
|
||||||
<n-flex vertical size="small">
|
<n-flex vertical size="small">
|
||||||
<n-dynamic-tags v-model:value="websiteConfig.classList" />
|
<n-dynamic-tags
|
||||||
|
v-model:value="websiteConfig.classList"
|
||||||
|
:render-tag="renderClassTag"
|
||||||
|
/>
|
||||||
<n-text depth="3" style="font-size: 12px">
|
<n-text depth="3" style="font-size: 12px">
|
||||||
填 {{ CLASS_NAME_MIN_DIGITS }}~{{ CLASS_NAME_MAX_DIGITS }}
|
填 {{ CLASS_NAME_MIN_DIGITS }}~{{ CLASS_NAME_MAX_DIGITS }}
|
||||||
位数字,如 251、2510,要和用户名里 ks 后面那段一致
|
位数字,如 251、2510,要和用户名里 ks 后面那段一致;
|
||||||
|
拖动标签调整顺序(登录页等下拉框按此顺序),改完点保存
|
||||||
</n-text>
|
</n-text>
|
||||||
</n-flex>
|
</n-flex>
|
||||||
</n-form-item>
|
</n-form-item>
|
||||||
|
|||||||
Reference in New Issue
Block a user