@qxs-bns/components-wc 0.0.24 → 0.0.25
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/subject/blank-fill.mjs +112 -33
- package/es/subject/blank-fill.mjs.map +1 -1
- package/es/subject/list.mjs +103 -69
- package/es/subject/list.mjs.map +1 -1
- package/es/subject/scale.mjs +93 -12
- package/es/subject/scale.mjs.map +1 -1
- package/es/subject/single.mjs +1 -1
- package/es/subject/single.mjs.map +1 -1
- package/es/subject/text-fill.mjs +140 -99
- package/es/subject/text-fill.mjs.map +1 -1
- package/lib/subject/blank-fill.cjs +106 -27
- package/lib/subject/blank-fill.cjs.map +1 -1
- package/lib/subject/list.cjs +34 -0
- package/lib/subject/list.cjs.map +1 -1
- package/lib/subject/scale.cjs +86 -5
- package/lib/subject/scale.cjs.map +1 -1
- package/lib/subject/single.cjs +1 -1
- package/lib/subject/single.cjs.map +1 -1
- package/lib/subject/text-fill.cjs +110 -69
- package/lib/subject/text-fill.cjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single.cjs","sources":["../../../../packages/components-wc/src/subject/single.ts"],"sourcesContent":["import type { AnswerType } from './types'\nimport { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { uid } from '../base/uid'\n\nexport interface SubjectErrorOptions {\n message: string\n code?: string\n field?: string\n row?: any\n}\n\nexport class SubjectError extends Error {\n constructor(\n message: string,\n public code: string = 'VALIDATION_ERROR',\n public field?: string,\n public row?: any,\n ) {\n super(message)\n this.name = 'SubjectError'\n }\n\n static from(options: SubjectErrorOptions): SubjectError {\n return new SubjectError(options.message, options.code, options.field, options.row)\n }\n}\n\ninterface Answer {\n title: string\n isCorrect: boolean\n customAnswerId?: string\n answerId?: string\n resultItem?: string\n orderIndex?: number\n answerRelations?: any[]\n relationType?: number | null\n}\n\nconst iconPlus = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>`\nconst iconRemove = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>`\nconst iconArrow = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"/></svg>`\n\nfunction normalizeTitle(text: string) {\n return text\n .replace(/^\\d+\\.\\s*/, '')\n .replace(/[\\s,,。.!!??;;::、'\"“”‘’()()[\\]【】\\-_/\\\\]+/g, '')\n .toLowerCase()\n}\n\nfunction showToast(msg: string) {\n const el = document.createElement('div')\n el.textContent = msg\n Object.assign(el.style, {\n position: 'fixed', top: '20px', left: '50%', transform: 'translateX(-50%)',\n padding: '10px 20px', borderRadius: '4px', fontSize: '13px', color: '#fff',\n background: '#f56c6c', zIndex: '99999', boxShadow: '0 4px 12px rgba(0,0,0,.15)',\n transition: 'opacity .3s', opacity: '1',\n })\n document.body.appendChild(el)\n setTimeout(() => { el.style.opacity = '0'; setTimeout(() => el.remove(), 300) }, 2500)\n}\n\n/**\n * 标签项 - 用于关联题目的标签信息\n * @typedef {object} TagItem\n * @property {string|number} tagId - 标签ID\n * @property {string} tagName - 标签名称\n * @property {KnowledgePointInfo[]} [knowledgePointInfos] - 关联的知识点的列表\n */\nexport interface TagItem {\n tagId: string | number\n tagName: string\n knowledgePointInfos?: KnowledgePointInfo[]\n}\n\n/**\n * 知识点信息\n * @typedef {object} KnowledgePointInfo\n * @property {string|number} knowledgePointId - 知识点ID\n * @property {string} knowledgePointName - 知识点名称\n */\nexport interface KnowledgePointInfo {\n knowledgePointId: string | number\n knowledgePointName: string\n}\n\n/**\n * 分类选项\n * @typedef {object} Category\n * @property {string|number} categoryId - 分类ID\n * @property {string} title - 分类标题\n */\nexport interface Category {\n categoryId: string | number\n title: string\n}\n\n/**\n * 题库搜索结果项\n * @typedef {object} SearchResult\n * @property {string|number} id - 题目ID\n * @property {string} title - 题目标题\n * @property {string} value - 用于搜索框显示的值\n * @property {any} [key: string] - 其他扩展字段\n */\nexport interface SearchResult {\n id: string | number\n title: string\n value: string\n [key: string]: any\n}\n\n/**\n * 题目资源(图片或视频)\n * @typedef {object} Resource\n * @property {1|2} resourceType - 资源类型:1-图片, 2-视频\n * @property {object} resource - 资源详情\n * @property {string} [resource.url] - 资源URL\n * @property {string} [resource.middle] - 中等尺寸图片URL\n * @property {string} [resource.videoId] - 视频ID\n */\nexport interface Resource {\n resourceType: 1 | 2\n resource: {\n url?: string\n middle?: string\n videoId?: string\n [key: string]: any\n }\n}\n\n@safeCustomElement('qxs-subject-single')\nexport class QxsSubjectSingle extends LitElement {\n static styles = css`\n :host { display: block; font-family: system-ui, -apple-system, \"PingFang SC\", \"Microsoft YaHei\", sans-serif; font-size: 12px; color: #5a5a5a; }\n *, ::before, ::after { box-sizing: border-box; }\n\n .preview { padding: 12px 0; }\n .preview .title { font-size: 14px; color: #303133; }\n .preview .title .key-badge {\n display: inline-block;\n margin-left: 8px;\n padding: 1px 6px;\n font-size: 11px;\n color: #fff;\n background: #f56c6c;\n border-radius: 3px;\n vertical-align: middle;\n }\n .preview .rich-text { margin-top: 8px; }\n .preview .rich-text img { max-width: 100%; }\n .preview-answer { display: flex; flex-direction: column; margin-top: 12px; }\n .preview-answer .radio { margin-top: 8px; padding-left: 8px; display: flex; align-items: center; gap: 6px; }\n .preview-answer .order { color: #909399; }\n .preview-answer .correct { color: #67c23a; }\n .preview-answer .result-info { color: #909399; }\n\n .flex { display: flex; }\n .flex-items-center { display: flex; align-items: center; }\n .flex-items-start { display: flex; align-items: flex-start; }\n .flex-justify-end { display: flex; justify-content: flex-end; }\n .label { min-width: 60px; font-size: 13px; color: #606266; }\n\n textarea {\n border: 1px solid #dcdfe6; border-radius: 3px; padding: 5px 11px;\n font-size: 13px; font-family: inherit; width: 100%; resize: none; transition: border-color .2s;\n line-height: 1.5; display: block; box-sizing: border-box;\n }\n textarea:focus { border-color: #3D61E3; outline: none; }\n textarea:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n .el-input { position: relative; display: block; }\n .el-input textarea { padding-bottom: 24px; }\n .el-input .char-counter {\n position: absolute; right: 12px; bottom: 8px;\n font-size: 12px; color: #909399; line-height: 1; pointer-events: none;\n }\n\n .answer-list { margin-top: 12px; }\n .answer-item { display: flex; align-items: center; margin-top: 6px; border-radius: 4px; }\n .answer-item .label { min-width: 60px; font-size: 13px; color: #909399; }\n .answer-item .input { flex: 1; max-width: 360px; position: relative; display: block; }\n .answer-item .input input {\n height: 32px; padding: 0 50px 0 8px;\n font-size: 13px; line-height: 32px;\n border: 1px solid #dcdfe6; border-radius: 3px; width: 100%;\n transition: border-color .2s; box-sizing: border-box;\n }\n .answer-item .input input:focus { border-color: #3D61E3; outline: none; }\n .answer-item .input input:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n .answer-item .input .char-counter {\n position: absolute; right: 8px; top: 50%; transform: translateY(-50%);\n font-size: 12px; color: #909399; line-height: 1; pointer-events: none;\n }\n\n .answer-item .correct { margin: 0 10px; color: #909399; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }\n .answer-item .correct:hover { color: #3D61E3; }\n .answer-item .correct.is-correct { color: #67c23a; }\n .answer-item .correct input { width: 14px; height: 14px; cursor: pointer; accent-color: #3D61E3; }\n\n .answer-item .icon {\n margin-left: 6px; cursor: pointer; display: inline-flex;\n align-items: center; justify-content: center;\n width: 24px; height: 24px; border-radius: 4px;\n border: 1px solid #dcdfe6; background: #fff; color: #909399;\n transition: all 0.2s;\n }\n .answer-item .icon:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n .answer-item .icon.disabled { color: #e4e7ed; border-color: #e4e7ed; cursor: not-allowed; }\n\n .answer-item .link { margin-left: 8px; color: #3D61E3; cursor: pointer; font-size: 12px; white-space: nowrap; }\n .answer-item .link:hover { color: #2D4CB8; }\n\n .el-select {\n width: 150px; height: 32px; border: 1px solid #dcdfe6; border-radius: 3px;\n padding: 0 8px; font-size: 13px; background: #fff; appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23c0c4cc' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 8px center;\n }\n .el-select:focus { border-color: #3D61E3; outline: none; }\n .el-select:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n\n .sort-badge { font-weight: bold; color: #3D61E3; margin-left: 10px; }\n\n .el-link { color: #3D61E3; cursor: pointer; font-size: 12px; }\n .el-link:hover { color: #2D4CB8; }\n .el-link.danger { color: #f56c6c; }\n\n .section-row { margin-top: 12px; }\n .value-text { font-size: 13px; color: #606266; white-space: pre-wrap; }\n .muted-text { font-size: 12px; color: #909399; }\n\n .search-wrap { position: relative; }\n .search-dropdown {\n position: absolute; z-index: 120; left: 0; right: 0; top: calc(100% + 4px);\n background: #fff; border: 1px solid #e4e7ed; border-radius: 6px;\n box-shadow: 0 8px 20px rgba(0,0,0,.12); overflow: hidden;\n }\n .search-item {\n padding: 10px 12px; cursor: pointer; transition: background .2s;\n font-size: 13px; color: #606266; line-height: 1.4;\n }\n .search-item:hover { background: #f5f7fa; color: #3D61E3; }\n .search-empty { padding: 10px 12px; font-size: 12px; color: #909399; }\n\n .tag-list { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 32px; }\n .tag-item {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 4px 8px; font-size: 12px; line-height: 1;\n color: #3D61E3; background: #ecf5ff; border: 1px solid #d9ecff; border-radius: 4px;\n }\n .tag-item .close { cursor: pointer; color: #909399; }\n .tag-item .close:hover { color: #f56c6c; }\n .tag-hint { font-size: 12px; color: #909399; }\n\n .resource-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 8px; }\n .resource-summary { font-size: 12px; color: #606266; }\n .resource-thumbs { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 8px; }\n .resource-thumb {\n width: 72px; height: 72px; object-fit: cover; border-radius: 6px;\n border: 1px solid #e4e7ed; cursor: pointer; background: #f5f7fa;\n }\n .resource-video {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 88px; height: 30px; padding: 0 10px; border: 1px solid #dcdfe6; border-radius: 4px;\n color: #606266; background: #fff; cursor: pointer; font-size: 12px; transition: all .2s;\n }\n .resource-video:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n .media-stage { display: flex; align-items: center; justify-content: center; min-height: 240px; }\n .media-stage img, .media-stage video { max-width: 100%; max-height: 60vh; border-radius: 6px; }\n .media-footer { display: flex; justify-content: space-between; align-items: center; gap: 8px; width: 100%; }\n .media-footer .group { display: flex; gap: 8px; }\n\n /* Multi-select with tags (Element Plus style) */\n .multi-select-wrapper { position: relative; }\n .multi-select {\n width: 240px; height: 28px; border: 1px solid #dcdfe6; border-radius: 3px;\n padding: 0 30px 0 8px; font-size: 13px; background: #fff; cursor: pointer;\n display: flex; flex-wrap: nowrap; align-items: center; gap: 4px;\n transition: border-color .2s; position: relative; overflow: hidden;\n }\n .multi-select:hover { border-color: #c0c4cc; }\n .multi-select.focused { border-color: #3D61E3; }\n .multi-select.disabled { background: #f5f7fa; cursor: not-allowed; }\n .multi-select .placeholder { color: #c0c4cc; font-size: 13px; padding: 4px 0; }\n .multi-select .arrow {\n position: absolute; right: 8px; top: 50%; transform: translateY(-50%);\n color: #c0c4cc; display: inline-flex; transition: transform .2s;\n }\n .multi-select.focused .arrow { transform: translateY(-50%) rotate(180deg); color: #3D61E3; }\n .multi-select .tag {\n display: inline-flex; align-items: center; gap: 2px;\n background: #f0f2f5; border-radius: 3px; padding: 0 6px; height: 20px;\n font-size: 12px; color: #606266; line-height: 20px;\n }\n .multi-select .tag .tag-close {\n display: inline-flex; cursor: pointer; color: #909399; margin-left: 2px; line-height: 1;\n }\n .multi-select .tag .tag-close:hover { color: #3D61E3; }\n .multi-select-dropdown {\n position: absolute; z-index: 100; background: #fff; left: 0; top: 100%; margin-top: 4px;\n border: 1px solid #e4e7ed; border-radius: 3px;\n box-shadow: 0 4px 12px rgba(0,0,0,.12); min-width: 240px; max-height: 140px; overflow-y: auto;\n }\n .multi-select-option {\n padding: 4px 12px; font-size: 13px; color: #606266; cursor: pointer;\n transition: background .2s;\n }\n .multi-select-option:hover { background: #f5f7fa; }\n .multi-select-option.selected { color: #3D61E3; font-weight: 500; }\n\n .modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 9000; display: flex; align-items: center; justify-content: center; }\n .modal { background: #fff; border-radius: 6px; width: 520px; max-width: 90vw; box-shadow: 0 12px 32px rgba(0,0,0,.12); display: flex; flex-direction: column; }\n .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px 12px; border-bottom: 1px solid #e4e7ed; }\n .modal-title { font-size: 14px; font-weight: 600; color: #303133; }\n .modal-close { background: none; border: none; font-size: 18px; cursor: pointer; color: #909399; padding: 0; line-height: 1; }\n .modal-close:hover { color: #3D61E3; }\n .modal-body { padding: 20px; }\n .modal-body textarea { min-height: 120px; }\n .modal-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 20px; border-top: 1px solid #e4e7ed; }\n .modal-footer button { padding: 6px 16px; font-size: 12px; border-radius: 3px; cursor: pointer; border: 1px solid #dcdfe6; background: #fff; color: #606266; }\n .modal-footer button:hover { color: #3D61E3; border-color: #a0cfff; }\n .modal-footer button.primary { background: #3D61E3; border-color: #3D61E3; color: #fff; }\n .modal-footer button.primary:hover { background: #2D4CB8; border-color: #2D4CB8; }\n `\n\n @property({ type: Number, attribute: 'order-index' }) 'order-index' = 0\n @property({ type: Boolean, attribute: 'is-edit' }) 'is-edit' = false\n @property({ type: Boolean, attribute: 'is-save' }) 'is-save' = false\n @property({ type: Boolean, attribute: 'is-set' }) 'is-set' = false\n @property({ type: Boolean, attribute: 'is-key' }) 'is-key' = false\n @property({ type: Boolean, attribute: 'show-action' }) 'show-action' = true\n @property({ type: Boolean, attribute: 'show-add' }) 'show-add' = true\n @property({ type: Boolean, attribute: 'show-answer-setting' }) 'show-answer-setting' = false\n @property({ type: Boolean, attribute: 'show-key' }) 'show-key' = false\n @property({ type: Boolean, attribute: 'show-analysis' }) 'show-analysis' = true\n @property({ attribute: 'question-type', reflect: true }) type: AnswerType = 'single'\n @property({ type: Number, attribute: 'answer-check-type' }) 'answer-check-type' = 1\n @property({ type: Number, attribute: 'exam-answer-relation-type' }) 'exam-answer-relation-type' = 0\n @property({ type: String, attribute: 'rich-text-content' }) 'rich-text-content' = ''\n @property({ type: String }) analysis = ''\n @property({ type: Number, attribute: 'least-answer-count' }) 'least-answer-count' = 0\n @property({ type: String, attribute: 'exam-expand' }) 'exam-expand' = ''\n @property({ type: String, attribute: 'custom-id' }) 'custom-id' = ''\n @property({ type: Number, attribute: 'exam-id' }) 'exam-id' = 0\n @property({ type: String, attribute: 'category-id' }) 'category-id' = ''\n @property({ type: Object, attribute: 'upload-image' }) 'upload-image': (file: File) => Promise<string> = async (file: File) => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = e => resolve(e.target?.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n }\n\n @property({ type: Array, attribute: 'answer-list' })\n get 'answer-list'() { return this._answers }\n\n set 'answer-list'(v: any) {\n // 编辑模式下不接受外部更新,避免覆盖用户正在编辑的内容\n if (this['is-edit']) {\n return\n }\n const arr = Array.isArray(v) ? v : []\n this._answers = arr.length\n ? arr.map((a: any) => ({ ...a }))\n : [\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n ]\n this.requestUpdate('answer-list')\n }\n\n // ============ 业务接口 Props ============\n /**\n * 标签列表 - 用于关联题目的标签信息\n * @type {TagItem[]}\n * @description 业务系统传入已选择的标签列表\n */\n @property({ type: Array, attribute: 'tag-list' }) 'tag-list': TagItem[] = []\n /**\n * 分类列表 - 可用于题目的分类选项\n * @type {Category[]}\n * @description 业务系统传入可选的分类列表\n */\n @property({ type: Array, attribute: 'category-list' }) 'category-list': Category[] = []\n /**\n * AI 推荐答案 - AI 根据题目内容推荐的答案\n * @type {string}\n * @description AI 返回的推荐答案,格式如 \"1. 选项A\\n2. 选项B\"\n */\n @property({ type: String, attribute: 'ai-answer' }) 'ai-answer' = ''\n /**\n * 图片/视频资源列表 - 题目附带的媒体资源\n * @type {Resource[]}\n * @description 题目附带图片或视频资源\n */\n @property({ type: Array, attribute: 'resource-list' }) 'resource-list': Resource[] = []\n /**\n * 是否显示标签功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示标签选择 UI\n */\n @property({ type: Boolean, attribute: 'show-tag' }) 'show-tag' = false\n /**\n * 是否显示分类功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示分类选择 UI\n */\n @property({ type: Boolean, attribute: 'show-category' }) 'show-category' = false\n /**\n * 是否显示 AI 推荐功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示 AI 推荐答案 UI\n */\n @property({ type: Boolean, attribute: 'show-ai' }) 'show-ai' = false\n /**\n * 是否显示资源功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示图片/视频资源 UI\n */\n @property({ type: Boolean, attribute: 'show-resource' }) 'show-resource' = false\n /**\n * 是否显示跳题功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示跳题逻辑设置入口\n */\n @property({ type: Boolean, attribute: 'show-jump' }) 'show-jump' = false\n /**\n * 跳题状态 - 是否已设置跳题逻辑\n * @type {boolean}\n * @default false\n * @description 标记当前题目是否已设置跳题逻辑\n */\n @property({ type: Boolean, attribute: 'has-jump' }) 'has-jump' = false\n /**\n * 题库搜索接口地址\n * @type {string}\n * @description 题库模糊搜索接口地址,用于题库搜索功能\n */\n @property({ type: String, attribute: 'search-api' }) 'search-api' = ''\n /**\n * 题库搜索回调函数\n * @type {Function}\n * @param {string} query - 搜索关键词\n * @param {number} answerType - 题目类型:0-单选, 1-多选\n * @returns {Promise<SearchResult[]>} 搜索结果列表\n * @description 题库搜索的回调函数,由业务系统实现搜索逻辑\n */\n @property({ type: Object, attribute: 'search-handler' }) 'search-handler'?: (query: string, answerType: number) => Promise<SearchResult[]>\n\n // 双向绑定支持\n @property({ type: String, attribute: 'model-value' }) 'model-value' = ''\n @property({ type: Boolean, attribute: 'use-model' }) 'use-model' = false\n\n @state() private _answers: Answer[] = [\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n ]\n\n @property({ type: String }) title = ''\n\n @state() private _title = ''\n @state() private _analysis = ''\n @state() private _richText = ''\n @state() private _showRichText = false\n @state() private _leastAnswerCount = 0\n @state() private _answerCheckType = 1\n @state() private _isKey = false\n @state() private _orderList: string[] = []\n @state() private _selectedTagList: TagItem[] = []\n @state() private _categoryId = ''\n @state() private _searchResults: SearchResult[] = []\n @state() private _searchOpen = false\n @state() private _searchLoading = false\n @state() private _resultDialogOpen = false\n @state() private _resultDialogIndex = 0\n @state() private _resultDialogValue = ''\n @state() private _sortDropdownOpen = false\n @state() private _imageViewerOpen = false\n @state() private _imageViewerIndex = 0\n @state() private _videoViewerOpen = false\n @state() private _correctHintDialogOpen = false\n @state() private _hasShownCorrectHint = false\n\n private _searchTimer: number | null = null\n private _searchToken = 0\n\n private readonly TITLE_MAX = 200\n private readonly ANSWER_MAX = 100\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener('click', this._handleDocumentClick)\n this._syncExternalProps()\n }\n\n firstUpdated() {\n this._syncExternalProps()\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleDocumentClick)\n if (this._searchTimer) {\n window.clearTimeout(this._searchTimer)\n this._searchTimer = null\n }\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const path = e.composedPath()\n const wrapper = this.shadowRoot?.querySelector('.multi-select-wrapper')\n const searchWrap = this.shadowRoot?.querySelector('.search-wrap')\n if (wrapper && !path.includes(wrapper)) {\n this._sortDropdownOpen = false\n }\n if (searchWrap && !path.includes(searchWrap)) {\n this._searchOpen = false\n }\n this.requestUpdate()\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('is-edit') && this['is-edit']) { this._syncProps() }\n if (!this['is-edit'] && (changed.has('title') || changed.has('answer-list') || changed.has('analysis') || changed.has('least-answer-count') || changed.has('answer-check-type') || changed.has('tag-list') || changed.has('category-id') || changed.has('rich-text-content'))) {\n this._syncExternalProps()\n }\n if (changed.has('is-key')) {\n this._isKey = this['is-key']\n }\n if (changed.has('tag-list')) {\n this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n }\n if (changed.has('category-id')) {\n this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n }\n if (changed.has('exam-expand') || changed.has('answer-list')) { this._syncExamExpand() }\n if (changed.has('model-value') && this['use-model']) {\n this._title = this['model-value']\n }\n }\n\n private _syncExternalProps() {\n this._title = this.title || ''\n this._analysis = this.analysis || ''\n this._leastAnswerCount = Number(this['least-answer-count']) || 0\n this._answerCheckType = this['answer-check-type'] || 1\n this._isKey = this['is-key']\n this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n this._richText = this['rich-text-content'] || ''\n this._showRichText = !!this['rich-text-content']\n if (this['answer-list']?.length) {\n this._answers = this['answer-list'].map((a: any) => ({\n ...a,\n title: a.title || '',\n isCorrect: !!a.isCorrect,\n }))\n }\n }\n\n private _syncProps() {\n this._title = (this as any).title || ''\n this._analysis = this.analysis || ''\n this._leastAnswerCount = Number(this['least-answer-count']) || 0\n this._answerCheckType = this['answer-check-type'] || 1\n this._isKey = this['is-key']\n this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n this._richText = this['rich-text-content'] || ''\n this._showRichText = !!this['rich-text-content']\n if (this['answer-list']?.length) {\n this._answers = this['answer-list'].map((a: any) => ({\n ...a,\n title: a.title || '',\n isCorrect: !!a.isCorrect,\n }))\n }\n this._syncExamExpand()\n }\n\n private _syncExamExpand() {\n if (!this['exam-expand'] || !this['answer-list']?.length) { return }\n const ids = this['exam-expand'].split(',')\n const answers = this['answer-list'] as any[]\n this._orderList = ids.map((id) => {\n const index = answers.findIndex((answer, answerIndex) =>\n String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n )\n return index >= 0 ? this._label(index) : ''\n }).filter(Boolean)\n }\n\n private _emit(name: string, detail?: unknown) {\n this.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail: detail ?? null }))\n }\n\n private _searchAnswerType() {\n if (this.type === 'single') { return 0 }\n if (this.type === 'multiple') { return 1 }\n return 5\n }\n\n private _queueSearch(query: string) {\n if (this._searchTimer) {\n window.clearTimeout(this._searchTimer)\n this._searchTimer = null\n }\n const keyword = query.trim()\n if (!keyword || (!this['search-api'] && typeof this['search-handler'] !== 'function')) {\n this._searchResults = []\n this._searchOpen = false\n this._searchLoading = false\n return\n }\n this._searchTimer = window.setTimeout(() => {\n void this._runSearch(keyword)\n }, 300)\n }\n\n private async _runSearch(query: string) {\n const currentToken = ++this._searchToken\n this._searchLoading = true\n this._searchOpen = true\n this.requestUpdate()\n try {\n let result: SearchResult[] = []\n if (typeof this['search-handler'] === 'function') {\n result = await this['search-handler'](query, this._searchAnswerType())\n }\n else if (this['search-api']) {\n const params = new URLSearchParams({\n searchKey: query,\n answerType: String(this._searchAnswerType()),\n })\n const response = await fetch(`${this['search-api']}${this['search-api'].includes('?') ? '&' : '?'}${params.toString()}`)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`)\n }\n const payload = await response.json()\n const list = Array.isArray(payload) ? payload : Array.isArray(payload?.data) ? payload.data : []\n result = list.map((item: any) => ({\n ...item,\n value: item?.value || item?.title || '',\n }))\n }\n if (currentToken !== this._searchToken) { return }\n this._searchResults = Array.isArray(result) ? result : []\n }\n catch (error: any) {\n if (currentToken !== this._searchToken) { return }\n this._searchResults = []\n showToast(error?.message || '题库搜索失败')\n }\n finally {\n if (currentToken === this._searchToken) {\n this._searchLoading = false\n this.requestUpdate()\n }\n }\n }\n\n private _selectSearchResult(item: SearchResult) {\n const selectedTitle = item.value || item.title || ''\n this._title = selectedTitle\n this._searchResults = []\n this._searchOpen = false\n if (this['use-model']) {\n this.dispatchEvent(new CustomEvent('update:modelValue', {\n bubbles: true,\n composed: true,\n detail: this._title,\n }))\n }\n this._emit('title-select', {\n ...item,\n id: item.id ?? item.examId ?? item.questionId,\n title: item.title || selectedTitle,\n value: selectedTitle,\n customId: this['custom-id'] || '',\n })\n }\n\n private _applyAiAnswer() {\n if (!this['ai-answer']?.trim()) {\n showToast('暂无 AI 推荐答案')\n return\n }\n const aiTitles = this['ai-answer']\n .split(/\\r?\\n/)\n .map(line => normalizeTitle(line))\n .filter(Boolean)\n let matched = 0\n if (this.type === 'single') {\n let selected = false\n this._answers = this._answers.map((answer) => {\n const shouldSelect = !selected && aiTitles.includes(normalizeTitle(answer.title || ''))\n if (shouldSelect) {\n selected = true\n matched++\n }\n return { ...answer, isCorrect: shouldSelect }\n })\n }\n else {\n this._answers = this._answers.map((answer) => {\n const shouldSelect = aiTitles.includes(normalizeTitle(answer.title || ''))\n if (shouldSelect) { matched++ }\n return { ...answer, isCorrect: shouldSelect }\n })\n }\n if (!matched) {\n showToast('未找到匹配的选项,请检查选项内容是否一致')\n return\n }\n this.requestUpdate()\n }\n\n private _removeTag(tagId: string | number) {\n this._selectedTagList = this._selectedTagList.filter(item => String(item.tagId) !== String(tagId))\n this._emit('tag-change', {\n value: this._selectedTagList,\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n })\n }\n\n private _chooseTag() {\n this._emit('choose-tag', {\n value: this._selectedTagList,\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n })\n }\n\n private _onCategoryChange(value: string) {\n this._categoryId = value\n this._emit('category-change', {\n value,\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n })\n }\n\n private _setRelation(item: Answer, answerIndex: number) {\n const answer = item.customAnswerId\n ? { ...item }\n : { ...item, customAnswerId: item.answerId || uid() }\n this._answers = this._answers.map((current, index) => index === answerIndex ? answer : current)\n this.requestUpdate()\n this._emit('set-relation', {\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n answerIndex,\n answer,\n })\n }\n\n private _relationLength(relations: any[] = []) {\n return relations.reduce((count, item) => count + (Array.isArray(item?.relationAnswers) ? item.relationAnswers.length : 0), 0)\n }\n\n private _imageResources() {\n return (this['resource-list'] || [])\n .filter(item => item.resourceType === 1)\n .map(item => item.resource.middle || item.resource.url)\n .filter(Boolean) as string[]\n }\n\n private _videoResource() {\n return (this['resource-list'] || []).find(item => item.resourceType === 2)?.resource || null\n }\n\n private _openImageViewer(index = 0) {\n if (!this._imageResources().length) { return }\n this._imageViewerIndex = index\n this._imageViewerOpen = true\n }\n\n private _closeImageViewer() {\n this._imageViewerOpen = false\n }\n\n private _moveImage(step: number) {\n const images = this._imageResources()\n if (!images.length) { return }\n this._imageViewerIndex = (this._imageViewerIndex + step + images.length) % images.length\n }\n\n private _openVideoViewer() {\n if (!this._videoResource()?.url) { return }\n this._videoViewerOpen = true\n }\n\n private _closeVideoViewer() {\n this._videoViewerOpen = false\n }\n\n private _label(i: number) { return String.fromCharCode(65 + i) }\n\n private get _titlePlaceholder() {\n return this.type === 'single' ? '单选题' : this.type === 'multiple' ? '多选题' : '排序题'\n }\n\n private _setCorrect(item: Answer, val: boolean) {\n if (this.type === 'single') {\n this._answers.forEach((a) => { a.isCorrect = false })\n item.isCorrect = val\n }\n else {\n item.isCorrect = val\n }\n this.requestUpdate()\n }\n\n private _onTitleInput(e: Event) {\n const el = e.target as HTMLTextAreaElement\n if (el.value.length > this.TITLE_MAX) { el.value = el.value.slice(0, this.TITLE_MAX) }\n this._title = el.value\n this._queueSearch(this._title)\n // 双向绑定:通知外部更新\n if (this['use-model']) {\n this.dispatchEvent(new CustomEvent('update:modelValue', {\n bubbles: true,\n composed: true,\n detail: this._title,\n }))\n }\n }\n\n private _onAnswerInput(e: Event, idx: number) {\n const el = e.target as HTMLInputElement\n if (el.value.length > this.ANSWER_MAX) { el.value = el.value.slice(0, this.ANSWER_MAX) }\n this._answers[idx].title = el.value\n this.requestUpdate()\n }\n\n private _addAnswer(index: number) {\n if (this['is-save']) { return }\n const arr = [...this._answers]\n arr.splice(index + 1, 0, { title: '', isCorrect: false, customAnswerId: uid() })\n this._answers = arr\n }\n\n private _deleteAnswer(index: number) {\n if (this._answers.length < 3 || this['is-save']) { return }\n this._answers = this._answers.filter((_, i) => i !== index)\n }\n\n private _toggleSortItem(letter: string) {\n const idx = this._orderList.indexOf(letter)\n if (idx >= 0) {\n this._orderList = this._orderList.filter(l => l !== letter)\n }\n else {\n this._orderList = [...this._orderList, letter]\n }\n this.requestUpdate()\n }\n\n private _removeSortItem(letter: string) {\n this._orderList = this._orderList.filter(l => l !== letter)\n this.requestUpdate()\n }\n\n private _getSortOrder(index: number): number | null {\n const pos = this._orderList.indexOf(this._label(index))\n return pos >= 0 ? pos + 1 : null\n }\n\n private _sortAnswerValue(letter: string) {\n const index = letter.charCodeAt(0) - 65\n const answer = this._answers[index] as any\n return answer?.answerId ?? index + 1\n }\n\n private _shouldShowCorrectHint() {\n if (this.type === 'sort') {\n return !this._orderList.length\n }\n return !this._answers.some(answer => !!answer.isCorrect)\n }\n\n async toJSON(): Promise<any> {\n return new Promise((resolve, reject) => {\n const row = { customId: this['custom-id'] || undefined, answerType: this.type, orderIndex: this['order-index'] }\n\n const title = this['is-edit'] ? this._title : (this as any).title || ''\n const answers = this['is-edit'] ? this._answers : this['answer-list'] || []\n const answerCheckType = this['is-edit'] ? this._answerCheckType : this['answer-check-type'] || 1\n const leastAnswerCount = this['is-edit'] ? this._leastAnswerCount : Number(this['least-answer-count']) || 0\n const analysis = this['is-edit'] ? this._analysis : this.analysis || ''\n const selectedTagList = this._selectedTagList || []\n const examExpand = this['is-edit']\n ? this._orderList.map((l: string) => this._sortAnswerValue(l)).join(',')\n : (this['exam-expand'] || '')\n const showRichText = this['is-edit'] ? this._showRichText : !!(this['rich-text-content'])\n const richText = this['is-edit'] ? this._richText : this['rich-text-content'] || ''\n const orderList = this['is-edit']\n ? this._orderList\n : (() => {\n const expand = this['exam-expand']\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const index = (this['answer-list'] as any[])?.findIndex((answer, answerIndex) =>\n String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n )\n return index >= 0 ? this._label(index) : ''\n }).filter(Boolean)\n })()\n\n if (!title) {\n reject(new SubjectError('题目标题不能为空!', 'EMPTY_TITLE', 'title', row))\n return\n }\n if (this['show-tag'] && selectedTagList.length === 0) {\n reject(new SubjectError('请选择标签/关键信息', 'EMPTY_TAGS', 'tagList', row))\n return\n }\n if (!answerCheckType) {\n reject(new SubjectError('请选择答题设置', 'NO_ANSWER_CHECK_TYPE', 'answerCheckType', row))\n return\n }\n\n let msg = ''\n let isSetCorrectAnswer = false\n let correctAnswerCount = 0\n\n if (this.type === 'multiple' || this.type === 'single') {\n answers.forEach((v: any, i: number) => {\n if (!v.title?.trim()) { msg += `选项${String.fromCharCode(65 + i)}未填写。` }\n if (v.isCorrect) { isSetCorrectAnswer = true; correctAnswerCount++ }\n })\n }\n else if (this.type === 'sort') {\n if (orderList.length) { isSetCorrectAnswer = true }\n if (isSetCorrectAnswer && orderList.length < leastAnswerCount) {\n reject(new SubjectError(`排序题至少需要设置${leastAnswerCount}项排序答案`, 'SORT_COUNT_INVALID', 'orderList', row))\n return\n }\n }\n\n if (msg) {\n reject(new SubjectError(msg, 'ANSWER_EMPTY', 'answers', row))\n return\n }\n\n const uniqueAnswer = new Set(answers.map((a: any) => a.title))\n if (uniqueAnswer.size !== answers.length) {\n reject(new SubjectError('选项不能重复', 'DUPLICATE_ANSWERS', 'answers', row))\n return\n }\n\n if (this.type === 'multiple') {\n if (correctAnswerCount === 1) {\n reject(new SubjectError('请至少设置两个支持选项', 'CORRECT_COUNT_INVALID', 'answers', row))\n return\n }\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount) {\n reject(new SubjectError('至少选几项与支持选项数不符', 'LEAST_ANSWER_COUNT_INVALID', 'answers', row))\n return\n }\n }\n\n if (answerCheckType === 2 || answerCheckType === 3) {\n if (!isSetCorrectAnswer) {\n reject(new SubjectError('请设置支持选项', 'NO_CORRECT_ANSWER', 'answers', row))\n return\n }\n }\n\n const result: any = {\n answerType: String(this.type),\n title,\n answers: answers.filter((a: any) => a.title).map((a: any, i: number) => ({ ...a, orderIndex: i + 1 })),\n examExpand,\n analysis,\n isSetCorrectAnswer,\n leastAnswerCount: leastAnswerCount || '',\n examRichTextContent: showRichText ? richText : '',\n examAnswerRelationType: this['exam-answer-relation-type'],\n isKey: this._isKey,\n answerCheckType,\n categoryId: this._categoryId || '',\n memberTagInfo: selectedTagList,\n tagInfos: selectedTagList,\n aiAnswer: this['ai-answer'] || '',\n resourceList: this['resource-list'] || [],\n examResourceBOList: this['resource-list'] || [],\n }\n if (this['custom-id']) { result.customId = this['custom-id'] }\n resolve(result)\n })\n }\n\n validate(): SubjectError[] {\n const errors: SubjectError[] = []\n const row = { customId: this['custom-id'] || undefined, answerType: this.type, orderIndex: this['order-index'] }\n\n const title = this['is-edit'] ? this._title : (this as any).title || ''\n const answers = this['is-edit'] ? this._answers : this['answer-list'] || []\n const answerCheckType = this['is-edit'] ? this._answerCheckType : this['answer-check-type'] || 1\n const leastAnswerCount = this['is-edit'] ? this._leastAnswerCount : Number(this['least-answer-count']) || 0\n const selectedTagList = this._selectedTagList || []\n const orderList = this['is-edit']\n ? this._orderList\n : (() => {\n const expand = this['exam-expand']\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const index = (this['answer-list'] as any[])?.findIndex((answer, answerIndex) =>\n String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n )\n return index >= 0 ? this._label(index) : ''\n }).filter(Boolean)\n })()\n\n if (!title) {\n errors.push(new SubjectError('题目标题不能为空!', 'EMPTY_TITLE', 'title', row))\n }\n if (this['show-tag'] && selectedTagList.length === 0) {\n errors.push(new SubjectError('请选择标签/关键信息', 'EMPTY_TAGS', 'tagList', row))\n }\n if (!answerCheckType) {\n errors.push(new SubjectError('请选择答题设置', 'NO_ANSWER_CHECK_TYPE', 'answerCheckType', row))\n }\n\n let isSetCorrectAnswer = false\n let correctAnswerCount = 0\n\n if (this.type === 'multiple' || this.type === 'single') {\n answers.forEach((v: any, i: number) => {\n if (!v.title?.trim()) {\n errors.push(new SubjectError(`选项${String.fromCharCode(65 + i)}未填写`, 'ANSWER_EMPTY', 'answers', row))\n }\n if (v.isCorrect) { isSetCorrectAnswer = true; correctAnswerCount++ }\n })\n }\n else if (this.type === 'sort') {\n if (orderList.length) { isSetCorrectAnswer = true }\n if (isSetCorrectAnswer && orderList.length < leastAnswerCount) {\n errors.push(new SubjectError(`排序题至少需要设置${leastAnswerCount}项排序答案`, 'SORT_COUNT_INVALID', 'orderList', row))\n }\n }\n\n const uniqueAnswer = new Set(answers.map((a: any) => a.title))\n if (uniqueAnswer.size !== answers.length && answers.length > 0) {\n errors.push(new SubjectError('选项不能重复', 'DUPLICATE_ANSWERS', 'answers', row))\n }\n\n if (this.type === 'multiple') {\n if (correctAnswerCount === 1 && answers.length > 0) {\n errors.push(new SubjectError('请至少设置两个支持选项', 'CORRECT_COUNT_INVALID', 'answers', row))\n }\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount) {\n errors.push(new SubjectError('至少选几项与支持选项数不符', 'LEAST_ANSWER_COUNT_INVALID', 'answers', row))\n }\n }\n\n if (answerCheckType === 2 || answerCheckType === 3) {\n if (!isSetCorrectAnswer) {\n errors.push(new SubjectError('请设置支持选项', 'NO_CORRECT_ANSWER', 'answers', row))\n }\n }\n\n return errors\n }\n\n private _openResultDialog(idx: number) {\n this._resultDialogIndex = idx\n this._resultDialogValue = this._answers[idx].resultItem || ''\n this._resultDialogOpen = true\n }\n\n private _saveResultDialog() {\n this._answers[this._resultDialogIndex].resultItem = this._resultDialogValue\n this._resultDialogOpen = false\n this.requestUpdate()\n }\n\n private _renderCorrectHintDialog() {\n if (!this._correctHintDialogOpen) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => { this._correctHintDialogOpen = false }}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">温馨提示</span>\n <button class=\"modal-close\" @click=${() => { this._correctHintDialogOpen = false }}>✕</button>\n </div>\n <div class=\"modal-body\">\n <div class=\"value-text\">为了收集更全面、有价值的数据,建议您为问卷每题设定推荐/正确选项。</div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"primary\" @click=${() => {\n this._hasShownCorrectHint = true\n this._correctHintDialogOpen = false\n }}>我知道了</button>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderResultDialog() {\n if (!this._resultDialogOpen) { return '' }\n const letter = this._label(this._resultDialogIndex)\n return html`\n <div class=\"modal-backdrop\" @click=${() => { this._resultDialogOpen = false }}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">编辑结果项 — 选项 ${letter}</span>\n <button class=\"modal-close\" @click=${() => { this._resultDialogOpen = false }}>✕</button>\n </div>\n <div class=\"modal-body\">\n <textarea rows=\"5\" .value=${this._resultDialogValue}\n @input=${(e: Event) => { this._resultDialogValue = (e.target as HTMLTextAreaElement).value }}\n placeholder=\"请输入该选项的结果项内容\"></textarea>\n </div>\n <div class=\"modal-footer\">\n <button @click=${() => { this._resultDialogOpen = false }}>取消</button>\n <button class=\"primary\" @click=${() => this._saveResultDialog()}>保存</button>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderSearchDropdown() {\n if (!this['is-edit'] || (!this._searchOpen && !this._searchLoading)) { return '' }\n return html`\n <div class=\"search-dropdown\">\n ${this._searchLoading\n ? html`<div class=\"search-empty\">搜索中...</div>`\n : this._searchResults.length\n ? this._searchResults.map(item => html`\n <div class=\"search-item\" @click=${() => this._selectSearchResult(item)}>${item.value || item.title}</div>\n `)\n : html`<div class=\"search-empty\">暂无匹配题目</div>`}\n </div>\n `\n }\n\n private _renderTagSection() {\n if (!this['show-tag']) { return '' }\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>标签:</span></div>\n <div style=\"flex:1\">\n <div class=\"tag-list\">\n ${this._selectedTagList.length\n ? this._selectedTagList.map(item => html`\n <span class=\"tag-item\">\n ${item.tagName}\n ${!this['is-save'] ? html`<span class=\"close\" @click=${() => this._removeTag(item.tagId)}>×</span>` : ''}\n </span>\n `)\n : html`<span class=\"tag-hint\">暂无标签/关键信息</span>`}\n </div>\n ${this['is-edit'] && !this['is-save']\n ? html`\n <div style=\"margin-top:8px\">\n <span class=\"el-link\" @click=${() => this._chooseTag()}>选择</span>\n </div>\n `\n : ''}\n </div>\n </div>\n `\n }\n\n private _renderCategorySection() {\n if (!this['show-category']) { return '' }\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>分类:</span></div>\n <div style=\"flex:1\">\n ${this['is-edit']\n ? html`\n <select class=\"el-select\" .value=${String(this._categoryId)} ?disabled=${this['is-save']}\n @change=${(e: Event) => this._onCategoryChange((e.target as HTMLSelectElement).value)}>\n <option value=\"\">选择分类</option>\n ${this['category-list'].map(item => html`\n <option value=${String(item.categoryId)} ?selected=${String(item.categoryId) === String(this._categoryId)}>${item.title}</option>\n `)}\n </select>\n `\n : html`<span class=\"value-text\">${this['category-list'].find(item => String(item.categoryId) === String(this._categoryId))?.title || '未选择分类'}</span>`}\n </div>\n </div>\n `\n }\n\n private _renderAiSection() {\n if (!this['show-ai'] || !['single', 'multiple'].includes(this.type)) { return '' }\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>AI推荐:</span></div>\n <div style=\"flex:1\">\n <span class=\"value-text\">${this['ai-answer'] || '暂无'}</span>\n ${this['is-edit']\n ? html`<div style=\"margin-top:8px\"><span class=\"el-link\" @click=${() => this._applyAiAnswer()}>一键勾选</span></div>`\n : ''}\n </div>\n </div>\n `\n }\n\n private _renderResourceSection() {\n if (!this['show-resource']) { return '' }\n const images = this._imageResources()\n const video = this._videoResource()\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>资源:</span></div>\n <div style=\"flex:1\">\n <div class=\"resource-summary\">\n 图片 ${images.length} 张${video ? ',含视频资源' : ''}\n </div>\n <div class=\"resource-actions\">\n ${images.length ? html`<span class=\"el-link\" @click=${() => this._openImageViewer(0)}>查看图片</span>` : ''}\n ${video?.url ? html`<span class=\"el-link\" @click=${() => this._openVideoViewer()}>查看视频</span>` : ''}\n ${!images.length && !video?.url ? html`<span class=\"muted-text\">暂无资源</span>` : ''}\n </div>\n ${images.length\n ? html`\n <div class=\"resource-thumbs\">\n ${images.slice(0, 4).map((src, index) => html`\n <img class=\"resource-thumb\" src=${src} alt=\"resource\" @click=${() => this._openImageViewer(index)} />\n `)}\n </div>\n `\n : ''}\n </div>\n </div>\n `\n }\n\n private _renderImageViewer() {\n if (!this._imageViewerOpen) { return '' }\n const images = this._imageResources()\n const current = images[this._imageViewerIndex]\n if (!current) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => this._closeImageViewer()}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">图片预览</span>\n <button class=\"modal-close\" @click=${() => this._closeImageViewer()}>✕</button>\n </div>\n <div class=\"modal-body\">\n <div class=\"media-stage\"><img src=${current} alt=\"resource-preview\" /></div>\n </div>\n <div class=\"modal-footer\">\n <div class=\"media-footer\">\n <span class=\"muted-text\">${this._imageViewerIndex + 1} / ${images.length}</span>\n <div class=\"group\">\n ${images.length > 1 ? html`<button @click=${() => this._moveImage(-1)}>上一张</button>` : ''}\n ${images.length > 1 ? html`<button @click=${() => this._moveImage(1)}>下一张</button>` : ''}\n <button class=\"primary\" @click=${() => this._closeImageViewer()}>关闭</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderVideoViewer() {\n const video = this._videoResource()\n if (!this._videoViewerOpen || !video?.url) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => this._closeVideoViewer()}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">视频预览</span>\n <button class=\"modal-close\" @click=${() => this._closeVideoViewer()}>✕</button>\n </div>\n <div class=\"modal-body\">\n <div class=\"media-stage\">\n <video src=${video.url} controls playsinline></video>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"primary\" @click=${() => this._closeVideoViewer()}>关闭</button>\n </div>\n </div>\n </div>\n `\n }\n\n private async _save(e?: Event) {\n e?.stopImmediatePropagation()\n const errors = this.validate()\n if (errors.length) {\n showToast(errors[0].message)\n return\n }\n if (!this._hasShownCorrectHint && this._shouldShowCorrectHint()) {\n this._correctHintDialogOpen = true\n return\n }\n try {\n const data = await this.toJSON()\n this._emit('save', data)\n }\n catch (err: any) {\n showToast(err.message)\n }\n }\n\n private _renderPreview() {\n const typeSuffix = this.type === 'single'\n ? '(单选题)'\n : `(${this._titlePlaceholder}${this['least-answer-count'] ? `,至少选${this['least-answer-count']}项${this.type === 'sort' ? '并排序' : ''}` : ''})`\n const answers = this['answer-list'] as Answer[]\n return html`\n <div class=\"preview\">\n <div><span class=\"title\">${this['order-index'] + 1}.${(this as any).title || ''}${typeSuffix}${this['show-key'] && this._isKey ? html`<span class=\"key-badge\">核心题</span>` : ''}</span></div>\n ${this['rich-text-content'] ? html`<div class=\"rich-text\" .innerHTML=${this['rich-text-content']}></div>` : ''}\n <div class=\"preview-answer\">\n ${answers.map((a, i) => html`\n <label class=\"radio\">\n <input type=\"${this.type === 'sort' ? 'checkbox' : 'radio'}\" .checked=${!!a.isCorrect} disabled />\n <span class=\"order\">${this._label(i)}.</span> ${a.title}\n ${this.type !== 'sort' && a.isCorrect ? html`<span class=\"correct\">(支持选项)</span>` : ''}\n ${this.type !== 'sort' && this['exam-answer-relation-type'] === 1 ? html`<span class=\"result-info\">${a.resultItem ? '(已设置结果项)' : '(未设置结果项)'}</span>` : ''}\n ${this.type !== 'sort' && this['exam-answer-relation-type'] === 2 ? html`<span class=\"result-info\">${a.answerRelations?.length ? '(已设置关联)' : '(未设置关联)'}</span>` : ''}\n </label>\n `)}\n </div>\n ${this['show-category'] && this._categoryId\n ? html`<div class=\"section-row\"><span class=\"value-text\">分类:${this['category-list'].find(item => String(item.categoryId) === String(this._categoryId))?.title || this._categoryId}</span></div>`\n : ''}\n ${this._selectedTagList.length && this['show-tag']\n ? html`\n <div class=\"section-row\">\n <span class=\"value-text\">标签/关键信息:</span>\n <div class=\"tag-list\" style=\"margin-top:6px\">\n ${this._selectedTagList.map(item => html`<span class=\"tag-item\">${item.tagName}</span>`)}\n </div>\n </div>\n `\n : ''}\n ${this['show-resource'] ? this._renderResourceSection() : ''}\n </div>\n `\n }\n\n private _renderEdit() {\n return html`\n <div class=\"flex-items-start\">\n <div class=\"label\"><span>题目:</span></div>\n <div style=\"flex:1\">\n <div class=\"el-input search-wrap\">\n <textarea rows=\"2\" .value=${this._title} ?disabled=${this['is-save']}\n maxlength=${this.TITLE_MAX}\n @input=${(e: Event) => this._onTitleInput(e)}\n placeholder=\"【${this._titlePlaceholder}】请输入问题\"></textarea>\n <span class=\"char-counter\">${this._title.length}/${this.TITLE_MAX}</span>\n ${this._renderSearchDropdown()}\n </div>\n </div>\n </div>\n\n ${['multiple', 'sort'].includes(this.type)\n ? html`\n <div class=\"flex-items-start\" style=\"margin-top:12px\">\n <div class=\"label\"><span>设置:</span></div>\n <select class=\"el-select\" .value=${this._leastAnswerCount ? String(this._leastAnswerCount) : ''} ?disabled=${this['is-save']}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value\n this._leastAnswerCount = value ? Number(value) : 0\n }}>\n <option value=\"\">至少选择几项</option>\n ${Array.from({ length: Math.max(0, this._answers.length - 1) }, (_, i) => i + 2).map(n => html`\n <option value=${n} ?selected=${this._leastAnswerCount === n}>至少选择${n}项</option>\n `)}\n </select>\n </div>\n `\n : ''}\n\n <div class=\"answer-list\">\n ${this._answers.map((a, i) => html`\n <div class=\"answer-item\">\n <span class=\"label\">${this._label(i)}.</span>\n <div class=\"input\">\n <input type=\"text\" .value=${a.title} ?disabled=${this['is-save']}\n maxlength=${this.ANSWER_MAX}\n @input=${(e: Event) => this._onAnswerInput(e, i)}\n placeholder=\"选项${this._label(i)}\" />\n <span class=\"char-counter\">${a.title.length}/${this.ANSWER_MAX}</span>\n </div>\n\n ${this.type === 'sort' && this._getSortOrder(i) !== null\n ? html`<span class=\"sort-badge\">第${this._getSortOrder(i)}位</span>`\n : ''}\n\n ${['single', 'multiple'].includes(this.type)\n ? html`\n <label class=\"correct ${a.isCorrect ? 'is-correct' : ''}\">\n <input type=\"checkbox\" .checked=${a.isCorrect} ?disabled=${this['is-save']}\n @change=${(e: Event) => this._setCorrect(a, (e.target as HTMLInputElement).checked)} />\n 支持选项\n </label>\n `\n : ''}\n\n <span class=\"icon ${this['is-save'] ? 'disabled' : ''}\"\n @click=${() => this._addAnswer(i)}>\n ${iconPlus}\n </span>\n <span class=\"icon ${this['is-save'] || this._answers.length < 3 ? 'disabled' : ''}\"\n @click=${() => this._deleteAnswer(i)}>\n ${iconRemove}\n </span>\n\n ${this['exam-answer-relation-type'] === 1 && this.type !== 'sort'\n ? html`\n <span class=\"link\" @click=${() => this._openResultDialog(i)}>${a.resultItem ? '编辑结果' : '添加结果'}</span>\n `\n : ''}\n ${this['exam-answer-relation-type'] === 2 && this.type !== 'sort'\n ? html`\n <span class=\"link\" @click=${() => this._setRelation(a, i)}>${a.answerRelations?.length ? `关联了${this._relationLength(a.answerRelations)}项` : '关联检查'}</span>\n `\n : ''}\n </div>\n `)}\n </div>\n\n ${this.type === 'sort'\n ? html`\n <div class=\"flex-items-center\" style=\"margin-top:12px\">\n <div class=\"label\"><span>排序答案:</span></div>\n <div style=\"flex:1\">\n <div class=\"multi-select-wrapper\">\n <div class=\"multi-select ${this._sortDropdownOpen ? 'focused' : ''} ${this['is-save'] ? 'disabled' : ''}\"\n @click=${() => { if (!this['is-save']) { this._sortDropdownOpen = !this._sortDropdownOpen; this.requestUpdate() } }}>\n ${this._orderList.length > 0\n ? this._orderList.map(l => html`\n <span class=\"tag\">\n ${l}\n <span class=\"tag-close\" @click=${(e: Event) => { e.stopPropagation(); this._removeSortItem(l) }}>✕</span>\n </span>\n `)\n : html`<span class=\"placeholder\">请按顺序选择排序答案</span>`\n }\n <span class=\"arrow\">${iconArrow}</span>\n </div>\n ${this._sortDropdownOpen\n ? html`\n <div class=\"multi-select-dropdown\">\n ${this._answers.map((_, i) => html`\n <div class=\"multi-select-option ${this._orderList.includes(this._label(i)) ? 'selected' : ''}\"\n @click=${() => { this._toggleSortItem(this._label(i)); this.requestUpdate() }}>\n ${this._label(i)}\n </div>\n `)}\n </div>\n `\n : ''}\n </div>\n </div>\n </div>\n `\n : ''}\n\n ${this._renderTagSection()}\n\n ${this._renderCategorySection()}\n\n ${this._renderAiSection()}\n\n ${this._renderResourceSection()}\n\n ${this._showRichText\n ? html`\n <div class=\"flex-items-start\" style=\"margin-top:12px\">\n <div class=\"label\"><span>富文本:</span></div>\n <div style=\"flex:1\">\n <qxs-blocksuite-editor\n .content=${this._richText}\n .upload-image=${this['upload-image']}\n ?is-edit=${true}\n @input=${(e: CustomEvent) => { this._richText = (e.target as any).getContent() }}\n ></qxs-blocksuite-editor>\n ${!this['show-action']\n ? html`<div class=\"flex-justify-end\" style=\"margin-top:8px\"><span class=\"el-link danger\" @click=${() => { this._showRichText = false; this._richText = '' }}>删除富文本</span></div>`\n : ''}\n </div>\n </div>\n `\n : ''}\n\n ${this['show-analysis']\n ? html`\n <div class=\"flex-items-start\" style=\"margin-top:12px\">\n <div class=\"label\"><span>解析:</span></div>\n <div style=\"flex:1\">\n <textarea rows=\"2\" .value=${this._analysis}\n @input=${(e: Event) => { this._analysis = (e.target as HTMLTextAreaElement).value }}\n placeholder=\"请输入题目解析\"></textarea>\n </div>\n </div>\n `\n : ''}\n `\n }\n\n render() {\n return html`\n <qxs-subject-layout .show-edit=${this['is-edit']}>\n <div slot=\"preview\">${this._renderPreview()}</div>\n <div slot=\"edit\">${this._renderEdit()}</div>\n ${this['show-action']\n ? html`\n <qxs-subject-action\n .is-edit=${this['is-edit']}\n .is-set=${this['is-set']}\n .is-key=${this._isKey}\n .show-add=${this['show-add']}\n .show-answer-setting=${this['show-answer-setting'] && ['single', 'multiple', 'sort'].includes(this.type)}\n .show-key=${this['show-key'] && ['single', 'multiple', 'sort'].includes(this.type)}\n .show-rich-text=${this._showRichText}\n .show-jump=${this['show-jump']}\n answer-check-type=${this._answerCheckType}\n exam-answer-relation-type=${this['exam-answer-relation-type']}\n @delete=${() => this._emit('delete')}\n @save=${this._save}\n @edit=${() => this._emit('edit')}\n @move=${(e: CustomEvent) => this._emit('move', e.detail)}\n @jump=${() => this._emit('jump', {\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n answerType: this.type,\n })}\n @add=${(e: CustomEvent) => this._emit('add', e.detail)}\n @set-key=${(e: CustomEvent) => { this._isKey = e.detail.value; this._emit('set-key', e.detail) }}\n @set-answer-setting=${(e: CustomEvent) => { this._answerCheckType = e.detail.value }}\n @on-show-rich-text=${() => {\n this._showRichText = !this._showRichText\n if (!this._showRichText) {\n this._richText = ''\n }\n }}\n ></qxs-subject-action>\n `\n : ''}\n </qxs-subject-layout>\n ${this._renderResultDialog()}\n ${this._renderCorrectHintDialog()}\n ${this._renderImageViewer()}\n ${this._renderVideoViewer()}\n `\n }\n}\n\nexport function register() {}\n"],"names":["SubjectError","Error","constructor","message","code","arguments","length","undefined","field","row","super","this","name","from","options","iconPlus","html","iconRemove","iconArrow","normalizeTitle","text","replace","toLowerCase","showToast","msg","el","document","createElement","textContent","Object","assign","style","position","top","left","transform","padding","borderRadius","fontSize","color","background","zIndex","boxShadow","transition","opacity","body","appendChild","setTimeout","remove","QxsSubjectSingle","LitElement","type","analysis","async","Promise","resolve","reject","reader","FileReader","onload","e","target","result","onerror","readAsDataURL","file","_answers","title","isCorrect","_title","_analysis","_richText","_showRichText","_leastAnswerCount","_answerCheckType","_isKey","_orderList","_selectedTagList","_categoryId","_searchResults","_searchOpen","_searchLoading","_resultDialogOpen","_resultDialogIndex","_resultDialogValue","_sortDropdownOpen","_imageViewerOpen","_imageViewerIndex","_videoViewerOpen","_correctHintDialogOpen","_hasShownCorrectHint","_searchTimer","_searchToken","TITLE_MAX","ANSWER_MAX","_handleDocumentClick","path","composedPath","wrapper","shadowRoot","querySelector","searchWrap","includes","requestUpdate","v","arr","Array","isArray","map","a","connectedCallback","addEventListener","_syncExternalProps","firstUpdated","disconnectedCallback","removeEventListener","window","clearTimeout","willUpdate","changed","has","_syncProps","item","String","_syncExamExpand","Number","ids","split","answers","id","index","findIndex","answer","answerIndex","answerId","orderIndex","_label","filter","Boolean","_emit","detail","dispatchEvent","CustomEvent","bubbles","composed","_searchAnswerType","_queueSearch","query","keyword","trim","_runSearch","currentToken","params","URLSearchParams","searchKey","answerType","response","fetch","toString","ok","status","payload","json","data","value","error","_selectSearchResult","selectedTitle","examId","questionId","customId","_applyAiAnswer","aiTitles","line","matched","selected","shouldSelect","_removeTag","tagId","_chooseTag","_onCategoryChange","_setRelation","customAnswerId","uid","current","_relationLength","reduce","count","relationAnswers","_imageResources","resourceType","resource","middle","url","_videoResource","find","_openImageViewer","_closeImageViewer","_moveImage","step","images","_openVideoViewer","_closeVideoViewer","i","fromCharCode","_titlePlaceholder","_setCorrect","val","forEach","_onTitleInput","slice","_onAnswerInput","idx","_addAnswer","splice","_deleteAnswer","_","_toggleSortItem","letter","indexOf","l","_removeSortItem","_getSortOrder","pos","_sortAnswerValue","charCodeAt","_shouldShowCorrectHint","some","toJSON","answerCheckType","leastAnswerCount","selectedTagList","examExpand","join","showRichText","richText","orderList","expand","isSetCorrectAnswer","correctAnswerCount","Set","size","examRichTextContent","examAnswerRelationType","isKey","categoryId","memberTagInfo","tagInfos","aiAnswer","resourceList","examResourceBOList","validate","errors","push","_openResultDialog","resultItem","_saveResultDialog","_renderCorrectHintDialog","stopPropagation","_renderResultDialog","_renderSearchDropdown","_renderTagSection","tagName","_renderCategorySection","_renderAiSection","_renderResourceSection","video","src","_renderImageViewer","_renderVideoViewer","_save","stopImmediatePropagation","err","_renderPreview","typeSuffix","answerRelations","_renderEdit","Math","max","n","checked","getContent","render","styles","css","__decorateClass","property","attribute","prototype","reflect","state","safeCustomElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"single.cjs","sources":["../../../../packages/components-wc/src/subject/single.ts"],"sourcesContent":["import type { AnswerType } from './types'\nimport { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { uid } from '../base/uid'\n\nexport interface SubjectErrorOptions {\n message: string\n code?: string\n field?: string\n row?: any\n}\n\nexport class SubjectError extends Error {\n constructor(\n message: string,\n public code: string = 'VALIDATION_ERROR',\n public field?: string,\n public row?: any,\n ) {\n super(message)\n this.name = 'SubjectError'\n }\n\n static from(options: SubjectErrorOptions): SubjectError {\n return new SubjectError(options.message, options.code, options.field, options.row)\n }\n}\n\ninterface Answer {\n title: string\n isCorrect: boolean\n customAnswerId?: string\n answerId?: string\n resultItem?: string\n orderIndex?: number\n answerRelations?: any[]\n relationType?: number | null\n}\n\nconst iconPlus = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>`\nconst iconRemove = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></svg>`\nconst iconArrow = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"/></svg>`\n\nfunction normalizeTitle(text: string) {\n return text\n .replace(/^\\d+\\.\\s*/, '')\n .replace(/[\\s,,。.!!??;;::、'\"“”‘’()()[\\]【】\\-_/\\\\]+/g, '')\n .toLowerCase()\n}\n\nfunction showToast(msg: string) {\n const el = document.createElement('div')\n el.textContent = msg\n Object.assign(el.style, {\n position: 'fixed', top: '20px', left: '50%', transform: 'translateX(-50%)',\n padding: '10px 20px', borderRadius: '4px', fontSize: '13px', color: '#fff',\n background: '#f56c6c', zIndex: '99999', boxShadow: '0 4px 12px rgba(0,0,0,.15)',\n transition: 'opacity .3s', opacity: '1',\n })\n document.body.appendChild(el)\n setTimeout(() => { el.style.opacity = '0'; setTimeout(() => el.remove(), 300) }, 2500)\n}\n\n/**\n * 标签项 - 用于关联题目的标签信息\n * @typedef {object} TagItem\n * @property {string|number} tagId - 标签ID\n * @property {string} tagName - 标签名称\n * @property {KnowledgePointInfo[]} [knowledgePointInfos] - 关联的知识点的列表\n */\nexport interface TagItem {\n tagId: string | number\n tagName: string\n knowledgePointInfos?: KnowledgePointInfo[]\n}\n\n/**\n * 知识点信息\n * @typedef {object} KnowledgePointInfo\n * @property {string|number} knowledgePointId - 知识点ID\n * @property {string} knowledgePointName - 知识点名称\n */\nexport interface KnowledgePointInfo {\n knowledgePointId: string | number\n knowledgePointName: string\n}\n\n/**\n * 分类选项\n * @typedef {object} Category\n * @property {string|number} categoryId - 分类ID\n * @property {string} title - 分类标题\n */\nexport interface Category {\n categoryId: string | number\n title: string\n}\n\n/**\n * 题库搜索结果项\n * @typedef {object} SearchResult\n * @property {string|number} id - 题目ID\n * @property {string} title - 题目标题\n * @property {string} value - 用于搜索框显示的值\n * @property {any} [key: string] - 其他扩展字段\n */\nexport interface SearchResult {\n id: string | number\n title: string\n value: string\n [key: string]: any\n}\n\n/**\n * 题目资源(图片或视频)\n * @typedef {object} Resource\n * @property {1|2} resourceType - 资源类型:1-图片, 2-视频\n * @property {object} resource - 资源详情\n * @property {string} [resource.url] - 资源URL\n * @property {string} [resource.middle] - 中等尺寸图片URL\n * @property {string} [resource.videoId] - 视频ID\n */\nexport interface Resource {\n resourceType: 1 | 2\n resource: {\n url?: string\n middle?: string\n videoId?: string\n [key: string]: any\n }\n}\n\n@safeCustomElement('qxs-subject-single')\nexport class QxsSubjectSingle extends LitElement {\n static styles = css`\n :host { display: block; font-family: system-ui, -apple-system, \"PingFang SC\", \"Microsoft YaHei\", sans-serif; font-size: 12px; color: #5a5a5a; }\n *, ::before, ::after { box-sizing: border-box; }\n\n .preview { padding: 12px 0; }\n .preview .title { font-size: 14px; color: #303133; }\n .preview .title .key-badge {\n display: inline-block;\n margin-left: 8px;\n padding: 1px 6px;\n font-size: 11px;\n color: #fff;\n background: #f56c6c;\n border-radius: 3px;\n vertical-align: middle;\n }\n .preview .rich-text { margin-top: 8px; }\n .preview .rich-text img { max-width: 100%; }\n .preview-answer { display: flex; flex-direction: column; margin-top: 12px; }\n .preview-answer .radio { margin-top: 8px; padding-left: 8px; display: flex; align-items: center; gap: 6px; }\n .preview-answer .order { color: #909399; }\n .preview-answer .correct { color: #67c23a; }\n .preview-answer .result-info { color: #909399; }\n\n .flex { display: flex; }\n .flex-items-center { display: flex; align-items: center; }\n .flex-items-start { display: flex; align-items: flex-start; }\n .flex-justify-end { display: flex; justify-content: flex-end; }\n .label { min-width: 60px; font-size: 13px; color: #606266; }\n\n textarea {\n border: 1px solid #dcdfe6; border-radius: 3px; padding: 5px 11px;\n font-size: 13px; font-family: inherit; width: 100%; resize: none; transition: border-color .2s;\n line-height: 1.5; display: block; box-sizing: border-box;\n }\n textarea:focus { border-color: #3D61E3; outline: none; }\n textarea:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n .el-input { position: relative; display: block; }\n .el-input textarea { padding-bottom: 24px; }\n .el-input .char-counter {\n position: absolute; right: 12px; bottom: 8px;\n font-size: 12px; color: #909399; line-height: 1; pointer-events: none;\n }\n\n .answer-list { margin-top: 12px; }\n .answer-item { display: flex; align-items: center; margin-top: 6px; border-radius: 4px; }\n .answer-item .label { min-width: 60px; font-size: 13px; color: #909399; }\n .answer-item .input { flex: 1; max-width: 360px; position: relative; display: block; }\n .answer-item .input input {\n height: 32px; padding: 0 50px 0 8px;\n font-size: 13px; line-height: 32px;\n border: 1px solid #dcdfe6; border-radius: 3px; width: 100%;\n transition: border-color .2s; box-sizing: border-box;\n }\n .answer-item .input input:focus { border-color: #3D61E3; outline: none; }\n .answer-item .input input:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n .answer-item .input .char-counter {\n position: absolute; right: 8px; top: 50%; transform: translateY(-50%);\n font-size: 12px; color: #909399; line-height: 1; pointer-events: none;\n }\n\n .answer-item .correct { margin: 0 10px; color: #909399; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }\n .answer-item .correct:hover { color: #3D61E3; }\n .answer-item .correct.is-correct { color: #67c23a; }\n .answer-item .correct input { width: 14px; height: 14px; cursor: pointer; accent-color: #3D61E3; }\n\n .answer-item .icon {\n margin-left: 6px; cursor: pointer; display: inline-flex;\n align-items: center; justify-content: center;\n width: 24px; height: 24px; border-radius: 4px;\n border: 1px solid #dcdfe6; background: #fff; color: #909399;\n transition: all 0.2s;\n }\n .answer-item .icon:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n .answer-item .icon.disabled { color: #e4e7ed; border-color: #e4e7ed; cursor: not-allowed; }\n\n .answer-item .link { margin-left: 8px; color: #3D61E3; cursor: pointer; font-size: 12px; white-space: nowrap; }\n .answer-item .link:hover { color: #2D4CB8; }\n\n .el-select {\n width: 150px; height: 32px; border: 1px solid #dcdfe6; border-radius: 3px;\n padding: 0 8px; font-size: 13px; background: #fff; appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23c0c4cc' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 8px center;\n }\n .el-select:focus { border-color: #3D61E3; outline: none; }\n .el-select:disabled { background: #f5f7fa; color: #c0c4cc; cursor: not-allowed; }\n\n .sort-badge { font-weight: bold; color: #3D61E3; margin-left: 10px; }\n\n .el-link { color: #3D61E3; cursor: pointer; font-size: 12px; }\n .el-link:hover { color: #2D4CB8; }\n .el-link.danger { color: #f56c6c; }\n\n .section-row { margin-top: 12px; }\n .value-text { font-size: 13px; color: #606266; white-space: pre-wrap; }\n .muted-text { font-size: 12px; color: #909399; }\n\n .search-wrap { position: relative; }\n .search-dropdown {\n position: absolute; z-index: 120; left: 0; right: 0; top: calc(100% + 4px);\n background: #fff; border: 1px solid #e4e7ed; border-radius: 6px;\n box-shadow: 0 8px 20px rgba(0,0,0,.12); overflow: hidden;\n }\n .search-item {\n padding: 10px 12px; cursor: pointer; transition: background .2s;\n font-size: 13px; color: #606266; line-height: 1.4;\n }\n .search-item:hover { background: #f5f7fa; color: #3D61E3; }\n .search-empty { padding: 10px 12px; font-size: 12px; color: #909399; }\n\n .tag-list { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; min-height: 32px; }\n .tag-item {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 4px 8px; font-size: 12px; line-height: 1;\n color: #3D61E3; background: #ecf5ff; border: 1px solid #d9ecff; border-radius: 4px;\n }\n .tag-item .close { cursor: pointer; color: #909399; }\n .tag-item .close:hover { color: #f56c6c; }\n .tag-hint { font-size: 12px; color: #909399; }\n\n .resource-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 8px; }\n .resource-summary { font-size: 12px; color: #606266; }\n .resource-thumbs { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 8px; }\n .resource-thumb {\n width: 72px; height: 72px; object-fit: cover; border-radius: 6px;\n border: 1px solid #e4e7ed; cursor: pointer; background: #f5f7fa;\n }\n .resource-video {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 88px; height: 30px; padding: 0 10px; border: 1px solid #dcdfe6; border-radius: 4px;\n color: #606266; background: #fff; cursor: pointer; font-size: 12px; transition: all .2s;\n }\n .resource-video:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n .media-stage { display: flex; align-items: center; justify-content: center; min-height: 240px; }\n .media-stage img, .media-stage video { max-width: 100%; max-height: 60vh; border-radius: 6px; }\n .media-footer { display: flex; justify-content: space-between; align-items: center; gap: 8px; width: 100%; }\n .media-footer .group { display: flex; gap: 8px; }\n\n /* Multi-select with tags (Element Plus style) */\n .multi-select-wrapper { position: relative; }\n .multi-select {\n width: 240px; height: 28px; border: 1px solid #dcdfe6; border-radius: 3px;\n padding: 0 30px 0 8px; font-size: 13px; background: #fff; cursor: pointer;\n display: flex; flex-wrap: nowrap; align-items: center; gap: 4px;\n transition: border-color .2s; position: relative; overflow: hidden;\n }\n .multi-select:hover { border-color: #c0c4cc; }\n .multi-select.focused { border-color: #3D61E3; }\n .multi-select.disabled { background: #f5f7fa; cursor: not-allowed; }\n .multi-select .placeholder { color: #c0c4cc; font-size: 13px; padding: 4px 0; }\n .multi-select .arrow {\n position: absolute; right: 8px; top: 50%; transform: translateY(-50%);\n color: #c0c4cc; display: inline-flex; transition: transform .2s;\n }\n .multi-select.focused .arrow { transform: translateY(-50%) rotate(180deg); color: #3D61E3; }\n .multi-select .tag {\n display: inline-flex; align-items: center; gap: 2px;\n background: #f0f2f5; border-radius: 3px; padding: 0 6px; height: 20px;\n font-size: 12px; color: #606266; line-height: 20px;\n }\n .multi-select .tag .tag-close {\n display: inline-flex; cursor: pointer; color: #909399; margin-left: 2px; line-height: 1;\n }\n .multi-select .tag .tag-close:hover { color: #3D61E3; }\n .multi-select-dropdown {\n position: absolute; z-index: 100; background: #fff; left: 0; top: 100%; margin-top: 4px;\n border: 1px solid #e4e7ed; border-radius: 3px;\n box-shadow: 0 4px 12px rgba(0,0,0,.12); min-width: 240px; max-height: 140px; overflow-y: auto;\n }\n .multi-select-option {\n padding: 4px 12px; font-size: 13px; color: #606266; cursor: pointer;\n transition: background .2s;\n }\n .multi-select-option:hover { background: #f5f7fa; }\n .multi-select-option.selected { color: #3D61E3; font-weight: 500; }\n\n .modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.45); z-index: 9000; display: flex; align-items: center; justify-content: center; }\n .modal { background: #fff; border-radius: 6px; width: 520px; max-width: 90vw; box-shadow: 0 12px 32px rgba(0,0,0,.12); display: flex; flex-direction: column; }\n .modal-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px 12px; border-bottom: 1px solid #e4e7ed; }\n .modal-title { font-size: 14px; font-weight: 600; color: #303133; }\n .modal-close { background: none; border: none; font-size: 18px; cursor: pointer; color: #909399; padding: 0; line-height: 1; }\n .modal-close:hover { color: #3D61E3; }\n .modal-body { padding: 20px; }\n .modal-body textarea { min-height: 120px; }\n .modal-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 20px; border-top: 1px solid #e4e7ed; }\n .modal-footer button { padding: 6px 16px; font-size: 12px; border-radius: 3px; cursor: pointer; border: 1px solid #dcdfe6; background: #fff; color: #606266; }\n .modal-footer button:hover { color: #3D61E3; border-color: #a0cfff; }\n .modal-footer button.primary { background: #3D61E3; border-color: #3D61E3; color: #fff; }\n .modal-footer button.primary:hover { background: #2D4CB8; border-color: #2D4CB8; }\n `\n\n @property({ type: Number, attribute: 'order-index' }) 'order-index' = 0\n @property({ type: Boolean, attribute: 'is-edit' }) 'is-edit' = false\n @property({ type: Boolean, attribute: 'is-save' }) 'is-save' = false\n @property({ type: Boolean, attribute: 'is-set' }) 'is-set' = false\n @property({ type: Boolean, attribute: 'is-key' }) 'is-key' = false\n @property({ type: Boolean, attribute: 'show-action' }) 'show-action' = true\n @property({ type: Boolean, attribute: 'show-add' }) 'show-add' = true\n @property({ type: Boolean, attribute: 'show-answer-setting' }) 'show-answer-setting' = false\n @property({ type: Boolean, attribute: 'show-key' }) 'show-key' = false\n @property({ type: Boolean, attribute: 'show-analysis' }) 'show-analysis' = true\n @property({ attribute: 'question-type', reflect: true }) type: AnswerType = 'single'\n @property({ type: Number, attribute: 'answer-check-type' }) 'answer-check-type' = 1\n @property({ type: Number, attribute: 'exam-answer-relation-type' }) 'exam-answer-relation-type' = 0\n @property({ type: String, attribute: 'rich-text-content' }) 'rich-text-content' = ''\n @property({ type: String }) analysis = ''\n @property({ type: Number, attribute: 'least-answer-count' }) 'least-answer-count' = 0\n @property({ type: String, attribute: 'exam-expand' }) 'exam-expand' = ''\n @property({ type: String, attribute: 'custom-id' }) 'custom-id' = ''\n @property({ type: Number, attribute: 'exam-id' }) 'exam-id' = 0\n @property({ type: String, attribute: 'category-id' }) 'category-id' = ''\n @property({ type: Object, attribute: 'upload-image' }) 'upload-image': (file: File) => Promise<string> = async (file: File) => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = e => resolve(e.target?.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n }\n\n @property({ type: Array, attribute: 'answer-list' })\n get 'answer-list'() { return this._answers }\n\n set 'answer-list'(v: any) {\n // 编辑模式下不接受外部更新,避免覆盖用户正在编辑的内容\n if (this['is-edit']) {\n return\n }\n const arr = Array.isArray(v) ? v : []\n this._answers = arr.length\n ? arr.map((a: any) => ({ ...a }))\n : [\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n ]\n this.requestUpdate('answer-list')\n }\n\n // ============ 业务接口 Props ============\n /**\n * 标签列表 - 用于关联题目的标签信息\n * @type {TagItem[]}\n * @description 业务系统传入已选择的标签列表\n */\n @property({ type: Array, attribute: 'tag-list' }) 'tag-list': TagItem[] = []\n /**\n * 分类列表 - 可用于题目的分类选项\n * @type {Category[]}\n * @description 业务系统传入可选的分类列表\n */\n @property({ type: Array, attribute: 'category-list' }) 'category-list': Category[] = []\n /**\n * AI 推荐答案 - AI 根据题目内容推荐的答案\n * @type {string}\n * @description AI 返回的推荐答案,格式如 \"1. 选项A\\n2. 选项B\"\n */\n @property({ type: String, attribute: 'ai-answer' }) 'ai-answer' = ''\n /**\n * 图片/视频资源列表 - 题目附带的媒体资源\n * @type {Resource[]}\n * @description 题目附带图片或视频资源\n */\n @property({ type: Array, attribute: 'resource-list' }) 'resource-list': Resource[] = []\n /**\n * 是否显示标签功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示标签选择 UI\n */\n @property({ type: Boolean, attribute: 'show-tag' }) 'show-tag' = false\n /**\n * 是否显示分类功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示分类选择 UI\n */\n @property({ type: Boolean, attribute: 'show-category' }) 'show-category' = false\n /**\n * 是否显示 AI 推荐功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示 AI 推荐答案 UI\n */\n @property({ type: Boolean, attribute: 'show-ai' }) 'show-ai' = false\n /**\n * 是否显示资源功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示图片/视频资源 UI\n */\n @property({ type: Boolean, attribute: 'show-resource' }) 'show-resource' = false\n /**\n * 是否显示跳题功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示跳题逻辑设置入口\n */\n @property({ type: Boolean, attribute: 'show-jump' }) 'show-jump' = false\n /**\n * 跳题状态 - 是否已设置跳题逻辑\n * @type {boolean}\n * @default false\n * @description 标记当前题目是否已设置跳题逻辑\n */\n @property({ type: Boolean, attribute: 'has-jump' }) 'has-jump' = false\n /**\n * 题库搜索接口地址\n * @type {string}\n * @description 题库模糊搜索接口地址,用于题库搜索功能\n */\n @property({ type: String, attribute: 'search-api' }) 'search-api' = ''\n /**\n * 题库搜索回调函数\n * @type {Function}\n * @param {string} query - 搜索关键词\n * @param {number} answerType - 题目类型:0-单选, 1-多选\n * @returns {Promise<SearchResult[]>} 搜索结果列表\n * @description 题库搜索的回调函数,由业务系统实现搜索逻辑\n */\n @property({ type: Object, attribute: 'search-handler' }) 'search-handler'?: (query: string, answerType: number) => Promise<SearchResult[]>\n\n // 双向绑定支持\n @property({ type: String, attribute: 'model-value' }) 'model-value' = ''\n @property({ type: Boolean, attribute: 'use-model' }) 'use-model' = false\n\n @state() private _answers: Answer[] = [\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n { title: '', isCorrect: false }, { title: '', isCorrect: false },\n ]\n\n @property({ type: String }) title = ''\n\n @state() private _title = ''\n @state() private _analysis = ''\n @state() private _richText = ''\n @state() private _showRichText = false\n @state() private _leastAnswerCount = 0\n @state() private _answerCheckType = 1\n @state() private _isKey = false\n @state() private _orderList: string[] = []\n @state() private _selectedTagList: TagItem[] = []\n @state() private _categoryId = ''\n @state() private _searchResults: SearchResult[] = []\n @state() private _searchOpen = false\n @state() private _searchLoading = false\n @state() private _resultDialogOpen = false\n @state() private _resultDialogIndex = 0\n @state() private _resultDialogValue = ''\n @state() private _sortDropdownOpen = false\n @state() private _imageViewerOpen = false\n @state() private _imageViewerIndex = 0\n @state() private _videoViewerOpen = false\n @state() private _correctHintDialogOpen = false\n @state() private _hasShownCorrectHint = false\n\n private _searchTimer: number | null = null\n private _searchToken = 0\n\n private readonly TITLE_MAX = 200\n private readonly ANSWER_MAX = 100\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener('click', this._handleDocumentClick)\n this._syncExternalProps()\n }\n\n firstUpdated() {\n this._syncExternalProps()\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleDocumentClick)\n if (this._searchTimer) {\n window.clearTimeout(this._searchTimer)\n this._searchTimer = null\n }\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const path = e.composedPath()\n const wrapper = this.shadowRoot?.querySelector('.multi-select-wrapper')\n const searchWrap = this.shadowRoot?.querySelector('.search-wrap')\n if (wrapper && !path.includes(wrapper)) {\n this._sortDropdownOpen = false\n }\n if (searchWrap && !path.includes(searchWrap)) {\n this._searchOpen = false\n }\n this.requestUpdate()\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('is-edit') && this['is-edit']) { this._syncProps() }\n if (!this['is-edit'] && (changed.has('title') || changed.has('answer-list') || changed.has('analysis') || changed.has('least-answer-count') || changed.has('answer-check-type') || changed.has('tag-list') || changed.has('category-id') || changed.has('rich-text-content'))) {\n this._syncExternalProps()\n }\n if (changed.has('is-key')) {\n this._isKey = this['is-key']\n }\n if (changed.has('tag-list')) {\n this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n }\n if (changed.has('category-id')) {\n this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n }\n if (changed.has('exam-expand') || changed.has('answer-list')) { this._syncExamExpand() }\n if (changed.has('model-value') && this['use-model']) {\n this._title = this['model-value']\n }\n }\n\n private _syncExternalProps() {\n this._title = this.title || ''\n this._analysis = this.analysis || ''\n this._leastAnswerCount = Number(this['least-answer-count']) || 0\n this._answerCheckType = this['answer-check-type'] || 1\n this._isKey = this['is-key']\n this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n this._richText = this['rich-text-content'] || ''\n this._showRichText = !!this['rich-text-content']\n if (this['answer-list']?.length) {\n this._answers = this['answer-list'].map((a: any) => ({\n ...a,\n title: a.title || '',\n isCorrect: !!a.isCorrect,\n }))\n }\n }\n\n private _syncProps() {\n this._title = (this as any).title || ''\n this._analysis = this.analysis || ''\n this._leastAnswerCount = Number(this['least-answer-count']) || 0\n this._answerCheckType = this['answer-check-type'] || 1\n this._isKey = this['is-key']\n this._selectedTagList = Array.isArray(this['tag-list']) ? this['tag-list'].map(item => ({ ...item })) : []\n this._categoryId = this['category-id'] ? String(this['category-id']) : ''\n this._richText = this['rich-text-content'] || ''\n this._showRichText = !!this['rich-text-content']\n if (this['answer-list']?.length) {\n this._answers = this['answer-list'].map((a: any) => ({\n ...a,\n title: a.title || '',\n isCorrect: !!a.isCorrect,\n }))\n }\n this._syncExamExpand()\n }\n\n private _syncExamExpand() {\n if (!this['exam-expand'] || !this['answer-list']?.length) { return }\n const ids = this['exam-expand'].split(',')\n const answers = this['answer-list'] as any[]\n this._orderList = ids.map((id) => {\n const index = answers.findIndex((answer, answerIndex) =>\n String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n )\n return index >= 0 ? this._label(index) : ''\n }).filter(Boolean)\n }\n\n private _emit(name: string, detail?: unknown) {\n this.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail: detail ?? null }))\n }\n\n private _searchAnswerType() {\n if (this.type === 'single') { return 0 }\n if (this.type === 'multiple') { return 1 }\n return 5\n }\n\n private _queueSearch(query: string) {\n if (this._searchTimer) {\n window.clearTimeout(this._searchTimer)\n this._searchTimer = null\n }\n const keyword = query.trim()\n if (!keyword || (!this['search-api'] && typeof this['search-handler'] !== 'function')) {\n this._searchResults = []\n this._searchOpen = false\n this._searchLoading = false\n return\n }\n this._searchTimer = window.setTimeout(() => {\n void this._runSearch(keyword)\n }, 300)\n }\n\n private async _runSearch(query: string) {\n const currentToken = ++this._searchToken\n this._searchLoading = true\n this._searchOpen = true\n this.requestUpdate()\n try {\n let result: SearchResult[] = []\n if (typeof this['search-handler'] === 'function') {\n result = await this['search-handler'](query, this._searchAnswerType())\n }\n else if (this['search-api']) {\n const params = new URLSearchParams({\n searchKey: query,\n answerType: String(this._searchAnswerType()),\n })\n const response = await fetch(`${this['search-api']}${this['search-api'].includes('?') ? '&' : '?'}${params.toString()}`)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`)\n }\n const payload = await response.json()\n const list = Array.isArray(payload) ? payload : Array.isArray(payload?.data) ? payload.data : []\n result = list.map((item: any) => ({\n ...item,\n value: item?.value || item?.title || '',\n }))\n }\n if (currentToken !== this._searchToken) { return }\n this._searchResults = Array.isArray(result) ? result : []\n }\n catch (error: any) {\n if (currentToken !== this._searchToken) { return }\n this._searchResults = []\n showToast(error?.message || '题库搜索失败')\n }\n finally {\n if (currentToken === this._searchToken) {\n this._searchLoading = false\n this.requestUpdate()\n }\n }\n }\n\n private _selectSearchResult(item: SearchResult) {\n const selectedTitle = item.value || item.title || ''\n this._title = selectedTitle\n this._searchResults = []\n this._searchOpen = false\n if (this['use-model']) {\n this.dispatchEvent(new CustomEvent('update:modelValue', {\n bubbles: true,\n composed: true,\n detail: this._title,\n }))\n }\n this._emit('title-select', {\n ...item,\n id: item.id ?? item.examId ?? item.questionId,\n title: item.title || selectedTitle,\n value: selectedTitle,\n customId: this['custom-id'] || '',\n })\n }\n\n private _applyAiAnswer() {\n if (!this['ai-answer']?.trim()) {\n showToast('暂无 AI 推荐答案')\n return\n }\n const aiTitles = this['ai-answer']\n .split(/\\r?\\n/)\n .map(line => normalizeTitle(line))\n .filter(Boolean)\n let matched = 0\n if (this.type === 'single') {\n let selected = false\n this._answers = this._answers.map((answer) => {\n const shouldSelect = !selected && aiTitles.includes(normalizeTitle(answer.title || ''))\n if (shouldSelect) {\n selected = true\n matched++\n }\n return { ...answer, isCorrect: shouldSelect }\n })\n }\n else {\n this._answers = this._answers.map((answer) => {\n const shouldSelect = aiTitles.includes(normalizeTitle(answer.title || ''))\n if (shouldSelect) { matched++ }\n return { ...answer, isCorrect: shouldSelect }\n })\n }\n if (!matched) {\n showToast('未找到匹配的选项,请检查选项内容是否一致')\n return\n }\n this.requestUpdate()\n }\n\n private _removeTag(tagId: string | number) {\n this._selectedTagList = this._selectedTagList.filter(item => String(item.tagId) !== String(tagId))\n this._emit('tag-change', {\n value: this._selectedTagList,\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n })\n }\n\n private _chooseTag() {\n this._emit('choose-tag', {\n value: this._selectedTagList,\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n })\n }\n\n private _onCategoryChange(value: string) {\n this._categoryId = value\n this._emit('category-change', {\n value,\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n })\n }\n\n private _setRelation(item: Answer, answerIndex: number) {\n const answer = item.customAnswerId\n ? { ...item }\n : { ...item, customAnswerId: item.answerId || uid() }\n this._answers = this._answers.map((current, index) => index === answerIndex ? answer : current)\n this.requestUpdate()\n this._emit('set-relation', {\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n answerIndex,\n answer,\n })\n }\n\n private _relationLength(relations: any[] = []) {\n return relations.reduce((count, item) => count + (Array.isArray(item?.relationAnswers) ? item.relationAnswers.length : 0), 0)\n }\n\n private _imageResources() {\n return (this['resource-list'] || [])\n .filter(item => item.resourceType === 1)\n .map(item => item.resource.middle || item.resource.url)\n .filter(Boolean) as string[]\n }\n\n private _videoResource() {\n return (this['resource-list'] || []).find(item => item.resourceType === 2)?.resource || null\n }\n\n private _openImageViewer(index = 0) {\n if (!this._imageResources().length) { return }\n this._imageViewerIndex = index\n this._imageViewerOpen = true\n }\n\n private _closeImageViewer() {\n this._imageViewerOpen = false\n }\n\n private _moveImage(step: number) {\n const images = this._imageResources()\n if (!images.length) { return }\n this._imageViewerIndex = (this._imageViewerIndex + step + images.length) % images.length\n }\n\n private _openVideoViewer() {\n if (!this._videoResource()?.url) { return }\n this._videoViewerOpen = true\n }\n\n private _closeVideoViewer() {\n this._videoViewerOpen = false\n }\n\n private _label(i: number) { return String.fromCharCode(65 + i) }\n\n private get _titlePlaceholder() {\n return this.type === 'single' ? '单选题' : this.type === 'multiple' ? '多选题' : '排序题'\n }\n\n private _setCorrect(item: Answer, val: boolean) {\n if (this.type === 'single') {\n this._answers.forEach((a) => { a.isCorrect = false })\n item.isCorrect = val\n }\n else {\n item.isCorrect = val\n }\n this.requestUpdate()\n }\n\n private _onTitleInput(e: Event) {\n const el = e.target as HTMLTextAreaElement\n if (el.value.length > this.TITLE_MAX) { el.value = el.value.slice(0, this.TITLE_MAX) }\n this._title = el.value\n this._queueSearch(this._title)\n // 双向绑定:通知外部更新\n if (this['use-model']) {\n this.dispatchEvent(new CustomEvent('update:modelValue', {\n bubbles: true,\n composed: true,\n detail: this._title,\n }))\n }\n }\n\n private _onAnswerInput(e: Event, idx: number) {\n const el = e.target as HTMLInputElement\n if (el.value.length > this.ANSWER_MAX) { el.value = el.value.slice(0, this.ANSWER_MAX) }\n this._answers[idx].title = el.value\n this.requestUpdate()\n }\n\n private _addAnswer(index: number) {\n if (this['is-save']) { return }\n const arr = [...this._answers]\n arr.splice(index + 1, 0, { title: '', isCorrect: false, customAnswerId: uid() })\n this._answers = arr\n }\n\n private _deleteAnswer(index: number) {\n if (this._answers.length < 3 || this['is-save']) { return }\n this._answers = this._answers.filter((_, i) => i !== index)\n }\n\n private _toggleSortItem(letter: string) {\n const idx = this._orderList.indexOf(letter)\n if (idx >= 0) {\n this._orderList = this._orderList.filter(l => l !== letter)\n }\n else {\n this._orderList = [...this._orderList, letter]\n }\n this.requestUpdate()\n }\n\n private _removeSortItem(letter: string) {\n this._orderList = this._orderList.filter(l => l !== letter)\n this.requestUpdate()\n }\n\n private _getSortOrder(index: number): number | null {\n const pos = this._orderList.indexOf(this._label(index))\n return pos >= 0 ? pos + 1 : null\n }\n\n private _sortAnswerValue(letter: string) {\n const index = letter.charCodeAt(0) - 65\n const answer = this._answers[index] as any\n return answer?.answerId ?? index + 1\n }\n\n private _shouldShowCorrectHint() {\n if (this.type === 'sort') {\n return !this._orderList.length\n }\n return !this._answers.some(answer => !!answer.isCorrect)\n }\n\n async toJSON(): Promise<any> {\n return new Promise((resolve, reject) => {\n const row = { customId: this['custom-id'] || undefined, answerType: this.type, orderIndex: this['order-index'] }\n\n const title = this['is-edit'] ? this._title : (this as any).title || ''\n const answers = this['is-edit'] ? this._answers : this['answer-list'] || []\n const answerCheckType = this['is-edit'] ? this._answerCheckType : this['answer-check-type'] || 1\n const leastAnswerCount = this['is-edit'] ? this._leastAnswerCount : Number(this['least-answer-count']) || 0\n const analysis = this['is-edit'] ? this._analysis : this.analysis || ''\n const selectedTagList = this._selectedTagList || []\n const examExpand = this['is-edit']\n ? this._orderList.map((l: string) => this._sortAnswerValue(l)).join(',')\n : (this['exam-expand'] || '')\n const showRichText = this['is-edit'] ? this._showRichText : !!(this['rich-text-content'])\n const richText = this['is-edit'] ? this._richText : this['rich-text-content'] || ''\n const orderList = this['is-edit']\n ? this._orderList\n : (() => {\n const expand = this['exam-expand']\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const index = (this['answer-list'] as any[])?.findIndex((answer, answerIndex) =>\n String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n )\n return index >= 0 ? this._label(index) : ''\n }).filter(Boolean)\n })()\n\n if (!title) {\n reject(new SubjectError('题目标题不能为空!', 'EMPTY_TITLE', 'title', row))\n return\n }\n if (this['show-tag'] && selectedTagList.length === 0) {\n reject(new SubjectError('请选择标签/关键信息', 'EMPTY_TAGS', 'tagList', row))\n return\n }\n if (!answerCheckType) {\n reject(new SubjectError('请选择答题设置', 'NO_ANSWER_CHECK_TYPE', 'answerCheckType', row))\n return\n }\n\n let msg = ''\n let isSetCorrectAnswer = false\n let correctAnswerCount = 0\n\n if (this.type === 'multiple' || this.type === 'single') {\n answers.forEach((v: any, i: number) => {\n if (!v.title?.trim()) { msg += `选项${String.fromCharCode(65 + i)}未填写。` }\n if (v.isCorrect) { isSetCorrectAnswer = true; correctAnswerCount++ }\n })\n }\n else if (this.type === 'sort') {\n if (orderList.length) { isSetCorrectAnswer = true }\n if (isSetCorrectAnswer && orderList.length < leastAnswerCount) {\n reject(new SubjectError(`排序题至少需要设置${leastAnswerCount}项排序答案`, 'SORT_COUNT_INVALID', 'orderList', row))\n return\n }\n }\n\n if (msg) {\n reject(new SubjectError(msg, 'ANSWER_EMPTY', 'answers', row))\n return\n }\n\n const uniqueAnswer = new Set(answers.map((a: any) => a.title))\n if (uniqueAnswer.size !== answers.length) {\n reject(new SubjectError('选项不能重复', 'DUPLICATE_ANSWERS', 'answers', row))\n return\n }\n\n if (this.type === 'multiple') {\n if (correctAnswerCount === 1) {\n reject(new SubjectError('请至少设置两个支持选项', 'CORRECT_COUNT_INVALID', 'answers', row))\n return\n }\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount) {\n reject(new SubjectError('至少选几项与支持选项数不符', 'LEAST_ANSWER_COUNT_INVALID', 'answers', row))\n return\n }\n }\n\n if (answerCheckType === 2 || answerCheckType === 3) {\n if (!isSetCorrectAnswer) {\n reject(new SubjectError('请设置支持选项', 'NO_CORRECT_ANSWER', 'answers', row))\n return\n }\n }\n\n const result: any = {\n answerType: String(this.type),\n title,\n answers: answers.filter((a: any) => a.title).map((a: any, i: number) => ({ ...a, orderIndex: i + 1 })),\n examExpand,\n analysis,\n isSetCorrectAnswer,\n leastAnswerCount: leastAnswerCount || '',\n examRichTextContent: showRichText ? richText : '',\n examAnswerRelationType: this['exam-answer-relation-type'],\n isKey: this._isKey,\n answerCheckType,\n categoryId: this._categoryId || '',\n memberTagInfo: selectedTagList,\n tagInfos: selectedTagList,\n aiAnswer: this['ai-answer'] || '',\n resourceList: this['resource-list'] || [],\n examResourceBOList: this['resource-list'] || [],\n }\n if (this['custom-id']) { result.customId = this['custom-id'] }\n resolve(result)\n })\n }\n\n validate(): SubjectError[] {\n const errors: SubjectError[] = []\n const row = { customId: this['custom-id'] || undefined, answerType: this.type, orderIndex: this['order-index'] }\n\n const title = this['is-edit'] ? this._title : (this as any).title || ''\n const answers = this['is-edit'] ? this._answers : this['answer-list'] || []\n const answerCheckType = this['is-edit'] ? this._answerCheckType : this['answer-check-type'] || 1\n const leastAnswerCount = this['is-edit'] ? this._leastAnswerCount : Number(this['least-answer-count']) || 0\n const selectedTagList = this._selectedTagList || []\n const orderList = this['is-edit']\n ? this._orderList\n : (() => {\n const expand = this['exam-expand']\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const index = (this['answer-list'] as any[])?.findIndex((answer, answerIndex) =>\n String(answer.answerId ?? answer.orderIndex ?? (answerIndex + 1)) === String(id),\n )\n return index >= 0 ? this._label(index) : ''\n }).filter(Boolean)\n })()\n\n if (!title) {\n errors.push(new SubjectError('题目标题不能为空!', 'EMPTY_TITLE', 'title', row))\n }\n if (this['show-tag'] && selectedTagList.length === 0) {\n errors.push(new SubjectError('请选择标签/关键信息', 'EMPTY_TAGS', 'tagList', row))\n }\n if (!answerCheckType) {\n errors.push(new SubjectError('请选择答题设置', 'NO_ANSWER_CHECK_TYPE', 'answerCheckType', row))\n }\n\n let isSetCorrectAnswer = false\n let correctAnswerCount = 0\n\n if (this.type === 'multiple' || this.type === 'single') {\n answers.forEach((v: any, i: number) => {\n if (!v.title?.trim()) {\n errors.push(new SubjectError(`选项${String.fromCharCode(65 + i)}未填写`, 'ANSWER_EMPTY', 'answers', row))\n }\n if (v.isCorrect) { isSetCorrectAnswer = true; correctAnswerCount++ }\n })\n }\n else if (this.type === 'sort') {\n if (orderList.length) { isSetCorrectAnswer = true }\n if (isSetCorrectAnswer && orderList.length < leastAnswerCount) {\n errors.push(new SubjectError(`排序题至少需要设置${leastAnswerCount}项排序答案`, 'SORT_COUNT_INVALID', 'orderList', row))\n }\n }\n\n const uniqueAnswer = new Set(answers.map((a: any) => a.title))\n if (uniqueAnswer.size !== answers.length && answers.length > 0) {\n errors.push(new SubjectError('选项不能重复', 'DUPLICATE_ANSWERS', 'answers', row))\n }\n\n if (this.type === 'multiple') {\n if (correctAnswerCount === 1 && answers.length > 0) {\n errors.push(new SubjectError('请至少设置两个支持选项', 'CORRECT_COUNT_INVALID', 'answers', row))\n }\n if (isSetCorrectAnswer && correctAnswerCount < leastAnswerCount) {\n errors.push(new SubjectError('至少选几项与支持选项数不符', 'LEAST_ANSWER_COUNT_INVALID', 'answers', row))\n }\n }\n\n if (answerCheckType === 2 || answerCheckType === 3) {\n if (!isSetCorrectAnswer) {\n errors.push(new SubjectError('请设置支持选项', 'NO_CORRECT_ANSWER', 'answers', row))\n }\n }\n\n return errors\n }\n\n private _openResultDialog(idx: number) {\n this._resultDialogIndex = idx\n this._resultDialogValue = this._answers[idx].resultItem || ''\n this._resultDialogOpen = true\n }\n\n private _saveResultDialog() {\n this._answers[this._resultDialogIndex].resultItem = this._resultDialogValue\n this._resultDialogOpen = false\n this.requestUpdate()\n }\n\n private _renderCorrectHintDialog() {\n if (!this._correctHintDialogOpen) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => { this._correctHintDialogOpen = false }}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">温馨提示</span>\n <button class=\"modal-close\" @click=${() => { this._correctHintDialogOpen = false }}>✕</button>\n </div>\n <div class=\"modal-body\">\n <div class=\"value-text\">为了收集更全面、有价值的数据,建议您为问卷每题设定推荐/正确选项。</div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"primary\" @click=${() => {\n this._hasShownCorrectHint = true\n this._correctHintDialogOpen = false\n }}>我知道了</button>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderResultDialog() {\n if (!this._resultDialogOpen) { return '' }\n const letter = this._label(this._resultDialogIndex)\n return html`\n <div class=\"modal-backdrop\" @click=${() => { this._resultDialogOpen = false }}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">编辑结果项 — 选项 ${letter}</span>\n <button class=\"modal-close\" @click=${() => { this._resultDialogOpen = false }}>✕</button>\n </div>\n <div class=\"modal-body\">\n <textarea rows=\"5\" .value=${this._resultDialogValue}\n @input=${(e: Event) => { this._resultDialogValue = (e.target as HTMLTextAreaElement).value }}\n placeholder=\"请输入该选项的结果项内容\"></textarea>\n </div>\n <div class=\"modal-footer\">\n <button @click=${() => { this._resultDialogOpen = false }}>取消</button>\n <button class=\"primary\" @click=${() => this._saveResultDialog()}>保存</button>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderSearchDropdown() {\n if (!this['is-edit'] || (!this._searchOpen && !this._searchLoading)) { return '' }\n return html`\n <div class=\"search-dropdown\">\n ${this._searchLoading\n ? html`<div class=\"search-empty\">搜索中...</div>`\n : this._searchResults.length\n ? this._searchResults.map(item => html`\n <div class=\"search-item\" @click=${() => this._selectSearchResult(item)}>${item.value || item.title}</div>\n `)\n : html`<div class=\"search-empty\">暂无匹配题目</div>`}\n </div>\n `\n }\n\n private _renderTagSection() {\n if (!this['show-tag']) { return '' }\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>标签:</span></div>\n <div style=\"flex:1\">\n <div class=\"tag-list\">\n ${this._selectedTagList.length\n ? this._selectedTagList.map(item => html`\n <span class=\"tag-item\">\n ${item.tagName}\n ${!this['is-save'] ? html`<span class=\"close\" @click=${() => this._removeTag(item.tagId)}>×</span>` : ''}\n </span>\n `)\n : html`<span class=\"tag-hint\">暂无标签/关键信息</span>`}\n </div>\n ${this['is-edit'] && !this['is-save']\n ? html`\n <div style=\"margin-top:8px\">\n <span class=\"el-link\" @click=${() => this._chooseTag()}>选择</span>\n </div>\n `\n : ''}\n </div>\n </div>\n `\n }\n\n private _renderCategorySection() {\n if (!this['show-category']) { return '' }\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>分类:</span></div>\n <div style=\"flex:1\">\n ${this['is-edit']\n ? html`\n <select class=\"el-select\" .value=${String(this._categoryId)} ?disabled=${this['is-save']}\n @change=${(e: Event) => this._onCategoryChange((e.target as HTMLSelectElement).value)}>\n <option value=\"\">选择分类</option>\n ${this['category-list'].map(item => html`\n <option value=${String(item.categoryId)} ?selected=${String(item.categoryId) === String(this._categoryId)}>${item.title}</option>\n `)}\n </select>\n `\n : html`<span class=\"value-text\">${this['category-list'].find(item => String(item.categoryId) === String(this._categoryId))?.title || '未选择分类'}</span>`}\n </div>\n </div>\n `\n }\n\n private _renderAiSection() {\n if (!this['show-ai'] || !['single', 'multiple'].includes(this.type)) { return '' }\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>AI推荐:</span></div>\n <div style=\"flex:1\">\n <span class=\"value-text\">${this['ai-answer'] || '暂无'}</span>\n ${this['is-edit']\n ? html`<div style=\"margin-top:8px\"><span class=\"el-link\" @click=${() => this._applyAiAnswer()}>一键勾选</span></div>`\n : ''}\n </div>\n </div>\n `\n }\n\n private _renderResourceSection() {\n if (!this['show-resource']) { return '' }\n const images = this._imageResources()\n const video = this._videoResource()\n return html`\n <div class=\"flex-items-start section-row\">\n <div class=\"label\"><span>资源:</span></div>\n <div style=\"flex:1\">\n <div class=\"resource-summary\">\n 图片 ${images.length} 张${video ? ',含视频资源' : ''}\n </div>\n <div class=\"resource-actions\">\n ${images.length ? html`<span class=\"el-link\" @click=${() => this._openImageViewer(0)}>查看图片</span>` : ''}\n ${video?.url ? html`<span class=\"el-link\" @click=${() => this._openVideoViewer()}>查看视频</span>` : ''}\n ${!images.length && !video?.url ? html`<span class=\"muted-text\">暂无资源</span>` : ''}\n </div>\n ${images.length\n ? html`\n <div class=\"resource-thumbs\">\n ${images.slice(0, 4).map((src, index) => html`\n <img class=\"resource-thumb\" src=${src} alt=\"resource\" @click=${() => this._openImageViewer(index)} />\n `)}\n </div>\n `\n : ''}\n </div>\n </div>\n `\n }\n\n private _renderImageViewer() {\n if (!this._imageViewerOpen) { return '' }\n const images = this._imageResources()\n const current = images[this._imageViewerIndex]\n if (!current) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => this._closeImageViewer()}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">图片预览</span>\n <button class=\"modal-close\" @click=${() => this._closeImageViewer()}>✕</button>\n </div>\n <div class=\"modal-body\">\n <div class=\"media-stage\"><img src=${current} alt=\"resource-preview\" /></div>\n </div>\n <div class=\"modal-footer\">\n <div class=\"media-footer\">\n <span class=\"muted-text\">${this._imageViewerIndex + 1} / ${images.length}</span>\n <div class=\"group\">\n ${images.length > 1 ? html`<button @click=${() => this._moveImage(-1)}>上一张</button>` : ''}\n ${images.length > 1 ? html`<button @click=${() => this._moveImage(1)}>下一张</button>` : ''}\n <button class=\"primary\" @click=${() => this._closeImageViewer()}>关闭</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderVideoViewer() {\n const video = this._videoResource()\n if (!this._videoViewerOpen || !video?.url) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => this._closeVideoViewer()}>\n <div class=\"modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"modal-header\">\n <span class=\"modal-title\">视频预览</span>\n <button class=\"modal-close\" @click=${() => this._closeVideoViewer()}>✕</button>\n </div>\n <div class=\"modal-body\">\n <div class=\"media-stage\">\n <video src=${video.url} controls playsinline></video>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"primary\" @click=${() => this._closeVideoViewer()}>关闭</button>\n </div>\n </div>\n </div>\n `\n }\n\n private async _save(e?: Event) {\n e?.stopImmediatePropagation()\n const errors = this.validate()\n if (errors.length) {\n showToast(errors[0].message)\n return\n }\n if (!this._hasShownCorrectHint && this._shouldShowCorrectHint()) {\n this._correctHintDialogOpen = true\n return\n }\n try {\n const data = await this.toJSON()\n this._emit('save', data)\n }\n catch (err: any) {\n showToast(err.message)\n }\n }\n\n private _renderPreview() {\n const typeSuffix = this.type === 'single'\n ? '(单选题)'\n : `(${this._titlePlaceholder}${this['least-answer-count'] ? `,至少选${this['least-answer-count']}项${this.type === 'sort' ? '并排序' : ''}` : ''})`\n const answers = this['answer-list'] as Answer[]\n return html`\n <div class=\"preview\">\n <div><span class=\"title\">${this['order-index'] + 1}.${(this as any).title || ''}${typeSuffix}${this['show-key'] && this._isKey ? html`<span class=\"key-badge\">核心题</span>` : ''}</span></div>\n ${this['rich-text-content'] ? html`<div class=\"rich-text\" .innerHTML=${this['rich-text-content']}></div>` : ''}\n <div class=\"preview-answer\">\n ${answers.map((a, i) => html`\n <label class=\"radio\">\n <input type=\"${this.type === 'sort' ? 'checkbox' : 'radio'}\" .checked=${!!a.isCorrect} disabled />\n <span class=\"order\">${this._label(i)}.</span> ${a.title}\n ${this.type !== 'sort' && a.isCorrect ? html`<span class=\"correct\">(支持选项)</span>` : ''}\n ${this.type !== 'sort' && this['exam-answer-relation-type'] === 1 ? html`<span class=\"result-info\">${a.resultItem ? '(已设置结果项)' : '(未设置结果项)'}</span>` : ''}\n ${this.type !== 'sort' && this['exam-answer-relation-type'] === 2 ? html`<span class=\"result-info\">${a.answerRelations?.length ? '(已设置关联)' : '(未设置关联)'}</span>` : ''}\n </label>\n `)}\n </div>\n ${this['show-category'] && this._categoryId\n ? html`<div class=\"section-row\"><span class=\"value-text\">分类:${this['category-list'].find(item => String(item.categoryId) === String(this._categoryId))?.title || this._categoryId}</span></div>`\n : ''}\n ${this._selectedTagList.length && this['show-tag']\n ? html`\n <div class=\"section-row\">\n <span class=\"value-text\">标签/关键信息:</span>\n <div class=\"tag-list\" style=\"margin-top:6px\">\n ${this._selectedTagList.map(item => html`<span class=\"tag-item\">${item.tagName}</span>`)}\n </div>\n </div>\n `\n : ''}\n ${this['show-resource'] ? this._renderResourceSection() : ''}\n </div>\n `\n }\n\n private _renderEdit() {\n return html`\n <div class=\"flex-items-start\">\n <div class=\"label\"><span>题目:</span></div>\n <div style=\"flex:1\">\n <div class=\"el-input search-wrap\">\n <textarea rows=\"2\" .value=${this._title} ?disabled=${this['is-save']}\n maxlength=${this.TITLE_MAX}\n @input=${(e: Event) => this._onTitleInput(e)}\n placeholder=\"【${this._titlePlaceholder}】请输入问题\"></textarea>\n <span class=\"char-counter\">${this._title.length}/${this.TITLE_MAX}</span>\n ${this._renderSearchDropdown()}\n </div>\n </div>\n </div>\n\n ${['multiple', 'sort'].includes(this.type)\n ? html`\n <div class=\"flex-items-start\" style=\"margin-top:12px\">\n <div class=\"label\"><span>设置:</span></div>\n <select class=\"el-select\" .value=${this._leastAnswerCount ? String(this._leastAnswerCount) : ''} ?disabled=${this['is-save']}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value\n this._leastAnswerCount = value ? Number(value) : 0\n }}>\n <option value=\"\">至少选择几项</option>\n ${Array.from({ length: Math.max(0, this._answers.length - 1) }, (_, i) => i + 2).map(n => html`\n <option value=${n} ?selected=${this._leastAnswerCount === n}>至少选择${n}项</option>\n `)}\n </select>\n </div>\n `\n : ''}\n\n <div class=\"answer-list\">\n ${this._answers.map((a, i) => html`\n <div class=\"answer-item\">\n <span class=\"label\">${this._label(i)}.</span>\n <div class=\"input\">\n <input type=\"text\" .value=${a.title} ?disabled=${this['is-save']}\n maxlength=${this.ANSWER_MAX}\n @input=${(e: Event) => this._onAnswerInput(e, i)}\n placeholder=\"选项${this._label(i)}\" />\n <span class=\"char-counter\">${a.title.length}/${this.ANSWER_MAX}</span>\n </div>\n\n ${this.type === 'sort' && this._getSortOrder(i) !== null\n ? html`<span class=\"sort-badge\">第${this._getSortOrder(i)}位</span>`\n : ''}\n\n ${['single', 'multiple'].includes(this.type)\n ? html`\n <label class=\"correct ${a.isCorrect ? 'is-correct' : ''}\">\n <input type=\"checkbox\" .checked=${a.isCorrect} ?disabled=${this['is-save']}\n @change=${(e: Event) => this._setCorrect(a, (e.target as HTMLInputElement).checked)} />\n 支持选项\n </label>\n `\n : ''}\n\n <span class=\"icon ${this['is-save'] ? 'disabled' : ''}\"\n @click=${() => this._addAnswer(i)}>\n ${iconPlus}\n </span>\n <span class=\"icon ${this['is-save'] || this._answers.length < 3 ? 'disabled' : ''}\"\n @click=${() => this._deleteAnswer(i)}>\n ${iconRemove}\n </span>\n\n ${this['exam-answer-relation-type'] === 1 && this.type !== 'sort'\n ? html`\n <span class=\"link\" @click=${() => this._openResultDialog(i)}>${a.resultItem ? '编辑结果' : '添加结果'}</span>\n `\n : ''}\n ${this['exam-answer-relation-type'] === 2 && this.type !== 'sort'\n ? html`\n <span class=\"link\" @click=${() => this._setRelation(a, i)}>${a.answerRelations?.length ? `关联了${this._relationLength(a.answerRelations)}项` : '关联检查'}</span>\n `\n : ''}\n </div>\n `)}\n </div>\n\n ${this.type === 'sort'\n ? html`\n <div class=\"flex-items-center\" style=\"margin-top:12px\">\n <div class=\"label\"><span>排序答案:</span></div>\n <div style=\"flex:1\">\n <div class=\"multi-select-wrapper\">\n <div class=\"multi-select ${this._sortDropdownOpen ? 'focused' : ''} ${this['is-save'] ? 'disabled' : ''}\"\n @click=${() => { if (!this['is-save']) { this._sortDropdownOpen = !this._sortDropdownOpen; this.requestUpdate() } }}>\n ${this._orderList.length > 0\n ? this._orderList.map(l => html`\n <span class=\"tag\">\n ${l}\n <span class=\"tag-close\" @click=${(e: Event) => { e.stopPropagation(); this._removeSortItem(l) }}>✕</span>\n </span>\n `)\n : html`<span class=\"placeholder\">请按顺序选择排序答案</span>`\n }\n <span class=\"arrow\">${iconArrow}</span>\n </div>\n ${this._sortDropdownOpen\n ? html`\n <div class=\"multi-select-dropdown\">\n ${this._answers.map((_, i) => html`\n <div class=\"multi-select-option ${this._orderList.includes(this._label(i)) ? 'selected' : ''}\"\n @click=${() => { this._toggleSortItem(this._label(i)); this.requestUpdate() }}>\n ${this._label(i)}\n </div>\n `)}\n </div>\n `\n : ''}\n </div>\n </div>\n </div>\n `\n : ''}\n\n ${this._renderTagSection()}\n\n ${this._renderCategorySection()}\n\n ${this._renderAiSection()}\n\n ${this._renderResourceSection()}\n\n ${this._showRichText\n ? html`\n <div class=\"flex-items-start\" style=\"margin-top:12px\">\n <div class=\"label\"><span>富文本:</span></div>\n <div style=\"flex:1\">\n <qxs-blocksuite-editor\n .content=${this._richText}\n .upload-image=${this['upload-image']}\n ?is-edit=${true}\n @input=${(e: CustomEvent) => { this._richText = (e.target as any).getContent() }}\n ></qxs-blocksuite-editor>\n ${!this['show-action']\n ? html`<div class=\"flex-justify-end\" style=\"margin-top:8px\"><span class=\"el-link danger\" @click=${() => { this._showRichText = false; this._richText = '' }}>删除富文本</span></div>`\n : ''}\n </div>\n </div>\n `\n : ''}\n\n ${this['show-analysis']\n ? html`\n <div class=\"flex-items-start\" style=\"margin-top:12px\">\n <div class=\"label\"><span>解析:</span></div>\n <div style=\"flex:1\">\n <textarea rows=\"2\" .value=${this._analysis}\n @input=${(e: Event) => { this._analysis = (e.target as HTMLTextAreaElement).value }}\n placeholder=\"请输入题目解析\"></textarea>\n </div>\n </div>\n `\n : ''}\n `\n }\n\n render() {\n return html`\n <qxs-subject-layout .show-edit=${this['is-edit']}>\n <div slot=\"preview\">${this._renderPreview()}</div>\n <div slot=\"edit\">${this._renderEdit()}</div>\n ${this['show-action']\n ? html`\n <qxs-subject-action\n .is-edit=${this['is-edit']}\n .is-set=${this['is-set']}\n .is-key=${this._isKey}\n .show-add=${this['show-add']}\n .show-answer-setting=${['single', 'multiple', 'sort'].includes(this.type)}\n .show-key=${this['show-key'] && ['single', 'multiple', 'sort'].includes(this.type)}\n .show-rich-text=${this._showRichText}\n .show-jump=${this['show-jump']}\n answer-check-type=${this._answerCheckType}\n exam-answer-relation-type=${this['exam-answer-relation-type']}\n @delete=${() => this._emit('delete')}\n @save=${this._save}\n @edit=${() => this._emit('edit')}\n @move=${(e: CustomEvent) => this._emit('move', e.detail)}\n @jump=${() => this._emit('jump', {\n customId: this['custom-id'] || '',\n examId: this['exam-id'] || 0,\n answerType: this.type,\n })}\n @add=${(e: CustomEvent) => this._emit('add', e.detail)}\n @set-key=${(e: CustomEvent) => { this._isKey = e.detail.value; this._emit('set-key', e.detail) }}\n @set-answer-setting=${(e: CustomEvent) => { this._answerCheckType = e.detail.value }}\n @on-show-rich-text=${() => {\n this._showRichText = !this._showRichText\n if (!this._showRichText) {\n this._richText = ''\n }\n }}\n ></qxs-subject-action>\n `\n : ''}\n </qxs-subject-layout>\n ${this._renderResultDialog()}\n ${this._renderCorrectHintDialog()}\n ${this._renderImageViewer()}\n ${this._renderVideoViewer()}\n `\n }\n}\n\nexport function register() {}\n"],"names":["SubjectError","Error","constructor","message","code","arguments","length","undefined","field","row","super","this","name","from","options","iconPlus","html","iconRemove","iconArrow","normalizeTitle","text","replace","toLowerCase","showToast","msg","el","document","createElement","textContent","Object","assign","style","position","top","left","transform","padding","borderRadius","fontSize","color","background","zIndex","boxShadow","transition","opacity","body","appendChild","setTimeout","remove","QxsSubjectSingle","LitElement","type","analysis","async","Promise","resolve","reject","reader","FileReader","onload","e","target","result","onerror","readAsDataURL","file","_answers","title","isCorrect","_title","_analysis","_richText","_showRichText","_leastAnswerCount","_answerCheckType","_isKey","_orderList","_selectedTagList","_categoryId","_searchResults","_searchOpen","_searchLoading","_resultDialogOpen","_resultDialogIndex","_resultDialogValue","_sortDropdownOpen","_imageViewerOpen","_imageViewerIndex","_videoViewerOpen","_correctHintDialogOpen","_hasShownCorrectHint","_searchTimer","_searchToken","TITLE_MAX","ANSWER_MAX","_handleDocumentClick","path","composedPath","wrapper","shadowRoot","querySelector","searchWrap","includes","requestUpdate","v","arr","Array","isArray","map","a","connectedCallback","addEventListener","_syncExternalProps","firstUpdated","disconnectedCallback","removeEventListener","window","clearTimeout","willUpdate","changed","has","_syncProps","item","String","_syncExamExpand","Number","ids","split","answers","id","index","findIndex","answer","answerIndex","answerId","orderIndex","_label","filter","Boolean","_emit","detail","dispatchEvent","CustomEvent","bubbles","composed","_searchAnswerType","_queueSearch","query","keyword","trim","_runSearch","currentToken","params","URLSearchParams","searchKey","answerType","response","fetch","toString","ok","status","payload","json","data","value","error","_selectSearchResult","selectedTitle","examId","questionId","customId","_applyAiAnswer","aiTitles","line","matched","selected","shouldSelect","_removeTag","tagId","_chooseTag","_onCategoryChange","_setRelation","customAnswerId","uid","current","_relationLength","reduce","count","relationAnswers","_imageResources","resourceType","resource","middle","url","_videoResource","find","_openImageViewer","_closeImageViewer","_moveImage","step","images","_openVideoViewer","_closeVideoViewer","i","fromCharCode","_titlePlaceholder","_setCorrect","val","forEach","_onTitleInput","slice","_onAnswerInput","idx","_addAnswer","splice","_deleteAnswer","_","_toggleSortItem","letter","indexOf","l","_removeSortItem","_getSortOrder","pos","_sortAnswerValue","charCodeAt","_shouldShowCorrectHint","some","toJSON","answerCheckType","leastAnswerCount","selectedTagList","examExpand","join","showRichText","richText","orderList","expand","isSetCorrectAnswer","correctAnswerCount","Set","size","examRichTextContent","examAnswerRelationType","isKey","categoryId","memberTagInfo","tagInfos","aiAnswer","resourceList","examResourceBOList","validate","errors","push","_openResultDialog","resultItem","_saveResultDialog","_renderCorrectHintDialog","stopPropagation","_renderResultDialog","_renderSearchDropdown","_renderTagSection","tagName","_renderCategorySection","_renderAiSection","_renderResourceSection","video","src","_renderImageViewer","_renderVideoViewer","_save","stopImmediatePropagation","err","_renderPreview","typeSuffix","answerRelations","_renderEdit","Math","max","n","checked","getContent","render","styles","css","__decorateClass","property","attribute","prototype","reflect","state","safeCustomElement"],"mappings":"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"}
|