@qxs-bns/components 0.0.26 → 0.0.27
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/es/package.json.js +1 -1
- package/es/src/subject-action/src/subject-action.vue.js +1 -1
- package/es/src/subject-action/src/subject-action.vue.js.map +1 -1
- package/es/src/subject-list/index.js.map +1 -1
- package/es/src/subject-list/src/components/subject-single.vue.js +1 -1
- package/es/src/subject-list/src/components/subject-single.vue.js.map +1 -1
- package/lib/package.json.js +1 -1
- package/lib/src/subject-action/src/subject-action.vue.js +1 -1
- package/lib/src/subject-action/src/subject-action.vue.js.map +1 -1
- package/lib/src/subject-list/index.js.map +1 -1
- package/lib/src/subject-list/src/components/subject-single.vue.js +1 -1
- package/lib/src/subject-list/src/components/subject-single.vue.js.map +1 -1
- package/package.json +1 -1
- package/types/tsconfig.tsbuildinfo +1 -1
package/es/package.json.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
var r="0.0.
|
1
|
+
var r="0.0.27";export{r as version};
|
2
2
|
//# sourceMappingURL=package.json.js.map
|
@@ -1,2 +1,2 @@
|
|
1
|
-
import{ElPopover as e,ElLink as t,ElCheckbox as l,ElButton as a,ElIcon as n,ElDialog as
|
1
|
+
import{ElPopover as e,ElLink as t,ElCheckbox as l,ElButton as a,ElIcon as n,ElDialog as i,ElRadioGroup as o,ElRadio as s}from"element-plus/es";import{defineComponent as u,ref as d,createElementBlock as c,openBlock as r,normalizeClass as m,unref as p,createElementVNode as f,createCommentVNode as y,createVNode as v,createBlock as k,withCtx as _,createTextVNode as b,isRef as h,Fragment as g}from"vue";import{Edit as w,Delete as C,Top as x,Bottom as V}from"@element-plus/icons-vue";import{useNamespace as j}from"@qxs-bns/hooks";import O from"../../subject-type/src/subject-type.vue.js";const S={key:0,class:"flex-justify-between"},E={key:0,class:"has-set"},T={key:1,class:"flex flex-justify-end",style:{width:"100%"}};var A=u({name:"QxsSubjectAction",__name:"subject-action",props:{isEdit:{type:Boolean},isSet:{type:Boolean,default:!1},isKey:{type:Boolean,default:!1},answerCheckType:{type:Number,default:2},showOtherOption:{type:Boolean,default:!0},examAnswerRelationType:{type:Number,default:null},pageEnd:{type:Boolean,default:!1}},emits:["moveUp","moveDown","delete","save","edit","add","onShowRichText","setKey","setAnswerSetting"],setup(u,{emit:A}){const B=u,U=d(B.isKey),K=d(!1),R=A,z=d(B.answerCheckType),D=j("subject-action");function N(){K.value=!1,R("setAnswerSetting",z)}function q(e,t){R("add",e,t?B.examAnswerRelationType:null)}return(d,j)=>{const A=t,B=e,Q=l,F=n,G=a,H=s,I=o,J=i;return r(),c("div",{class:m(p(D).e("action-exam"))},[f("div",{class:m(["action flex",[{active:u.isEdit}]])},[u.isEdit?(r(),c("div",S,[v(B,{trigger:"click"},{reference:_((()=>[v(A,{type:"primary",class:"btn-margin"},{default:_((()=>j[13]||(j[13]=[b(" +在此题后加入新题 ")]))),_:1})])),default:_((()=>[v(O,{onSelect:q})])),_:1}),u.showOtherOption?(r(),k(A,{key:0,type:"primary",onClick:j[0]||(j[0]=e=>R("onShowRichText")),class:"btn-margin"},{default:_((()=>j[14]||(j[14]=[b(" +添加题目描述(图文) ")]))),_:1})):y("v-if",!0),u.showOtherOption?(r(),k(A,{key:1,type:"primary",onClick:j[1]||(j[1]=e=>K.value=!0),class:"btn-margin"},{default:_((()=>j[15]||(j[15]=[b(" 答题设置 ")]))),_:1})):y("v-if",!0),u.showOtherOption?(r(),k(Q,{key:2,modelValue:p(U),"onUpdate:modelValue":j[2]||(j[2]=e=>h(U)?U.value=e:null),label:"核心题",onChange:j[3]||(j[3]=e=>R("setKey",p(U)))},null,8,["modelValue"])):y("v-if",!0)])):y("v-if",!0),f("div",null,[u.isSet?(r(),c("div",E," *此题设置了跳题逻辑 ")):(r(),c("div",T,[u.isEdit?(r(),c(g,{key:1},[v(G,{class:"btn-margin",onClick:j[8]||(j[8]=e=>R("delete"))},{default:_((()=>j[20]||(j[20]=[b(" 删除 ")]))),_:1}),v(G,{type:"primary",onClick:j[9]||(j[9]=e=>R("save"))},{default:_((()=>j[21]||(j[21]=[b(" 完成编辑 ")]))),_:1})],64)):(r(),c(g,{key:0},[u.pageEnd?y("v-if",!0):(r(),k(G,{key:0,class:"btn-margin",onClick:j[4]||(j[4]=e=>R("edit"))},{icon:_((()=>[v(F,null,{default:_((()=>[v(p(w))])),_:1})])),default:_((()=>[j[16]||(j[16]=b(" 编辑 "))])),_:1})),v(G,{class:"btn-margin",onClick:j[5]||(j[5]=e=>R("delete"))},{icon:_((()=>[v(F,null,{default:_((()=>[v(p(C))])),_:1})])),default:_((()=>[j[17]||(j[17]=b(" 删除 "))])),_:1}),v(G,{class:"btn-margin",onClick:j[6]||(j[6]=e=>R("moveUp"))},{icon:_((()=>[v(F,null,{default:_((()=>[v(p(x))])),_:1})])),default:_((()=>[j[18]||(j[18]=b(" 上移 "))])),_:1}),v(G,{class:"btn-margin",onClick:j[7]||(j[7]=e=>R("moveDown"))},{icon:_((()=>[v(F,null,{default:_((()=>[v(p(V))])),_:1})])),default:_((()=>[j[19]||(j[19]=b(" 下移 "))])),_:1})],64))]))]),v(J,{modelValue:p(K),"onUpdate:modelValue":j[12]||(j[12]=e=>h(K)?K.value=e:null),title:"答题设置",class:"customize-dialog"},{footer:_((()=>[v(G,{class:"customize-button",type:"primary",plain:"",onClick:j[11]||(j[11]=e=>K.value=!1)},{default:_((()=>j[25]||(j[25]=[b(" 取消 ")]))),_:1}),v(G,{class:"customize-button",type:"primary",plain:"",onClick:N},{default:_((()=>j[26]||(j[26]=[b(" 保存 ")]))),_:1})])),default:_((()=>[v(I,{modelValue:p(z),"onUpdate:modelValue":j[10]||(j[10]=e=>h(z)?z.value=e:null),class:"vertical-radio-group"},{default:_((()=>[v(H,{value:1},{default:_((()=>j[22]||(j[22]=[b("必须全部都是支持选项,方可下一步")]))),_:1}),v(H,{value:2},{default:_((()=>j[23]||(j[23]=[b("无需判断是否是支持选项")]))),_:1}),v(H,{value:3},{default:_((()=>j[24]||(j[24]=[b("包含全部支持选项,即可下一步")]))),_:1})])),_:1},8,["modelValue"])])),_:1},8,["modelValue"])],2)],2)}}});export{A as default};
|
2
2
|
//# sourceMappingURL=subject-action.vue.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"subject-action.vue.js","sources":["../../../../../../packages/components/src/subject-action/src/subject-action.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Bottom, Delete, Edit, Top } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectType from '../../subject-type/src/subject-type.vue'\n\ndefineOptions({\n name: 'QxsSubjectAction',\n})\nconst props = defineProps({\n isEdit: {\n type: Boolean,\n },\n isSet: {\n type: Boolean,\n default: false,\n },\n isKey: {\n type: Boolean,\n default: false,\n },\n answerCheckType: {\n type: Number,\n default: 2\n },\n showOtherOption: {\n type: Boolean,\n default: true,\n },\n examAnswerRelationType: {\n type: Number,\n default: null\n },\n pageEnd: {\n type: Boolean,\n default: false\n }\n})\nconst isKey = ref(props.isKey)\nconst showAnswerSetting = ref(false)\nconst emits = defineEmits(['moveUp', 'moveDown', 'delete', 'save', 'edit', 'add', 'onShowRichText', 'setKey', 'setAnswerSetting'])\nconst answerType = ref(props.answerCheckType)\nconst ns = useNamespace('subject-action')\n\nfunction onSaveSetting() {\n showAnswerSetting.value = false\n emits('setAnswerSetting', answerType)\n}\n\nfunction selectExam(type:string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n</script>\n\n<template>\n <div :class=\"ns.e('action-exam')\">\n <div class=\"action\" :class=\"[{ active: isEdit }]\">\n <div v-if=\"isEdit\"
|
1
|
+
{"version":3,"file":"subject-action.vue.js","sources":["../../../../../../packages/components/src/subject-action/src/subject-action.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Bottom, Delete, Edit, Top } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectType from '../../subject-type/src/subject-type.vue'\n\ndefineOptions({\n name: 'QxsSubjectAction',\n})\nconst props = defineProps({\n isEdit: {\n type: Boolean,\n },\n isSet: {\n type: Boolean,\n default: false,\n },\n isKey: {\n type: Boolean,\n default: false,\n },\n answerCheckType: {\n type: Number,\n default: 2\n },\n showOtherOption: {\n type: Boolean,\n default: true,\n },\n examAnswerRelationType: {\n type: Number,\n default: null\n },\n pageEnd: {\n type: Boolean,\n default: false\n }\n})\nconst isKey = ref(props.isKey)\nconst showAnswerSetting = ref(false)\nconst emits = defineEmits(['moveUp', 'moveDown', 'delete', 'save', 'edit', 'add', 'onShowRichText', 'setKey', 'setAnswerSetting'])\nconst answerType = ref(props.answerCheckType)\nconst ns = useNamespace('subject-action')\n\nfunction onSaveSetting() {\n showAnswerSetting.value = false\n emits('setAnswerSetting', answerType)\n}\n\nfunction selectExam(type:string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n</script>\n\n<template>\n <div :class=\"ns.e('action-exam')\">\n <div class=\"action flex\" :class=\"[{ active: isEdit }]\">\n <div v-if=\"isEdit\" class=\"flex-justify-between\">\n <el-popover trigger=\"click\">\n <template #reference>\n <el-link type=\"primary\" class=\"btn-margin\">\n +在此题后加入新题\n </el-link>\n </template>\n <SubjectType @select=\"selectExam\" />\n </el-popover>\n <el-link type=\"primary\" @click=\"emits('onShowRichText')\" v-if=\"showOtherOption\" class=\"btn-margin\">\n +添加题目描述(图文)\n </el-link>\n <el-link type=\"primary\" @click=\"showAnswerSetting = true\" v-if=\"showOtherOption\" class=\"btn-margin\">\n 答题设置\n </el-link>\n <el-checkbox v-model=\"isKey\" label=\"核心题\" @change=\"emits('setKey', isKey)\" v-if=\"showOtherOption\" />\n </div>\n <div>\n <div v-if=\"isSet\" class=\"has-set\">\n *此题设置了跳题逻辑\n </div>\n <div v-else class=\"flex flex-justify-end\" style=\"width: 100%;\">\n <template v-if=\"!isEdit\">\n <el-button class=\"btn-margin\" @click=\"emits('edit')\" v-if=\"!pageEnd\">\n <template #icon>\n <el-icon>\n <Edit />\n </el-icon>\n </template>\n 编辑\n </el-button>\n <el-button class=\"btn-margin\" @click=\"emits('delete')\">\n <template #icon>\n <el-icon>\n <Delete />\n </el-icon>\n </template>\n 删除\n </el-button>\n <el-button class=\"btn-margin\" @click=\"emits('moveUp')\">\n <template #icon>\n <el-icon>\n <Top />\n </el-icon>\n </template>\n 上移\n </el-button>\n <el-button class=\"btn-margin\" @click=\"emits('moveDown')\">\n <template #icon>\n <el-icon>\n <Bottom />\n </el-icon>\n </template>\n 下移\n </el-button>\n </template>\n <template v-else>\n <el-button class=\"btn-margin\" @click=\"emits('delete')\">\n 删除\n </el-button>\n <el-button type=\"primary\" @click=\"emits('save')\">\n 完成编辑\n </el-button>\n </template>\n </div>\n </div>\n <el-dialog\n v-model=\"showAnswerSetting\"\n title=\"答题设置\"\n class=\"customize-dialog\"\n >\n <el-radio-group v-model=\"answerType\" class=\"vertical-radio-group\">\n <el-radio :value=\"1\">必须全部都是支持选项,方可下一步</el-radio>\n <el-radio :value=\"2\">无需判断是否是支持选项</el-radio>\n <el-radio :value=\"3\">包含全部支持选项,即可下一步</el-radio>\n </el-radio-group>\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"showAnswerSetting = false\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveSetting\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n </div>\n</template>\n"],"names":["props","__props","isKey","ref","showAnswerSetting","emits","__emit","answerType","answerCheckType","ns","useNamespace","onSaveSetting","value","selectExam","type","canSet","examAnswerRelationType"],"mappings":"koCAQA,MAAMA,EAAQC,EA6BRC,EAAQC,EAAIH,EAAME,OAClBE,EAAoBD,GAAI,GACxBE,EAAQC,EACRC,EAAaJ,EAAIH,EAAMQ,iBACvBC,EAAKC,EAAa,kBAExB,SAASC,IACPP,EAAkBQ,OAAQ,EAC1BP,EAAM,mBAAoBE,EAAU,CAG7B,SAAAM,EAAWC,EAAaC,GAChCV,EAAM,MAAOS,EAAMC,EAAQf,EAAMgB,uBAAwB,KAAI"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../packages/components/src/subject-list/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-list.vue'\n\nconst QxsSubjectList = withInstall(component)\n
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../packages/components/src/subject-list/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-list.vue'\n\nconst QxsSubjectList = withInstall(component)\n\nexport {\n QxsSubjectList\n}\n\nexport default QxsSubjectList"],"names":["QxsSubjectList","withInstall","component"],"mappings":"yFAGA,MAAMA,EAAiBC,EAAYC"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
import{ElCheckbox as e,ElRadio as l,ElInput as t,ElSelect as a,ElOption as i,ElIcon as s,ElLink as n,ElDialog as r,ElButton as o,ElMessage as u}from"element-plus/es";import{defineComponent as d,useAttrs as m,ref as c,computed as p,watch as v,onMounted as y,createElementBlock as f,openBlock as x,normalizeClass as w,unref as h,createVNode as C,createSlots as g,withCtx as b,createBlock as k,createCommentVNode as S,createElementVNode as A,createTextVNode as V,toDisplayString as T,Fragment as R,renderList as q,isRef as j,mergeProps as I}from"vue";import{CirclePlus as _,Remove as E}from"@element-plus/icons-vue";import{useNamespace as U}from"@qxs-bns/hooks";import B from"../../../subject-action/src/subject-action.vue.js";import L from"../../../subject-layout/src/subject-layout.vue.js";import $ from"../../../tiny-mce-editor/src/tiny-mce-editor.vue.js";import{setGuid as K}from"@qxs-bns/utils";const N={class:"preview"},z={class:"title"},M={key:0},D={key:1},H={key:0},O=["innerHTML"],Q={class:"preview-answer"},F={class:"order"},G={class:"order"},J={style:{flex:"1"}},P={class:"margin-bottom flex flex-items-center"},W={class:"margin-bottom answer-list"},X={class:"order"},Y={key:0,class:"margin-bottom flex flex-items-center"},Z={style:{flex:"1"}},ee={key:1,class:"flex"},le={style:{flex:"1"}},te={key:2,class:"margin-bottom flex"},ae={style:{flex:"1"}},ie={class:"flex flex-justify-end"};var se=d({name:"QxsSubjectSingle",__name:"subject-single",props:{orderIndex:{type:Number,required:!0},title:{type:String,required:!1},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},type:{type:String,required:!0},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},answerList:{type:null,required:!1},leastAnswerCount:{type:Number,required:!1},analysis:{type:String,required:!1},examExpand:{type:String,required:!1},examRichTextContent:{type:String,required:!1},showAnalysis:{type:Boolean,required:!1},examAnswerRelationType:{type:Number,required:!1},customId:{type:Number,required:!1},examId:{type:Number,required:!1},isKey:{type:Boolean,required:!0},answerCheckType:{type:Number,required:!0}},emits:["move","save","delete","edit","add","setRelation"],setup(d,{emit:se}){const ne=d,re=se,oe=m(),ue=c(0),de=c(ne.isKey),me=c(2),ce=c([{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1}]),pe=c(),ve=c(""),ye=c(""),fe=c(!1),xe=c(""),we=c(0),he=c(!1),Ce=c(""),ge=p((()=>"single"===ne.type?"单选题":"multiple"===ne.type?"多选题":"排序题")),be=c([]),ke=p((()=>{const e=[];for(let l=ce.value.length;l>1;l--)e.push({label:`至少选择${l}项`,value:l});return e.reverse()}));function Se(){ne.isSave||ce.value.push({title:"",isCorrect:!1,customAnswerId:K()})}function Ae(){fe.value=!1,xe.value=""}function Ve(){if(!ve.value)return void u.error("题目标题不能为空!");let e="",l=!1,t=null,a=0;if("multiple"===ne.type||"single"===ne.type?ce.value.forEach(((i,s)=>{i.title||(e+=`选项${String.fromCharCode(65+s)}未填写。`),i.isCorrect&&(l=!0,a++),i.resultItem&&(t=1),i.answerRelations?.length&&(t=2)})):"sort"===ne.type&&be.value.length&&(l=!0),e)return void u.error(e);if(new Set(ce.value.map((e=>e.title))).size===ce.value.length){if("multiple"===ne.type){if(1===a)return void u.error("请至少设置两个正确答案");if(l&&a<pe.value)return void u.error("至少选几项与正确答案数不符")}re("save",{title:ve.value,answers:ce.value.map(((e,l)=>({...e,orderIndex:l+1}))),examExpand:be.value.map((e=>e.charCodeAt(0)-65+1)).join(","),analysis:ye.value,isSetCorrectAnswer:l,leastAnswerCount:pe.value,examRichTextContent:fe.value?xe.value:"",examAnswerRelationType:t,isKey:de.value,answerCheckType:me.value})}else u.error("选项不能重复")}function Te(){he.value=!1,Ce.value=""}function Re(){he.value=!1}function qe(e){de.value=e}function je(e){me.value=e}function Ie(e,l){re("add",e,l?ne.examAnswerRelationType:null)}v((()=>ne.isEdit),(()=>{ne.isEdit&&(we.value=(new Date).getTime())}));const _e=U("subject-single");return y((function(){if(ne.title&&(ve.value=ne.title),ne.answerCheckType&&(me.value=ne.answerCheckType),ne.answerList&&ne.answerList.length&&(ce.value=ne.answerList.map((e=>({...e,customAnswerId:e.examAnswerId||K()})))),ne.leastAnswerCount&&(pe.value=ne.leastAnswerCount),ne.examExpand&&ne.examExpand){const e=ne.examExpand.split(",");be.value=e.map((e=>{const l=ne.answerList.find((l=>l.answerId?.toString()===e));return l?String.fromCharCode(65+l.orderIndex-1):e})).filter(Boolean)}ne.analysis&&(ye.value=ne.analysis),ne.examRichTextContent&&(xe.value=ne.examRichTextContent,fe.value=!0)})),(u,d)=>{const m=e,c=l,p=t,v=i,y=a,U=s,K=n,se=o,we=r;return x(),f("div",{class:w(h(_e).e("single-exam"))},[C(L,{"show-edit":u.isEdit},g({preview:b((()=>[A("div",N,[A("div",null,[A("span",z,[V(T(u.orderIndex+1)+"."+T(h(ve))+" ",1),"single"===u.type?(x(),f("span",M,"(单选题)")):["multiple","sort"].includes(u.type)?(x(),f("span",D," ("+T(h(ge))+T(h(pe)?`至少选${h(pe)}项${"sort"===u.type?"并排序":""}`:"")+") ",1)):S("v-if",!0)])]),h(fe)?(x(),f("div",H,[A("div",{innerHTML:h(xe)},null,8,O)])):S("v-if",!0),A("div",Q,["sort"===u.type?(x(!0),f(R,{key:0},q(h(ce),((e,l)=>(x(),k(m,{key:l,class:"radio",disabled:!0},{default:b((()=>[A("span",F,T(String.fromCharCode(65+l))+". ",1),V(" "+T(e.title),1)])),_:2},1024)))),128)):(x(!0),f(R,{key:1},q(h(ce),((e,l)=>(x(),k(c,{key:l,class:"radio",value:"disabled",disabled:""},{default:b((()=>[A("span",G,T(String.fromCharCode(65+l))+". ",1),V(" "+T(e.title)+" "+T(e.isCorrect?"(支持选项)":"")+" "+T(e.resultItem&&1===u.examAnswerRelationType?"(已设置结果项)":"(未设置结果项)")+" "+T(e.answerRelations?.length&&2===u.examAnswerRelationType?"(已设置关联)":"(未设置关联)"),1)])),_:2},1024)))),128))])])])),default:b((()=>[u.showAction?(x(),k(B,{key:0,"is-edit":u.isEdit,"is-set":u.isSet,isKey:h(de),examAnswerRelationType:ne.examAnswerRelationType,answerCheckType:h(me),onMoveUp:d[5]||(d[5]=e=>re("move","up")),onMoveDown:d[6]||(d[6]=e=>re("move","down")),onDelete:d[7]||(d[7]=e=>re("delete")),onSave:Ve,onEdit:d[8]||(d[8]=e=>re("edit")),onAdd:Ie,onOnShowRichText:d[9]||(d[9]=e=>fe.value=!0),onSetKey:qe,onSetAnswerSetting:je},null,8,["is-edit","is-set","isKey","examAnswerRelationType","answerCheckType"])):S("v-if",!0)])),_:2},[u.isEdit?{name:"edit",fn:b((()=>[A("div",{class:w(["flex",[{"margin-bottom":h(fe)}]])},[d[12]||(d[12]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"题目:")],-1)),A("div",J,[C(p,{modelValue:h(ve),"onUpdate:modelValue":d[0]||(d[0]=e=>j(ve)?ve.value=e:null),type:"textarea",rows:2,placeholder:`【${h(ge)}】请输入问题`,disabled:u.isSave,"show-word-limit":"",maxlength:"200",class:"margin-bottom"},null,8,["modelValue","placeholder","disabled"])])],2),A("div",P,[d[13]||(d[13]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"设置:")],-1)),["multiple","sort"].includes(u.type)?(x(),k(y,{key:0,modelValue:h(pe),"onUpdate:modelValue":d[1]||(d[1]=e=>j(pe)?pe.value=e:null),style:{width:"150px"},placeholder:"至少选择几项",disabled:u.isSave},{default:b((()=>[(x(!0),f(R,null,q(h(ke),(e=>(x(),k(v,{key:e.value,value:e.value,label:e.label},null,8,["value","label"])))),128))])),_:1},8,["modelValue","disabled"])):S("v-if",!0)]),A("div",W,[(x(!0),f(R,null,q(h(ce),((e,l)=>(x(),f("div",{key:l,class:"answer-item flex flex-items-center"},[A("span",X,T(String.fromCharCode(65+l))+".",1),C(p,{modelValue:e.title,"onUpdate:modelValue":l=>e.title=l,class:"input","show-word-limit":"",maxlength:"100",placeholder:`选项${String.fromCharCode(65+l)}`,disabled:u.isSave},null,8,["modelValue","onUpdate:modelValue","placeholder","disabled"]),["single","multiple"].includes(u.type)?(x(),k(m,{key:0,modelValue:e.isCorrect,"onUpdate:modelValue":l=>e.isCorrect=l,class:w([{"is-correct":e.isCorrect}]),disabled:u.isSave,style:{"margin-left":"10px"},onChange:l=>function(e,l){"single"===ne.type?(l&&ce.value.forEach((l=>{l!==e&&(l.isCorrect=!1)})),e.isCorrect=l):"multiple"===ne.type&&(e.isCorrect=l)}(e,l)},{default:b((()=>[...d[14]||(d[14]=[V(" 支持选项 ")])])),_:2},1032,["modelValue","onUpdate:modelValue","class","disabled","onChange"])):S("v-if",!0),C(U,{class:"icon"},{default:b((()=>[C(h(_),{class:w([{disabled:u.isSave}]),onClick:Se},null,8,["class"])])),_:1}),C(U,{class:"icon"},{default:b((()=>[C(h(E),{class:w([{disabled:h(ce).length<3||u.isSave}]),onClick:e=>function(e){ce.value.length<3||ne.isSave||ce.value.splice(e,1)}(l)},null,8,["class","onClick"])])),_:2},1024),1===u.examAnswerRelationType?(x(),k(K,{key:1,type:"primary",class:"margin-left-10",onClick:e=>{return t=l,ue.value=t,void(he.value=!0);var t}},{default:b((()=>[A("span",null,T(e.resultItem?"编辑结果":"添加结果"),1)])),_:2},1032,["onClick"])):S("v-if",!0),2===u.examAnswerRelationType?(x(),k(K,{key:2,type:"primary",class:"margin-left-10",onClick:l=>function(e){re("setRelation",ne.examId,ne.customId,e)}(e)},{default:b((()=>[A("span",null,T(e.answerRelations?.length?`关联了${e.answerRelations?.length}项`:"关联检查"),1)])),_:2},1032,["onClick"])):S("v-if",!0)])))),128))]),"sort"===u.type?(x(),f("div",Y,[d[15]||(d[15]=A("div",{class:"label flex flex-justify-end"},[A("span",null,"排序答案:")],-1)),A("div",Z,[C(y,{modelValue:h(be),"onUpdate:modelValue":d[2]||(d[2]=e=>j(be)?be.value=e:null),mode:"multiple",style:{width:"360px"},placeholder:"请按顺序选择排序答案","show-arrow":!0},{default:b((()=>[S(' :options="[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))" '),(x(!0),f(R,null,q(h(ce),((e,l)=>(x(),k(v,{key:l,label:e.title,value:String.fromCharCode(65+l)},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])])):S("v-if",!0),u.showAnalysis?(x(),f("div",ee,[d[16]||(d[16]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"解析:")],-1)),A("div",le,[C(p,{modelValue:h(ye),"onUpdate:modelValue":d[3]||(d[3]=e=>j(ye)?ye.value=e:null),type:"textarea",rows:2,placeholder:"请输入题目解析"},null,8,["modelValue"])])])):S("v-if",!0),h(fe)?(x(),f("div",te,[d[18]||(d[18]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"富文本:")],-1)),A("div",ae,[C($,I({"model-value":h(xe),"onUpdate:modelValue":d[4]||(d[4]=e=>j(xe)?xe.value=e:null)},h(oe),{style:{width:"100%"}}),null,16,["model-value"]),A("div",ie,[C(K,{type:"danger",onClick:Ae},{default:b((()=>d[17]||(d[17]=[V(" 删除富文本 ")]))),_:1})])])])):S("v-if",!0)])),key:"0"}:void 0]),1032,["show-edit"]),C(we,{modelValue:h(he),"onUpdate:modelValue":d[11]||(d[11]=e=>j(he)?he.value=e:null),title:"添加结果",class:"customize-dialog"},{footer:b((()=>[C(se,{class:"customize-button",type:"primary",plain:"",onClick:Te},{default:b((()=>d[19]||(d[19]=[V(" 取消 ")]))),_:1}),C(se,{class:"customize-button",type:"primary",plain:"",onClick:Re},{default:b((()=>d[20]||(d[20]=[V(" 保存 ")]))),_:1})])),default:b((()=>[(x(),k($,I({key:h(ue),"model-value":h(ce)[h(ue)].resultItem,"onUpdate:modelValue":d[10]||(d[10]=e=>h(ce)[h(ue)].resultItem=e)},h(oe),{style:{width:"100%"}}),null,16,["model-value"]))])),_:1},8,["modelValue"])],2)}}});export{se as default};
|
1
|
+
import{ElCheckbox as e,ElRadio as l,ElInput as t,ElSelect as a,ElOption as i,ElIcon as s,ElLink as n,ElDialog as r,ElButton as o,ElMessage as u}from"element-plus/es";import{defineComponent as d,useAttrs as m,ref as c,computed as p,watch as v,onMounted as y,createElementBlock as f,openBlock as x,normalizeClass as w,unref as h,createVNode as C,createSlots as g,withCtx as b,createBlock as k,createCommentVNode as S,createElementVNode as A,createTextVNode as V,toDisplayString as T,Fragment as R,renderList as q,isRef as j,mergeProps as I}from"vue";import{CirclePlus as _,Remove as E}from"@element-plus/icons-vue";import{useNamespace as U}from"@qxs-bns/hooks";import B from"../../../subject-action/src/subject-action.vue.js";import L from"../../../subject-layout/src/subject-layout.vue.js";import $ from"../../../tiny-mce-editor/src/tiny-mce-editor.vue.js";import{setGuid as K}from"@qxs-bns/utils";const N={class:"preview"},z={class:"title"},M={key:0},D={key:1},H={key:0},O=["innerHTML"],Q={class:"preview-answer"},F={class:"order"},G={class:"order"},J={style:{flex:"1"}},P={class:"margin-bottom flex flex-items-center"},W={class:"margin-bottom answer-list"},X={class:"order"},Y={key:0,class:"margin-bottom flex flex-items-center"},Z={style:{flex:"1"}},ee={key:1,class:"flex"},le={style:{flex:"1"}},te={key:2,class:"margin-bottom flex"},ae={style:{flex:"1"}},ie={class:"flex flex-justify-end"};var se=d({name:"QxsSubjectSingle",__name:"subject-single",props:{orderIndex:{type:Number,required:!0},title:{type:String,required:!1},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},type:{type:String,required:!0},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},answerList:{type:null,required:!1},leastAnswerCount:{type:Number,required:!1},analysis:{type:String,required:!1},examExpand:{type:String,required:!1},examRichTextContent:{type:String,required:!1},showAnalysis:{type:Boolean,required:!1},examAnswerRelationType:{type:Number,required:!1},customId:{type:Number,required:!1},examId:{type:Number,required:!1},isKey:{type:Boolean,required:!0},answerCheckType:{type:Number,required:!0}},emits:["move","save","delete","edit","add","setRelation"],setup(d,{emit:se}){const ne=d,re=se,oe=m(),ue=c(0),de=c(ne.isKey),me=c(ne.answerCheckType),ce=c([{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1}]),pe=c(),ve=c(""),ye=c(""),fe=c(!1),xe=c(""),we=c(0),he=c(!1),Ce=c(""),ge=p((()=>"single"===ne.type?"单选题":"multiple"===ne.type?"多选题":"排序题")),be=c([]),ke=p((()=>{const e=[];for(let l=ce.value.length;l>1;l--)e.push({label:`至少选择${l}项`,value:l});return e.reverse()}));function Se(){ne.isSave||ce.value.push({title:"",isCorrect:!1,customAnswerId:K()})}function Ae(){fe.value=!1,xe.value=""}function Ve(){if(!ve.value)return void u.error("题目标题不能为空!");let e="",l=!1,t=null,a=0;if("multiple"===ne.type||"single"===ne.type?ce.value.forEach(((i,s)=>{i.title||(e+=`选项${String.fromCharCode(65+s)}未填写。`),i.isCorrect&&(l=!0,a++),i.resultItem&&(t=1),i.answerRelations?.length&&(t=2)})):"sort"===ne.type&&be.value.length&&(l=!0),e)return void u.error(e);if(new Set(ce.value.map((e=>e.title))).size===ce.value.length){if("multiple"===ne.type){if(1===a)return void u.error("请至少设置两个正确答案");if(l&&a<pe.value)return void u.error("至少选几项与正确答案数不符")}re("save",{title:ve.value,answers:ce.value.map(((e,l)=>({...e,orderIndex:l+1}))),examExpand:be.value.map((e=>e.charCodeAt(0)-65+1)).join(","),analysis:ye.value,isSetCorrectAnswer:l,leastAnswerCount:pe.value,examRichTextContent:fe.value?xe.value:"",examAnswerRelationType:t,isKey:de.value,answerCheckType:me.value})}else u.error("选项不能重复")}function Te(){he.value=!1,Ce.value=""}function Re(){he.value=!1}function qe(e){de.value=e}function je(e){me.value=e}function Ie(e,l){re("add",e,l?ne.examAnswerRelationType:null)}v((()=>ne.isEdit),(()=>{ne.isEdit&&(we.value=(new Date).getTime())}));const _e=U("subject-single");return y((function(){if(ne.title&&(ve.value=ne.title),ne.answerList&&ne.answerList.length&&(ce.value=ne.answerList.map((e=>({...e,customAnswerId:e.examAnswerId||K()})))),ne.leastAnswerCount&&(pe.value=ne.leastAnswerCount),ne.examExpand&&ne.examExpand){const e=ne.examExpand.split(",");be.value=e.map((e=>{const l=ne.answerList.find((l=>l.answerId?.toString()===e));return l?String.fromCharCode(65+l.orderIndex-1):e})).filter(Boolean)}ne.analysis&&(ye.value=ne.analysis),ne.examRichTextContent&&(xe.value=ne.examRichTextContent,fe.value=!0)})),(u,d)=>{const m=e,c=l,p=t,v=i,y=a,U=s,K=n,se=o,we=r;return x(),f("div",{class:w(h(_e).e("single-exam"))},[C(L,{"show-edit":u.isEdit},g({preview:b((()=>[A("div",N,[A("div",null,[A("span",z,[V(T(u.orderIndex+1)+"."+T(h(ve))+" ",1),"single"===u.type?(x(),f("span",M,"(单选题)")):["multiple","sort"].includes(u.type)?(x(),f("span",D," ("+T(h(ge))+T(h(pe)?`至少选${h(pe)}项${"sort"===u.type?"并排序":""}`:"")+") ",1)):S("v-if",!0)])]),h(fe)?(x(),f("div",H,[A("div",{innerHTML:h(xe)},null,8,O)])):S("v-if",!0),A("div",Q,["sort"===u.type?(x(!0),f(R,{key:0},q(h(ce),((e,l)=>(x(),k(m,{key:l,class:"radio",disabled:!0},{default:b((()=>[A("span",F,T(String.fromCharCode(65+l))+". ",1),V(" "+T(e.title),1)])),_:2},1024)))),128)):(x(!0),f(R,{key:1},q(h(ce),((e,l)=>(x(),k(c,{key:l,class:"radio",value:"disabled",disabled:""},{default:b((()=>[A("span",G,T(String.fromCharCode(65+l))+". ",1),V(" "+T(e.title)+" "+T(e.isCorrect?"(支持选项)":"")+" "+T(1===u.examAnswerRelationType?e.resultItem?"(已设置结果项)":"(未设置结果项)":"")+" "+T(2===u.examAnswerRelationType?e.answerRelations?.length?"(已设置关联)":"(未设置关联)":""),1)])),_:2},1024)))),128))])])])),default:b((()=>[u.showAction?(x(),k(B,{key:0,"is-edit":u.isEdit,"is-set":u.isSet,isKey:h(de),examAnswerRelationType:ne.examAnswerRelationType,answerCheckType:h(me),onMoveUp:d[5]||(d[5]=e=>re("move","up")),onMoveDown:d[6]||(d[6]=e=>re("move","down")),onDelete:d[7]||(d[7]=e=>re("delete")),onSave:Ve,onEdit:d[8]||(d[8]=e=>re("edit")),onAdd:Ie,onOnShowRichText:d[9]||(d[9]=e=>fe.value=!0),onSetKey:qe,onSetAnswerSetting:je},null,8,["is-edit","is-set","isKey","examAnswerRelationType","answerCheckType"])):S("v-if",!0)])),_:2},[u.isEdit?{name:"edit",fn:b((()=>[A("div",{class:w(["flex",[{"margin-bottom":h(fe)}]])},[d[12]||(d[12]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"题目:")],-1)),A("div",J,[C(p,{modelValue:h(ve),"onUpdate:modelValue":d[0]||(d[0]=e=>j(ve)?ve.value=e:null),type:"textarea",rows:2,placeholder:`【${h(ge)}】请输入问题`,disabled:u.isSave,"show-word-limit":"",maxlength:"200",class:"margin-bottom"},null,8,["modelValue","placeholder","disabled"])])],2),A("div",P,[d[13]||(d[13]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"设置:")],-1)),["multiple","sort"].includes(u.type)?(x(),k(y,{key:0,modelValue:h(pe),"onUpdate:modelValue":d[1]||(d[1]=e=>j(pe)?pe.value=e:null),style:{width:"150px"},placeholder:"至少选择几项",disabled:u.isSave},{default:b((()=>[(x(!0),f(R,null,q(h(ke),(e=>(x(),k(v,{key:e.value,value:e.value,label:e.label},null,8,["value","label"])))),128))])),_:1},8,["modelValue","disabled"])):S("v-if",!0)]),A("div",W,[(x(!0),f(R,null,q(h(ce),((e,l)=>(x(),f("div",{key:l,class:"answer-item flex flex-items-center"},[A("span",X,T(String.fromCharCode(65+l))+".",1),C(p,{modelValue:e.title,"onUpdate:modelValue":l=>e.title=l,class:"input","show-word-limit":"",maxlength:"100",placeholder:`选项${String.fromCharCode(65+l)}`,disabled:u.isSave},null,8,["modelValue","onUpdate:modelValue","placeholder","disabled"]),["single","multiple"].includes(u.type)?(x(),k(m,{key:0,modelValue:e.isCorrect,"onUpdate:modelValue":l=>e.isCorrect=l,class:w([{"is-correct":e.isCorrect}]),disabled:u.isSave,style:{"margin-left":"10px"},onChange:l=>function(e,l){"single"===ne.type?(l&&ce.value.forEach((l=>{l!==e&&(l.isCorrect=!1)})),e.isCorrect=l):"multiple"===ne.type&&(e.isCorrect=l)}(e,l)},{default:b((()=>[...d[14]||(d[14]=[V(" 支持选项 ")])])),_:2},1032,["modelValue","onUpdate:modelValue","class","disabled","onChange"])):S("v-if",!0),C(U,{class:"icon"},{default:b((()=>[C(h(_),{class:w([{disabled:u.isSave}]),onClick:Se},null,8,["class"])])),_:1}),C(U,{class:"icon"},{default:b((()=>[C(h(E),{class:w([{disabled:h(ce).length<3||u.isSave}]),onClick:e=>function(e){ce.value.length<3||ne.isSave||ce.value.splice(e,1)}(l)},null,8,["class","onClick"])])),_:2},1024),1===u.examAnswerRelationType?(x(),k(K,{key:1,type:"primary",class:"margin-left-10",onClick:e=>{return t=l,ue.value=t,void(he.value=!0);var t}},{default:b((()=>[A("span",null,T(e.resultItem?"编辑结果":"添加结果"),1)])),_:2},1032,["onClick"])):S("v-if",!0),2===u.examAnswerRelationType?(x(),k(K,{key:2,type:"primary",class:"margin-left-10",onClick:l=>function(e){re("setRelation",ne.examId,ne.customId,e)}(e)},{default:b((()=>[A("span",null,T(e.answerRelations?.length?`关联了${e.answerRelations?.length}项`:"关联检查"),1)])),_:2},1032,["onClick"])):S("v-if",!0)])))),128))]),"sort"===u.type?(x(),f("div",Y,[d[15]||(d[15]=A("div",{class:"label flex flex-justify-end"},[A("span",null,"排序答案:")],-1)),A("div",Z,[C(y,{modelValue:h(be),"onUpdate:modelValue":d[2]||(d[2]=e=>j(be)?be.value=e:null),mode:"multiple",style:{width:"360px"},placeholder:"请按顺序选择排序答案","show-arrow":!0},{default:b((()=>[S(' :options="[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))" '),(x(!0),f(R,null,q(h(ce),((e,l)=>(x(),k(v,{key:l,label:e.title,value:String.fromCharCode(65+l)},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])])):S("v-if",!0),u.showAnalysis?(x(),f("div",ee,[d[16]||(d[16]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"解析:")],-1)),A("div",le,[C(p,{modelValue:h(ye),"onUpdate:modelValue":d[3]||(d[3]=e=>j(ye)?ye.value=e:null),type:"textarea",rows:2,placeholder:"请输入题目解析"},null,8,["modelValue"])])])):S("v-if",!0),h(fe)?(x(),f("div",te,[d[18]||(d[18]=A("div",{class:"label flex flex-justify-center"},[A("span",null,"富文本:")],-1)),A("div",ae,[C($,I({"model-value":h(xe),"onUpdate:modelValue":d[4]||(d[4]=e=>j(xe)?xe.value=e:null)},h(oe),{style:{width:"100%"}}),null,16,["model-value"]),A("div",ie,[C(K,{type:"danger",onClick:Ae},{default:b((()=>d[17]||(d[17]=[V(" 删除富文本 ")]))),_:1})])])])):S("v-if",!0)])),key:"0"}:void 0]),1032,["show-edit"]),C(we,{modelValue:h(he),"onUpdate:modelValue":d[11]||(d[11]=e=>j(he)?he.value=e:null),title:"添加结果",class:"customize-dialog"},{footer:b((()=>[C(se,{class:"customize-button",type:"primary",plain:"",onClick:Te},{default:b((()=>d[19]||(d[19]=[V(" 取消 ")]))),_:1}),C(se,{class:"customize-button",type:"primary",plain:"",onClick:Re},{default:b((()=>d[20]||(d[20]=[V(" 保存 ")]))),_:1})])),default:b((()=>[(x(),k($,I({key:h(ue),"model-value":h(ce)[h(ue)].resultItem,"onUpdate:modelValue":d[10]||(d[10]=e=>h(ce)[h(ue)].resultItem=e)},h(oe),{style:{width:"100%"}}),null,16,["model-value"]))])),_:1},8,["modelValue"])],2)}}});export{se as default};
|
2
2
|
//# sourceMappingURL=subject-single.vue.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"subject-single.vue.js","sources":["../../../../../../../packages/components/src/subject-list/src/components/subject-single.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CirclePlus, Remove } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectAction from '../../../subject-action/src/subject-action.vue'\nimport SubjectLayout from '../../../subject-layout/src/subject-layout.vue'\nimport TinyMceEditor from '../../../tiny-mce-editor/src/tiny-mce-editor.vue'\nimport { setGuid } from '@qxs-bns/utils'\n\ndefineOptions({\n name: 'QxsSubjectSingle',\n})\nconst props = defineProps<{\n orderIndex: number\n title?: string\n isSave: boolean\n showAction?: boolean\n type: 'single' | 'multiple' | 'sort'\n isEdit: boolean\n isSet: boolean\n answerList?: any\n leastAnswerCount?: number\n analysis?: string\n examExpand?: string\n examRichTextContent?: string\n showAnalysis?: boolean\n examAnswerRelationType?: number\n customId?: number\n examId?: number\n isKey: boolean\n answerCheckType: number\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(props.isKey)\nconst answerCheckType = ref(2)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: string\n customAnswerId?: string\n answerRelations?: {\n relationExamId: number\n relationAnswers: {\n relationAnswerId: number\n relationAnswerIndex: number\n }[]\n }[]\n}[]>([{\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}])\n\nconst leastAnswerCount = ref()\nconst title = ref('')\nconst analysis = ref('')\nconst showRichText = ref(false)\nconst richText = ref('')\nconst startTime = ref(0)\nconst showRichContent = ref(false)\nconst resultItem = ref<string>('')\nconst titlePlaceholder = computed(() => {\n if (props.type === 'single') {\n return '单选题'\n }\n else if (props.type === 'multiple') {\n return '多选题'\n }\n else {\n return '排序题'\n }\n})\n\nconst orderList = ref<string[]>([])\n\nconst leastAnswerOptions = computed(() => {\n const items = []\n const length = answers.value.length\n for (let count = length; count > 1; count--) {\n items.push({\n label: `至少选择${count}项`,\n value: count,\n })\n }\n return items.reverse()\n})\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\n customAnswerId: setGuid()\n })\n}\n\nfunction deleteAnswer(index: number) {\n if (answers.value.length < 3 || props.isSave) {\n return\n }\n answers.value.splice(index, 1)\n}\n\nfunction setCorrect(it: any, event: any) {\n if (props.type === 'single') {\n // 单选题:确保只有一个正确答案\n if (event) {\n answers.value.forEach((answer) => {\n if (answer !== it) {\n answer.isCorrect = false\n }\n })\n }\n it.isCorrect = event\n } else if (props.type === 'multiple') {\n // 多选题:可以有多个正确答案\n it.isCorrect = event\n }\n}\nfunction setRelation(item: any) {\n emits('setRelation', props.examId, props.customId, item)\n}\n\nfunction deleteRichText() {\n showRichText.value = false\n richText.value = ''\n}\n\nfunction save() {\n if (!title.value) {\n ElMessage.error('题目标题不能为空!')\n return\n }\n let msg = ''\n let isSetCorrectAnswer = false\n let examAnswerRelationType = null\n let correctAnswerCount = 0\n if (props.type === 'multiple' || props.type === 'single') {\n answers.value.forEach((v: any, i: number) => {\n if (!v.title) {\n msg += `选项${String.fromCharCode(65 + i)}未填写。`\n }\n if (v.isCorrect) {\n isSetCorrectAnswer = true\n correctAnswerCount++\n }\n if (v.resultItem) {\n examAnswerRelationType = 1\n }\n if (v.answerRelations?.length) {\n examAnswerRelationType = 2\n }\n })\n }\n else if (props.type === 'sort') {\n // 如果设置了正确答案\n if (orderList.value.length) {\n isSetCorrectAnswer = true\n }\n }\n if (msg) {\n ElMessage.error(msg)\n return\n }\n\n const uniqueAnswer = new Set(answers.value.map((item: any) => item.title))\n\n if (uniqueAnswer.size !== answers.value.length) {\n ElMessage.error('选项不能重复')\n return\n }\n\n if (props.type === 'multiple') {\n if (correctAnswerCount === 1) {\n ElMessage.error('请至少设置两个正确答案')\n return\n }\n\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount.value) {\n ElMessage.error('至少选几项与正确答案数不符')\n return\n }\n }\n\n emits('save', {\n title: title.value,\n answers: answers.value.map((item: any, index: number) => {\n return { ...item, orderIndex: index + 1 }\n }),\n examExpand: orderList.value.map((i: string) => i.charCodeAt(0) - 65 + 1).join(','),\n analysis: analysis.value,\n isSetCorrectAnswer,\n leastAnswerCount: leastAnswerCount.value,\n examRichTextContent: showRichText.value ? richText.value : '',\n examAnswerRelationType,\n isKey: isKey.value,\n answerCheckType: answerCheckType.value\n })\n}\n\nfunction init() {\n if (props.title) {\n title.value = props.title\n }\n // const customId = props.id || setGuid()\n\n if (props.answerCheckType) {\n answerCheckType.value = props.answerCheckType\n }\n\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList.map((item: any) => {\n return { ...item, customAnswerId: item.examAnswerId || setGuid() }\n })\n }\n\n if (props.leastAnswerCount) {\n leastAnswerCount.value = props.leastAnswerCount\n }\n\n if (props.examExpand) {\n // 设置正确答案 props.examExpand里是答案id\n if (props.examExpand) {\n const correctAnswerIdList = props.examExpand.split(',')\n\n // 遍历 correctAnswerIdList,直接在 props.answerList 中查找对应的 orderIndex 并转换成字母\n orderList.value = correctAnswerIdList.map((id: string) => {\n const answer = props.answerList.find((item: any) => item.answerId?.toString() === id)\n return answer ? String.fromCharCode(65 + answer.orderIndex - 1) : id\n }).filter(Boolean) // 过滤掉任何可能的空字符串\n }\n }\n\n if (props.analysis) {\n analysis.value = props.analysis\n }\n\n if (props.examRichTextContent) {\n richText.value = props.examRichTextContent\n showRichText.value = true\n }\n}\n\nfunction onCloseResult() {\n showRichContent.value = false\n resultItem.value = ''\n}\n\nfunction onOpenResult(i: number) {\n answersIndex.value = i\n // console.log(answers.value[i].resultItem, 1);\n // resultItem.value = answers.value[i].resultItem || ''\n showRichContent.value = true\n}\n\nfunction onSaveResult() {\n // answers.value[answersIndex.value].resultItem = resultItem.value || ''\n showRichContent.value = false\n}\n\nfunction setKey(key: boolean) {\n isKey.value = key\n}\n\nfunction setAnswerSetting(type: number) {\n answerCheckType.value = type\n}\n\nfunction add(type: string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n// 监听isEdit\nwatch(() => props.isEdit, () => {\n if (props.isEdit) {\n startTime.value = new Date().getTime()\n }\n})\nconst ns = useNamespace('subject-single')\n\nonMounted(init)\n</script>\n\n<template>\n <div :class=\"ns.e('single-exam')\">\n <SubjectLayout\n :show-edit=\"isEdit\"\n >\n <template #preview>\n <div class=\"preview\">\n <div>\n <span class=\"title\">\n {{ orderIndex + 1 }}.{{ title }}\n <span v-if=\"type === 'single'\">(单选题)</span>\n <span v-else-if=\"['multiple', 'sort'].includes(type)\">\n ({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})\n </span>\n </span>\n </div>\n <div v-if=\"showRichText\">\n <div v-html=\"richText\" />\n </div>\n <div class=\"preview-answer\">\n <template v-if=\"type === 'sort'\">\n <el-checkbox\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n :disabled=\"true\"\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }}\n </el-checkbox>\n </template>\n <template v-else>\n <el-radio\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n value=\"disabled\"\n disabled\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }} \n {{ item.isCorrect ? '(支持选项)' : '' }} \n {{ item.resultItem && examAnswerRelationType === 1? '(已设置结果项)' : '(未设置结果项)' }} \n {{ item.answerRelations?.length && examAnswerRelationType === 2 ? '(已设置关联)' : '(未设置关联)' }}\n </el-radio>\n </template>\n </div>\n </div>\n </template>\n <template v-if=\"isEdit\" #edit>\n <div class=\"flex\" :class=\"[{ 'margin-bottom': showRichText }]\">\n <div class=\"label flex flex-justify-center\">\n <span>题目:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"title\"\n type=\"textarea\"\n :rows=\"2\"\n :placeholder=\"`【${titlePlaceholder}】请输入问题`\"\n :disabled=\"isSave\"\n show-word-limit\n maxlength=\"200\"\n class=\"margin-bottom\"\n />\n </div>\n </div>\n <div class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-center\">\n <span>设置:</span>\n </div>\n <el-select\n v-if=\"['multiple', 'sort'].includes(type)\"\n v-model=\"leastAnswerCount\"\n style=\"width: 150px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n :label=\"item.label\"\n >\n </el-option>\n </el-select>\n </div>\n <div class=\"margin-bottom answer-list\">\n <div\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"answer-item flex flex-items-center\"\n >\n <span class=\"order\">{{ String.fromCharCode(65 + index) }}.</span>\n <el-input\n v-model=\"item.title\"\n class=\"input\"\n show-word-limit\n maxlength=\"100\"\n :placeholder=\"`选项${String.fromCharCode(65 + index)}`\"\n :disabled=\"isSave\"\n />\n <el-checkbox\n v-if=\"['single', 'multiple'].includes(type)\"\n v-model=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event: any) => setCorrect(item, event)\"\n >\n 支持选项 \n </el-checkbox>\n <el-icon class=\"icon\">\n <CirclePlus\n :class=\"[{ disabled: isSave }]\"\n @click=\"addAnswer\"\n />\n </el-icon>\n <el-icon class=\"icon\">\n <Remove\n :class=\"[{ disabled: answers.length < 3 || isSave }]\"\n @click=\"deleteAnswer(index)\"\n />\n </el-icon>\n <el-link\n v-if=\"examAnswerRelationType === 1\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"onOpenResult(index)\"\n >\n <span>{{ item.resultItem ? '编辑结果' : '添加结果' }}</span>\n </el-link>\n <el-link\n v-if=\"examAnswerRelationType === 2\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"setRelation(item)\"\n >\n <span>{{ item.answerRelations?.length ? `关联了${item.answerRelations?.length}项` : '关联检查' }}</span>\n </el-link>\n </div>\n </div>\n <div v-if=\"type === 'sort'\" class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-end\">\n <span>排序答案:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-select\n v-model=\"orderList\"\n mode=\"multiple\"\n style=\"width: 360px;\"\n placeholder=\"请按顺序选择排序答案\"\n :show-arrow=\"true\"\n >\n <!-- :options=\"[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))\" -->\n <el-option\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n :label=\"item.title\"\n :value=\"String.fromCharCode(65 + index)\"\n />\n </el-select>\n </div>\n </div>\n <div\n v-if=\"showAnalysis\"\n class=\"flex\"\n >\n <div class=\"label flex flex-justify-center\">\n <span>解析:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"analysis\"\n type=\"textarea\"\n :rows=\"2\"\n placeholder=\"请输入题目解析\"\n />\n </div>\n </div>\n <div v-if=\"showRichText\" class=\"margin-bottom flex\">\n <div class=\"label flex flex-justify-center\">\n <span>富文本:</span>\n </div>\n <div style=\"flex: 1;\">\n <TinyMceEditor v-model:model-value=\"richText\" v-bind=\"attrs\" style=\"width: 100%;\" />\n <div class=\"flex flex-justify-end\">\n <el-link\n type=\"danger\"\n @click=\"deleteRichText\"\n >\n 删除富文本\n </el-link>\n </div>\n </div>\n </div>\n </template>\n <SubjectAction\n v-if=\"showAction\"\n :is-edit=\"isEdit\"\n :is-set=\"isSet\"\n :isKey=\"isKey\"\n :examAnswerRelationType=\"props.examAnswerRelationType\"\n :answerCheckType=\"answerCheckType\"\n @move-up=\"emits('move', 'up')\"\n @move-down=\"emits('move', 'down')\"\n @delete=\"emits('delete')\"\n @save=\"save\"\n @edit=\"emits('edit')\"\n @add=\"add\"\n @onShowRichText=\"showRichText = true\"\n @setKey=\"setKey\"\n @setAnswerSetting=\"setAnswerSetting\"\n />\n </SubjectLayout>\n <el-dialog\n v-model=\"showRichContent\"\n title=\"添加结果\"\n class=\"customize-dialog\"\n >\n <TinyMceEditor\n :key=\"answersIndex\"\n v-model:model-value=\"(answers[answersIndex].resultItem as string)\" \n v-bind=\"attrs\"\n style=\"width: 100%;\" />\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onCloseResult\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveResult\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","attrs","useAttrs","answersIndex","ref","isKey","answerCheckType","answers","title","isCorrect","leastAnswerCount","analysis","showRichText","richText","startTime","showRichContent","resultItem","titlePlaceholder","computed","type","orderList","leastAnswerOptions","items","count","value","length","push","label","reverse","addAnswer","isSave","customAnswerId","setGuid","deleteRichText","save","ElMessage","error","msg","isSetCorrectAnswer","examAnswerRelationType","correctAnswerCount","forEach","v","i","String","fromCharCode","answerRelations","Set","map","item","size","index","orderIndex","examExpand","charCodeAt","join","examRichTextContent","onCloseResult","onSaveResult","setKey","key","setAnswerSetting","add","canSet","watch","isEdit","Date","getTime","ns","useNamespace","onMounted","answerList","examAnswerId","correctAnswerIdList","split","id","answer","find","answerId","toString","filter","Boolean","it","event","splice","examId","customId"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"subject-single.vue.js","sources":["../../../../../../../packages/components/src/subject-list/src/components/subject-single.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CirclePlus, Remove } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectAction from '../../../subject-action/src/subject-action.vue'\nimport SubjectLayout from '../../../subject-layout/src/subject-layout.vue'\nimport TinyMceEditor from '../../../tiny-mce-editor/src/tiny-mce-editor.vue'\nimport { setGuid } from '@qxs-bns/utils'\n\ndefineOptions({\n name: 'QxsSubjectSingle',\n})\nconst props = defineProps<{\n orderIndex: number\n title?: string\n isSave: boolean\n showAction?: boolean\n type: 'single' | 'multiple' | 'sort'\n isEdit: boolean\n isSet: boolean\n answerList?: any\n leastAnswerCount?: number\n analysis?: string\n examExpand?: string\n examRichTextContent?: string\n showAnalysis?: boolean\n examAnswerRelationType?: number\n customId?: number\n examId?: number\n isKey: boolean\n answerCheckType: number\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(props.isKey)\nconst answerCheckType = ref(props.answerCheckType)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: string\n customAnswerId?: string\n answerRelations?: {\n relationExamId: number\n relationAnswers: {\n relationAnswerId: number\n relationAnswerIndex: number\n }[]\n }[]\n}[]>([{\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}])\n\nconst leastAnswerCount = ref()\nconst title = ref('')\nconst analysis = ref('')\nconst showRichText = ref(false)\nconst richText = ref('')\nconst startTime = ref(0)\nconst showRichContent = ref(false)\nconst resultItem = ref<string>('')\nconst titlePlaceholder = computed(() => {\n if (props.type === 'single') {\n return '单选题'\n }\n else if (props.type === 'multiple') {\n return '多选题'\n }\n else {\n return '排序题'\n }\n})\n\nconst orderList = ref<string[]>([])\n\nconst leastAnswerOptions = computed(() => {\n const items = []\n const length = answers.value.length\n for (let count = length; count > 1; count--) {\n items.push({\n label: `至少选择${count}项`,\n value: count,\n })\n }\n return items.reverse()\n})\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\n customAnswerId: setGuid()\n })\n}\n\nfunction deleteAnswer(index: number) {\n if (answers.value.length < 3 || props.isSave) {\n return\n }\n answers.value.splice(index, 1)\n}\n\nfunction setCorrect(it: any, event: any) {\n if (props.type === 'single') {\n // 单选题:确保只有一个正确答案\n if (event) {\n answers.value.forEach((answer) => {\n if (answer !== it) {\n answer.isCorrect = false\n }\n })\n }\n it.isCorrect = event\n } else if (props.type === 'multiple') {\n // 多选题:可以有多个正确答案\n it.isCorrect = event\n }\n}\nfunction setRelation(item: any) {\n emits('setRelation', props.examId, props.customId, item)\n}\n\nfunction deleteRichText() {\n showRichText.value = false\n richText.value = ''\n}\n\nfunction save() {\n if (!title.value) {\n ElMessage.error('题目标题不能为空!')\n return\n }\n let msg = ''\n let isSetCorrectAnswer = false\n let examAnswerRelationType = null\n let correctAnswerCount = 0\n if (props.type === 'multiple' || props.type === 'single') {\n answers.value.forEach((v: any, i: number) => {\n if (!v.title) {\n msg += `选项${String.fromCharCode(65 + i)}未填写。`\n }\n if (v.isCorrect) {\n isSetCorrectAnswer = true\n correctAnswerCount++\n }\n if (v.resultItem) {\n examAnswerRelationType = 1\n }\n if (v.answerRelations?.length) {\n examAnswerRelationType = 2\n }\n })\n }\n else if (props.type === 'sort') {\n // 如果设置了正确答案\n if (orderList.value.length) {\n isSetCorrectAnswer = true\n }\n }\n if (msg) {\n ElMessage.error(msg)\n return\n }\n\n const uniqueAnswer = new Set(answers.value.map((item: any) => item.title))\n\n if (uniqueAnswer.size !== answers.value.length) {\n ElMessage.error('选项不能重复')\n return\n }\n\n if (props.type === 'multiple') {\n if (correctAnswerCount === 1) {\n ElMessage.error('请至少设置两个正确答案')\n return\n }\n\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount.value) {\n ElMessage.error('至少选几项与正确答案数不符')\n return\n }\n }\n\n emits('save', {\n title: title.value,\n answers: answers.value.map((item: any, index: number) => {\n return { ...item, orderIndex: index + 1 }\n }),\n examExpand: orderList.value.map((i: string) => i.charCodeAt(0) - 65 + 1).join(','),\n analysis: analysis.value,\n isSetCorrectAnswer,\n leastAnswerCount: leastAnswerCount.value,\n examRichTextContent: showRichText.value ? richText.value : '',\n examAnswerRelationType,\n isKey: isKey.value,\n answerCheckType: answerCheckType.value\n })\n}\n\nfunction init() {\n if (props.title) {\n title.value = props.title\n }\n // const customId = props.id || setGuid()\n\n // if (props.answerCheckType) {\n // answerCheckType.value = props.answerCheckType\n // }\n\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList.map((item: any) => {\n return { ...item, customAnswerId: item.examAnswerId || setGuid() }\n })\n }\n\n if (props.leastAnswerCount) {\n leastAnswerCount.value = props.leastAnswerCount\n }\n\n if (props.examExpand) {\n // 设置正确答案 props.examExpand里是答案id\n if (props.examExpand) {\n const correctAnswerIdList = props.examExpand.split(',')\n\n // 遍历 correctAnswerIdList,直接在 props.answerList 中查找对应的 orderIndex 并转换成字母\n orderList.value = correctAnswerIdList.map((id: string) => {\n const answer = props.answerList.find((item: any) => item.answerId?.toString() === id)\n return answer ? String.fromCharCode(65 + answer.orderIndex - 1) : id\n }).filter(Boolean) // 过滤掉任何可能的空字符串\n }\n }\n\n if (props.analysis) {\n analysis.value = props.analysis\n }\n\n if (props.examRichTextContent) {\n richText.value = props.examRichTextContent\n showRichText.value = true\n }\n}\n\nfunction onCloseResult() {\n showRichContent.value = false\n resultItem.value = ''\n}\n\nfunction onOpenResult(i: number) {\n answersIndex.value = i\n // console.log(answers.value[i].resultItem, 1);\n // resultItem.value = answers.value[i].resultItem || ''\n showRichContent.value = true\n}\n\nfunction onSaveResult() {\n // answers.value[answersIndex.value].resultItem = resultItem.value || ''\n showRichContent.value = false\n}\n\nfunction setKey(key: boolean) {\n isKey.value = key\n}\n\nfunction setAnswerSetting(type: number) {\n answerCheckType.value = type\n}\n\nfunction add(type: string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n// 监听isEdit\nwatch(() => props.isEdit, () => {\n if (props.isEdit) {\n startTime.value = new Date().getTime()\n }\n})\nconst ns = useNamespace('subject-single')\n\nonMounted(init)\n</script>\n\n<template>\n <div :class=\"ns.e('single-exam')\">\n <SubjectLayout\n :show-edit=\"isEdit\"\n >\n <template #preview>\n <div class=\"preview\">\n <div>\n <span class=\"title\">\n {{ orderIndex + 1 }}.{{ title }}\n <span v-if=\"type === 'single'\">(单选题)</span>\n <span v-else-if=\"['multiple', 'sort'].includes(type)\">\n ({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})\n </span>\n </span>\n </div>\n <div v-if=\"showRichText\">\n <div v-html=\"richText\" />\n </div>\n <div class=\"preview-answer\">\n <template v-if=\"type === 'sort'\">\n <el-checkbox\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n :disabled=\"true\"\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }}\n </el-checkbox>\n </template>\n <template v-else>\n <el-radio\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n value=\"disabled\"\n disabled\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }} \n {{ item.isCorrect ? '(支持选项)' : '' }} \n {{ examAnswerRelationType === 1 ? (item.resultItem? '(已设置结果项)' : '(未设置结果项)' ) : ''}} \n {{ examAnswerRelationType === 2 ? (item.answerRelations?.length? '(已设置关联)' : '(未设置关联)') : '' }}\n </el-radio>\n </template>\n </div>\n </div>\n </template>\n <template v-if=\"isEdit\" #edit>\n <div class=\"flex\" :class=\"[{ 'margin-bottom': showRichText }]\">\n <div class=\"label flex flex-justify-center\">\n <span>题目:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"title\"\n type=\"textarea\"\n :rows=\"2\"\n :placeholder=\"`【${titlePlaceholder}】请输入问题`\"\n :disabled=\"isSave\"\n show-word-limit\n maxlength=\"200\"\n class=\"margin-bottom\"\n />\n </div>\n </div>\n <div class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-center\">\n <span>设置:</span>\n </div>\n <el-select\n v-if=\"['multiple', 'sort'].includes(type)\"\n v-model=\"leastAnswerCount\"\n style=\"width: 150px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n :label=\"item.label\"\n >\n </el-option>\n </el-select>\n </div>\n <div class=\"margin-bottom answer-list\">\n <div\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"answer-item flex flex-items-center\"\n >\n <span class=\"order\">{{ String.fromCharCode(65 + index) }}.</span>\n <el-input\n v-model=\"item.title\"\n class=\"input\"\n show-word-limit\n maxlength=\"100\"\n :placeholder=\"`选项${String.fromCharCode(65 + index)}`\"\n :disabled=\"isSave\"\n />\n <el-checkbox\n v-if=\"['single', 'multiple'].includes(type)\"\n v-model=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event: any) => setCorrect(item, event)\"\n >\n 支持选项 \n </el-checkbox>\n <el-icon class=\"icon\">\n <CirclePlus\n :class=\"[{ disabled: isSave }]\"\n @click=\"addAnswer\"\n />\n </el-icon>\n <el-icon class=\"icon\">\n <Remove\n :class=\"[{ disabled: answers.length < 3 || isSave }]\"\n @click=\"deleteAnswer(index)\"\n />\n </el-icon>\n <el-link\n v-if=\"examAnswerRelationType === 1\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"onOpenResult(index)\"\n >\n <span>{{ item.resultItem ? '编辑结果' : '添加结果' }}</span>\n </el-link>\n <el-link\n v-if=\"examAnswerRelationType === 2\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"setRelation(item)\"\n >\n <span>{{ item.answerRelations?.length ? `关联了${item.answerRelations?.length}项` : '关联检查' }}</span>\n </el-link>\n </div>\n </div>\n <div v-if=\"type === 'sort'\" class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-end\">\n <span>排序答案:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-select\n v-model=\"orderList\"\n mode=\"multiple\"\n style=\"width: 360px;\"\n placeholder=\"请按顺序选择排序答案\"\n :show-arrow=\"true\"\n >\n <!-- :options=\"[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))\" -->\n <el-option\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n :label=\"item.title\"\n :value=\"String.fromCharCode(65 + index)\"\n />\n </el-select>\n </div>\n </div>\n <div\n v-if=\"showAnalysis\"\n class=\"flex\"\n >\n <div class=\"label flex flex-justify-center\">\n <span>解析:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"analysis\"\n type=\"textarea\"\n :rows=\"2\"\n placeholder=\"请输入题目解析\"\n />\n </div>\n </div>\n <div v-if=\"showRichText\" class=\"margin-bottom flex\">\n <div class=\"label flex flex-justify-center\">\n <span>富文本:</span>\n </div>\n <div style=\"flex: 1;\">\n <TinyMceEditor v-model:model-value=\"richText\" v-bind=\"attrs\" style=\"width: 100%;\" />\n <div class=\"flex flex-justify-end\">\n <el-link\n type=\"danger\"\n @click=\"deleteRichText\"\n >\n 删除富文本\n </el-link>\n </div>\n </div>\n </div>\n </template>\n <SubjectAction\n v-if=\"showAction\"\n :is-edit=\"isEdit\"\n :is-set=\"isSet\"\n :isKey=\"isKey\"\n :examAnswerRelationType=\"props.examAnswerRelationType\"\n :answerCheckType=\"answerCheckType\"\n @move-up=\"emits('move', 'up')\"\n @move-down=\"emits('move', 'down')\"\n @delete=\"emits('delete')\"\n @save=\"save\"\n @edit=\"emits('edit')\"\n @add=\"add\"\n @onShowRichText=\"showRichText = true\"\n @setKey=\"setKey\"\n @setAnswerSetting=\"setAnswerSetting\"\n />\n </SubjectLayout>\n <el-dialog\n v-model=\"showRichContent\"\n title=\"添加结果\"\n class=\"customize-dialog\"\n >\n <TinyMceEditor\n :key=\"answersIndex\"\n v-model:model-value=\"(answers[answersIndex].resultItem as string)\" \n v-bind=\"attrs\"\n style=\"width: 100%;\" />\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onCloseResult\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveResult\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","attrs","useAttrs","answersIndex","ref","isKey","answerCheckType","answers","title","isCorrect","leastAnswerCount","analysis","showRichText","richText","startTime","showRichContent","resultItem","titlePlaceholder","computed","type","orderList","leastAnswerOptions","items","count","value","length","push","label","reverse","addAnswer","isSave","customAnswerId","setGuid","deleteRichText","save","ElMessage","error","msg","isSetCorrectAnswer","examAnswerRelationType","correctAnswerCount","forEach","v","i","String","fromCharCode","answerRelations","Set","map","item","size","index","orderIndex","examExpand","charCodeAt","join","examRichTextContent","onCloseResult","onSaveResult","setKey","key","setAnswerSetting","add","canSet","watch","isEdit","Date","getTime","ns","useNamespace","onMounted","answerList","examAnswerId","correctAnswerIdList","split","id","answer","find","answerId","toString","filter","Boolean","it","event","splice","examId","customId"],"mappings":"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"}
|
package/lib/package.json.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";exports.version="0.0.
|
1
|
+
"use strict";exports.version="0.0.27";
|
2
2
|
//# sourceMappingURL=package.json.js.map
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es"),t=require("vue"),
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es"),t=require("vue"),a=require("@element-plus/icons-vue"),o=require("@qxs-bns/hooks"),l=require("../../subject-type/src/subject-type.vue.js");const n={key:0,class:"flex-justify-between"},c={key:0,class:"has-set"},r={key:1,class:"flex flex-justify-end",style:{width:"100%"}};var i=t.defineComponent({name:"QxsSubjectAction",__name:"subject-action",props:{isEdit:{type:Boolean},isSet:{type:Boolean,default:!1},isKey:{type:Boolean,default:!1},answerCheckType:{type:Number,default:2},showOtherOption:{type:Boolean,default:!0},examAnswerRelationType:{type:Number,default:null},pageEnd:{type:Boolean,default:!1}},emits:["moveUp","moveDown","delete","save","edit","add","onShowRichText","setKey","setAnswerSetting"],setup(i,{emit:d}){const u=i,s=t.ref(u.isKey),m=t.ref(!1),p=d,f=t.ref(u.answerCheckType),x=o.useNamespace("subject-action");function V(){m.value=!1,p("setAnswerSetting",f)}function C(e,t){p("add",e,t?u.examAnswerRelationType:null)}return(o,d)=>{const u=e.ElLink,N=e.ElPopover,h=e.ElCheckbox,k=e.ElIcon,w=e.ElButton,y=e.ElRadio,v=e.ElRadioGroup,B=e.ElDialog;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(x).e("action-exam"))},[t.createElementVNode("div",{class:t.normalizeClass(["action flex",[{active:i.isEdit}]])},[i.isEdit?(t.openBlock(),t.createElementBlock("div",n,[t.createVNode(N,{trigger:"click"},{reference:t.withCtx((()=>[t.createVNode(u,{type:"primary",class:"btn-margin"},{default:t.withCtx((()=>d[13]||(d[13]=[t.createTextVNode(" +在此题后加入新题 ")]))),_:1})])),default:t.withCtx((()=>[t.createVNode(l.default,{onSelect:C})])),_:1}),i.showOtherOption?(t.openBlock(),t.createBlock(u,{key:0,type:"primary",onClick:d[0]||(d[0]=e=>p("onShowRichText")),class:"btn-margin"},{default:t.withCtx((()=>d[14]||(d[14]=[t.createTextVNode(" +添加题目描述(图文) ")]))),_:1})):t.createCommentVNode("v-if",!0),i.showOtherOption?(t.openBlock(),t.createBlock(u,{key:1,type:"primary",onClick:d[1]||(d[1]=e=>m.value=!0),class:"btn-margin"},{default:t.withCtx((()=>d[15]||(d[15]=[t.createTextVNode(" 答题设置 ")]))),_:1})):t.createCommentVNode("v-if",!0),i.showOtherOption?(t.openBlock(),t.createBlock(h,{key:2,modelValue:t.unref(s),"onUpdate:modelValue":d[2]||(d[2]=e=>t.isRef(s)?s.value=e:null),label:"核心题",onChange:d[3]||(d[3]=e=>p("setKey",t.unref(s)))},null,8,["modelValue"])):t.createCommentVNode("v-if",!0)])):t.createCommentVNode("v-if",!0),t.createElementVNode("div",null,[i.isSet?(t.openBlock(),t.createElementBlock("div",c," *此题设置了跳题逻辑 ")):(t.openBlock(),t.createElementBlock("div",r,[i.isEdit?(t.openBlock(),t.createElementBlock(t.Fragment,{key:1},[t.createVNode(w,{class:"btn-margin",onClick:d[8]||(d[8]=e=>p("delete"))},{default:t.withCtx((()=>d[20]||(d[20]=[t.createTextVNode(" 删除 ")]))),_:1}),t.createVNode(w,{type:"primary",onClick:d[9]||(d[9]=e=>p("save"))},{default:t.withCtx((()=>d[21]||(d[21]=[t.createTextVNode(" 完成编辑 ")]))),_:1})],64)):(t.openBlock(),t.createElementBlock(t.Fragment,{key:0},[i.pageEnd?t.createCommentVNode("v-if",!0):(t.openBlock(),t.createBlock(w,{key:0,class:"btn-margin",onClick:d[4]||(d[4]=e=>p("edit"))},{icon:t.withCtx((()=>[t.createVNode(k,null,{default:t.withCtx((()=>[t.createVNode(t.unref(a.Edit))])),_:1})])),default:t.withCtx((()=>[d[16]||(d[16]=t.createTextVNode(" 编辑 "))])),_:1})),t.createVNode(w,{class:"btn-margin",onClick:d[5]||(d[5]=e=>p("delete"))},{icon:t.withCtx((()=>[t.createVNode(k,null,{default:t.withCtx((()=>[t.createVNode(t.unref(a.Delete))])),_:1})])),default:t.withCtx((()=>[d[17]||(d[17]=t.createTextVNode(" 删除 "))])),_:1}),t.createVNode(w,{class:"btn-margin",onClick:d[6]||(d[6]=e=>p("moveUp"))},{icon:t.withCtx((()=>[t.createVNode(k,null,{default:t.withCtx((()=>[t.createVNode(t.unref(a.Top))])),_:1})])),default:t.withCtx((()=>[d[18]||(d[18]=t.createTextVNode(" 上移 "))])),_:1}),t.createVNode(w,{class:"btn-margin",onClick:d[7]||(d[7]=e=>p("moveDown"))},{icon:t.withCtx((()=>[t.createVNode(k,null,{default:t.withCtx((()=>[t.createVNode(t.unref(a.Bottom))])),_:1})])),default:t.withCtx((()=>[d[19]||(d[19]=t.createTextVNode(" 下移 "))])),_:1})],64))]))]),t.createVNode(B,{modelValue:t.unref(m),"onUpdate:modelValue":d[12]||(d[12]=e=>t.isRef(m)?m.value=e:null),title:"答题设置",class:"customize-dialog"},{footer:t.withCtx((()=>[t.createVNode(w,{class:"customize-button",type:"primary",plain:"",onClick:d[11]||(d[11]=e=>m.value=!1)},{default:t.withCtx((()=>d[25]||(d[25]=[t.createTextVNode(" 取消 ")]))),_:1}),t.createVNode(w,{class:"customize-button",type:"primary",plain:"",onClick:V},{default:t.withCtx((()=>d[26]||(d[26]=[t.createTextVNode(" 保存 ")]))),_:1})])),default:t.withCtx((()=>[t.createVNode(v,{modelValue:t.unref(f),"onUpdate:modelValue":d[10]||(d[10]=e=>t.isRef(f)?f.value=e:null),class:"vertical-radio-group"},{default:t.withCtx((()=>[t.createVNode(y,{value:1},{default:t.withCtx((()=>d[22]||(d[22]=[t.createTextVNode("必须全部都是支持选项,方可下一步")]))),_:1}),t.createVNode(y,{value:2},{default:t.withCtx((()=>d[23]||(d[23]=[t.createTextVNode("无需判断是否是支持选项")]))),_:1}),t.createVNode(y,{value:3},{default:t.withCtx((()=>d[24]||(d[24]=[t.createTextVNode("包含全部支持选项,即可下一步")]))),_:1})])),_:1},8,["modelValue"])])),_:1},8,["modelValue"])],2)],2)}}});exports.default=i;
|
2
2
|
//# sourceMappingURL=subject-action.vue.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"subject-action.vue.js","sources":["../../../../../../packages/components/src/subject-action/src/subject-action.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Bottom, Delete, Edit, Top } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectType from '../../subject-type/src/subject-type.vue'\n\ndefineOptions({\n name: 'QxsSubjectAction',\n})\nconst props = defineProps({\n isEdit: {\n type: Boolean,\n },\n isSet: {\n type: Boolean,\n default: false,\n },\n isKey: {\n type: Boolean,\n default: false,\n },\n answerCheckType: {\n type: Number,\n default: 2\n },\n showOtherOption: {\n type: Boolean,\n default: true,\n },\n examAnswerRelationType: {\n type: Number,\n default: null\n },\n pageEnd: {\n type: Boolean,\n default: false\n }\n})\nconst isKey = ref(props.isKey)\nconst showAnswerSetting = ref(false)\nconst emits = defineEmits(['moveUp', 'moveDown', 'delete', 'save', 'edit', 'add', 'onShowRichText', 'setKey', 'setAnswerSetting'])\nconst answerType = ref(props.answerCheckType)\nconst ns = useNamespace('subject-action')\n\nfunction onSaveSetting() {\n showAnswerSetting.value = false\n emits('setAnswerSetting', answerType)\n}\n\nfunction selectExam(type:string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n</script>\n\n<template>\n <div :class=\"ns.e('action-exam')\">\n <div class=\"action\" :class=\"[{ active: isEdit }]\">\n <div v-if=\"isEdit\"
|
1
|
+
{"version":3,"file":"subject-action.vue.js","sources":["../../../../../../packages/components/src/subject-action/src/subject-action.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Bottom, Delete, Edit, Top } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectType from '../../subject-type/src/subject-type.vue'\n\ndefineOptions({\n name: 'QxsSubjectAction',\n})\nconst props = defineProps({\n isEdit: {\n type: Boolean,\n },\n isSet: {\n type: Boolean,\n default: false,\n },\n isKey: {\n type: Boolean,\n default: false,\n },\n answerCheckType: {\n type: Number,\n default: 2\n },\n showOtherOption: {\n type: Boolean,\n default: true,\n },\n examAnswerRelationType: {\n type: Number,\n default: null\n },\n pageEnd: {\n type: Boolean,\n default: false\n }\n})\nconst isKey = ref(props.isKey)\nconst showAnswerSetting = ref(false)\nconst emits = defineEmits(['moveUp', 'moveDown', 'delete', 'save', 'edit', 'add', 'onShowRichText', 'setKey', 'setAnswerSetting'])\nconst answerType = ref(props.answerCheckType)\nconst ns = useNamespace('subject-action')\n\nfunction onSaveSetting() {\n showAnswerSetting.value = false\n emits('setAnswerSetting', answerType)\n}\n\nfunction selectExam(type:string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n</script>\n\n<template>\n <div :class=\"ns.e('action-exam')\">\n <div class=\"action flex\" :class=\"[{ active: isEdit }]\">\n <div v-if=\"isEdit\" class=\"flex-justify-between\">\n <el-popover trigger=\"click\">\n <template #reference>\n <el-link type=\"primary\" class=\"btn-margin\">\n +在此题后加入新题\n </el-link>\n </template>\n <SubjectType @select=\"selectExam\" />\n </el-popover>\n <el-link type=\"primary\" @click=\"emits('onShowRichText')\" v-if=\"showOtherOption\" class=\"btn-margin\">\n +添加题目描述(图文)\n </el-link>\n <el-link type=\"primary\" @click=\"showAnswerSetting = true\" v-if=\"showOtherOption\" class=\"btn-margin\">\n 答题设置\n </el-link>\n <el-checkbox v-model=\"isKey\" label=\"核心题\" @change=\"emits('setKey', isKey)\" v-if=\"showOtherOption\" />\n </div>\n <div>\n <div v-if=\"isSet\" class=\"has-set\">\n *此题设置了跳题逻辑\n </div>\n <div v-else class=\"flex flex-justify-end\" style=\"width: 100%;\">\n <template v-if=\"!isEdit\">\n <el-button class=\"btn-margin\" @click=\"emits('edit')\" v-if=\"!pageEnd\">\n <template #icon>\n <el-icon>\n <Edit />\n </el-icon>\n </template>\n 编辑\n </el-button>\n <el-button class=\"btn-margin\" @click=\"emits('delete')\">\n <template #icon>\n <el-icon>\n <Delete />\n </el-icon>\n </template>\n 删除\n </el-button>\n <el-button class=\"btn-margin\" @click=\"emits('moveUp')\">\n <template #icon>\n <el-icon>\n <Top />\n </el-icon>\n </template>\n 上移\n </el-button>\n <el-button class=\"btn-margin\" @click=\"emits('moveDown')\">\n <template #icon>\n <el-icon>\n <Bottom />\n </el-icon>\n </template>\n 下移\n </el-button>\n </template>\n <template v-else>\n <el-button class=\"btn-margin\" @click=\"emits('delete')\">\n 删除\n </el-button>\n <el-button type=\"primary\" @click=\"emits('save')\">\n 完成编辑\n </el-button>\n </template>\n </div>\n </div>\n <el-dialog\n v-model=\"showAnswerSetting\"\n title=\"答题设置\"\n class=\"customize-dialog\"\n >\n <el-radio-group v-model=\"answerType\" class=\"vertical-radio-group\">\n <el-radio :value=\"1\">必须全部都是支持选项,方可下一步</el-radio>\n <el-radio :value=\"2\">无需判断是否是支持选项</el-radio>\n <el-radio :value=\"3\">包含全部支持选项,即可下一步</el-radio>\n </el-radio-group>\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"showAnswerSetting = false\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveSetting\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n </div>\n</template>\n"],"names":["props","__props","isKey","ref","showAnswerSetting","emits","__emit","answerType","answerCheckType","ns","useNamespace","onSaveSetting","value","selectExam","type","canSet","examAnswerRelationType"],"mappings":"wzBAQA,MAAMA,EAAQC,EA6BRC,EAAQC,EAAAA,IAAIH,EAAME,OAClBE,EAAoBD,OAAI,GACxBE,EAAQC,EACRC,EAAaJ,EAAAA,IAAIH,EAAMQ,iBACvBC,EAAKC,eAAa,kBAExB,SAASC,IACPP,EAAkBQ,OAAQ,EAC1BP,EAAM,mBAAoBE,EAAU,CAG7B,SAAAM,EAAWC,EAAaC,GAChCV,EAAM,MAAOS,EAAMC,EAAQf,EAAMgB,uBAAwB,KAAI"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../packages/components/src/subject-list/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-list.vue'\n\nconst QxsSubjectList = withInstall(component)\n
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../packages/components/src/subject-list/index.ts"],"sourcesContent":["import { withInstall } from '../withInstall'\nimport component from './src/subject-list.vue'\n\nconst QxsSubjectList = withInstall(component)\n\nexport {\n QxsSubjectList\n}\n\nexport default QxsSubjectList"],"names":["QxsSubjectList","withInstall","component","default"],"mappings":"8IAGA,MAAMA,EAAiBC,cAAYC,EAASC"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es"),t=require("vue"),l=require("@element-plus/icons-vue"),a=require("@qxs-bns/hooks"),r=require("../../../subject-action/src/subject-action.vue.js"),n=require("../../../subject-layout/src/subject-layout.vue.js"),o=require("../../../tiny-mce-editor/src/tiny-mce-editor.vue.js"),i=require("@qxs-bns/utils");const s={class:"preview"},u={class:"title"},d={key:0},c={key:1},m={key:0},p=["innerHTML"],f={class:"preview-answer"},v={class:"order"},y={class:"order"},x={style:{flex:"1"}},C={class:"margin-bottom flex flex-items-center"},k={class:"margin-bottom answer-list"},V={class:"order"},w={key:0,class:"margin-bottom flex flex-items-center"},h={style:{flex:"1"}},g={key:1,class:"flex"},E={style:{flex:"1"}},N={key:2,class:"margin-bottom flex"},B={style:{flex:"1"}},S={class:"flex flex-justify-end"};var b=t.defineComponent({name:"QxsSubjectSingle",__name:"subject-single",props:{orderIndex:{type:Number,required:!0},title:{type:String,required:!1},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},type:{type:String,required:!0},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},answerList:{type:null,required:!1},leastAnswerCount:{type:Number,required:!1},analysis:{type:String,required:!1},examExpand:{type:String,required:!1},examRichTextContent:{type:String,required:!1},showAnalysis:{type:Boolean,required:!1},examAnswerRelationType:{type:Number,required:!1},customId:{type:Number,required:!1},examId:{type:Number,required:!1},isKey:{type:Boolean,required:!0},answerCheckType:{type:Number,required:!0}},emits:["move","save","delete","edit","add","setRelation"],setup(b,{emit:T}){const R=b,q=T,A=t.useAttrs(),I=t.ref(0),_=t.ref(R.isKey),j=t.ref(2),D=t.ref([{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1}]),L=t.ref(),U=t.ref(""),M=t.ref(""),z=t.ref(!1),$=t.ref(""),K=t.ref(0),F=t.ref(!1),P=t.ref(""),O=t.computed((()=>"single"===R.type?"单选题":"multiple"===R.type?"多选题":"排序题")),G=t.ref([]),H=t.computed((()=>{const e=[];for(let t=D.value.length;t>1;t--)e.push({label:`至少选择${t}项`,value:t});return e.reverse()}));function Q(){R.isSave||D.value.push({title:"",isCorrect:!1,customAnswerId:i.setGuid()})}function J(){z.value=!1,$.value=""}function W(){if(!U.value)return void e.ElMessage.error("题目标题不能为空!");let t="",l=!1,a=null,r=0;if("multiple"===R.type||"single"===R.type?D.value.forEach(((e,n)=>{e.title||(t+=`选项${String.fromCharCode(65+n)}未填写。`),e.isCorrect&&(l=!0,r++),e.resultItem&&(a=1),e.answerRelations?.length&&(a=2)})):"sort"===R.type&&G.value.length&&(l=!0),t)return void e.ElMessage.error(t);if(new Set(D.value.map((e=>e.title))).size===D.value.length){if("multiple"===R.type){if(1===r)return void e.ElMessage.error("请至少设置两个正确答案");if(l&&r<L.value)return void e.ElMessage.error("至少选几项与正确答案数不符")}q("save",{title:U.value,answers:D.value.map(((e,t)=>({...e,orderIndex:t+1}))),examExpand:G.value.map((e=>e.charCodeAt(0)-65+1)).join(","),analysis:M.value,isSetCorrectAnswer:l,leastAnswerCount:L.value,examRichTextContent:z.value?$.value:"",examAnswerRelationType:a,isKey:_.value,answerCheckType:j.value})}else e.ElMessage.error("选项不能重复")}function X(){F.value=!1,P.value=""}function Y(){F.value=!1}function Z(e){_.value=e}function ee(e){j.value=e}function te(e,t){q("add",e,t?R.examAnswerRelationType:null)}t.watch((()=>R.isEdit),(()=>{R.isEdit&&(K.value=(new Date).getTime())}));const le=a.useNamespace("subject-single");return t.onMounted((function(){if(R.title&&(U.value=R.title),R.answerCheckType&&(j.value=R.answerCheckType),R.answerList&&R.answerList.length&&(D.value=R.answerList.map((e=>({...e,customAnswerId:e.examAnswerId||i.setGuid()})))),R.leastAnswerCount&&(L.value=R.leastAnswerCount),R.examExpand&&R.examExpand){const e=R.examExpand.split(",");G.value=e.map((e=>{const t=R.answerList.find((t=>t.answerId?.toString()===e));return t?String.fromCharCode(65+t.orderIndex-1):e})).filter(Boolean)}R.analysis&&(M.value=R.analysis),R.examRichTextContent&&($.value=R.examRichTextContent,z.value=!0)})),(a,i)=>{const b=e.ElCheckbox,T=e.ElRadio,K=e.ElInput,P=e.ElOption,ae=e.ElSelect,re=e.ElIcon,ne=e.ElLink,oe=e.ElButton,ie=e.ElDialog;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(le).e("single-exam"))},[t.createVNode(n.default,{"show-edit":a.isEdit},t.createSlots({preview:t.withCtx((()=>[t.createElementVNode("div",s,[t.createElementVNode("div",null,[t.createElementVNode("span",u,[t.createTextVNode(t.toDisplayString(a.orderIndex+1)+"."+t.toDisplayString(t.unref(U))+" ",1),"single"===a.type?(t.openBlock(),t.createElementBlock("span",d,"(单选题)")):["multiple","sort"].includes(a.type)?(t.openBlock(),t.createElementBlock("span",c," ("+t.toDisplayString(t.unref(O))+t.toDisplayString(t.unref(L)?`至少选${t.unref(L)}项${"sort"===a.type?"并排序":""}`:"")+") ",1)):t.createCommentVNode("v-if",!0)])]),t.unref(z)?(t.openBlock(),t.createElementBlock("div",m,[t.createElementVNode("div",{innerHTML:t.unref($)},null,8,p)])):t.createCommentVNode("v-if",!0),t.createElementVNode("div",f,["sort"===a.type?(t.openBlock(!0),t.createElementBlock(t.Fragment,{key:0},t.renderList(t.unref(D),((e,l)=>(t.openBlock(),t.createBlock(b,{key:l,class:"radio",disabled:!0},{default:t.withCtx((()=>[t.createElementVNode("span",v,t.toDisplayString(String.fromCharCode(65+l))+". ",1),t.createTextVNode(" "+t.toDisplayString(e.title),1)])),_:2},1024)))),128)):(t.openBlock(!0),t.createElementBlock(t.Fragment,{key:1},t.renderList(t.unref(D),((e,l)=>(t.openBlock(),t.createBlock(T,{key:l,class:"radio",value:"disabled",disabled:""},{default:t.withCtx((()=>[t.createElementVNode("span",y,t.toDisplayString(String.fromCharCode(65+l))+". ",1),t.createTextVNode(" "+t.toDisplayString(e.title)+" "+t.toDisplayString(e.isCorrect?"(支持选项)":"")+" "+t.toDisplayString(e.resultItem&&1===a.examAnswerRelationType?"(已设置结果项)":"(未设置结果项)")+" "+t.toDisplayString(e.answerRelations?.length&&2===a.examAnswerRelationType?"(已设置关联)":"(未设置关联)"),1)])),_:2},1024)))),128))])])])),default:t.withCtx((()=>[a.showAction?(t.openBlock(),t.createBlock(r.default,{key:0,"is-edit":a.isEdit,"is-set":a.isSet,isKey:t.unref(_),examAnswerRelationType:R.examAnswerRelationType,answerCheckType:t.unref(j),onMoveUp:i[5]||(i[5]=e=>q("move","up")),onMoveDown:i[6]||(i[6]=e=>q("move","down")),onDelete:i[7]||(i[7]=e=>q("delete")),onSave:W,onEdit:i[8]||(i[8]=e=>q("edit")),onAdd:te,onOnShowRichText:i[9]||(i[9]=e=>z.value=!0),onSetKey:Z,onSetAnswerSetting:ee},null,8,["is-edit","is-set","isKey","examAnswerRelationType","answerCheckType"])):t.createCommentVNode("v-if",!0)])),_:2},[a.isEdit?{name:"edit",fn:t.withCtx((()=>[t.createElementVNode("div",{class:t.normalizeClass(["flex",[{"margin-bottom":t.unref(z)}]])},[i[12]||(i[12]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"题目:")],-1)),t.createElementVNode("div",x,[t.createVNode(K,{modelValue:t.unref(U),"onUpdate:modelValue":i[0]||(i[0]=e=>t.isRef(U)?U.value=e:null),type:"textarea",rows:2,placeholder:`【${t.unref(O)}】请输入问题`,disabled:a.isSave,"show-word-limit":"",maxlength:"200",class:"margin-bottom"},null,8,["modelValue","placeholder","disabled"])])],2),t.createElementVNode("div",C,[i[13]||(i[13]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"设置:")],-1)),["multiple","sort"].includes(a.type)?(t.openBlock(),t.createBlock(ae,{key:0,modelValue:t.unref(L),"onUpdate:modelValue":i[1]||(i[1]=e=>t.isRef(L)?L.value=e:null),style:{width:"150px"},placeholder:"至少选择几项",disabled:a.isSave},{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(H),(e=>(t.openBlock(),t.createBlock(P,{key:e.value,value:e.value,label:e.label},null,8,["value","label"])))),128))])),_:1},8,["modelValue","disabled"])):t.createCommentVNode("v-if",!0)]),t.createElementVNode("div",k,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(D),((e,r)=>(t.openBlock(),t.createElementBlock("div",{key:r,class:"answer-item flex flex-items-center"},[t.createElementVNode("span",V,t.toDisplayString(String.fromCharCode(65+r))+".",1),t.createVNode(K,{modelValue:e.title,"onUpdate:modelValue":t=>e.title=t,class:"input","show-word-limit":"",maxlength:"100",placeholder:`选项${String.fromCharCode(65+r)}`,disabled:a.isSave},null,8,["modelValue","onUpdate:modelValue","placeholder","disabled"]),["single","multiple"].includes(a.type)?(t.openBlock(),t.createBlock(b,{key:0,modelValue:e.isCorrect,"onUpdate:modelValue":t=>e.isCorrect=t,class:t.normalizeClass([{"is-correct":e.isCorrect}]),disabled:a.isSave,style:{"margin-left":"10px"},onChange:t=>function(e,t){"single"===R.type?(t&&D.value.forEach((t=>{t!==e&&(t.isCorrect=!1)})),e.isCorrect=t):"multiple"===R.type&&(e.isCorrect=t)}(e,t)},{default:t.withCtx((()=>[...i[14]||(i[14]=[t.createTextVNode(" 支持选项 ")])])),_:2},1032,["modelValue","onUpdate:modelValue","class","disabled","onChange"])):t.createCommentVNode("v-if",!0),t.createVNode(re,{class:"icon"},{default:t.withCtx((()=>[t.createVNode(t.unref(l.CirclePlus),{class:t.normalizeClass([{disabled:a.isSave}]),onClick:Q},null,8,["class"])])),_:1}),t.createVNode(re,{class:"icon"},{default:t.withCtx((()=>[t.createVNode(t.unref(l.Remove),{class:t.normalizeClass([{disabled:t.unref(D).length<3||a.isSave}]),onClick:e=>function(e){D.value.length<3||R.isSave||D.value.splice(e,1)}(r)},null,8,["class","onClick"])])),_:2},1024),1===a.examAnswerRelationType?(t.openBlock(),t.createBlock(ne,{key:1,type:"primary",class:"margin-left-10",onClick:e=>{return t=r,I.value=t,void(F.value=!0);var t}},{default:t.withCtx((()=>[t.createElementVNode("span",null,t.toDisplayString(e.resultItem?"编辑结果":"添加结果"),1)])),_:2},1032,["onClick"])):t.createCommentVNode("v-if",!0),2===a.examAnswerRelationType?(t.openBlock(),t.createBlock(ne,{key:2,type:"primary",class:"margin-left-10",onClick:t=>function(e){q("setRelation",R.examId,R.customId,e)}(e)},{default:t.withCtx((()=>[t.createElementVNode("span",null,t.toDisplayString(e.answerRelations?.length?`关联了${e.answerRelations?.length}项`:"关联检查"),1)])),_:2},1032,["onClick"])):t.createCommentVNode("v-if",!0)])))),128))]),"sort"===a.type?(t.openBlock(),t.createElementBlock("div",w,[i[15]||(i[15]=t.createElementVNode("div",{class:"label flex flex-justify-end"},[t.createElementVNode("span",null,"排序答案:")],-1)),t.createElementVNode("div",h,[t.createVNode(ae,{modelValue:t.unref(G),"onUpdate:modelValue":i[2]||(i[2]=e=>t.isRef(G)?G.value=e:null),mode:"multiple",style:{width:"360px"},placeholder:"请按顺序选择排序答案","show-arrow":!0},{default:t.withCtx((()=>[t.createCommentVNode(' :options="[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))" '),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(D),((e,l)=>(t.openBlock(),t.createBlock(P,{key:l,label:e.title,value:String.fromCharCode(65+l)},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])])):t.createCommentVNode("v-if",!0),a.showAnalysis?(t.openBlock(),t.createElementBlock("div",g,[i[16]||(i[16]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"解析:")],-1)),t.createElementVNode("div",E,[t.createVNode(K,{modelValue:t.unref(M),"onUpdate:modelValue":i[3]||(i[3]=e=>t.isRef(M)?M.value=e:null),type:"textarea",rows:2,placeholder:"请输入题目解析"},null,8,["modelValue"])])])):t.createCommentVNode("v-if",!0),t.unref(z)?(t.openBlock(),t.createElementBlock("div",N,[i[18]||(i[18]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"富文本:")],-1)),t.createElementVNode("div",B,[t.createVNode(o.default,t.mergeProps({"model-value":t.unref($),"onUpdate:modelValue":i[4]||(i[4]=e=>t.isRef($)?$.value=e:null)},t.unref(A),{style:{width:"100%"}}),null,16,["model-value"]),t.createElementVNode("div",S,[t.createVNode(ne,{type:"danger",onClick:J},{default:t.withCtx((()=>i[17]||(i[17]=[t.createTextVNode(" 删除富文本 ")]))),_:1})])])])):t.createCommentVNode("v-if",!0)])),key:"0"}:void 0]),1032,["show-edit"]),t.createVNode(ie,{modelValue:t.unref(F),"onUpdate:modelValue":i[11]||(i[11]=e=>t.isRef(F)?F.value=e:null),title:"添加结果",class:"customize-dialog"},{footer:t.withCtx((()=>[t.createVNode(oe,{class:"customize-button",type:"primary",plain:"",onClick:X},{default:t.withCtx((()=>i[19]||(i[19]=[t.createTextVNode(" 取消 ")]))),_:1}),t.createVNode(oe,{class:"customize-button",type:"primary",plain:"",onClick:Y},{default:t.withCtx((()=>i[20]||(i[20]=[t.createTextVNode(" 保存 ")]))),_:1})])),default:t.withCtx((()=>[(t.openBlock(),t.createBlock(o.default,t.mergeProps({key:t.unref(I),"model-value":t.unref(D)[t.unref(I)].resultItem,"onUpdate:modelValue":i[10]||(i[10]=e=>t.unref(D)[t.unref(I)].resultItem=e)},t.unref(A),{style:{width:"100%"}}),null,16,["model-value"]))])),_:1},8,["modelValue"])],2)}}});exports.default=b;
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("element-plus/es"),t=require("vue"),l=require("@element-plus/icons-vue"),a=require("@qxs-bns/hooks"),r=require("../../../subject-action/src/subject-action.vue.js"),n=require("../../../subject-layout/src/subject-layout.vue.js"),o=require("../../../tiny-mce-editor/src/tiny-mce-editor.vue.js"),i=require("@qxs-bns/utils");const s={class:"preview"},d={class:"title"},u={key:0},c={key:1},m={key:0},p=["innerHTML"],f={class:"preview-answer"},v={class:"order"},y={class:"order"},x={style:{flex:"1"}},C={class:"margin-bottom flex flex-items-center"},V={class:"margin-bottom answer-list"},k={class:"order"},w={key:0,class:"margin-bottom flex flex-items-center"},h={style:{flex:"1"}},g={key:1,class:"flex"},E={style:{flex:"1"}},N={key:2,class:"margin-bottom flex"},B={style:{flex:"1"}},S={class:"flex flex-justify-end"};var b=t.defineComponent({name:"QxsSubjectSingle",__name:"subject-single",props:{orderIndex:{type:Number,required:!0},title:{type:String,required:!1},isSave:{type:Boolean,required:!0},showAction:{type:Boolean,required:!1},type:{type:String,required:!0},isEdit:{type:Boolean,required:!0},isSet:{type:Boolean,required:!0},answerList:{type:null,required:!1},leastAnswerCount:{type:Number,required:!1},analysis:{type:String,required:!1},examExpand:{type:String,required:!1},examRichTextContent:{type:String,required:!1},showAnalysis:{type:Boolean,required:!1},examAnswerRelationType:{type:Number,required:!1},customId:{type:Number,required:!1},examId:{type:Number,required:!1},isKey:{type:Boolean,required:!0},answerCheckType:{type:Number,required:!0}},emits:["move","save","delete","edit","add","setRelation"],setup(b,{emit:T}){const R=b,q=T,A=t.useAttrs(),I=t.ref(0),_=t.ref(R.isKey),j=t.ref(R.answerCheckType),D=t.ref([{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1},{title:"",isCorrect:!1}]),L=t.ref(),U=t.ref(""),M=t.ref(""),z=t.ref(!1),$=t.ref(""),K=t.ref(0),F=t.ref(!1),P=t.ref(""),O=t.computed((()=>"single"===R.type?"单选题":"multiple"===R.type?"多选题":"排序题")),G=t.ref([]),H=t.computed((()=>{const e=[];for(let t=D.value.length;t>1;t--)e.push({label:`至少选择${t}项`,value:t});return e.reverse()}));function Q(){R.isSave||D.value.push({title:"",isCorrect:!1,customAnswerId:i.setGuid()})}function J(){z.value=!1,$.value=""}function W(){if(!U.value)return void e.ElMessage.error("题目标题不能为空!");let t="",l=!1,a=null,r=0;if("multiple"===R.type||"single"===R.type?D.value.forEach(((e,n)=>{e.title||(t+=`选项${String.fromCharCode(65+n)}未填写。`),e.isCorrect&&(l=!0,r++),e.resultItem&&(a=1),e.answerRelations?.length&&(a=2)})):"sort"===R.type&&G.value.length&&(l=!0),t)return void e.ElMessage.error(t);if(new Set(D.value.map((e=>e.title))).size===D.value.length){if("multiple"===R.type){if(1===r)return void e.ElMessage.error("请至少设置两个正确答案");if(l&&r<L.value)return void e.ElMessage.error("至少选几项与正确答案数不符")}q("save",{title:U.value,answers:D.value.map(((e,t)=>({...e,orderIndex:t+1}))),examExpand:G.value.map((e=>e.charCodeAt(0)-65+1)).join(","),analysis:M.value,isSetCorrectAnswer:l,leastAnswerCount:L.value,examRichTextContent:z.value?$.value:"",examAnswerRelationType:a,isKey:_.value,answerCheckType:j.value})}else e.ElMessage.error("选项不能重复")}function X(){F.value=!1,P.value=""}function Y(){F.value=!1}function Z(e){_.value=e}function ee(e){j.value=e}function te(e,t){q("add",e,t?R.examAnswerRelationType:null)}t.watch((()=>R.isEdit),(()=>{R.isEdit&&(K.value=(new Date).getTime())}));const le=a.useNamespace("subject-single");return t.onMounted((function(){if(R.title&&(U.value=R.title),R.answerList&&R.answerList.length&&(D.value=R.answerList.map((e=>({...e,customAnswerId:e.examAnswerId||i.setGuid()})))),R.leastAnswerCount&&(L.value=R.leastAnswerCount),R.examExpand&&R.examExpand){const e=R.examExpand.split(",");G.value=e.map((e=>{const t=R.answerList.find((t=>t.answerId?.toString()===e));return t?String.fromCharCode(65+t.orderIndex-1):e})).filter(Boolean)}R.analysis&&(M.value=R.analysis),R.examRichTextContent&&($.value=R.examRichTextContent,z.value=!0)})),(a,i)=>{const b=e.ElCheckbox,T=e.ElRadio,K=e.ElInput,P=e.ElOption,ae=e.ElSelect,re=e.ElIcon,ne=e.ElLink,oe=e.ElButton,ie=e.ElDialog;return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(t.unref(le).e("single-exam"))},[t.createVNode(n.default,{"show-edit":a.isEdit},t.createSlots({preview:t.withCtx((()=>[t.createElementVNode("div",s,[t.createElementVNode("div",null,[t.createElementVNode("span",d,[t.createTextVNode(t.toDisplayString(a.orderIndex+1)+"."+t.toDisplayString(t.unref(U))+" ",1),"single"===a.type?(t.openBlock(),t.createElementBlock("span",u,"(单选题)")):["multiple","sort"].includes(a.type)?(t.openBlock(),t.createElementBlock("span",c," ("+t.toDisplayString(t.unref(O))+t.toDisplayString(t.unref(L)?`至少选${t.unref(L)}项${"sort"===a.type?"并排序":""}`:"")+") ",1)):t.createCommentVNode("v-if",!0)])]),t.unref(z)?(t.openBlock(),t.createElementBlock("div",m,[t.createElementVNode("div",{innerHTML:t.unref($)},null,8,p)])):t.createCommentVNode("v-if",!0),t.createElementVNode("div",f,["sort"===a.type?(t.openBlock(!0),t.createElementBlock(t.Fragment,{key:0},t.renderList(t.unref(D),((e,l)=>(t.openBlock(),t.createBlock(b,{key:l,class:"radio",disabled:!0},{default:t.withCtx((()=>[t.createElementVNode("span",v,t.toDisplayString(String.fromCharCode(65+l))+". ",1),t.createTextVNode(" "+t.toDisplayString(e.title),1)])),_:2},1024)))),128)):(t.openBlock(!0),t.createElementBlock(t.Fragment,{key:1},t.renderList(t.unref(D),((e,l)=>(t.openBlock(),t.createBlock(T,{key:l,class:"radio",value:"disabled",disabled:""},{default:t.withCtx((()=>[t.createElementVNode("span",y,t.toDisplayString(String.fromCharCode(65+l))+". ",1),t.createTextVNode(" "+t.toDisplayString(e.title)+" "+t.toDisplayString(e.isCorrect?"(支持选项)":"")+" "+t.toDisplayString(1===a.examAnswerRelationType?e.resultItem?"(已设置结果项)":"(未设置结果项)":"")+" "+t.toDisplayString(2===a.examAnswerRelationType?e.answerRelations?.length?"(已设置关联)":"(未设置关联)":""),1)])),_:2},1024)))),128))])])])),default:t.withCtx((()=>[a.showAction?(t.openBlock(),t.createBlock(r.default,{key:0,"is-edit":a.isEdit,"is-set":a.isSet,isKey:t.unref(_),examAnswerRelationType:R.examAnswerRelationType,answerCheckType:t.unref(j),onMoveUp:i[5]||(i[5]=e=>q("move","up")),onMoveDown:i[6]||(i[6]=e=>q("move","down")),onDelete:i[7]||(i[7]=e=>q("delete")),onSave:W,onEdit:i[8]||(i[8]=e=>q("edit")),onAdd:te,onOnShowRichText:i[9]||(i[9]=e=>z.value=!0),onSetKey:Z,onSetAnswerSetting:ee},null,8,["is-edit","is-set","isKey","examAnswerRelationType","answerCheckType"])):t.createCommentVNode("v-if",!0)])),_:2},[a.isEdit?{name:"edit",fn:t.withCtx((()=>[t.createElementVNode("div",{class:t.normalizeClass(["flex",[{"margin-bottom":t.unref(z)}]])},[i[12]||(i[12]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"题目:")],-1)),t.createElementVNode("div",x,[t.createVNode(K,{modelValue:t.unref(U),"onUpdate:modelValue":i[0]||(i[0]=e=>t.isRef(U)?U.value=e:null),type:"textarea",rows:2,placeholder:`【${t.unref(O)}】请输入问题`,disabled:a.isSave,"show-word-limit":"",maxlength:"200",class:"margin-bottom"},null,8,["modelValue","placeholder","disabled"])])],2),t.createElementVNode("div",C,[i[13]||(i[13]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"设置:")],-1)),["multiple","sort"].includes(a.type)?(t.openBlock(),t.createBlock(ae,{key:0,modelValue:t.unref(L),"onUpdate:modelValue":i[1]||(i[1]=e=>t.isRef(L)?L.value=e:null),style:{width:"150px"},placeholder:"至少选择几项",disabled:a.isSave},{default:t.withCtx((()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(H),(e=>(t.openBlock(),t.createBlock(P,{key:e.value,value:e.value,label:e.label},null,8,["value","label"])))),128))])),_:1},8,["modelValue","disabled"])):t.createCommentVNode("v-if",!0)]),t.createElementVNode("div",V,[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(D),((e,r)=>(t.openBlock(),t.createElementBlock("div",{key:r,class:"answer-item flex flex-items-center"},[t.createElementVNode("span",k,t.toDisplayString(String.fromCharCode(65+r))+".",1),t.createVNode(K,{modelValue:e.title,"onUpdate:modelValue":t=>e.title=t,class:"input","show-word-limit":"",maxlength:"100",placeholder:`选项${String.fromCharCode(65+r)}`,disabled:a.isSave},null,8,["modelValue","onUpdate:modelValue","placeholder","disabled"]),["single","multiple"].includes(a.type)?(t.openBlock(),t.createBlock(b,{key:0,modelValue:e.isCorrect,"onUpdate:modelValue":t=>e.isCorrect=t,class:t.normalizeClass([{"is-correct":e.isCorrect}]),disabled:a.isSave,style:{"margin-left":"10px"},onChange:t=>function(e,t){"single"===R.type?(t&&D.value.forEach((t=>{t!==e&&(t.isCorrect=!1)})),e.isCorrect=t):"multiple"===R.type&&(e.isCorrect=t)}(e,t)},{default:t.withCtx((()=>[...i[14]||(i[14]=[t.createTextVNode(" 支持选项 ")])])),_:2},1032,["modelValue","onUpdate:modelValue","class","disabled","onChange"])):t.createCommentVNode("v-if",!0),t.createVNode(re,{class:"icon"},{default:t.withCtx((()=>[t.createVNode(t.unref(l.CirclePlus),{class:t.normalizeClass([{disabled:a.isSave}]),onClick:Q},null,8,["class"])])),_:1}),t.createVNode(re,{class:"icon"},{default:t.withCtx((()=>[t.createVNode(t.unref(l.Remove),{class:t.normalizeClass([{disabled:t.unref(D).length<3||a.isSave}]),onClick:e=>function(e){D.value.length<3||R.isSave||D.value.splice(e,1)}(r)},null,8,["class","onClick"])])),_:2},1024),1===a.examAnswerRelationType?(t.openBlock(),t.createBlock(ne,{key:1,type:"primary",class:"margin-left-10",onClick:e=>{return t=r,I.value=t,void(F.value=!0);var t}},{default:t.withCtx((()=>[t.createElementVNode("span",null,t.toDisplayString(e.resultItem?"编辑结果":"添加结果"),1)])),_:2},1032,["onClick"])):t.createCommentVNode("v-if",!0),2===a.examAnswerRelationType?(t.openBlock(),t.createBlock(ne,{key:2,type:"primary",class:"margin-left-10",onClick:t=>function(e){q("setRelation",R.examId,R.customId,e)}(e)},{default:t.withCtx((()=>[t.createElementVNode("span",null,t.toDisplayString(e.answerRelations?.length?`关联了${e.answerRelations?.length}项`:"关联检查"),1)])),_:2},1032,["onClick"])):t.createCommentVNode("v-if",!0)])))),128))]),"sort"===a.type?(t.openBlock(),t.createElementBlock("div",w,[i[15]||(i[15]=t.createElementVNode("div",{class:"label flex flex-justify-end"},[t.createElementVNode("span",null,"排序答案:")],-1)),t.createElementVNode("div",h,[t.createVNode(ae,{modelValue:t.unref(G),"onUpdate:modelValue":i[2]||(i[2]=e=>t.isRef(G)?G.value=e:null),mode:"multiple",style:{width:"360px"},placeholder:"请按顺序选择排序答案","show-arrow":!0},{default:t.withCtx((()=>[t.createCommentVNode(' :options="[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))" '),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(t.unref(D),((e,l)=>(t.openBlock(),t.createBlock(P,{key:l,label:e.title,value:String.fromCharCode(65+l)},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])])):t.createCommentVNode("v-if",!0),a.showAnalysis?(t.openBlock(),t.createElementBlock("div",g,[i[16]||(i[16]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"解析:")],-1)),t.createElementVNode("div",E,[t.createVNode(K,{modelValue:t.unref(M),"onUpdate:modelValue":i[3]||(i[3]=e=>t.isRef(M)?M.value=e:null),type:"textarea",rows:2,placeholder:"请输入题目解析"},null,8,["modelValue"])])])):t.createCommentVNode("v-if",!0),t.unref(z)?(t.openBlock(),t.createElementBlock("div",N,[i[18]||(i[18]=t.createElementVNode("div",{class:"label flex flex-justify-center"},[t.createElementVNode("span",null,"富文本:")],-1)),t.createElementVNode("div",B,[t.createVNode(o.default,t.mergeProps({"model-value":t.unref($),"onUpdate:modelValue":i[4]||(i[4]=e=>t.isRef($)?$.value=e:null)},t.unref(A),{style:{width:"100%"}}),null,16,["model-value"]),t.createElementVNode("div",S,[t.createVNode(ne,{type:"danger",onClick:J},{default:t.withCtx((()=>i[17]||(i[17]=[t.createTextVNode(" 删除富文本 ")]))),_:1})])])])):t.createCommentVNode("v-if",!0)])),key:"0"}:void 0]),1032,["show-edit"]),t.createVNode(ie,{modelValue:t.unref(F),"onUpdate:modelValue":i[11]||(i[11]=e=>t.isRef(F)?F.value=e:null),title:"添加结果",class:"customize-dialog"},{footer:t.withCtx((()=>[t.createVNode(oe,{class:"customize-button",type:"primary",plain:"",onClick:X},{default:t.withCtx((()=>i[19]||(i[19]=[t.createTextVNode(" 取消 ")]))),_:1}),t.createVNode(oe,{class:"customize-button",type:"primary",plain:"",onClick:Y},{default:t.withCtx((()=>i[20]||(i[20]=[t.createTextVNode(" 保存 ")]))),_:1})])),default:t.withCtx((()=>[(t.openBlock(),t.createBlock(o.default,t.mergeProps({key:t.unref(I),"model-value":t.unref(D)[t.unref(I)].resultItem,"onUpdate:modelValue":i[10]||(i[10]=e=>t.unref(D)[t.unref(I)].resultItem=e)},t.unref(A),{style:{width:"100%"}}),null,16,["model-value"]))])),_:1},8,["modelValue"])],2)}}});exports.default=b;
|
2
2
|
//# sourceMappingURL=subject-single.vue.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"subject-single.vue.js","sources":["../../../../../../../packages/components/src/subject-list/src/components/subject-single.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CirclePlus, Remove } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectAction from '../../../subject-action/src/subject-action.vue'\nimport SubjectLayout from '../../../subject-layout/src/subject-layout.vue'\nimport TinyMceEditor from '../../../tiny-mce-editor/src/tiny-mce-editor.vue'\nimport { setGuid } from '@qxs-bns/utils'\n\ndefineOptions({\n name: 'QxsSubjectSingle',\n})\nconst props = defineProps<{\n orderIndex: number\n title?: string\n isSave: boolean\n showAction?: boolean\n type: 'single' | 'multiple' | 'sort'\n isEdit: boolean\n isSet: boolean\n answerList?: any\n leastAnswerCount?: number\n analysis?: string\n examExpand?: string\n examRichTextContent?: string\n showAnalysis?: boolean\n examAnswerRelationType?: number\n customId?: number\n examId?: number\n isKey: boolean\n answerCheckType: number\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(props.isKey)\nconst answerCheckType = ref(2)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: string\n customAnswerId?: string\n answerRelations?: {\n relationExamId: number\n relationAnswers: {\n relationAnswerId: number\n relationAnswerIndex: number\n }[]\n }[]\n}[]>([{\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}])\n\nconst leastAnswerCount = ref()\nconst title = ref('')\nconst analysis = ref('')\nconst showRichText = ref(false)\nconst richText = ref('')\nconst startTime = ref(0)\nconst showRichContent = ref(false)\nconst resultItem = ref<string>('')\nconst titlePlaceholder = computed(() => {\n if (props.type === 'single') {\n return '单选题'\n }\n else if (props.type === 'multiple') {\n return '多选题'\n }\n else {\n return '排序题'\n }\n})\n\nconst orderList = ref<string[]>([])\n\nconst leastAnswerOptions = computed(() => {\n const items = []\n const length = answers.value.length\n for (let count = length; count > 1; count--) {\n items.push({\n label: `至少选择${count}项`,\n value: count,\n })\n }\n return items.reverse()\n})\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\n customAnswerId: setGuid()\n })\n}\n\nfunction deleteAnswer(index: number) {\n if (answers.value.length < 3 || props.isSave) {\n return\n }\n answers.value.splice(index, 1)\n}\n\nfunction setCorrect(it: any, event: any) {\n if (props.type === 'single') {\n // 单选题:确保只有一个正确答案\n if (event) {\n answers.value.forEach((answer) => {\n if (answer !== it) {\n answer.isCorrect = false\n }\n })\n }\n it.isCorrect = event\n } else if (props.type === 'multiple') {\n // 多选题:可以有多个正确答案\n it.isCorrect = event\n }\n}\nfunction setRelation(item: any) {\n emits('setRelation', props.examId, props.customId, item)\n}\n\nfunction deleteRichText() {\n showRichText.value = false\n richText.value = ''\n}\n\nfunction save() {\n if (!title.value) {\n ElMessage.error('题目标题不能为空!')\n return\n }\n let msg = ''\n let isSetCorrectAnswer = false\n let examAnswerRelationType = null\n let correctAnswerCount = 0\n if (props.type === 'multiple' || props.type === 'single') {\n answers.value.forEach((v: any, i: number) => {\n if (!v.title) {\n msg += `选项${String.fromCharCode(65 + i)}未填写。`\n }\n if (v.isCorrect) {\n isSetCorrectAnswer = true\n correctAnswerCount++\n }\n if (v.resultItem) {\n examAnswerRelationType = 1\n }\n if (v.answerRelations?.length) {\n examAnswerRelationType = 2\n }\n })\n }\n else if (props.type === 'sort') {\n // 如果设置了正确答案\n if (orderList.value.length) {\n isSetCorrectAnswer = true\n }\n }\n if (msg) {\n ElMessage.error(msg)\n return\n }\n\n const uniqueAnswer = new Set(answers.value.map((item: any) => item.title))\n\n if (uniqueAnswer.size !== answers.value.length) {\n ElMessage.error('选项不能重复')\n return\n }\n\n if (props.type === 'multiple') {\n if (correctAnswerCount === 1) {\n ElMessage.error('请至少设置两个正确答案')\n return\n }\n\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount.value) {\n ElMessage.error('至少选几项与正确答案数不符')\n return\n }\n }\n\n emits('save', {\n title: title.value,\n answers: answers.value.map((item: any, index: number) => {\n return { ...item, orderIndex: index + 1 }\n }),\n examExpand: orderList.value.map((i: string) => i.charCodeAt(0) - 65 + 1).join(','),\n analysis: analysis.value,\n isSetCorrectAnswer,\n leastAnswerCount: leastAnswerCount.value,\n examRichTextContent: showRichText.value ? richText.value : '',\n examAnswerRelationType,\n isKey: isKey.value,\n answerCheckType: answerCheckType.value\n })\n}\n\nfunction init() {\n if (props.title) {\n title.value = props.title\n }\n // const customId = props.id || setGuid()\n\n if (props.answerCheckType) {\n answerCheckType.value = props.answerCheckType\n }\n\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList.map((item: any) => {\n return { ...item, customAnswerId: item.examAnswerId || setGuid() }\n })\n }\n\n if (props.leastAnswerCount) {\n leastAnswerCount.value = props.leastAnswerCount\n }\n\n if (props.examExpand) {\n // 设置正确答案 props.examExpand里是答案id\n if (props.examExpand) {\n const correctAnswerIdList = props.examExpand.split(',')\n\n // 遍历 correctAnswerIdList,直接在 props.answerList 中查找对应的 orderIndex 并转换成字母\n orderList.value = correctAnswerIdList.map((id: string) => {\n const answer = props.answerList.find((item: any) => item.answerId?.toString() === id)\n return answer ? String.fromCharCode(65 + answer.orderIndex - 1) : id\n }).filter(Boolean) // 过滤掉任何可能的空字符串\n }\n }\n\n if (props.analysis) {\n analysis.value = props.analysis\n }\n\n if (props.examRichTextContent) {\n richText.value = props.examRichTextContent\n showRichText.value = true\n }\n}\n\nfunction onCloseResult() {\n showRichContent.value = false\n resultItem.value = ''\n}\n\nfunction onOpenResult(i: number) {\n answersIndex.value = i\n // console.log(answers.value[i].resultItem, 1);\n // resultItem.value = answers.value[i].resultItem || ''\n showRichContent.value = true\n}\n\nfunction onSaveResult() {\n // answers.value[answersIndex.value].resultItem = resultItem.value || ''\n showRichContent.value = false\n}\n\nfunction setKey(key: boolean) {\n isKey.value = key\n}\n\nfunction setAnswerSetting(type: number) {\n answerCheckType.value = type\n}\n\nfunction add(type: string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n// 监听isEdit\nwatch(() => props.isEdit, () => {\n if (props.isEdit) {\n startTime.value = new Date().getTime()\n }\n})\nconst ns = useNamespace('subject-single')\n\nonMounted(init)\n</script>\n\n<template>\n <div :class=\"ns.e('single-exam')\">\n <SubjectLayout\n :show-edit=\"isEdit\"\n >\n <template #preview>\n <div class=\"preview\">\n <div>\n <span class=\"title\">\n {{ orderIndex + 1 }}.{{ title }}\n <span v-if=\"type === 'single'\">(单选题)</span>\n <span v-else-if=\"['multiple', 'sort'].includes(type)\">\n ({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})\n </span>\n </span>\n </div>\n <div v-if=\"showRichText\">\n <div v-html=\"richText\" />\n </div>\n <div class=\"preview-answer\">\n <template v-if=\"type === 'sort'\">\n <el-checkbox\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n :disabled=\"true\"\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }}\n </el-checkbox>\n </template>\n <template v-else>\n <el-radio\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n value=\"disabled\"\n disabled\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }} \n {{ item.isCorrect ? '(支持选项)' : '' }} \n {{ item.resultItem && examAnswerRelationType === 1? '(已设置结果项)' : '(未设置结果项)' }} \n {{ item.answerRelations?.length && examAnswerRelationType === 2 ? '(已设置关联)' : '(未设置关联)' }}\n </el-radio>\n </template>\n </div>\n </div>\n </template>\n <template v-if=\"isEdit\" #edit>\n <div class=\"flex\" :class=\"[{ 'margin-bottom': showRichText }]\">\n <div class=\"label flex flex-justify-center\">\n <span>题目:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"title\"\n type=\"textarea\"\n :rows=\"2\"\n :placeholder=\"`【${titlePlaceholder}】请输入问题`\"\n :disabled=\"isSave\"\n show-word-limit\n maxlength=\"200\"\n class=\"margin-bottom\"\n />\n </div>\n </div>\n <div class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-center\">\n <span>设置:</span>\n </div>\n <el-select\n v-if=\"['multiple', 'sort'].includes(type)\"\n v-model=\"leastAnswerCount\"\n style=\"width: 150px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n :label=\"item.label\"\n >\n </el-option>\n </el-select>\n </div>\n <div class=\"margin-bottom answer-list\">\n <div\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"answer-item flex flex-items-center\"\n >\n <span class=\"order\">{{ String.fromCharCode(65 + index) }}.</span>\n <el-input\n v-model=\"item.title\"\n class=\"input\"\n show-word-limit\n maxlength=\"100\"\n :placeholder=\"`选项${String.fromCharCode(65 + index)}`\"\n :disabled=\"isSave\"\n />\n <el-checkbox\n v-if=\"['single', 'multiple'].includes(type)\"\n v-model=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event: any) => setCorrect(item, event)\"\n >\n 支持选项 \n </el-checkbox>\n <el-icon class=\"icon\">\n <CirclePlus\n :class=\"[{ disabled: isSave }]\"\n @click=\"addAnswer\"\n />\n </el-icon>\n <el-icon class=\"icon\">\n <Remove\n :class=\"[{ disabled: answers.length < 3 || isSave }]\"\n @click=\"deleteAnswer(index)\"\n />\n </el-icon>\n <el-link\n v-if=\"examAnswerRelationType === 1\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"onOpenResult(index)\"\n >\n <span>{{ item.resultItem ? '编辑结果' : '添加结果' }}</span>\n </el-link>\n <el-link\n v-if=\"examAnswerRelationType === 2\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"setRelation(item)\"\n >\n <span>{{ item.answerRelations?.length ? `关联了${item.answerRelations?.length}项` : '关联检查' }}</span>\n </el-link>\n </div>\n </div>\n <div v-if=\"type === 'sort'\" class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-end\">\n <span>排序答案:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-select\n v-model=\"orderList\"\n mode=\"multiple\"\n style=\"width: 360px;\"\n placeholder=\"请按顺序选择排序答案\"\n :show-arrow=\"true\"\n >\n <!-- :options=\"[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))\" -->\n <el-option\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n :label=\"item.title\"\n :value=\"String.fromCharCode(65 + index)\"\n />\n </el-select>\n </div>\n </div>\n <div\n v-if=\"showAnalysis\"\n class=\"flex\"\n >\n <div class=\"label flex flex-justify-center\">\n <span>解析:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"analysis\"\n type=\"textarea\"\n :rows=\"2\"\n placeholder=\"请输入题目解析\"\n />\n </div>\n </div>\n <div v-if=\"showRichText\" class=\"margin-bottom flex\">\n <div class=\"label flex flex-justify-center\">\n <span>富文本:</span>\n </div>\n <div style=\"flex: 1;\">\n <TinyMceEditor v-model:model-value=\"richText\" v-bind=\"attrs\" style=\"width: 100%;\" />\n <div class=\"flex flex-justify-end\">\n <el-link\n type=\"danger\"\n @click=\"deleteRichText\"\n >\n 删除富文本\n </el-link>\n </div>\n </div>\n </div>\n </template>\n <SubjectAction\n v-if=\"showAction\"\n :is-edit=\"isEdit\"\n :is-set=\"isSet\"\n :isKey=\"isKey\"\n :examAnswerRelationType=\"props.examAnswerRelationType\"\n :answerCheckType=\"answerCheckType\"\n @move-up=\"emits('move', 'up')\"\n @move-down=\"emits('move', 'down')\"\n @delete=\"emits('delete')\"\n @save=\"save\"\n @edit=\"emits('edit')\"\n @add=\"add\"\n @onShowRichText=\"showRichText = true\"\n @setKey=\"setKey\"\n @setAnswerSetting=\"setAnswerSetting\"\n />\n </SubjectLayout>\n <el-dialog\n v-model=\"showRichContent\"\n title=\"添加结果\"\n class=\"customize-dialog\"\n >\n <TinyMceEditor\n :key=\"answersIndex\"\n v-model:model-value=\"(answers[answersIndex].resultItem as string)\" \n v-bind=\"attrs\"\n style=\"width: 100%;\" />\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onCloseResult\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveResult\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","attrs","useAttrs","answersIndex","ref","isKey","answerCheckType","answers","title","isCorrect","leastAnswerCount","analysis","showRichText","richText","startTime","showRichContent","resultItem","titlePlaceholder","computed","type","orderList","leastAnswerOptions","items","count","value","length","push","label","reverse","addAnswer","isSave","customAnswerId","setGuid","deleteRichText","save","ElMessage","error","msg","isSetCorrectAnswer","examAnswerRelationType","correctAnswerCount","forEach","v","i","String","fromCharCode","answerRelations","Set","map","item","size","index","orderIndex","examExpand","charCodeAt","join","examRichTextContent","onCloseResult","onSaveResult","setKey","key","setAnswerSetting","add","canSet","watch","isEdit","Date","getTime","ns","useNamespace","onMounted","answerList","examAnswerId","correctAnswerIdList","split","id","answer","find","answerId","toString","filter","Boolean","it","event","splice","examId","customId"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"subject-single.vue.js","sources":["../../../../../../../packages/components/src/subject-list/src/components/subject-single.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CirclePlus, Remove } from '@element-plus/icons-vue'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport SubjectAction from '../../../subject-action/src/subject-action.vue'\nimport SubjectLayout from '../../../subject-layout/src/subject-layout.vue'\nimport TinyMceEditor from '../../../tiny-mce-editor/src/tiny-mce-editor.vue'\nimport { setGuid } from '@qxs-bns/utils'\n\ndefineOptions({\n name: 'QxsSubjectSingle',\n})\nconst props = defineProps<{\n orderIndex: number\n title?: string\n isSave: boolean\n showAction?: boolean\n type: 'single' | 'multiple' | 'sort'\n isEdit: boolean\n isSet: boolean\n answerList?: any\n leastAnswerCount?: number\n analysis?: string\n examExpand?: string\n examRichTextContent?: string\n showAnalysis?: boolean\n examAnswerRelationType?: number\n customId?: number\n examId?: number\n isKey: boolean\n answerCheckType: number\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(props.isKey)\nconst answerCheckType = ref(props.answerCheckType)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: string\n customAnswerId?: string\n answerRelations?: {\n relationExamId: number\n relationAnswers: {\n relationAnswerId: number\n relationAnswerIndex: number\n }[]\n }[]\n}[]>([{\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}, {\n title: '',\n isCorrect: false,\n}])\n\nconst leastAnswerCount = ref()\nconst title = ref('')\nconst analysis = ref('')\nconst showRichText = ref(false)\nconst richText = ref('')\nconst startTime = ref(0)\nconst showRichContent = ref(false)\nconst resultItem = ref<string>('')\nconst titlePlaceholder = computed(() => {\n if (props.type === 'single') {\n return '单选题'\n }\n else if (props.type === 'multiple') {\n return '多选题'\n }\n else {\n return '排序题'\n }\n})\n\nconst orderList = ref<string[]>([])\n\nconst leastAnswerOptions = computed(() => {\n const items = []\n const length = answers.value.length\n for (let count = length; count > 1; count--) {\n items.push({\n label: `至少选择${count}项`,\n value: count,\n })\n }\n return items.reverse()\n})\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\n customAnswerId: setGuid()\n })\n}\n\nfunction deleteAnswer(index: number) {\n if (answers.value.length < 3 || props.isSave) {\n return\n }\n answers.value.splice(index, 1)\n}\n\nfunction setCorrect(it: any, event: any) {\n if (props.type === 'single') {\n // 单选题:确保只有一个正确答案\n if (event) {\n answers.value.forEach((answer) => {\n if (answer !== it) {\n answer.isCorrect = false\n }\n })\n }\n it.isCorrect = event\n } else if (props.type === 'multiple') {\n // 多选题:可以有多个正确答案\n it.isCorrect = event\n }\n}\nfunction setRelation(item: any) {\n emits('setRelation', props.examId, props.customId, item)\n}\n\nfunction deleteRichText() {\n showRichText.value = false\n richText.value = ''\n}\n\nfunction save() {\n if (!title.value) {\n ElMessage.error('题目标题不能为空!')\n return\n }\n let msg = ''\n let isSetCorrectAnswer = false\n let examAnswerRelationType = null\n let correctAnswerCount = 0\n if (props.type === 'multiple' || props.type === 'single') {\n answers.value.forEach((v: any, i: number) => {\n if (!v.title) {\n msg += `选项${String.fromCharCode(65 + i)}未填写。`\n }\n if (v.isCorrect) {\n isSetCorrectAnswer = true\n correctAnswerCount++\n }\n if (v.resultItem) {\n examAnswerRelationType = 1\n }\n if (v.answerRelations?.length) {\n examAnswerRelationType = 2\n }\n })\n }\n else if (props.type === 'sort') {\n // 如果设置了正确答案\n if (orderList.value.length) {\n isSetCorrectAnswer = true\n }\n }\n if (msg) {\n ElMessage.error(msg)\n return\n }\n\n const uniqueAnswer = new Set(answers.value.map((item: any) => item.title))\n\n if (uniqueAnswer.size !== answers.value.length) {\n ElMessage.error('选项不能重复')\n return\n }\n\n if (props.type === 'multiple') {\n if (correctAnswerCount === 1) {\n ElMessage.error('请至少设置两个正确答案')\n return\n }\n\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount.value) {\n ElMessage.error('至少选几项与正确答案数不符')\n return\n }\n }\n\n emits('save', {\n title: title.value,\n answers: answers.value.map((item: any, index: number) => {\n return { ...item, orderIndex: index + 1 }\n }),\n examExpand: orderList.value.map((i: string) => i.charCodeAt(0) - 65 + 1).join(','),\n analysis: analysis.value,\n isSetCorrectAnswer,\n leastAnswerCount: leastAnswerCount.value,\n examRichTextContent: showRichText.value ? richText.value : '',\n examAnswerRelationType,\n isKey: isKey.value,\n answerCheckType: answerCheckType.value\n })\n}\n\nfunction init() {\n if (props.title) {\n title.value = props.title\n }\n // const customId = props.id || setGuid()\n\n // if (props.answerCheckType) {\n // answerCheckType.value = props.answerCheckType\n // }\n\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList.map((item: any) => {\n return { ...item, customAnswerId: item.examAnswerId || setGuid() }\n })\n }\n\n if (props.leastAnswerCount) {\n leastAnswerCount.value = props.leastAnswerCount\n }\n\n if (props.examExpand) {\n // 设置正确答案 props.examExpand里是答案id\n if (props.examExpand) {\n const correctAnswerIdList = props.examExpand.split(',')\n\n // 遍历 correctAnswerIdList,直接在 props.answerList 中查找对应的 orderIndex 并转换成字母\n orderList.value = correctAnswerIdList.map((id: string) => {\n const answer = props.answerList.find((item: any) => item.answerId?.toString() === id)\n return answer ? String.fromCharCode(65 + answer.orderIndex - 1) : id\n }).filter(Boolean) // 过滤掉任何可能的空字符串\n }\n }\n\n if (props.analysis) {\n analysis.value = props.analysis\n }\n\n if (props.examRichTextContent) {\n richText.value = props.examRichTextContent\n showRichText.value = true\n }\n}\n\nfunction onCloseResult() {\n showRichContent.value = false\n resultItem.value = ''\n}\n\nfunction onOpenResult(i: number) {\n answersIndex.value = i\n // console.log(answers.value[i].resultItem, 1);\n // resultItem.value = answers.value[i].resultItem || ''\n showRichContent.value = true\n}\n\nfunction onSaveResult() {\n // answers.value[answersIndex.value].resultItem = resultItem.value || ''\n showRichContent.value = false\n}\n\nfunction setKey(key: boolean) {\n isKey.value = key\n}\n\nfunction setAnswerSetting(type: number) {\n answerCheckType.value = type\n}\n\nfunction add(type: string, canSet: boolean) {\n emits('add', type, canSet? props.examAnswerRelationType: null)\n}\n// 监听isEdit\nwatch(() => props.isEdit, () => {\n if (props.isEdit) {\n startTime.value = new Date().getTime()\n }\n})\nconst ns = useNamespace('subject-single')\n\nonMounted(init)\n</script>\n\n<template>\n <div :class=\"ns.e('single-exam')\">\n <SubjectLayout\n :show-edit=\"isEdit\"\n >\n <template #preview>\n <div class=\"preview\">\n <div>\n <span class=\"title\">\n {{ orderIndex + 1 }}.{{ title }}\n <span v-if=\"type === 'single'\">(单选题)</span>\n <span v-else-if=\"['multiple', 'sort'].includes(type)\">\n ({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})\n </span>\n </span>\n </div>\n <div v-if=\"showRichText\">\n <div v-html=\"richText\" />\n </div>\n <div class=\"preview-answer\">\n <template v-if=\"type === 'sort'\">\n <el-checkbox\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n :disabled=\"true\"\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }}\n </el-checkbox>\n </template>\n <template v-else>\n <el-radio\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"radio\"\n value=\"disabled\"\n disabled\n >\n <span class=\"order\">\n {{ String.fromCharCode(65 + index) }}.\n </span>\n {{ item.title }} \n {{ item.isCorrect ? '(支持选项)' : '' }} \n {{ examAnswerRelationType === 1 ? (item.resultItem? '(已设置结果项)' : '(未设置结果项)' ) : ''}} \n {{ examAnswerRelationType === 2 ? (item.answerRelations?.length? '(已设置关联)' : '(未设置关联)') : '' }}\n </el-radio>\n </template>\n </div>\n </div>\n </template>\n <template v-if=\"isEdit\" #edit>\n <div class=\"flex\" :class=\"[{ 'margin-bottom': showRichText }]\">\n <div class=\"label flex flex-justify-center\">\n <span>题目:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"title\"\n type=\"textarea\"\n :rows=\"2\"\n :placeholder=\"`【${titlePlaceholder}】请输入问题`\"\n :disabled=\"isSave\"\n show-word-limit\n maxlength=\"200\"\n class=\"margin-bottom\"\n />\n </div>\n </div>\n <div class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-center\">\n <span>设置:</span>\n </div>\n <el-select\n v-if=\"['multiple', 'sort'].includes(type)\"\n v-model=\"leastAnswerCount\"\n style=\"width: 150px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n :label=\"item.label\"\n >\n </el-option>\n </el-select>\n </div>\n <div class=\"margin-bottom answer-list\">\n <div\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n class=\"answer-item flex flex-items-center\"\n >\n <span class=\"order\">{{ String.fromCharCode(65 + index) }}.</span>\n <el-input\n v-model=\"item.title\"\n class=\"input\"\n show-word-limit\n maxlength=\"100\"\n :placeholder=\"`选项${String.fromCharCode(65 + index)}`\"\n :disabled=\"isSave\"\n />\n <el-checkbox\n v-if=\"['single', 'multiple'].includes(type)\"\n v-model=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event: any) => setCorrect(item, event)\"\n >\n 支持选项 \n </el-checkbox>\n <el-icon class=\"icon\">\n <CirclePlus\n :class=\"[{ disabled: isSave }]\"\n @click=\"addAnswer\"\n />\n </el-icon>\n <el-icon class=\"icon\">\n <Remove\n :class=\"[{ disabled: answers.length < 3 || isSave }]\"\n @click=\"deleteAnswer(index)\"\n />\n </el-icon>\n <el-link\n v-if=\"examAnswerRelationType === 1\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"onOpenResult(index)\"\n >\n <span>{{ item.resultItem ? '编辑结果' : '添加结果' }}</span>\n </el-link>\n <el-link\n v-if=\"examAnswerRelationType === 2\"\n type=\"primary\"\n class=\"margin-left-10\"\n @click=\"setRelation(item)\"\n >\n <span>{{ item.answerRelations?.length ? `关联了${item.answerRelations?.length}项` : '关联检查' }}</span>\n </el-link>\n </div>\n </div>\n <div v-if=\"type === 'sort'\" class=\"margin-bottom flex flex-items-center\">\n <div class=\"label flex flex-justify-end\">\n <span>排序答案:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-select\n v-model=\"orderList\"\n mode=\"multiple\"\n style=\"width: 360px;\"\n placeholder=\"请按顺序选择排序答案\"\n :show-arrow=\"true\"\n >\n <!-- :options=\"[...Array(answers.length)].map((_, i) => ({ value: String.fromCharCode(65 + i) }))\" -->\n <el-option\n v-for=\"(item, index) in answers\"\n :key=\"index\"\n :label=\"item.title\"\n :value=\"String.fromCharCode(65 + index)\"\n />\n </el-select>\n </div>\n </div>\n <div\n v-if=\"showAnalysis\"\n class=\"flex\"\n >\n <div class=\"label flex flex-justify-center\">\n <span>解析:</span>\n </div>\n <div style=\"flex: 1;\">\n <el-input\n v-model=\"analysis\"\n type=\"textarea\"\n :rows=\"2\"\n placeholder=\"请输入题目解析\"\n />\n </div>\n </div>\n <div v-if=\"showRichText\" class=\"margin-bottom flex\">\n <div class=\"label flex flex-justify-center\">\n <span>富文本:</span>\n </div>\n <div style=\"flex: 1;\">\n <TinyMceEditor v-model:model-value=\"richText\" v-bind=\"attrs\" style=\"width: 100%;\" />\n <div class=\"flex flex-justify-end\">\n <el-link\n type=\"danger\"\n @click=\"deleteRichText\"\n >\n 删除富文本\n </el-link>\n </div>\n </div>\n </div>\n </template>\n <SubjectAction\n v-if=\"showAction\"\n :is-edit=\"isEdit\"\n :is-set=\"isSet\"\n :isKey=\"isKey\"\n :examAnswerRelationType=\"props.examAnswerRelationType\"\n :answerCheckType=\"answerCheckType\"\n @move-up=\"emits('move', 'up')\"\n @move-down=\"emits('move', 'down')\"\n @delete=\"emits('delete')\"\n @save=\"save\"\n @edit=\"emits('edit')\"\n @add=\"add\"\n @onShowRichText=\"showRichText = true\"\n @setKey=\"setKey\"\n @setAnswerSetting=\"setAnswerSetting\"\n />\n </SubjectLayout>\n <el-dialog\n v-model=\"showRichContent\"\n title=\"添加结果\"\n class=\"customize-dialog\"\n >\n <TinyMceEditor\n :key=\"answersIndex\"\n v-model:model-value=\"(answers[answersIndex].resultItem as string)\" \n v-bind=\"attrs\"\n style=\"width: 100%;\" />\n <template #footer>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onCloseResult\"\n >\n 取消\n </el-button>\n <el-button\n class=\"customize-button\"\n type=\"primary\"\n plain\n @click=\"onSaveResult\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":["props","__props","emits","__emit","attrs","useAttrs","answersIndex","ref","isKey","answerCheckType","answers","title","isCorrect","leastAnswerCount","analysis","showRichText","richText","startTime","showRichContent","resultItem","titlePlaceholder","computed","type","orderList","leastAnswerOptions","items","count","value","length","push","label","reverse","addAnswer","isSave","customAnswerId","setGuid","deleteRichText","save","ElMessage","error","msg","isSetCorrectAnswer","examAnswerRelationType","correctAnswerCount","forEach","v","i","String","fromCharCode","answerRelations","Set","map","item","size","index","orderIndex","examExpand","charCodeAt","join","examRichTextContent","onCloseResult","onSaveResult","setKey","key","setAnswerSetting","add","canSet","watch","isEdit","Date","getTime","ns","useNamespace","onMounted","answerList","examAnswerId","correctAnswerIdList","split","id","answer","find","answerId","toString","filter","Boolean","it","event","splice","examId","customId"],"mappings":"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"}
|