Files
fe-manage/src/components/vote/AddVote.vue
2023-02-22 23:49:53 +08:00

703 lines
18 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 addvoteDrawer"
width="800"
title="添加投票"
placement="right"
>
<div class="drawerMain">
<div class="header">
<div v-if="taskIndex>=0" class="headerTitle">编辑投票任务</div>
<div v-else class="headerTitle">添加投票任务</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<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.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' }"
:disabled-date="disabledDate"
:disabled-time="disabledRangeTime"
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">
<CreateVote v-model:options="formData.voteStemDtoList" :list="formData.voteStemDtoList">
<button class="xkbtn">
{{ formData.voteStemDtoList.length ? "编辑" : "创建" }}投票题干
</button>
</CreateVote>
<div v-if="formData.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.voteExplain"
placeholder="请输入投票说明"
allow-clear
:rows="6"
maxlength="150"
/>
</div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="confirm">确定</button>
</div>
</div>
</a-drawer>
</template>
<script setup>
import {defineEmits, defineProps, ref} from "vue";
import CreateVote from "./CreateVote.vue";
import {Form, message} from "ant-design-vue";
import dayjs from "dayjs";
const props = defineProps({
type: Number,
taskList: []
})
const visible = ref(false)
const formData = ref({
voteName: '',
voteStartTime: '',
voteEndTime: '',
voteStemDtoList: [],
voteExplain: '',
})
const emit = defineEmits({})
const taskIndex = ref(-1);
const dateTime = ref([]);
const rulesRef = ref({
voteName: [
{
required: true,
message: '请输入投票名称',
},
],
voteStartTime: [
{
required: true,
message: '请输入起止时间',
},
],
voteEndTime: [
{
required: true,
message: '请输入起止时间',
},
],
voteStemDtoList: [
{
required: true,
message: '请创建题干信息',
},
],
});
const {resetFields, validate} = Form.useForm(formData, rulesRef);
const closeDrawer = () => {
visible.value = false
taskIndex.value = -1
dateTime.value = []
resetFields()
};
const range = (start, end) => {
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
};
function timeChange(time, timeStr) {
formData.value.voteStartTime = timeStr[0]
formData.value.voteEndTime = timeStr[1]
}
const disabledDate = (current) => {
return current && current < dayjs().startOf('day');
};
const disabledRangeTime = () => ({
disabledHours: () => range(0, 24).splice(4, 20),
disabledMinutes: () => range(30, 60),
disabledSeconds: () => [55, 56],
});
async function confirm() {
debugger
await validate().catch(({errorFields}) => {
message.warning(errorFields[0].errors.join());
throw Error("数据校验不通过")
});
if (taskIndex.value === -1) {
const list = props.taskList
list.push({name: formData.value.voteName, type: props.type,duration:dayjs(formData.value.voteEndTime).diff(formData.value.voteStartTime,'minutes'), info: {...formData.value}})
} else {
const data = props.taskList[taskIndex.value]
data.name = formData.value.voteName
data.info = {...formData.value}
data.duration = dayjs(formData.value.voteEndTime).diff(formData.value.voteStartTime,'minutes')
}
emit('update:taskList', [...props.taskList])
closeDrawer()
}
function openDrawer(i, row) {
row && (formData.value = {...row.info});
row && (dateTime.value = [dayjs(row.info.voteStartTime, "YYYY-MM-DD HH:mm"), dayjs(row.info.voteEndTime, "YYYY-MM-DD HH:mm")]);
(i >= 0) && (taskIndex.value = i)
visible.value = true
}
function handleDel() {
formData.value.voteStemDtoList = []
}
defineExpose({openDrawer})
// 限制文件格式上传
// const beforeUpload = (file) => {
// if (file.type.indexOf("sheet") == -1) {
// message.destroy();
// message.error("请上传正确的文件格式");
//
// state.fileList = [];
// return false;
// }
//
// const formData = new FormData();
// formData.append("uploadFile", file);
// baseVoteupload(formData).then((res) => {
// if (res.data.code === 200) {
// state.basevote = res.data.data;
// }
// });
// return false;
// };
//
// //删除题干信息接口
// const dleVoteStem = () => {
// api.deleteVoteStem({voteStemId: state.voteId}).then(() => {
// message.success("删除题干信息成功");
// });
// };
//
// //根据投票id获取投票信息
// const queryVoteInfo = () => {
// api.queryVoteDetailById(props.EditVoteId)
// .then((res) => {
// state.inputV1 = res.data.data.voteName;
// state.textV1 = res.data.data.voteExplain;
// state.baseVote = res.data.data.baseVote;
// state.ascriptionId = res.data.data.ascriptionId;
// state.voteId = res.data.data.id;
// state.time = [
// dayjs(res.data.data.voteStartTime, "YYYY-MM-DD HH:mm"),
// dayjs(res.data.data.voteEndTime, "YYYY-MM-DD HH:mm"),
// ];
// })
// };
// const updateToTask = (res) => {
// console.log("props.isLevel=====", props.isLevel);
// if (props.isLevel == 1) {
// if (!props.isactive) {
// message.destroy();
// return message.warning("请先选中关卡");
// }
// RouterEditTask({
// chapterId: props.isactive,
// courseId: res.data.data.id,
// name: res.data.data.voteName,
// routerId: props.routerId,
// routerTaskId: props.routerTaskId || 0,
// type: 12,
// id: props.taskIdDraft
// }).then(() => {
// ctx.emit("changeData", false);
// state.addLoading = false;
// })
// } else if (props.isLevel == 2) {
// apiTask.addTask({
// courseId: res.data.data.id,
// name: res.data.data.voteName,
// projectId: props.projectId,
// projectTaskId: props.projectTaskId || 0,
// stageId: props.chooseStageId || 0,
// type: 12,
// id: props.taskIdDraft
// })
// .then(() => {
// ctx.emit("changeData", false);
// })
// } else if (props.isLevel == 3) {
// addTempTask({
// courseId: res.data.data.id,
// name: res.data.data.voteName,
// projectTemplateId: props.projectTemplateId,
// projectTaskId: props.projectTaskId || 0,
// stageId: props.chooseStageId || 0,
// type: 12,
// id: props.taskIdDraft
// })
// .then(() => {
// ctx.emit("changeData", false);
// //message.success(`${props.edit ? "编辑" : "新增"}阶段任务成功`);
// })
// }
// };
// //修改投票信息接口
// const updateVoteInfo = () => {
//
// if (state.time) {
// state.startTime = dayjs(state.time[0]).format("YYYY-MM-DD HH:mm:ss");
// state.endTime = dayjs(state.time[1]).format("YYYY-MM-DD HH:mm:ss");
// }
// let obj = {
// voteName: state.inputV1,
// voteStartTime: dayjs(state.time[0]).format("YYYY-MM-DD HH:mm:ss"),
// voteEndTime: dayjs(state.time[1]).format("YYYY-MM-DD HH:mm:ss"),
// id: state.voteId,
// voteExplain: state.textV1,
// };
// api.editVote(obj).then(async (res) => {
// await updateToTask(res);
// closeDrawer();
// message.destroy();
// message.success(props.edit ? "修改投票信息成功" : "添加投票信息成功");
// })
// };
// const queryStem = () => {
// state.addStemVisible = true;
// };
// const closeStem = () => {
// state.addStemVisible = false;
// };
// const handlelog = (e) => {
// state.ballotId = null;
// console.log(e);
// };
//
// function downloadTemplate() {
// window.open("/manageApi/投票基础数据模版.xlsx");
// }
</script>
<style lang="scss">
.ConfirmModal {
.ant-modal {
width: 424px !important;
height: 258px !important;
.ant-modal-content {
width: 424px !important;
height: 258px !important;
.ant-modal-body {
width: 424px !important;
height: 258px !important;
padding: 0 !important;
.delete {
z-index: 999;
width: 424px;
height: 258px;
background: #ffffff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
border-radius: 4px;
.del_header {
position: absolute;
width: calc(100%);
height: 40px;
background: linear-gradient(
rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%
);
}
.del_main {
width: 100%;
position: relative;
.header {
display: flex;
align-items: center;
padding-top: 20px;
padding-left: 26px;
font-size: 16px;
.icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/QR.png);
background-size: 100% 100%;
}
.close_exit {
position: absolute;
right: 42px;
cursor: pointer;
width: 20px;
height: 20px;
background-image: url(@/assets/images/coursewareManage/close.png);
background-size: 100% 100%;
}
}
.body {
width: 100%;
margin: 34px auto 56px auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: relative;
.back {
position: absolute;
top: 30px;
font-size: 12px;
font-weight: 400;
color: #666666;
}
}
.del_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
width: 100px;
height: 40px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 40px;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
margin-right: 14px;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
}
}
}
}
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addvoteDrawer {
.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: 32px;
.main_item {
display: flex;
align-items: center;
margin-bottom: 32px;
.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;
margin-right: 8px;
color: #fff;
margin-right: 10px;
}
.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;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
.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>