Files
fe-manage/src/components/growthpath/GrowthVote.vue
Pengxiansen 403f234c7e 提交
2025-02-28 18:37:21 +08:00

487 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div @click="openDrawer()">
<slot></slot>
</div>
<a-drawer
:visible="visible"
class="drawerStyle growth-vote"
width="800"
title="添加投票"
placement="right"
>
<a-spin :spinning="spinning">
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ title }}</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<template v-if="step == 1">
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">任务名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="formData.info.voteName"
style="width: 424px; height: 40px; border-radius: 8px"
placeholder="请输入投票任务名称"
maxlength="20"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">起止时间</span>
</div>
<div class="select">
<a-range-picker
:show-time="{ format: 'HH:mm' }"
format="YYYY-MM-DD HH:mm"
style="width: 424px"
v-model:value="dateTime"
@change="timeChange"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span>创建投票题干</span>
</div>
<div class="btnbox">
<button class="xkbtn" @click="step = 2">
{{
formData.info.voteStemDtoList.length ? "编辑" : "创建"
}}投票题干
</button>
<div v-if="formData.info.voteStemDtoList.length">
<a-tag closable color="processing" @close="handleDel">
<span style="font-size: 14px; line-height: 33px"
>删除投票题干</span
>
</a-tag>
</div>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">投票说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="formData.info.voteExplain"
placeholder="请输入投票说明"
allow-clear
:rows="6"
maxlength="150"
/>
</div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn2" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</template>
<template v-if="step == 2">
<CreateVote
v-model:options="formData.info.voteStemDtoList"
@close="step = 1"
@confirm="step = 1"
>
</CreateVote>
</template>
</div>
</a-spin>
</a-drawer>
</template>
<script setup>
import { defineEmits, defineProps, ref, computed } from "vue";
import CreateVote from "./CreateVote.vue";
import { Form, message } from "ant-design-vue";
import dayjs from "dayjs";
import { useResetRef } from "@/utils/useCommon";
import { saveTask } from "@/api/growthpath";
const props = defineProps({
type: Number,
// 选秀2 必修1
activeKey: String,
growId: String,
});
// 弹框标题
const title = computed(() => {
if (step.value == 1) {
return formData.value.id ? "编辑投票任务" : "添加投票";
} else if (step.value == 2) {
return "创建投票题干";
}
});
// 步骤数
const step = ref(1);
const visible = ref(false);
const formData = ref({
info: {
voteName: "",
voteStartTime: "",
voteEndTime: "",
voteStemDtoList: [],
voteExplain: "",
},
});
const emit = defineEmits(["refresh"]);
const dateTime = ref([]);
const rulesRef = ref({
voteName: [
{
required: true,
message: "请输入投票名称",
},
],
voteStartTime: [
{
required: true,
message: "请输入起止时间",
},
],
voteEndTime: [
{
required: true,
message: "请输入起止时间",
},
],
voteStemDtoList: [
{
required: true,
message: "请创建题干信息",
},
],
});
let validate = null;
// 关闭弹窗
const closeDrawer = () => {
if (step.value > 1) {
step.value = step.value - 1;
} else {
visible.value = false;
dateTime.value = [];
formData.value = {
info: {
voteName: "",
voteStartTime: "",
voteEndTime: "",
voteStemDtoList: [],
voteExplain: "",
},
};
}
};
function timeChange(time, timeStr) {
formData.value.info.voteStartTime = timeStr[0];
formData.value.info.voteEndTime = timeStr[1];
}
const disabledDate = (current) => {
return current && current < dayjs().startOf("day");
};
const spinning = ref(false);
async function confirm() {
await validate().catch(({ errorFields }) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过");
});
if (dayjs().isAfter(dayjs(formData.value.info.voteEndTime))) {
message.warning("考试结束时间不能小于当前时间");
return;
}
// 专业力ID
formData.value.growthId = props.growId;
// 任务类型
formData.value.taskType = props.type;
// 必修/选修
formData.value.type = props.activeKey;
// 任务名称
formData.value.taskName = formData.value.info.voteName;
spinning.value = true;
saveTask(formData.value)
.then((res) => {
if (res.data.code == 200) {
if (formData.value.id) {
message.success("编辑成功");
} else {
message.success("添加成功");
}
emit("refresh");
} else {
message.error(res.msg);
}
closeDrawer();
})
.finally(() => {
spinning.value = false;
});
}
function openDrawer(row) {
row && (row = JSON.parse(JSON.stringify(row)));
row && (formData.value = row);
row &&
(dateTime.value = [
dayjs(row.info.voteStartTime, "YYYY-MM-DD HH:mm"),
dayjs(row.info.voteEndTime, "YYYY-MM-DD HH:mm"),
]);
validate = Form.useForm(formData.value.info, rulesRef).validate;
visible.value = true;
}
function handleDel() {
formData.value.info.voteStemDtoList = [];
}
defineExpose({ openDrawer });
</script>
<style lang="scss" scoped>
.growth-vote > .ant-drawer-content-wrapper {
min-width: 800px !important;
width: 800px !important;
}
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
::v-deep.ant-spin-nested-loading {
height: 100%;
.ant-spin-container {
height: 100%;
}
}
.growth-vote {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
padding-right: 30px;
flex: 1;
// border-right: 1px solid #e8e8e8;
margin-top: 0px;
.main_item {
display: flex;
align-items: center;
margin: 32px 0;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
color: #fff;
margin: 0 16px 0 0;
}
.fileTigan {
display: flex;
align-items: center;
padding: 3px 5px;
background-color: rgba(42, 103, 209, 0.4);
span {
margin-right: 5px;
}
.delBox {
width: 13px;
height: 13px;
background-image: url(@/assets/images/basicinfo/ch.png);
background-size: 100% 100%;
border-radius: 50%;
}
}
}
}
.in {
element.style {
border-radius: 8px;
}
.ant-input-affix-wrapper {
position: relative;
display: inline-block;
width: 132%;
/* min-width: 19px; */
padding: 4px 11px;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
line-height: 1.5715;
background-color: #fff;
background-image: none;
border: 1px solid #d9d9d9;
border-radius: 2px;
transition: all 0.3s;
display: inline-flex;
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 423px;
.ant-input {
width: 355px;
}
.ant-input-textarea-show-count {
position: relative;
}
.ant-input-textarea-show-count::after {
position: absolute;
right: 10px;
bottom: 0px;
}
.ant-input {
border-radius: 8px;
}
}
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
}
}
}
.main_btns {
height: 72px;
width: 100%;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>