@qxs-bns/components 0.0.16 → 0.0.18
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/index.js +0 -1
- package/es/index.js.map +1 -1
- package/es/package.json.js +1 -1
- package/es/src/components.js +0 -1
- package/es/src/components.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/es/src/subject-list/src/subject-list.vue.js +32 -10
- package/es/src/subject-list/src/subject-list.vue.js.map +1 -1
- package/lib/index.js +18 -20
- package/lib/index.js.map +1 -1
- package/lib/package.json.js +1 -1
- package/lib/src/components.js +18 -20
- package/lib/src/components.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/lib/src/subject-list/src/subject-list.vue.js +32 -10
- package/lib/src/subject-list/src/subject-list.vue.js.map +1 -1
- package/package.json +10 -4
- package/types/index.d.ts +6 -0
- package/types/index.d.ts.map +1 -0
- package/types/src/base/style/css.d.ts +2 -0
- package/types/src/base/style/css.d.ts.map +1 -0
- package/types/src/base/style/index.d.ts +2 -0
- package/types/src/base/style/index.d.ts.map +1 -0
- package/types/src/components.d.ts +10 -0
- package/types/src/components.d.ts.map +1 -0
- package/types/src/data-chart/index.d.ts +4 -0
- package/types/src/data-chart/index.d.ts.map +1 -0
- package/types/src/data-chart/src/analyze.d.ts +23 -0
- package/types/src/data-chart/src/analyze.d.ts.map +1 -0
- package/types/src/data-chart/src/utils/config.d.ts +41 -0
- package/types/src/data-chart/src/utils/config.d.ts.map +1 -0
- package/types/src/data-chart/src/utils/injectionKeys.d.ts +3 -0
- package/types/src/data-chart/src/utils/injectionKeys.d.ts.map +1 -0
- package/types/src/data-chart/src/utils/useCharts.d.ts +16 -0
- package/types/src/data-chart/src/utils/useCharts.d.ts.map +1 -0
- package/types/src/data-chart/style/index.d.ts +3 -0
- package/types/src/data-chart/style/index.d.ts.map +1 -0
- package/types/src/defaults.d.ts +6 -0
- package/types/src/defaults.d.ts.map +1 -0
- package/types/src/file-upload/index.d.ts +4 -0
- package/types/src/file-upload/index.d.ts.map +1 -0
- package/types/src/file-upload/style/index.d.ts +3 -0
- package/types/src/file-upload/style/index.d.ts.map +1 -0
- package/types/src/fixed-action-bar/index.d.ts +4 -0
- package/types/src/fixed-action-bar/index.d.ts.map +1 -0
- package/types/src/fixed-action-bar/style/index.d.ts +3 -0
- package/types/src/fixed-action-bar/style/index.d.ts.map +1 -0
- package/types/src/image-upload/index.d.ts +4 -0
- package/types/src/image-upload/index.d.ts.map +1 -0
- package/types/src/image-upload/style/index.d.ts +3 -0
- package/types/src/image-upload/style/index.d.ts.map +1 -0
- package/types/src/make-installer.d.ts +9 -0
- package/types/src/make-installer.d.ts.map +1 -0
- package/types/src/photo-crop-tool/index.d.ts +4 -0
- package/types/src/photo-crop-tool/index.d.ts.map +1 -0
- package/types/src/photo-crop-tool/src/composables.d.ts +7 -0
- package/types/src/photo-crop-tool/src/composables.d.ts.map +1 -0
- package/types/src/photo-crop-tool/style/index.d.ts +3 -0
- package/types/src/photo-crop-tool/style/index.d.ts.map +1 -0
- package/types/src/subject-action/index.d.ts +4 -0
- package/types/src/subject-action/index.d.ts.map +1 -0
- package/types/src/subject-action/style/index.d.ts +3 -0
- package/types/src/subject-action/style/index.d.ts.map +1 -0
- package/types/src/subject-layout/index.d.ts +4 -0
- package/types/src/subject-layout/index.d.ts.map +1 -0
- package/types/src/subject-layout/style/index.d.ts +3 -0
- package/types/src/subject-layout/style/index.d.ts.map +1 -0
- package/types/src/subject-list/index.d.ts +4 -0
- package/types/src/subject-list/index.d.ts.map +1 -0
- package/types/src/subject-list/style/index.d.ts +3 -0
- package/types/src/subject-list/style/index.d.ts.map +1 -0
- package/types/src/subject-type/index.d.ts +4 -0
- package/types/src/subject-type/index.d.ts.map +1 -0
- package/types/src/subject-type/style/index.d.ts +3 -0
- package/types/src/subject-type/style/index.d.ts.map +1 -0
- package/types/src/tiny-mce-editor/index.d.ts +4 -0
- package/types/src/tiny-mce-editor/index.d.ts.map +1 -0
- package/types/src/tiny-mce-editor/style/index.d.ts +3 -0
- package/types/src/tiny-mce-editor/style/index.d.ts.map +1 -0
- package/types/src/withInstall.d.ts +4 -0
- package/types/src/withInstall.d.ts.map +1 -0
- package/types/tsconfig.tsbuildinfo +1 -0
- package/es/_virtual/_plugin-vue_export-helper.js +0 -10
- package/es/_virtual/_plugin-vue_export-helper.js.map +0 -1
- package/es/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +0 -27
- package/es/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +0 -1
- package/es/src/data-chart/index.js +0 -7
- package/es/src/data-chart/index.js.map +0 -1
- package/es/src/data-chart/src/data-chart.vue.js +0 -8
- package/es/src/data-chart/src/data-chart.vue.js.map +0 -1
- package/es/src/data-chart/src/data-chart.vue2.js +0 -108
- package/es/src/data-chart/src/data-chart.vue2.js.map +0 -1
- package/es/src/data-chart/src/data-chart.vue3.js +0 -7
- package/es/src/data-chart/src/data-chart.vue3.js.map +0 -1
- package/es/src/data-chart/src/utils/config.js +0 -380
- package/es/src/data-chart/src/utils/config.js.map +0 -1
- package/es/src/data-chart/src/utils/injectionKeys.js +0 -4
- package/es/src/data-chart/src/utils/injectionKeys.js.map +0 -1
- package/es/src/data-chart/src/utils/useCharts.js +0 -23
- package/es/src/data-chart/src/utils/useCharts.js.map +0 -1
- package/lib/_virtual/_plugin-vue_export-helper.js +0 -14
- package/lib/_virtual/_plugin-vue_export-helper.js.map +0 -1
- package/lib/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +0 -31
- package/lib/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +0 -1
- package/lib/src/data-chart/index.js +0 -12
- package/lib/src/data-chart/index.js.map +0 -1
- package/lib/src/data-chart/src/data-chart.vue.js +0 -12
- package/lib/src/data-chart/src/data-chart.vue.js.map +0 -1
- package/lib/src/data-chart/src/data-chart.vue2.js +0 -112
- package/lib/src/data-chart/src/data-chart.vue2.js.map +0 -1
- package/lib/src/data-chart/src/data-chart.vue3.js +0 -11
- package/lib/src/data-chart/src/data-chart.vue3.js.map +0 -1
- package/lib/src/data-chart/src/utils/config.js +0 -384
- package/lib/src/data-chart/src/utils/config.js.map +0 -1
- package/lib/src/data-chart/src/utils/injectionKeys.js +0 -6
- package/lib/src/data-chart/src/utils/injectionKeys.js.map +0 -1
- package/lib/src/data-chart/src/utils/useCharts.js +0 -25
- package/lib/src/data-chart/src/utils/useCharts.js.map +0 -1
package/es/index.js
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
import installer from './src/defaults.js';
|
2
|
-
export { QxsDataChart } from './src/data-chart/index.js';
|
3
2
|
export { QxsFileUpload } from './src/file-upload/index.js';
|
4
3
|
export { QxsFixedActionBar } from './src/fixed-action-bar/index.js';
|
5
4
|
export { QxsImageUpload } from './src/image-upload/index.js';
|
package/es/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../packages/components/index.ts"],"sourcesContent":["import installer from './src/defaults'\n\nexport * from './src/components'\n\nexport const install = installer.install\nexport const version = installer.version\nexport default installer\n"],"names":["install","installer","version"],"mappings":"
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../packages/components/index.ts"],"sourcesContent":["import installer from './src/defaults'\n\nexport * from './src/components'\n\nexport const install = installer.install\nexport const version = installer.version\nexport default installer\n"],"names":["install","installer","version"],"mappings":";;;;;;;;;;;AAIaA,MAAAA,UAAUC,SAAU,CAAAD;AACpBE,MAAAA,UAAUD,SAAU,CAAAC;;;;"}
|
package/es/package.json.js
CHANGED
package/es/src/components.js
CHANGED
package/es/src/components.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
@@ -136,7 +136,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
136
136
|
}
|
137
137
|
}
|
138
138
|
function setRelation(item) {
|
139
|
-
emits("setRelation", props.id, item
|
139
|
+
emits("setRelation", props.id, item);
|
140
140
|
}
|
141
141
|
function deleteRichText() {
|
142
142
|
showRichText.value = false;
|
@@ -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'\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 id?: string\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(false)\nconst answerCheckType = ref(2)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: 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}, {\n title: '',\n isCorrect: false,\n\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})\n\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\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}\n\nfunction setRelation(item: any) {\n emits('setRelation', props.id, item.answerId)\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\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList\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(i: number) {\n answers.value[i].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)\">({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})</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 </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: 120px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n >\n {{ item.label }}\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 :value=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event) => 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 v-model:model-value=\"resultItem\" v-bind=\"attrs\" 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(answersIndex)\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":[],"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'\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 id?: string\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(false)\nconst answerCheckType = ref(2)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: 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}, {\n title: '',\n isCorrect: false,\n\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})\n\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\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}\n\nfunction setRelation(item: any) {\n emits('setRelation', props.id, 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\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList\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(i: number) {\n answers.value[i].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)\">({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})</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 </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: 120px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n >\n {{ item.label }}\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 :value=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event) => 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 v-model:model-value=\"resultItem\" v-bind=\"attrs\" 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(answersIndex)\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAA,MAAM,KAAQ,GAAA,OAAA;AAiBd,IAAA,MAAM,KAAQ,GAAA,MAAA;AAEd,IAAA,MAAM,QAAQ,QAAS,EAAA;AAEvB,IAAM,MAAA,YAAA,GAAe,IAAI,CAAC,CAAA;AAC1B,IAAM,MAAA,KAAA,GAAQ,IAAI,KAAK,CAAA;AACvB,IAAM,MAAA,eAAA,GAAkB,IAAI,CAAC,CAAA;AAC7B,IAAM,MAAA,OAAA,GAAU,IAYX,CAAC;AAAA,MACJ,KAAO,EAAA,EAAA;AAAA,MACP,SAAW,EAAA;AAAA,KACV,EAAA;AAAA,MACD,KAAO,EAAA,EAAA;AAAA,MACP,SAAW,EAAA;AAAA,KAEV,EAAA;AAAA,MACD,KAAO,EAAA,EAAA;AAAA,MACP,SAAW,EAAA;AAAA,KAEV,EAAA;AAAA,MACD,KAAO,EAAA,EAAA;AAAA,MACP,SAAW,EAAA;AAAA,KACZ,CAAC,CAAA;AAEF,IAAA,MAAM,mBAAmB,GAAI,EAAA;AAC7B,IAAM,MAAA,KAAA,GAAQ,IAAI,EAAE,CAAA;AACpB,IAAM,MAAA,QAAA,GAAW,IAAI,EAAE,CAAA;AACvB,IAAM,MAAA,YAAA,GAAe,IAAI,KAAK,CAAA;AAC9B,IAAM,MAAA,QAAA,GAAW,IAAI,EAAE,CAAA;AACvB,IAAM,MAAA,SAAA,GAAY,IAAI,CAAC,CAAA;AACvB,IAAM,MAAA,eAAA,GAAkB,IAAI,KAAK,CAAA;AACjC,IAAM,MAAA,UAAA,GAAa,IAAY,EAAE,CAAA;AACjC,IAAM,MAAA,gBAAA,GAAmB,SAAS,MAAM;AACtC,MAAI,IAAA,KAAA,CAAM,SAAS,QAAU,EAAA;AAC3B,QAAO,OAAA,oBAAA;AAAA,OACT,MAAA,IACS,KAAM,CAAA,IAAA,KAAS,UAAY,EAAA;AAClC,QAAO,OAAA,oBAAA;AAAA,OAEJ,MAAA;AACH,QAAO,OAAA,oBAAA;AAAA;AACT,KACD,CAAA;AAED,IAAM,MAAA,SAAA,GAAY,GAAc,CAAA,EAAE,CAAA;AAElC,IAAM,MAAA,kBAAA,GAAqB,SAAS,MAAM;AACxC,MAAA,MAAM,QAAQ,EAAC;AACf,MAAM,MAAA,MAAA,GAAS,QAAQ,KAAM,CAAA,MAAA;AAC7B,MAAA,KAAA,IAAS,KAAQ,GAAA,MAAA,EAAQ,KAAQ,GAAA,CAAA,EAAG,KAAS,EAAA,EAAA;AAC3C,QAAA,KAAA,CAAM,IAAK,CAAA;AAAA,UACT,KAAA,EAAO,2BAAO,KAAK,CAAA,MAAA,CAAA;AAAA,UACnB,KAAO,EAAA;AAAA,SACR,CAAA;AAAA;AAEH,MAAA,OAAO,MAAM,OAAQ,EAAA;AAAA,KACtB,CAAA;AAED,IAAA,SAAS,SAAY,GAAA;AACnB,MAAA,IAAI,MAAM,MAAQ,EAAA;AAChB,QAAA;AAAA;AAEF,MAAA,OAAA,CAAQ,MAAM,IAAK,CAAA;AAAA,QACjB,KAAO,EAAA,EAAA;AAAA,QACP,SAAW,EAAA;AAAA,OACZ,CAAA;AAAA;AAGH,IAAA,SAAS,aAAa,KAAe,EAAA;AACnC,MAAA,IAAI,OAAQ,CAAA,KAAA,CAAM,MAAS,GAAA,CAAA,IAAK,MAAM,MAAQ,EAAA;AAC5C,QAAA;AAAA;AAEF,MAAQ,OAAA,CAAA,KAAA,CAAM,MAAO,CAAA,KAAA,EAAO,CAAC,CAAA;AAAA;AAG/B,IAAS,SAAA,UAAA,CAAW,IAAS,KAAY,EAAA;AACvC,MAAI,IAAA,KAAA,CAAM,SAAS,QAAU,EAAA;AAE3B,QAAA,IAAI,KAAO,EAAA;AACT,UAAQ,OAAA,CAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,MAAW,KAAA;AAChC,YAAA,IAAI,WAAW,EAAI,EAAA;AACjB,cAAA,MAAA,CAAO,SAAY,GAAA,KAAA;AAAA;AACrB,WACD,CAAA;AAAA;AAEH,QAAA,EAAA,CAAG,SAAY,GAAA,KAAA;AAAA,OACjB,MAAA,IAAW,KAAM,CAAA,IAAA,KAAS,UAAY,EAAA;AAEpC,QAAA,EAAA,CAAG,SAAY,GAAA,KAAA;AAAA;AACjB;AAGF,IAAA,SAAS,YAAY,IAAW,EAAA;AAC9B,MAAM,KAAA,CAAA,aAAA,EAAe,KAAM,CAAA,EAAA,EAAI,IAAI,CAAA;AAAA;AAGrC,IAAA,SAAS,cAAiB,GAAA;AACxB,MAAA,YAAA,CAAa,KAAQ,GAAA,KAAA;AACrB,MAAA,QAAA,CAAS,KAAQ,GAAA,EAAA;AAAA;AAGnB,IAAA,SAAS,IAAO,GAAA;AACd,MAAI,IAAA,CAAC,MAAM,KAAO,EAAA;AAChB,QAAA,SAAA,CAAU,MAAM,mDAAW,CAAA;AAC3B,QAAA;AAAA;AAEF,MAAA,IAAI,GAAM,GAAA,EAAA;AACV,MAAA,IAAI,kBAAqB,GAAA,KAAA;AACzB,MAAA,IAAI,sBAAyB,GAAA,IAAA;AAC7B,MAAA,IAAI,kBAAqB,GAAA,CAAA;AACzB,MAAA,IAAI,KAAM,CAAA,IAAA,KAAS,UAAc,IAAA,KAAA,CAAM,SAAS,QAAU,EAAA;AACxD,QAAA,OAAA,CAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA,EAAQ,CAAc,KAAA;AAC3C,UAAI,IAAA,CAAC,EAAE,KAAO,EAAA;AACZ,YAAA,GAAA,IAAO,CAAK,YAAA,EAAA,MAAA,CAAO,YAAa,CAAA,EAAA,GAAK,CAAC,CAAC,CAAA,wBAAA,CAAA;AAAA;AAEzC,UAAA,IAAI,EAAE,SAAW,EAAA;AACf,YAAqB,kBAAA,GAAA,IAAA;AACrB,YAAA,kBAAA,EAAA;AAAA;AAEF,UAAA,IAAI,EAAE,UAAY,EAAA;AAChB,YAAyB,sBAAA,GAAA,CAAA;AAAA;AAE3B,UAAI,IAAA,CAAA,CAAE,iBAAiB,MAAQ,EAAA;AAC7B,YAAyB,sBAAA,GAAA,CAAA;AAAA;AAC3B,SACD,CAAA;AAAA,OACH,MAAA,IACS,KAAM,CAAA,IAAA,KAAS,MAAQ,EAAA;AAE9B,QAAI,IAAA,SAAA,CAAU,MAAM,MAAQ,EAAA;AAC1B,UAAqB,kBAAA,GAAA,IAAA;AAAA;AACvB;AAEF,MAAA,IAAI,GAAK,EAAA;AACP,QAAA,SAAA,CAAU,MAAM,GAAG,CAAA;AACnB,QAAA;AAAA;AAGF,MAAM,MAAA,YAAA,GAAe,IAAI,GAAA,CAAI,OAAQ,CAAA,KAAA,CAAM,IAAI,CAAC,IAAA,KAAc,IAAK,CAAA,KAAK,CAAC,CAAA;AAEzE,MAAA,IAAI,YAAa,CAAA,IAAA,KAAS,OAAQ,CAAA,KAAA,CAAM,MAAQ,EAAA;AAC9C,QAAA,SAAA,CAAU,MAAM,sCAAQ,CAAA;AACxB,QAAA;AAAA;AAGF,MAAI,IAAA,KAAA,CAAM,SAAS,UAAY,EAAA;AAC7B,QAAA,IAAI,uBAAuB,CAAG,EAAA;AAC5B,UAAA,SAAA,CAAU,MAAM,oEAAa,CAAA;AAC7B,UAAA;AAAA;AAGF,QAAI,IAAA,kBAAA,IAAsB,kBAAqB,GAAA,gBAAA,CAAiB,KAAO,EAAA;AACrE,UAAA,SAAA,CAAU,MAAM,gFAAe,CAAA;AAC/B,UAAA;AAAA;AACF;AAGF,MAAA,KAAA,CAAM,MAAQ,EAAA;AAAA,QACZ,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,SAAS,OAAQ,CAAA,KAAA,CAAM,GAAI,CAAA,CAAC,MAAW,KAAkB,KAAA;AACvD,UAAA,OAAO,EAAE,GAAG,IAAM,EAAA,UAAA,EAAY,QAAQ,CAAE,EAAA;AAAA,SACzC,CAAA;AAAA,QACD,UAAY,EAAA,SAAA,CAAU,KAAM,CAAA,GAAA,CAAI,CAAC,CAAc,KAAA,CAAA,CAAE,UAAW,CAAA,CAAC,CAAI,GAAA,EAAA,GAAK,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,QACjF,UAAU,QAAS,CAAA,KAAA;AAAA,QACnB,kBAAA;AAAA,QACA,kBAAkB,gBAAiB,CAAA,KAAA;AAAA,QACnC,mBAAqB,EAAA,YAAA,CAAa,KAAQ,GAAA,QAAA,CAAS,KAAQ,GAAA,EAAA;AAAA,QAC3D,sBAAA;AAAA,QACA,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,iBAAiB,eAAgB,CAAA;AAAA,OAClC,CAAA;AAAA;AAGH,IAAA,SAAS,IAAO,GAAA;AACd,MAAA,IAAI,MAAM,KAAO,EAAA;AACf,QAAA,KAAA,CAAM,QAAQ,KAAM,CAAA,KAAA;AAAA;AAGtB,MAAA,IAAI,KAAM,CAAA,UAAA,IAAc,KAAM,CAAA,UAAA,CAAW,MAAQ,EAAA;AAC/C,QAAA,OAAA,CAAQ,QAAQ,KAAM,CAAA,UAAA;AAAA;AAExB,MAAA,IAAI,MAAM,gBAAkB,EAAA;AAC1B,QAAA,gBAAA,CAAiB,QAAQ,KAAM,CAAA,gBAAA;AAAA;AAGjC,MAAA,IAAI,MAAM,UAAY,EAAA;AAEpB,QAAA,IAAI,MAAM,UAAY,EAAA;AACpB,UAAA,MAAM,mBAAsB,GAAA,KAAA,CAAM,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA;AAGtD,UAAA,SAAA,CAAU,KAAQ,GAAA,mBAAA,CAAoB,GAAI,CAAA,CAAC,EAAe,KAAA;AACxD,YAAM,MAAA,MAAA,GAAS,KAAM,CAAA,UAAA,CAAW,IAAK,CAAA,CAAC,SAAc,IAAK,CAAA,QAAA,EAAU,QAAS,EAAA,KAAM,EAAE,CAAA;AACpF,YAAA,OAAO,SAAS,MAAO,CAAA,YAAA,CAAa,KAAK,MAAO,CAAA,UAAA,GAAa,CAAC,CAAI,GAAA,EAAA;AAAA,WACnE,CAAE,CAAA,MAAA,CAAO,OAAO,CAAA;AAAA;AACnB;AAGF,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,QAAA,CAAS,QAAQ,KAAM,CAAA,QAAA;AAAA;AAGzB,MAAA,IAAI,MAAM,mBAAqB,EAAA;AAC7B,QAAA,QAAA,CAAS,QAAQ,KAAM,CAAA,mBAAA;AACvB,QAAA,YAAA,CAAa,KAAQ,GAAA,IAAA;AAAA;AACvB;AAGF,IAAA,SAAS,aAAgB,GAAA;AACvB,MAAA,eAAA,CAAgB,KAAQ,GAAA,KAAA;AACxB,MAAA,UAAA,CAAW,KAAQ,GAAA,EAAA;AAAA;AAGrB,IAAA,SAAS,aAAa,CAAW,EAAA;AAC/B,MAAA,YAAA,CAAa,KAAQ,GAAA,CAAA;AACrB,MAAA,OAAA,CAAQ,IAAI,OAAQ,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,YAAY,CAAC,CAAA;AAC1C,MAAA,UAAA,CAAW,KAAQ,GAAA,OAAA,CAAQ,KAAM,CAAA,CAAC,EAAE,UAAc,IAAA,EAAA;AAClD,MAAA,eAAA,CAAgB,KAAQ,GAAA,IAAA;AAAA;AAG1B,IAAA,SAAS,aAAa,CAAW,EAAA;AAC/B,MAAA,OAAA,CAAQ,KAAM,CAAA,CAAC,CAAE,CAAA,UAAA,GAAa,WAAW,KAAS,IAAA,EAAA;AAClD,MAAA,eAAA,CAAgB,KAAQ,GAAA,KAAA;AAAA;AAG1B,IAAA,SAAS,OAAO,GAAc,EAAA;AAC5B,MAAA,KAAA,CAAM,KAAQ,GAAA,GAAA;AAAA;AAGhB,IAAA,SAAS,iBAAiB,IAAc,EAAA;AACtC,MAAA,eAAA,CAAgB,KAAQ,GAAA,IAAA;AAAA;AAG1B,IAAS,SAAA,GAAA,CAAI,MAAc,MAAiB,EAAA;AACxC,MAAA,KAAA,CAAM,KAAO,EAAA,IAAA,EAAM,MAAQ,GAAA,KAAA,CAAM,yBAAwB,IAAI,CAAA;AAAA;AAGjE,IAAM,KAAA,CAAA,MAAM,KAAM,CAAA,MAAA,EAAQ,MAAM;AAC9B,MAAA,IAAI,MAAM,MAAQ,EAAA;AAChB,QAAA,SAAA,CAAU,KAAQ,GAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,OAAQ,EAAA;AAAA;AACvC,KACD,CAAA;AACD,IAAM,MAAA,EAAA,GAAK,aAAa,gBAAgB,CAAA;AAExC,IAAA,SAAA,CAAU,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
@@ -26,7 +26,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
26
26
|
addSubject,
|
27
27
|
currentList,
|
28
28
|
uploadExcel,
|
29
|
-
addExam
|
29
|
+
addExam,
|
30
|
+
setAnswerRelation
|
30
31
|
});
|
31
32
|
function totalPageIndex() {
|
32
33
|
let totalPageIndex2 = 0;
|
@@ -79,9 +80,22 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
79
80
|
});
|
80
81
|
}
|
81
82
|
}
|
83
|
+
function setAnswerRelation(answerRelations, examId, examAnswerId) {
|
84
|
+
if (answerRelations.length) {
|
85
|
+
currentList.value.forEach((c) => {
|
86
|
+
if (c.examId === examId) {
|
87
|
+
c.answer.forEach((c2) => {
|
88
|
+
if (c2.examAnswerId === examAnswerId) {
|
89
|
+
c2.answerRelations = answerRelations;
|
90
|
+
}
|
91
|
+
});
|
92
|
+
}
|
93
|
+
});
|
94
|
+
}
|
95
|
+
}
|
82
96
|
function addExam(item) {
|
83
97
|
const answerList = [];
|
84
|
-
item.
|
98
|
+
item.answers?.map((v) => {
|
85
99
|
answerList.push({
|
86
100
|
...v,
|
87
101
|
title: v.answer,
|
@@ -92,7 +106,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
92
106
|
...item,
|
93
107
|
examId: "",
|
94
108
|
answerType: item.richTextContent ? "rich_text" : item.examTypeEnum,
|
95
|
-
|
109
|
+
answers: answerList,
|
96
110
|
isSave: false,
|
97
111
|
isEdit: true,
|
98
112
|
isRealCanDel: true,
|
@@ -126,8 +140,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
126
140
|
currentList.value.splice(index, 1);
|
127
141
|
ElMessage.success("\u5220\u9664\u6210\u529F");
|
128
142
|
}
|
129
|
-
function setRelation(examId,
|
130
|
-
emits("setRelation", examId,
|
143
|
+
function setRelation(examId, examAnswers) {
|
144
|
+
emits("setRelation", examId, examAnswers);
|
131
145
|
}
|
132
146
|
watch(() => props.subjectList, (newList) => {
|
133
147
|
if (newList) {
|
@@ -167,8 +181,10 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
167
181
|
onSave: (item2) => saveSubject(index, item2),
|
168
182
|
onEdit: ($event) => item.isEdit = true,
|
169
183
|
onAdd: (type, examAnswerRelationType) => addSubject(type, index, examAnswerRelationType)
|
170
|
-
}), null, 16, ["order-index", "title", "type", "is-save", "id", "is-set", "answer-list", "analysis", "least-answer-count", "is-edit", "show-action", "exam-expand", "exam-rich-text-content", "examAnswerRelationType", "onMove", "onDelete", "onSave", "onEdit", "onAdd"])) : item.answerType === "scale" ? (openBlock(), createBlock(_sfc_main$2, {
|
184
|
+
}), null, 16, ["order-index", "title", "type", "is-save", "id", "is-set", "answer-list", "analysis", "least-answer-count", "is-edit", "show-action", "exam-expand", "exam-rich-text-content", "examAnswerRelationType", "onMove", "onDelete", "onSave", "onEdit", "onAdd"])) : item.answerType === "scale" ? (openBlock(), createBlock(_sfc_main$2, mergeProps({
|
171
185
|
key: 1,
|
186
|
+
ref_for: true
|
187
|
+
}, unref(attrs), {
|
172
188
|
"order-index": index,
|
173
189
|
title: item.title,
|
174
190
|
"is-save": !item.isRealCanDel,
|
@@ -185,8 +201,10 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
185
201
|
onSave: (item2) => saveSubject(index, item2),
|
186
202
|
onEdit: ($event) => item.isEdit = true,
|
187
203
|
onAdd: (type) => addSubject(type, index, null)
|
188
|
-
}, null,
|
204
|
+
}), null, 16, ["order-index", "title", "is-save", "is-set", "answer-list", "analysis", "is-edit", "scale-question-list", "show-action", "exam-rich-text-content", "examAnswerRelationType", "onMove", "onDelete", "onSave", "onEdit", "onAdd"])) : item.answerType === "blank_fill" ? (openBlock(), createBlock(_sfc_main$3, mergeProps({
|
189
205
|
key: 2,
|
206
|
+
ref_for: true
|
207
|
+
}, unref(attrs), {
|
190
208
|
"order-index": index,
|
191
209
|
title: item.title,
|
192
210
|
"is-save": !item.isRealCanDel,
|
@@ -203,8 +221,10 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
203
221
|
onSave: (item2) => saveSubject(index, item2),
|
204
222
|
onEdit: ($event) => item.isEdit = true,
|
205
223
|
onAdd: (type) => addSubject(type, index, null)
|
206
|
-
}, null,
|
224
|
+
}), null, 16, ["order-index", "title", "is-save", "is-set", "answer-list", "analysis", "show-action", "is-edit", "exam-answer-setting-v-o", "exam-rich-text-content", "examAnswerRelationType", "onMove", "onDelete", "onSave", "onEdit", "onAdd"])) : item.answerType === "text_fill" ? (openBlock(), createBlock(_sfc_main$4, mergeProps({
|
207
225
|
key: 3,
|
226
|
+
ref_for: true
|
227
|
+
}, unref(attrs), {
|
208
228
|
"order-index": index,
|
209
229
|
title: item.title,
|
210
230
|
"is-save": !item.isRealCanDel,
|
@@ -222,8 +242,10 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
222
242
|
onSave: (item2) => saveSubject(index, item2),
|
223
243
|
onEdit: ($event) => item.isEdit = true,
|
224
244
|
onAdd: (type) => addSubject(type, index, null)
|
225
|
-
}, null,
|
245
|
+
}), null, 16, ["order-index", "title", "is-save", "is-set", "answer-list", "analysis", "show-action", "is-edit", "exam-expand", "exam-answer-setting-v-o", "examAnswerRelationType", "exam-rich-text-content", "onMove", "onDelete", "onSave", "onEdit", "onAdd"])) : item.answerType === "rich_text" ? (openBlock(), createBlock(_sfc_main$5, mergeProps({
|
226
246
|
key: 4,
|
247
|
+
ref_for: true
|
248
|
+
}, unref(attrs), {
|
227
249
|
"order-index": index,
|
228
250
|
richTextContent: item.richTextContent,
|
229
251
|
"is-set": item.hasSet || false,
|
@@ -236,7 +258,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
236
258
|
onSave: (item2) => saveSubject(index, item2),
|
237
259
|
onEdit: ($event) => item.isEdit = true,
|
238
260
|
onAdd: (type) => addSubject(type, index, null)
|
239
|
-
}, null,
|
261
|
+
}), null, 16, ["order-index", "richTextContent", "is-set", "is-save", "is-edit", "show-action", "onMove", "onDelete", "examAnswerRelationType", "onSave", "onEdit", "onAdd"])) : item.answerType === "page_end" ? (openBlock(), createBlock(_sfc_main$6, {
|
240
262
|
key: 5,
|
241
263
|
"total-page": totalPageIndex(),
|
242
264
|
"current-page-index": currentPageIndex()(item.id),
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"subject-list.vue.js","sources":["../../../../../../packages/components/src/subject-list/src/subject-list.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// import isEqual from 'lodash/isEqual'\nimport SubjectBlankFill from './components/subject-blank-fill.vue'\nimport SubjectScale from './components/subject-scale.vue'\nimport SubjectSingle from './components/subject-single.vue'\nimport SubjectTextFill from './components/subject-text-fill.vue'\nimport SubjectRichText from './components/SubjectRichText.vue'\nimport SubjectPageEnd from './components/SubjectPageEnd.vue'\n\ndefineOptions({\n name: 'QxsSubjectList',\n})\n\nconst props = defineProps<{\n subjectList: any[]\n isPreview: boolean\n}>()\nconst currentList = ref([] as any)\nconst emits = defineEmits(['setRelation'])\n\nconst attrs = useAttrs()\n\ndefineExpose({\n addSubject,\n currentList,\n uploadExcel,\n addExam,\n})\n\nfunction totalPageIndex() {\n let totalPageIndex = 0\n let isLastPageIndex = false\n currentList.value.map((v: any, i: number, arr: any) => {\n if (v.answerType === 'page_end') {\n totalPageIndex++\n isLastPageIndex = i === arr.length - 1\n }\n })\n // 假设最后是一个分页器认为是最后一页\n return isLastPageIndex ? totalPageIndex : totalPageIndex + 1\n}\n\nfunction currentPageIndex() {\n return (currentId: any) => {\n const currentPageList = currentList.value.filter(\n (v: any) => v.answerType === 'page_end'\n )\n let currentIndex = 0\n currentPageList.forEach((c: any, i: number) => {\n if (currentId === c.id) {\n currentIndex = i + 1\n }\n })\n return currentIndex\n }\n}\n\nfunction addSubject(type: string, index: number, examAnswerRelationType: number | null) {\n console.log(index, 'index')\n if (index || index === 0) {\n currentList.value.splice(index + 1, 0, {\n answerType: type,\n analysis: '',\n scaleQuestionList: [],\n isSave: false,\n isEdit: true,\n isRealCanDel: true,\n hasSet: false,\n examAnswerRelationType: examAnswerRelationType,\n })\n }\n else {\n currentList.value.push({\n answerType: type,\n analysis: '',\n scaleQuestionList: [],\n isSave: false,\n isEdit: true,\n isRealCanDel: true,\n hasSet: false,\n examAnswerRelationType: examAnswerRelationType,\n })\n }\n}\n\nfunction addExam(item: any) {\n const answerList = []\n item.answer?.map((v: any) => {\n answerList.push({\n ...v,\n title: v.answer,\n answerId: v.examAnswerId,\n })\n })\n currentList.value.push({\n ...item,\n examId: '',\n answerType: item.richTextContent? 'rich_text': item.examTypeEnum,\n answerList: item.answer,\n isSave: false,\n isEdit: true,\n isRealCanDel: true,\n hasSet: false,\n })\n}\n\nfunction uploadExcel(list: any[]) {\n currentList.value = currentList.value.concat(list)\n}\n\nfunction move(index: number, type: 'up' | 'down') {\n if (type === 'up' && index > 0) {\n const [item] = currentList.value.splice(index, 1)\n currentList.value.splice(index - 1, 0, item)\n }\n else if (type === 'down' && index < currentList.value.length - 1) {\n const [item] = currentList.value.splice(index, 1)\n currentList.value.splice(index + 1, 0, item)\n }\n}\n\nfunction saveSubject(index: number, item: any) {\n for (let idx = 0; idx < currentList.value.length; idx++) {\n if (index === idx) {\n currentList.value[index] =\n {\n ...currentList.value[index],\n ...item,\n isEdit: false,\n }\n }\n }\n}\n\nfunction deleteSubject(index: number) {\n currentList.value.splice(index, 1)\n ElMessage.success('删除成功')\n}\n\nfunction setRelation(examId: string, examAnswerId: string) {\n emits('setRelation', examId, examAnswerId)\n}\n\nwatch(() => props.subjectList, (newList: any) => {\n if (newList) {\n currentList.value = [...newList]\n }\n}, { immediate: true })\n</script>\n\n<template>\n <div class=\"subject-list-wrapper\">\n <div v-for=\"(item, index) in currentList\" :key=\"index + item.examId || item.title\">\n <template v-if=\"['single', 'multiple', 'sort'].includes(item.answerType)\">\n <SubjectSingle v-bind=\"attrs\" :order-index=\"index\" :title=\"item.title\" :type=\"item.answerType\" :is-save=\"!item.isRealCanDel\"\n :id=\"item.examId\"\n :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\" :analysis=\"item.analysis\"\n :least-answer-count=\"item.leastAnswerCount\" :is-edit=\"item.isEdit || false\" :show-action=\"!isPreview\"\n :exam-expand=\"item.examExpand\" :exam-rich-text-content=\"item.examRichTextContent\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @setRelation=\"setRelation\"\n @move=\"(type: 'up' | 'down') => move(index, type)\" @delete=\"deleteSubject(index)\"\n @save=\"item => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type, examAnswerRelationType) => addSubject(type, index, examAnswerRelationType)\" />\n </template>\n <SubjectScale v-else-if=\"item.answerType === 'scale'\" :order-index=\"index\" :title=\"item.title\"\n :is-save=\"!item.isRealCanDel\" :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\"\n :analysis=\"item.analysis\" :is-edit=\"item.isEdit || false\" :scale-question-list=\"item.scaleQuestionList\"\n :show-action=\"!isPreview\" :exam-rich-text-content=\"item.examRichTextContent\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectBlankFill v-else-if=\"item.answerType === 'blank_fill'\" :order-index=\"index\" :title=\"item.title\"\n :is-save=\"!item.isRealCanDel\" :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\"\n :analysis=\"item.analysis\" :show-action=\"!isPreview\" :is-edit=\"item.isEdit || false\"\n :exam-answer-setting-v-o=\"item.examAnswerSettingVO || {}\" :exam-rich-text-content=\"item.examRichTextContent\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectTextFill v-else-if=\"item.answerType === 'text_fill'\" :order-index=\"index\" :title=\"item.title\"\n :is-save=\"!item.isRealCanDel\" :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\"\n :analysis=\"item.analysis\" :show-action=\"!isPreview\" :is-edit=\"item.isEdit || false\"\n :exam-expand=\"item.examExpand\" :exam-answer-setting-v-o=\"item.examAnswerSettingVO || {}\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" :exam-rich-text-content=\"item.examRichTextContent\"\n @move=\"(type: 'up' | 'down') => move(index, type)\" @delete=\"deleteSubject(index)\"\n @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectRichText v-else-if=\"item.answerType === 'rich_text'\" :order-index=\"index\"\n :richTextContent=\"item.richTextContent\" :is-set=\"item.hasSet || false\" :is-save=\"!item.isRealCanDel\"\n :is-edit=\"item.isEdit || false\" :show-action=\"!isPreview\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" :examAnswerRelationType=\"item.examAnswerRelationType\"\n @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectPageEnd v-else-if=\"item.answerType === 'page_end'\" :total-page=\"totalPageIndex()\"\n :current-page-index=\"currentPageIndex()(item.id)\" :item=\"item\" :order-index=\"index\"\n :is-edit=\"item.isEdit || false\" :is-set=\"item.hasSet || false\" :is-save=\"!item.isRealCanDel\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n </div>\n </div>\n</template>\n"],"names":["totalPageIndex"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"subject-list.vue.js","sources":["../../../../../../packages/components/src/subject-list/src/subject-list.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// import isEqual from 'lodash/isEqual'\nimport SubjectBlankFill from './components/subject-blank-fill.vue'\nimport SubjectScale from './components/subject-scale.vue'\nimport SubjectSingle from './components/subject-single.vue'\nimport SubjectTextFill from './components/subject-text-fill.vue'\nimport SubjectRichText from './components/SubjectRichText.vue'\nimport SubjectPageEnd from './components/SubjectPageEnd.vue'\n\ndefineOptions({\n name: 'QxsSubjectList',\n})\n\nconst props = defineProps<{\n subjectList: any[]\n isPreview: boolean\n}>()\nconst currentList = ref([] as any)\nconst emits = defineEmits(['setRelation'])\n\nconst attrs = useAttrs()\n\ndefineExpose({\n addSubject,\n currentList,\n uploadExcel,\n addExam,\n setAnswerRelation,\n})\n\nfunction totalPageIndex() {\n let totalPageIndex = 0\n let isLastPageIndex = false\n currentList.value.map((v: any, i: number, arr: any) => {\n if (v.answerType === 'page_end') {\n totalPageIndex++\n isLastPageIndex = i === arr.length - 1\n }\n })\n // 假设最后是一个分页器认为是最后一页\n return isLastPageIndex ? totalPageIndex : totalPageIndex + 1\n}\n\nfunction currentPageIndex() {\n return (currentId: any) => {\n const currentPageList = currentList.value.filter(\n (v: any) => v.answerType === 'page_end'\n )\n let currentIndex = 0\n currentPageList.forEach((c: any, i: number) => {\n if (currentId === c.id) {\n currentIndex = i + 1\n }\n })\n return currentIndex\n }\n}\n\nfunction addSubject(type: string, index: number, examAnswerRelationType: number | null) {\n console.log(index, 'index')\n if (index || index === 0) {\n currentList.value.splice(index + 1, 0, {\n answerType: type,\n analysis: '',\n scaleQuestionList: [],\n isSave: false,\n isEdit: true,\n isRealCanDel: true,\n hasSet: false,\n examAnswerRelationType: examAnswerRelationType,\n })\n }\n else {\n currentList.value.push({\n answerType: type,\n analysis: '',\n scaleQuestionList: [],\n isSave: false,\n isEdit: true,\n isRealCanDel: true,\n hasSet: false,\n examAnswerRelationType: examAnswerRelationType,\n })\n }\n}\n\nfunction setAnswerRelation(answerRelations: any, examId: string, examAnswerId: string, ) {\n // 给examId设置答案关联\n if (answerRelations.length) {\n currentList.value.forEach((c: any) => {\n if (c.examId === examId) {\n c.answer.forEach((c: any) => {\n if (c.examAnswerId === examAnswerId) {\n c.answerRelations = answerRelations\n }\n })\n }\n })\n }\n}\n\nfunction addExam(item: any) {\n const answerList: any[] = []\n item.answers?.map((v: any) => {\n answerList.push({\n ...v,\n title: v.answer,\n answerId: v.examAnswerId,\n })\n })\n currentList.value.push({\n ...item,\n examId: '',\n answerType: item.richTextContent? 'rich_text': item.examTypeEnum,\n answers:answerList,\n isSave: false,\n isEdit: true,\n isRealCanDel: true,\n hasSet: false,\n })\n}\n\nfunction uploadExcel(list: any[]) {\n currentList.value = currentList.value.concat(list)\n}\n\nfunction move(index: number, type: 'up' | 'down') {\n if (type === 'up' && index > 0) {\n const [item] = currentList.value.splice(index, 1)\n currentList.value.splice(index - 1, 0, item)\n }\n else if (type === 'down' && index < currentList.value.length - 1) {\n const [item] = currentList.value.splice(index, 1)\n currentList.value.splice(index + 1, 0, item)\n }\n}\n\nfunction saveSubject(index: number, item: any) {\n for (let idx = 0; idx < currentList.value.length; idx++) {\n if (index === idx) {\n currentList.value[index] =\n {\n ...currentList.value[index],\n ...item,\n isEdit: false,\n }\n }\n }\n}\n\nfunction deleteSubject(index: number) {\n currentList.value.splice(index, 1)\n ElMessage.success('删除成功')\n}\n\nfunction setRelation(examId: string, examAnswers: any) {\n emits('setRelation', examId, examAnswers)\n}\n\nwatch(() => props.subjectList, (newList: any) => {\n if (newList) {\n currentList.value = [...newList]\n }\n}, { immediate: true })\n</script>\n\n<template>\n <div class=\"subject-list-wrapper\">\n <div v-for=\"(item, index) in currentList\" :key=\"index + item.examId || item.title\">\n <template v-if=\"['single', 'multiple', 'sort'].includes(item.answerType)\">\n <SubjectSingle v-bind=\"attrs\" :order-index=\"index\" :title=\"item.title\" :type=\"item.answerType\" :is-save=\"!item.isRealCanDel\"\n :id=\"item.examId\"\n :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\" :analysis=\"item.analysis\"\n :least-answer-count=\"item.leastAnswerCount\" :is-edit=\"item.isEdit || false\" :show-action=\"!isPreview\"\n :exam-expand=\"item.examExpand\" :exam-rich-text-content=\"item.examRichTextContent\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @setRelation=\"setRelation\"\n @move=\"(type: 'up' | 'down') => move(index, type)\" @delete=\"deleteSubject(index)\"\n @save=\"item => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type, examAnswerRelationType) => addSubject(type, index, examAnswerRelationType)\" />\n </template>\n <SubjectScale v-bind=\"attrs\" v-else-if=\"item.answerType === 'scale'\" :order-index=\"index\" :title=\"item.title\"\n :is-save=\"!item.isRealCanDel\" :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\"\n :analysis=\"item.analysis\" :is-edit=\"item.isEdit || false\" :scale-question-list=\"item.scaleQuestionList\"\n :show-action=\"!isPreview\" :exam-rich-text-content=\"item.examRichTextContent\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectBlankFill v-bind=\"attrs\" v-else-if=\"item.answerType === 'blank_fill'\" :order-index=\"index\" :title=\"item.title\"\n :is-save=\"!item.isRealCanDel\" :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\"\n :analysis=\"item.analysis\" :show-action=\"!isPreview\" :is-edit=\"item.isEdit || false\"\n :exam-answer-setting-v-o=\"item.examAnswerSettingVO || {}\" :exam-rich-text-content=\"item.examRichTextContent\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectTextFill v-bind=\"attrs\" v-else-if=\"item.answerType === 'text_fill'\" :order-index=\"index\" :title=\"item.title\"\n :is-save=\"!item.isRealCanDel\" :is-set=\"item.hasSet || false\" :answer-list=\"item.answers\"\n :analysis=\"item.analysis\" :show-action=\"!isPreview\" :is-edit=\"item.isEdit || false\"\n :exam-expand=\"item.examExpand\" :exam-answer-setting-v-o=\"item.examAnswerSettingVO || {}\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" :exam-rich-text-content=\"item.examRichTextContent\"\n @move=\"(type: 'up' | 'down') => move(index, type)\" @delete=\"deleteSubject(index)\"\n @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectRichText \n v-bind=\"attrs\"\n v-else-if=\"item.answerType === 'rich_text'\" :order-index=\"index\"\n :richTextContent=\"item.richTextContent\" :is-set=\"item.hasSet || false\" :is-save=\"!item.isRealCanDel\"\n :is-edit=\"item.isEdit || false\" :show-action=\"!isPreview\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" :examAnswerRelationType=\"item.examAnswerRelationType\"\n @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n <SubjectPageEnd v-else-if=\"item.answerType === 'page_end'\" :total-page=\"totalPageIndex()\"\n :current-page-index=\"currentPageIndex()(item.id)\" :item=\"item\" :order-index=\"index\"\n :is-edit=\"item.isEdit || false\" :is-set=\"item.hasSet || false\" :is-save=\"!item.isRealCanDel\"\n :examAnswerRelationType=\"item.examAnswerRelationType\" @move=\"(type: 'up' | 'down') => move(index, type)\"\n @delete=\"deleteSubject(index)\" @save=\"(item: any) => saveSubject(index, item)\" @edit=\"item.isEdit = true\"\n @add=\"(type: string) => addSubject(type, index, null)\" />\n </div>\n </div>\n</template>\n"],"names":["totalPageIndex","c"],"mappings":"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"}
|
package/lib/index.js
CHANGED
@@ -3,31 +3,29 @@
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
4
4
|
|
5
5
|
var defaults = require('./src/defaults.js');
|
6
|
-
var index = require('./src/
|
7
|
-
var index$1 = require('./src/
|
8
|
-
var index$2 = require('./src/
|
9
|
-
var index$3 = require('./src/
|
10
|
-
var index$4 = require('./src/
|
11
|
-
var index$5 = require('./src/subject-
|
12
|
-
var index$6 = require('./src/subject-
|
13
|
-
var index$7 = require('./src/subject-
|
14
|
-
var index$8 = require('./src/
|
15
|
-
var index$9 = require('./src/tiny-mce-editor/index.js');
|
6
|
+
var index = require('./src/file-upload/index.js');
|
7
|
+
var index$1 = require('./src/fixed-action-bar/index.js');
|
8
|
+
var index$2 = require('./src/image-upload/index.js');
|
9
|
+
var index$3 = require('./src/photo-crop-tool/index.js');
|
10
|
+
var index$4 = require('./src/subject-action/index.js');
|
11
|
+
var index$5 = require('./src/subject-layout/index.js');
|
12
|
+
var index$6 = require('./src/subject-list/index.js');
|
13
|
+
var index$7 = require('./src/subject-type/index.js');
|
14
|
+
var index$8 = require('./src/tiny-mce-editor/index.js');
|
16
15
|
|
17
16
|
const install = defaults.default.install;
|
18
17
|
const version = defaults.default.version;
|
19
18
|
|
20
19
|
exports.default = defaults.default;
|
21
|
-
exports.
|
22
|
-
exports.
|
23
|
-
exports.
|
24
|
-
exports.
|
25
|
-
exports.
|
26
|
-
exports.
|
27
|
-
exports.
|
28
|
-
exports.
|
29
|
-
exports.
|
30
|
-
exports.QxsTinyMceEditor = index$9.QxsTinyMceEditor;
|
20
|
+
exports.QxsFileUpload = index.QxsFileUpload;
|
21
|
+
exports.QxsFixedActionBar = index$1.QxsFixedActionBar;
|
22
|
+
exports.QxsImageUpload = index$2.QxsImageUpload;
|
23
|
+
exports.QxsPhotoCropTool = index$3.QxsPhotoCropTool;
|
24
|
+
exports.QxsSubjectAction = index$4.QxsSubjectAction;
|
25
|
+
exports.QxsSubjectLayout = index$5.QxsSubjectLayout;
|
26
|
+
exports.QxsSubjectList = index$6.QxsSubjectList;
|
27
|
+
exports.QxsSubjectType = index$7.QxsSubjectType;
|
28
|
+
exports.QxsTinyMceEditor = index$8.QxsTinyMceEditor;
|
31
29
|
exports.install = install;
|
32
30
|
exports.version = version;
|
33
31
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../packages/components/index.ts"],"sourcesContent":["import installer from './src/defaults'\n\nexport * from './src/components'\n\nexport const install = installer.install\nexport const version = installer.version\nexport default installer\n"],"names":["install","installer","version"],"mappings":"
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../packages/components/index.ts"],"sourcesContent":["import installer from './src/defaults'\n\nexport * from './src/components'\n\nexport const install = installer.install\nexport const version = installer.version\nexport default installer\n"],"names":["install","installer","version"],"mappings":";;;;;;;;;;;;;;;AAIaA,MAAAA,UAAUC,gBAAU,CAAAD;AACpBE,MAAAA,UAAUD,gBAAU,CAAAC;;;;;;;;;;;;;;;"}
|
package/lib/package.json.js
CHANGED
package/lib/src/components.js
CHANGED
@@ -1,26 +1,24 @@
|
|
1
1
|
'use strict';
|
2
2
|
|
3
|
-
var index = require('./
|
4
|
-
var index$1 = require('./
|
5
|
-
var index$2 = require('./
|
6
|
-
var index$3 = require('./
|
7
|
-
var index$4 = require('./
|
8
|
-
var index$5 = require('./subject-
|
9
|
-
var index$6 = require('./subject-
|
10
|
-
var index$7 = require('./subject-
|
11
|
-
var index$8 = require('./
|
12
|
-
var index$9 = require('./tiny-mce-editor/index.js');
|
3
|
+
var index = require('./file-upload/index.js');
|
4
|
+
var index$1 = require('./fixed-action-bar/index.js');
|
5
|
+
var index$2 = require('./image-upload/index.js');
|
6
|
+
var index$3 = require('./photo-crop-tool/index.js');
|
7
|
+
var index$4 = require('./subject-action/index.js');
|
8
|
+
var index$5 = require('./subject-layout/index.js');
|
9
|
+
var index$6 = require('./subject-list/index.js');
|
10
|
+
var index$7 = require('./subject-type/index.js');
|
11
|
+
var index$8 = require('./tiny-mce-editor/index.js');
|
13
12
|
|
14
13
|
|
15
14
|
|
16
|
-
exports.
|
17
|
-
exports.
|
18
|
-
exports.
|
19
|
-
exports.
|
20
|
-
exports.
|
21
|
-
exports.
|
22
|
-
exports.
|
23
|
-
exports.
|
24
|
-
exports.
|
25
|
-
exports.QxsTinyMceEditor = index$9.QxsTinyMceEditor;
|
15
|
+
exports.QxsFileUpload = index.QxsFileUpload;
|
16
|
+
exports.QxsFixedActionBar = index$1.QxsFixedActionBar;
|
17
|
+
exports.QxsImageUpload = index$2.QxsImageUpload;
|
18
|
+
exports.QxsPhotoCropTool = index$3.QxsPhotoCropTool;
|
19
|
+
exports.QxsSubjectAction = index$4.QxsSubjectAction;
|
20
|
+
exports.QxsSubjectLayout = index$5.QxsSubjectLayout;
|
21
|
+
exports.QxsSubjectList = index$6.QxsSubjectList;
|
22
|
+
exports.QxsSubjectType = index$7.QxsSubjectType;
|
23
|
+
exports.QxsTinyMceEditor = index$8.QxsTinyMceEditor;
|
26
24
|
//# sourceMappingURL=components.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
|
@@ -140,7 +140,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
140
140
|
}
|
141
141
|
}
|
142
142
|
function setRelation(item) {
|
143
|
-
emits("setRelation", props.id, item
|
143
|
+
emits("setRelation", props.id, item);
|
144
144
|
}
|
145
145
|
function deleteRichText() {
|
146
146
|
showRichText.value = false;
|
@@ -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'\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 id?: string\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(false)\nconst answerCheckType = ref(2)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: 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}, {\n title: '',\n isCorrect: false,\n\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})\n\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\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}\n\nfunction setRelation(item: any) {\n emits('setRelation', props.id, item.answerId)\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\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList\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(i: number) {\n answers.value[i].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)\">({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})</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 </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: 120px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n >\n {{ item.label }}\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 :value=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event) => 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 v-model:model-value=\"resultItem\" v-bind=\"attrs\" 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(answersIndex)\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":["useNamespace"],"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'\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 id?: string\n}>()\nconst emits = defineEmits(['move', 'save', 'delete', 'edit', 'add', 'setRelation'])\n\nconst attrs = useAttrs()\n\nconst answersIndex = ref(0)\nconst isKey = ref(false)\nconst answerCheckType = ref(2)\nconst answers = ref<{\n title: string\n isCorrect: boolean\n orderIndex?: number\n resultItem?: 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}, {\n title: '',\n isCorrect: false,\n\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})\n\nfunction addAnswer() {\n if (props.isSave) {\n return\n }\n answers.value.push({\n title: '',\n isCorrect: false,\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}\n\nfunction setRelation(item: any) {\n emits('setRelation', props.id, 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\n if (props.answerList && props.answerList.length) {\n answers.value = props.answerList\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(i: number) {\n answers.value[i].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)\">({{ titlePlaceholder }}{{ leastAnswerCount ? `至少选${leastAnswerCount}项${type === 'sort' ? '并排序' : ''}` : '' }})</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 </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: 120px;\"\n placeholder=\"至少选择几项\"\n :disabled=\"isSave\"\n >\n <el-option\n v-for=\"item in leastAnswerOptions\"\n :key=\"item.value\"\n :value=\"item.value\"\n >\n {{ item.label }}\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 :value=\"item.isCorrect\"\n :class=\"[{ 'is-correct': item.isCorrect }]\"\n :disabled=\"isSave\"\n style=\"margin-left: 10px;\"\n @change=\"(event) => 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 v-model:model-value=\"resultItem\" v-bind=\"attrs\" 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(answersIndex)\"\n >\n 保存\n </el-button>\n </template>\n </el-dialog>\n </div>\n</template>\n"],"names":["useNamespace"],"mappings":"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"}
|