@qxs-bns/components-wc 0.0.20 → 0.0.21
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/action.mjs +76 -22
- package/es/subject/action.mjs.map +1 -1
- package/es/subject/blank-fill.mjs +29 -24
- package/es/subject/blank-fill.mjs.map +1 -1
- package/es/subject/list.mjs +85 -55
- package/es/subject/list.mjs.map +1 -1
- package/es/subject/page-end.mjs +6 -5
- package/es/subject/page-end.mjs.map +1 -1
- package/es/subject/scale.mjs +7 -5
- package/es/subject/scale.mjs.map +1 -1
- package/es/subject/single.mjs +212 -18
- package/es/subject/single.mjs.map +1 -1
- package/es/subject/text-fill.mjs +32 -29
- package/es/subject/text-fill.mjs.map +1 -1
- package/es/subject/type.mjs +1 -1
- package/es/subject/type.mjs.map +1 -1
- package/lib/subject/action.cjs +76 -22
- package/lib/subject/action.cjs.map +1 -1
- package/lib/subject/blank-fill.cjs +28 -23
- package/lib/subject/blank-fill.cjs.map +1 -1
- package/lib/subject/list.cjs +41 -11
- package/lib/subject/list.cjs.map +1 -1
- package/lib/subject/page-end.cjs +3 -2
- package/lib/subject/page-end.cjs.map +1 -1
- package/lib/subject/scale.cjs +7 -5
- package/lib/subject/scale.cjs.map +1 -1
- package/lib/subject/single.cjs +212 -18
- package/lib/subject/single.cjs.map +1 -1
- package/lib/subject/text-fill.cjs +41 -38
- package/lib/subject/text-fill.cjs.map +1 -1
- package/lib/subject/type.cjs +1 -1
- package/lib/subject/type.cjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single.mjs","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'\nimport { SubjectType } from './types'\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 iconClose = 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\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></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 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@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 .el-select.sort-select {\n width: 360px; height: auto; min-height: 32px; appearance: auto;\n }\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 /* 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' }) orderIndex = 0\n @property({ type: Boolean, attribute: 'is-edit' }) isEdit = false\n @property({ type: Boolean, attribute: 'is-save' }) isSave = false\n @property({ type: Boolean, attribute: 'is-set' }) isSet = false\n @property({ type: Boolean, attribute: 'is-key' }) isKey = false\n @property({ type: Boolean, attribute: 'show-action' }) showAction = true\n @property({ type: Boolean, attribute: 'show-analysis' }) showAnalysis = true\n @property({ attribute: 'question-type', reflect: true }) type: AnswerType = 'single'\n @property({ type: Number, attribute: 'answer-check-type' }) answerCheckType = 1\n @property({ type: Number, attribute: 'exam-answer-relation-type' }) examAnswerRelationType = 0\n @property({ type: String, attribute: 'rich-text-content' }) richTextContent = ''\n @property({ type: String }) analysis = ''\n @property({ type: Number, attribute: 'least-answer-count' }) leastAnswerCount = 2\n @property({ type: String, attribute: 'exam-expand' }) examExpand = ''\n @property({ type: String, attribute: 'custom-id' }) customId = ''\n @property({ type: Number, attribute: 'exam-id' }) examId = 0\n @property({ type: Object }) uploadImage: (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 answerList() { return this._answers }\n\n set answerList(v: any) {\n // 编辑模式下不接受外部更新,避免覆盖用户正在编辑的内容\n if (this.isEdit) {\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('answerList')\n }\n\n // 双向绑定支持\n @property({ type: String, attribute: 'model-value' }) modelValue = ''\n @property({ type: Boolean, attribute: 'use-model' }) useModel = 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 = 2\n @state() private _answerCheckType = 1\n @state() private _isKey = false\n @state() private _orderList: string[] = []\n @state() private _resultDialogOpen = false\n @state() private _resultDialogIndex = 0\n @state() private _resultDialogValue = ''\n @state() private _sortDropdownOpen = false\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 if (this.richTextContent) {\n this._richText = this.richTextContent\n this._showRichText = true\n }\n }\n\n firstUpdated() {\n this._syncExternalProps()\n if (this.richTextContent) {\n this._richText = this.richTextContent\n this._showRichText = true\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleDocumentClick)\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const path = e.composedPath()\n const wrapper = this.shadowRoot?.querySelector('.multi-select-wrapper')\n if (wrapper && !path.includes(wrapper)) {\n this._sortDropdownOpen = false\n this.requestUpdate()\n }\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('isEdit') && this.isEdit) { this._syncProps() }\n if (!this.isEdit && (changed.has('title') || changed.has('answerList') || changed.has('analysis') || changed.has('leastAnswerCount') || changed.has('answerCheckType'))) {\n this._syncExternalProps()\n }\n if (changed.has('isKey')) {\n this._isKey = this.isKey\n }\n if (changed.has('examExpand') || changed.has('answerList')) { this._syncExamExpand() }\n if (changed.has('modelValue') && this.useModel) {\n this._title = this.modelValue\n }\n }\n\n private _syncExternalProps() {\n this._title = this.title || ''\n this._analysis = this.analysis || ''\n this._leastAnswerCount = this.leastAnswerCount || 2\n this._answerCheckType = this.answerCheckType || 1\n this._isKey = this.isKey\n if (this.richTextContent) { this._richText = this.richTextContent; this._showRichText = true }\n if (this.answerList?.length) {\n this._answers = this.answerList.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 = this.leastAnswerCount || 2\n this._answerCheckType = this.answerCheckType || 1\n this._isKey = this.isKey\n if (this.richTextContent) { this._richText = this.richTextContent; this._showRichText = true }\n if (this.answerList?.length) {\n this._answers = this.answerList.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.examExpand || !this.answerList?.length) { return }\n const ids = this.examExpand.split(',')\n this._orderList = ids.map((id) => {\n const answer = (this.answerList as any[]).find(a => a.answerId?.toString() === id)\n return answer ? String.fromCharCode(65 + answer.orderIndex - 1) : id\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 _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 // 双向绑定:通知外部更新\n if (this.useModel) {\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() {\n if (this.isSave) { return }\n this._answers = [...this._answers, { title: '', isCorrect: false, customAnswerId: uid() }]\n }\n\n private _deleteAnswer(index: number) {\n if (this._answers.length < 3 || this.isSave) { 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 async toJSON(): Promise<any> {\n return new Promise((resolve, reject) => {\n const row = { customId: this.customId || undefined, answerType: this.type, orderIndex: this.orderIndex }\n\n const title = this.isEdit ? this._title : (this as any).title || ''\n const answers = this.isEdit ? this._answers : this.answerList || []\n const answerCheckType = this.isEdit ? this._answerCheckType : this.answerCheckType || 1\n const leastAnswerCount = this.isEdit ? this._leastAnswerCount : this.leastAnswerCount || 2\n const analysis = this.isEdit ? this._analysis : this.analysis || ''\n const examExpand = this.isEdit\n ? this._orderList.map((l: string) => l.charCodeAt(0) - 65 + 1).join(',')\n : ((this as any).examExpand || '')\n const showRichText = this.isEdit ? this._showRichText : !!(this.richTextContent)\n const richText = this.isEdit ? this._richText : this.richTextContent || ''\n const orderList = this.isEdit\n ? this._orderList\n : (() => {\n const expand = (this as any).examExpand\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const answer = (this.answerList as any[])?.find(a => a.answerId?.toString() === id)\n return answer ? String.fromCharCode(65 + answer.orderIndex - 1) : id\n }).filter(Boolean)\n })()\n\n if (!title) {\n reject(new SubjectError('题目标题不能为空!', 'EMPTY_TITLE', 'title', 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,\n examRichTextContent: showRichText ? richText : '',\n examAnswerRelationType: this.examAnswerRelationType,\n isKey: this._isKey,\n answerCheckType,\n }\n if (this.customId) { result.customId = this.customId }\n resolve(result)\n })\n }\n\n validate(): SubjectError[] {\n const errors: SubjectError[] = []\n const row = { customId: this.customId || undefined, answerType: this.type, orderIndex: this.orderIndex }\n\n const title = this.isEdit ? this._title : (this as any).title || ''\n const answers = this.isEdit ? this._answers : this.answerList || []\n const answerCheckType = this.isEdit ? this._answerCheckType : this.answerCheckType || 1\n const leastAnswerCount = this.isEdit ? this._leastAnswerCount : this.leastAnswerCount || 2\n const orderList = this.isEdit\n ? this._orderList\n : (() => {\n const expand = (this as any).examExpand\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const answer = (this.answerList as any[])?.find(a => a.answerId?.toString() === id)\n return answer ? String.fromCharCode(65 + answer.orderIndex - 1) : id\n }).filter(Boolean)\n })()\n\n if (!title) {\n errors.push(new SubjectError('题目标题不能为空!', 'EMPTY_TITLE', 'title', 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 _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 async _save(e?: Event) {\n e?.stopImmediatePropagation()\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.leastAnswerCount ? `至少选${this.leastAnswerCount}项${this.type === 'sort' ? '并排序' : ''}` : ''})`\n const answers = this.answerList as Answer[]\n return html`\n <div class=\"preview\">\n <div><span class=\"title\">${this.orderIndex + 1}.${(this as any).title || ''}${typeSuffix}${this._isKey ? html`<span class=\"key-badge\">核心题</span>` : ''}</span></div>\n ${this.richTextContent ? html`<div class=\"rich-text\" .innerHTML=${this.richTextContent}></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.examAnswerRelationType === 1 ? html`<span class=\"result-info\">${a.resultItem ? '(已设置结果项)' : '(未设置结果项)'}</span>` : ''}\n ${this.type !== 'sort' && this.examAnswerRelationType === 2 ? html`<span class=\"result-info\">${a.answerRelations?.length ? '(已设置关联)' : '(未设置关联)'}</span>` : ''}\n </label>\n `)}\n </div>\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\">\n <textarea rows=\"2\" .value=${this._title} ?disabled=${this.isSave}\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 </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=${String(this._leastAnswerCount)} ?disabled=${this.isSave}\n @change=${(e: Event) => { this._leastAnswerCount = Number((e.target as HTMLSelectElement).value) }}>\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.isSave}\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.isSave}\n @change=${(e: Event) => this._setCorrect(a, (e.target as HTMLInputElement).checked)} />\n 支持选项\n </label>\n `\n : ''}\n\n <span class=\"icon ${this.isSave ? 'disabled' : ''}\"\n @click=${() => this._addAnswer()}>\n ${iconPlus}\n </span>\n <span class=\"icon ${this.isSave || this._answers.length < 3 ? 'disabled' : ''}\"\n @click=${() => this._deleteAnswer(i)}>\n ${iconRemove}\n </span>\n\n ${this.examAnswerRelationType === 1 && this.type !== 'sort'\n ? html`\n <span class=\"link\" @click=${() => this._openResultDialog(i)}>${a.resultItem ? '编辑结果' : '添加结果'}</span>\n `\n : ''}\n ${this.examAnswerRelationType === 2 && this.type !== 'sort'\n ? html`\n <span class=\"link\">关联检查</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.isSave ? 'disabled' : ''}\"\n @click=${() => { if (!this.isSave) { 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._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 .uploadImage=${this.uploadImage}\n ?is-edit=${true}\n @input=${(e: CustomEvent) => { this._richText = (e.target as any).getContent() }}\n ></qxs-blocksuite-editor>\n <div class=\"flex-justify-end\" style=\"margin-top:8px\"><span class=\"el-link danger\" @click=${() => { this._showRichText = false; this._richText = '' }}>删除富文本</span></div>\n </div>\n </div>\n `\n : ''}\n\n ${this.showAnalysis\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.isEdit}>\n <div slot=\"preview\">${this._renderPreview()}</div>\n <div slot=\"edit\">${this._renderEdit()}</div>\n ${this.showAction\n ? html`\n <qxs-subject-action\n ?is-edit=${this.isEdit}\n ?is-set=${this.isSet}\n ?is-key=${this._isKey}\n ?show-other-option=${this.type === 'multiple' || this.type === 'single'}\n answer-check-type=${this._answerCheckType}\n exam-answer-relation-type=${this.examAnswerRelationType}\n @delete=${() => this._emit('delete')}\n @save=${this._save}\n @edit=${() => this._emit('edit')}\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=${() => { this._showRichText = true }}\n ></qxs-subject-action>\n `\n : ''}\n </qxs-subject-layout>\n ${this._renderResultDialog()}\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","QxsSubjectSingle","LitElement","orderIndex","isEdit","isSave","isSet","isKey","showAction","showAnalysis","type","answerCheckType","examAnswerRelationType","richTextContent","analysis","leastAnswerCount","examExpand","customId","examId","uploadImage","async","Promise","resolve","reject","reader","FileReader","onload","e","target","result","onerror","readAsDataURL","file","modelValue","useModel","_answers","title","isCorrect","_title","_analysis","_richText","_showRichText","_leastAnswerCount","_answerCheckType","_isKey","_orderList","_resultDialogOpen","_resultDialogIndex","_resultDialogValue","_sortDropdownOpen","TITLE_MAX","ANSWER_MAX","_handleDocumentClick","path","composedPath","wrapper","shadowRoot","querySelector","includes","requestUpdate","answerList","v","arr","Array","isArray","map","a","connectedCallback","document","addEventListener","_syncExternalProps","firstUpdated","disconnectedCallback","removeEventListener","willUpdate","changed","has","_syncProps","_syncExamExpand","ids","split","id","answer","find","answerId","toString","String","fromCharCode","filter","Boolean","_emit","detail","dispatchEvent","CustomEvent","bubbles","composed","_label","i","_titlePlaceholder","_setCorrect","item","val","forEach","_onTitleInput","el","value","slice","_onAnswerInput","idx","_addAnswer","customAnswerId","uid","_deleteAnswer","index","_","_toggleSortItem","letter","indexOf","l","_removeSortItem","_getSortOrder","pos","toJSON","answerType","answers","charCodeAt","join","showRichText","richText","orderList","expand","msg","isSetCorrectAnswer","correctAnswerCount","trim","Set","size","examRichTextContent","validate","errors","push","_openResultDialog","resultItem","_saveResultDialog","_renderResultDialog","stopPropagation","_save","stopImmediatePropagation","data","err","createElement","textContent","Object","assign","style","position","top","left","transform","padding","borderRadius","fontSize","color","background","zIndex","boxShadow","transition","opacity","body","appendChild","setTimeout","remove","showToast","_renderPreview","typeSuffix","answerRelations","_renderEdit","Number","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.mjs","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' }) orderIndex = 0\n @property({ type: Boolean, attribute: 'is-edit' }) isEdit = false\n @property({ type: Boolean, attribute: 'is-save' }) isSave = false\n @property({ type: Boolean, attribute: 'is-set' }) isSet = false\n @property({ type: Boolean, attribute: 'is-key' }) isKey = false\n @property({ type: Boolean, attribute: 'show-action' }) showAction = true\n @property({ type: Boolean, attribute: 'show-add' }) showAdd = true\n @property({ type: Boolean, attribute: 'show-answer-setting' }) showAnswerSetting = false\n @property({ type: Boolean, attribute: 'show-key' }) showKey = false\n @property({ type: Boolean, attribute: 'show-analysis' }) showAnalysis = true\n @property({ attribute: 'question-type', reflect: true }) type: AnswerType = 'single'\n @property({ type: Number, attribute: 'answer-check-type' }) answerCheckType = 1\n @property({ type: Number, attribute: 'exam-answer-relation-type' }) examAnswerRelationType = 0\n @property({ type: String, attribute: 'rich-text-content' }) richTextContent = ''\n @property({ type: String }) analysis = ''\n @property({ type: Number, attribute: 'least-answer-count' }) leastAnswerCount = 0\n @property({ type: String, attribute: 'exam-expand' }) examExpand = ''\n @property({ type: String, attribute: 'custom-id' }) customId = ''\n @property({ type: Number, attribute: 'exam-id' }) examId = 0\n @property({ type: String, attribute: 'category-id' }) categoryId = ''\n @property({ type: Object }) uploadImage: (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 answerList() { return this._answers }\n\n set answerList(v: any) {\n // 编辑模式下不接受外部更新,避免覆盖用户正在编辑的内容\n if (this.isEdit) {\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('answerList')\n }\n\n // ============ 业务接口 Props ============\n /**\n * 标签列表 - 用于关联题目的标签信息\n * @type {TagItem[]}\n * @description 业务系统传入已选择的标签列表\n */\n @property({ type: Array, attribute: 'tag-list' }) tagList: TagItem[] = []\n /**\n * 分类列表 - 可用于题目的分类选项\n * @type {Category[]}\n * @description 业务系统传入可选的分类列表\n */\n @property({ type: Array, attribute: 'category-list' }) categoryList: Category[] = []\n /**\n * AI 推荐答案 - AI 根据题目内容推荐的答案\n * @type {string}\n * @description AI 返回的推荐答案,格式如 \"1. 选项A\\n2. 选项B\"\n */\n @property({ type: String, attribute: 'ai-answer' }) aiAnswer = ''\n /**\n * 图片/视频资源列表 - 题目附带的媒体资源\n * @type {Resource[]}\n * @description 题目附带图片或视频资源\n */\n @property({ type: Array, attribute: 'resource-list' }) resourceList: Resource[] = []\n /**\n * 是否显示标签功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示标签选择 UI\n */\n @property({ type: Boolean, attribute: 'show-tag' }) showTag = false\n /**\n * 是否显示分类功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示分类选择 UI\n */\n @property({ type: Boolean, attribute: 'show-category' }) showCategory = false\n /**\n * 是否显示 AI 推荐功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示 AI 推荐答案 UI\n */\n @property({ type: Boolean, attribute: 'show-ai' }) showAi = false\n /**\n * 是否显示资源功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示图片/视频资源 UI\n */\n @property({ type: Boolean, attribute: 'show-resource' }) showResource = false\n /**\n * 是否显示跳题功能\n * @type {boolean}\n * @default false\n * @description 业务功能开关,控制是否显示跳题逻辑设置入口\n */\n @property({ type: Boolean, attribute: 'show-jump' }) showJump = false\n /**\n * 跳题状态 - 是否已设置跳题逻辑\n * @type {boolean}\n * @default false\n * @description 标记当前题目是否已设置跳题逻辑\n */\n @property({ type: Boolean, attribute: 'has-jump' }) hasJump = false\n /**\n * 题库搜索接口地址\n * @type {string}\n * @description 题库模糊搜索接口地址,用于题库搜索功能\n */\n @property({ type: String, attribute: 'search-api' }) searchApi = ''\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 }) searchHandler?: (query: string, answerType: number) => Promise<SearchResult[]>\n\n // 双向绑定支持\n @property({ type: String, attribute: 'model-value' }) modelValue = ''\n @property({ type: Boolean, attribute: 'use-model' }) useModel = 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('isEdit') && this.isEdit) { this._syncProps() }\n if (!this.isEdit && (changed.has('title') || changed.has('answerList') || changed.has('analysis') || changed.has('leastAnswerCount') || changed.has('answerCheckType') || changed.has('tagList') || changed.has('categoryId') || changed.has('richTextContent'))) {\n this._syncExternalProps()\n }\n if (changed.has('isKey')) {\n this._isKey = this.isKey\n }\n if (changed.has('tagList')) {\n this._selectedTagList = Array.isArray(this.tagList) ? this.tagList.map(item => ({ ...item })) : []\n }\n if (changed.has('categoryId')) {\n this._categoryId = this.categoryId ? String(this.categoryId) : ''\n }\n if (changed.has('examExpand') || changed.has('answerList')) { this._syncExamExpand() }\n if (changed.has('modelValue') && this.useModel) {\n this._title = this.modelValue\n }\n }\n\n private _syncExternalProps() {\n this._title = this.title || ''\n this._analysis = this.analysis || ''\n this._leastAnswerCount = Number(this.leastAnswerCount) || 0\n this._answerCheckType = this.answerCheckType || 1\n this._isKey = this.isKey\n this._selectedTagList = Array.isArray(this.tagList) ? this.tagList.map(item => ({ ...item })) : []\n this._categoryId = this.categoryId ? String(this.categoryId) : ''\n this._richText = this.richTextContent || ''\n this._showRichText = !!this.richTextContent\n if (this.answerList?.length) {\n this._answers = this.answerList.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.leastAnswerCount) || 0\n this._answerCheckType = this.answerCheckType || 1\n this._isKey = this.isKey\n this._selectedTagList = Array.isArray(this.tagList) ? this.tagList.map(item => ({ ...item })) : []\n this._categoryId = this.categoryId ? String(this.categoryId) : ''\n this._richText = this.richTextContent || ''\n this._showRichText = !!this.richTextContent\n if (this.answerList?.length) {\n this._answers = this.answerList.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.examExpand || !this.answerList?.length) { return }\n const ids = this.examExpand.split(',')\n const answers = this.answerList 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.searchApi && typeof this.searchHandler !== '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.searchHandler === 'function') {\n result = await this.searchHandler(query, this._searchAnswerType())\n }\n else if (this.searchApi) {\n const params = new URLSearchParams({\n searchKey: query,\n answerType: String(this._searchAnswerType()),\n })\n const response = await fetch(`${this.searchApi}${this.searchApi.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.useModel) {\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.customId || '',\n })\n }\n\n private _applyAiAnswer() {\n if (!this.aiAnswer?.trim()) {\n showToast('暂无 AI 推荐答案')\n return\n }\n const aiTitles = this.aiAnswer\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.customId || '',\n examId: this.examId || 0,\n })\n }\n\n private _chooseTag() {\n this._emit('choose-tag', {\n value: this._selectedTagList,\n customId: this.customId || '',\n examId: this.examId || 0,\n })\n }\n\n private _onCategoryChange(value: string) {\n this._categoryId = value\n this._emit('category-change', {\n value,\n customId: this.customId || '',\n examId: this.examId || 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.customId || '',\n examId: this.examId || 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.resourceList || [])\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.resourceList || []).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.useModel) {\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.isSave) { 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.isSave) { 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.customId || undefined, answerType: this.type, orderIndex: this.orderIndex }\n\n const title = this.isEdit ? this._title : (this as any).title || ''\n const answers = this.isEdit ? this._answers : this.answerList || []\n const answerCheckType = this.isEdit ? this._answerCheckType : this.answerCheckType || 1\n const leastAnswerCount = this.isEdit ? this._leastAnswerCount : Number(this.leastAnswerCount) || 0\n const analysis = this.isEdit ? this._analysis : this.analysis || ''\n const selectedTagList = this._selectedTagList || []\n const examExpand = this.isEdit\n ? this._orderList.map((l: string) => this._sortAnswerValue(l)).join(',')\n : ((this as any).examExpand || '')\n const showRichText = this.isEdit ? this._showRichText : !!(this.richTextContent)\n const richText = this.isEdit ? this._richText : this.richTextContent || ''\n const orderList = this.isEdit\n ? this._orderList\n : (() => {\n const expand = (this as any).examExpand\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const index = (this.answerList 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.showTag && 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.examAnswerRelationType,\n isKey: this._isKey,\n answerCheckType,\n categoryId: this._categoryId || '',\n memberTagInfo: selectedTagList,\n tagInfos: selectedTagList,\n aiAnswer: this.aiAnswer || '',\n resourceList: this.resourceList || [],\n examResourceBOList: this.resourceList || [],\n }\n if (this.customId) { result.customId = this.customId }\n resolve(result)\n })\n }\n\n validate(): SubjectError[] {\n const errors: SubjectError[] = []\n const row = { customId: this.customId || undefined, answerType: this.type, orderIndex: this.orderIndex }\n\n const title = this.isEdit ? this._title : (this as any).title || ''\n const answers = this.isEdit ? this._answers : this.answerList || []\n const answerCheckType = this.isEdit ? this._answerCheckType : this.answerCheckType || 1\n const leastAnswerCount = this.isEdit ? this._leastAnswerCount : Number(this.leastAnswerCount) || 0\n const selectedTagList = this._selectedTagList || []\n const orderList = this.isEdit\n ? this._orderList\n : (() => {\n const expand = (this as any).examExpand\n if (!expand) { return [] }\n return expand.split(',').map((id: string) => {\n const index = (this.answerList 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.showTag && 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.isEdit || (!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.showTag) { 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.isSave ? html`<span class=\"close\" @click=${() => this._removeTag(item.tagId)}>×</span>` : ''}\n </span>\n `)\n : html`<span class=\"tag-hint\">暂无标签/关键信息</span>`}\n </div>\n ${this.isEdit && !this.isSave\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.showCategory) { 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.isEdit\n ? html`\n <select class=\"el-select\" .value=${String(this._categoryId)} ?disabled=${this.isSave}\n @change=${(e: Event) => this._onCategoryChange((e.target as HTMLSelectElement).value)}>\n <option value=\"\">选择分类</option>\n ${this.categoryList.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.categoryList.find(item => String(item.categoryId) === String(this._categoryId))?.title || '未选择分类'}</span>`}\n </div>\n </div>\n `\n }\n\n private _renderAiSection() {\n if (!this.showAi || !['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.aiAnswer || '暂无'}</span>\n ${this.isEdit\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.showResource) { 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.leastAnswerCount ? `,至少选${this.leastAnswerCount}项${this.type === 'sort' ? '并排序' : ''}` : ''})`\n const answers = this.answerList as Answer[]\n return html`\n <div class=\"preview\">\n <div><span class=\"title\">${this.orderIndex + 1}.${(this as any).title || ''}${typeSuffix}${this.showKey && this._isKey ? html`<span class=\"key-badge\">核心题</span>` : ''}</span></div>\n ${this.richTextContent ? html`<div class=\"rich-text\" .innerHTML=${this.richTextContent}></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.examAnswerRelationType === 1 ? html`<span class=\"result-info\">${a.resultItem ? '(已设置结果项)' : '(未设置结果项)'}</span>` : ''}\n ${this.type !== 'sort' && this.examAnswerRelationType === 2 ? html`<span class=\"result-info\">${a.answerRelations?.length ? '(已设置关联)' : '(未设置关联)'}</span>` : ''}\n </label>\n `)}\n </div>\n ${this.showCategory && this._categoryId\n ? html`<div class=\"section-row\"><span class=\"value-text\">分类:${this.categoryList.find(item => String(item.categoryId) === String(this._categoryId))?.title || this._categoryId}</span></div>`\n : ''}\n ${this._selectedTagList.length && this.showTag\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.showResource ? 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.isSave}\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.isSave}\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.isSave}\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.isSave}\n @change=${(e: Event) => this._setCorrect(a, (e.target as HTMLInputElement).checked)} />\n 支持选项\n </label>\n `\n : ''}\n\n <span class=\"icon ${this.isSave ? 'disabled' : ''}\"\n @click=${() => this._addAnswer(i)}>\n ${iconPlus}\n </span>\n <span class=\"icon ${this.isSave || this._answers.length < 3 ? 'disabled' : ''}\"\n @click=${() => this._deleteAnswer(i)}>\n ${iconRemove}\n </span>\n\n ${this.examAnswerRelationType === 1 && this.type !== 'sort'\n ? html`\n <span class=\"link\" @click=${() => this._openResultDialog(i)}>${a.resultItem ? '编辑结果' : '添加结果'}</span>\n `\n : ''}\n ${this.examAnswerRelationType === 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.isSave ? 'disabled' : ''}\"\n @click=${() => { if (!this.isSave) { 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 .uploadImage=${this.uploadImage}\n ?is-edit=${true}\n @input=${(e: CustomEvent) => { this._richText = (e.target as any).getContent() }}\n ></qxs-blocksuite-editor>\n ${!this.showAction\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.showAnalysis\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.isEdit}>\n <div slot=\"preview\">${this._renderPreview()}</div>\n <div slot=\"edit\">${this._renderEdit()}</div>\n ${this.showAction\n ? html`\n <qxs-subject-action\n ?is-edit=${this.isEdit}\n ?is-set=${this.isSet}\n ?is-key=${this._isKey}\n ?show-add=${this.showAdd}\n ?show-answer-setting=${this.showAnswerSetting && ['single', 'multiple', 'sort'].includes(this.type)}\n ?show-key=${this.showKey && ['single', 'multiple', 'sort'].includes(this.type)}\n ?show-rich-text=${this._showRichText}\n ?show-jump=${this.showJump}\n answer-check-type=${this._answerCheckType}\n exam-answer-relation-type=${this.examAnswerRelationType}\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.customId || '',\n examId: this.examId || 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","orderIndex","isEdit","isSave","isSet","isKey","showAction","showAdd","showAnswerSetting","showKey","showAnalysis","type","answerCheckType","examAnswerRelationType","richTextContent","analysis","leastAnswerCount","examExpand","customId","examId","categoryId","uploadImage","async","Promise","resolve","reject","reader","FileReader","onload","e","target","result","onerror","readAsDataURL","file","tagList","categoryList","aiAnswer","resourceList","showTag","showCategory","showAi","showResource","showJump","hasJump","searchApi","modelValue","useModel","_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","answerList","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","_label","filter","Boolean","_emit","detail","dispatchEvent","CustomEvent","bubbles","composed","_searchAnswerType","_queueSearch","query","keyword","trim","searchHandler","_runSearch","currentToken","params","URLSearchParams","searchKey","answerType","response","fetch","toString","ok","status","payload","json","data","value","error","_selectSearchResult","selectedTitle","questionId","_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","selectedTagList","join","showRichText","richText","orderList","expand","isSetCorrectAnswer","correctAnswerCount","Set","size","examRichTextContent","memberTagInfo","tagInfos","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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"}
|
package/es/subject/text-fill.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import{css as e,LitElement as t,html as i}from"lit";import{property as s}from"../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.mjs";import{state as
|
|
1
|
+
import{css as e,LitElement as t,html as i}from"lit";import{property as s}from"../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.mjs";import{state as r}from"../node_modules/.pnpm/@lit_reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.mjs";import{safeCustomElement as o}from"../base/define.mjs";import{SubjectError as n}from"./single.mjs";import{SubjectType as a}from"./types.mjs";var l=Object.defineProperty,d=Object.getOwnPropertyDescriptor,p=(e,t,i,s)=>{for(var r,o=s>1?void 0:s?d(t,i):t,n=e.length-1;n>=0;n--)(r=e[n])&&(o=(s?r(t,i,o):r(o))||o);return s&&o&&l(t,i,o),o};const h=[{bg:"#ecf5ff",color:"#3D61E3",border:"#d9ecff"},{bg:"#f0f9eb",color:"#67c23a",border:"#c2e7b0"},{bg:"#fdf6ec",color:"#e6a23c",border:"#faecd8"},{bg:"#fef0f0",color:"#f56c6c",border:"#fde2e2"},{bg:"#f4f4f5",color:"#909399",border:"#e9e9eb"}];let c=class extends t{constructor(){super(...arguments),this._iconPlus=i`<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>`,this._iconRemove=i`<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>`,this.orderIndex=0,this.title="",this.customId="",this.isEdit=!1,this.isSave=!1,this.isSet=!1,this.isKey=!1,this.showAction=!0,this.showAdd=!0,this.showAnswerSetting=!1,this.showAnalysis=!0,this.richTextContent="",this.analysis="",this.examAnswerRelationType=0,this.examExpand="",this.examAnswerSetting={isInOrder:!0,isIgnoreCase:!0,keywordCount:1},this.uploadImage=async e=>new Promise((t,i)=>{const s=new FileReader;s.onload=e=>t(e.target?.result),s.onerror=i,s.readAsDataURL(e)}),this.answerList=[],this.modelValue="",this.useModel=!1,this._answers=[{title:"",tag:"",showInput:!1}],this._title="",this._analysis="",this._isInOrder=!0,this._isIgnoreCase=!0,this._keywordCount=1,this._correct="",this._showRichText=!1,this._richText="",this.TITLE_MAX=200}willUpdate(e){e.has("isEdit")&&this.isEdit&&this._syncProps(),!this.isEdit&&(e.has("title")||e.has("answerList")||e.has("analysis")||e.has("examAnswerSetting")||e.has("richTextContent")||e.has("examExpand"))&&this._syncProps(),e.has("modelValue")&&this.useModel&&(this._title=this.modelValue)}_normalizeAnswerTitle(e){return String(e?.title??e?.answer??"")}_normalizedAnswerList(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(Array.isArray(e)?e:[]).map(e=>({...e,answerId:e?.answerId??e?.examAnswerId,title:this._normalizeAnswerTitle(e)}))}_syncProps(){this._title=this.title||"",this._analysis=this.analysis||"",this.answerList?.length?this._answers=this._normalizedAnswerList(this.answerList).map(e=>({title:e.title||"",tag:"",showInput:!1,answerId:e.answerId,customAnswerId:e.customAnswerId})):this._answers=[{title:"",tag:"",showInput:!1}],this.examAnswerSetting&&(this._isInOrder=!!this.examAnswerSetting.isInOrder,this._isIgnoreCase=!!this.examAnswerSetting.isIgnoreCase,this._keywordCount=this.examAnswerSetting.keywordCount||1),this._richText=this.richTextContent||"",this._showRichText=!!this.richTextContent,this._correct=this.examExpand||""}_emit(e,t){this.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:t??null}))}_onTitleInput(e){const t=e.target;t.value.length>this.TITLE_MAX&&(t.value=t.value.slice(0,this.TITLE_MAX)),this._title=t.value,this.useModel&&this.dispatchEvent(new CustomEvent("update:modelValue",{bubbles:!0,composed:!0,detail:this._title}))}_addTag(e){const t={...this._answers[e]};t.tag&&(t.title=t.title?[t.title,t.tag].join(","):t.tag,t.tag=""),t.showInput=!1,this._answers=this._answers.map((i,s)=>s===e?t:i)}_closeTag(e,t){const i={...this._answers[t]};i.title=i.title.split(",").filter(t=>t!==e).join(","),this._answers=this._answers.map((e,s)=>s===t?i:e)}async toJSON(){return new Promise((e,t)=>{const i={customId:this.customId||void 0,answerType:"text_fill",orderIndex:this.orderIndex},s=this.isEdit?this._title:this.title||"",r=this.isEdit?this._answers:this._normalizedAnswerList(this.answerList||[]),o=this.isEdit?this._analysis:this.analysis||"",l=this.isEdit?this._correct:this.examExpand||"",d=this.isEdit?this._keywordCount:this.examAnswerSetting?.keywordCount||1,p=this.isEdit?this._isInOrder:this.examAnswerSetting?.isInOrder??!0,h=this.isEdit?this._isIgnoreCase:this.examAnswerSetting?.isIgnoreCase??!0,c=this.isEdit?this._showRichText:!!this.richTextContent,x=this.isEdit?this._richText:this.richTextContent||"";if(!s)return void t(new n("题目标题不能为空!","EMPTY_TITLE","title",i));if(d||l){if(!d)return void t(new n("请完善答题设置!","NO_KEYWORD_COUNT","keywordCount",i));if(!l)return void t(new n("请输入问题正确答案!","NO_CORRECT_ANSWER","correct",i));if(r.length!==d)return void t(new n("关键词个数设置有误!","KEYWORD_COUNT_MISMATCH","answers",i));const e=[];if(r.forEach((t,i)=>{this._normalizeAnswerTitle(t)||e.push(`关键词${i+1}未设置`)}),e.length)return void t(new n(e.join(","),"KEYWORD_EMPTY","answers",i))}const w={answerType:a.TEXT_FILL,title:s,answers:r.filter(e=>this._normalizeAnswerTitle(e)).map(e=>({title:this._normalizeAnswerTitle(e),...e.answerId?{answerId:e.answerId}:{},...e.customAnswerId?{customAnswerId:e.customAnswerId}:{}})),analysis:o,isSetCorrectAnswer:!!l,isKey:this.isKey,examExpand:l,examAnswerSettingBO:{isIgnoreCase:h,isInOrder:p,keywordCount:d},examRichTextContent:c?x:""};this.customId&&(w.customId=this.customId),e(w)})}_addAnswer(){this.isSave||(this._answers=[...this._answers,{title:"",tag:"",showInput:!1}])}_deleteAnswer(e){this._answers.length<2||this.isSave||(this._answers=this._answers.filter((t,i)=>i!==e))}async _save(e){e?.stopImmediatePropagation();try{const e=await this.toJSON();this._emit("save",e)}catch(e){!function(e){const t=document.createElement("div");t.textContent=e,Object.assign(t.style,{position:"fixed",top:"20px",left:"50%",transform:"translateX(-50%)",padding:"10px 20px",borderRadius:"4px",fontSize:"13px",color:"#fff",background:"#f56c6c",zIndex:"99999",boxShadow:"0 4px 12px rgba(0,0,0,.15)",transition:"opacity .3s",opacity:"1"}),document.body.appendChild(t),setTimeout(()=>{t.style.opacity="0",setTimeout(()=>t.remove(),300)},2500)}(e.message)}}validate(){const e=[],t={customId:this.customId||void 0,answerType:"text_fill",orderIndex:this.orderIndex},i=this.isEdit?this._title:this.title||"",s=this.isEdit?this._answers:this._normalizedAnswerList(this.answerList||[]),r=this.isEdit?this._correct:this.examExpand||"",o=this.isEdit?this._keywordCount:this.examAnswerSetting?.keywordCount||1;return i||e.push(new n("题目标题不能为空!","EMPTY_TITLE","title",t)),(o||r)&&(o||e.push(new n("请完善答题设置!","NO_KEYWORD_COUNT","keywordCount",t)),r||e.push(new n("请输入问题正确答案!","NO_CORRECT_ANSWER","correct",t)),s.length!==o&&e.push(new n("关键词个数设置有误!","KEYWORD_COUNT_MISMATCH","answers",t)),s.forEach((i,s)=>{this._normalizeAnswerTitle(i)||e.push(new n(`关键词${s+1}未设置`,"KEYWORD_EMPTY","answers",t))})),e}_renderPreview(){const e=this.isEdit?this._answers:this._normalizedAnswerList(this.answerList||[]),t=this.isEdit?this._correct:this.examExpand||"";return i`
|
|
2
2
|
<div class="preview">
|
|
3
3
|
<span class="title">${this.orderIndex+1}.${this.title}(问答题)</span>
|
|
4
4
|
${this.richTextContent?i`<div class="rich-text" .innerHTML=${this.richTextContent}></div>`:""}
|
|
5
|
-
${
|
|
5
|
+
${e.some(e=>e.title)?i`
|
|
6
6
|
<div style="margin-top:8px;color:#a8abb2">
|
|
7
|
-
${
|
|
7
|
+
${e.map((e,t)=>e.title?i`
|
|
8
8
|
<span style="margin-right:10px">关键词${t+1}: ${e.title}</span>
|
|
9
9
|
`:"")}
|
|
10
10
|
</div>
|
|
11
11
|
`:""}
|
|
12
|
-
${
|
|
12
|
+
${t?i`<div style="margin-top:8px;color:#a8abb2">正确答案:${t}</div>`:""}
|
|
13
13
|
${this.analysis?i`<div style="color:#909399;font-size:12px;margin-top:8px">解析: ${this.analysis}</div>`:""}
|
|
14
14
|
</div>
|
|
15
15
|
`}_renderEdit(){return i`
|
|
@@ -26,26 +26,28 @@ import{css as e,LitElement as t,html as i}from"lit";import{property as s}from"..
|
|
|
26
26
|
</div>
|
|
27
27
|
</div>
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
<div class="
|
|
31
|
-
|
|
32
|
-
<
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
<
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
${this.showAnswerSetting?i`
|
|
30
|
+
<div class="flex-items-start" style="margin-top:12px">
|
|
31
|
+
<div class="label"><span>答题设置:</span></div>
|
|
32
|
+
<div style="flex:1;display:flex;align-items:center;flex-wrap:wrap;gap:8px">
|
|
33
|
+
<span style="font-size:13px;color:#606266">共答对</span>
|
|
34
|
+
<input type="number" style="width:60px;height:24px;border:1px solid #dcdfe6;border-radius:3px;padding:0 8px;font-size:13px"
|
|
35
|
+
.value=${String(this._keywordCount)} min="1"
|
|
36
|
+
@change=${e=>{this._keywordCount=Number(e.target.value)}} />
|
|
37
|
+
<span style="font-size:13px;color:#606266">个关键词,算是正确的</span>
|
|
38
|
+
<label style="display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-size:12px;color:#606266">
|
|
39
|
+
<input type="checkbox" .checked=${this._isInOrder}
|
|
40
|
+
@change=${e=>{this._isInOrder=e.target.checked}} />
|
|
41
|
+
答案不分顺序
|
|
42
|
+
</label>
|
|
43
|
+
<label style="display:inline-flex;align-items:center;gap:4px;cursor:pointer;font-size:12px;color:#606266">
|
|
44
|
+
<input type="checkbox" .checked=${this._isIgnoreCase}
|
|
45
|
+
@change=${e=>{this._isIgnoreCase=e.target.checked}} />
|
|
46
|
+
忽略大小写
|
|
47
|
+
</label>
|
|
48
|
+
</div>
|
|
47
49
|
</div>
|
|
48
|
-
|
|
50
|
+
`:""}
|
|
49
51
|
|
|
50
52
|
<div class="flex-items-start" style="margin-top:12px">
|
|
51
53
|
<div class="label"><span>答案:</span></div>
|
|
@@ -66,7 +68,7 @@ import{css as e,LitElement as t,html as i}from"lit";import{property as s}from"..
|
|
|
66
68
|
<div class="answer-item">
|
|
67
69
|
<span class="label">关键词${t+1}:</span>
|
|
68
70
|
<div class="answer-tags" style="display:flex;flex-wrap:wrap;gap:5px;align-items:center;flex:1;max-width:360px">
|
|
69
|
-
${e.title.split(",").filter(Boolean).map(e=>{const s=
|
|
71
|
+
${e.title.split(",").filter(Boolean).map(e=>{const s=h[t%h.length];return i`
|
|
70
72
|
<span style="display:inline-flex;align-items:center;background:${s.bg};color:${s.color};border:1px solid ${s.border};border-radius:3px;padding:2px 8px;font-size:12px;line-height:16px">
|
|
71
73
|
${e}
|
|
72
74
|
${this.isSave?"":i`<span style="cursor:pointer;margin-left:4px;color:#909399" @click=${()=>this._closeTag(e,t)}>×</span>`}
|
|
@@ -101,7 +103,7 @@ import{css as e,LitElement as t,html as i}from"lit";import{property as s}from"..
|
|
|
101
103
|
.uploadImage=${this.uploadImage}
|
|
102
104
|
?is-edit=${!0}
|
|
103
105
|
></qxs-blocksuite-editor>
|
|
104
|
-
|
|
106
|
+
${this.showAction?"":i`<div class="flex-justify-end" style="margin-top:8px"><span class="el-link danger" @click=${()=>{this._showRichText=!1,this._richText=""}}>删除富文本</span></div>`}
|
|
105
107
|
</div>
|
|
106
108
|
</div>
|
|
107
109
|
`:""}
|
|
@@ -126,18 +128,19 @@ import{css as e,LitElement as t,html as i}from"lit";import{property as s}from"..
|
|
|
126
128
|
<qxs-subject-action
|
|
127
129
|
?is-edit=${this.isEdit}
|
|
128
130
|
?is-set=${this.isSet}
|
|
129
|
-
?show-
|
|
131
|
+
?show-add=${this.showAdd}
|
|
132
|
+
?show-rich-text=${this._showRichText}
|
|
130
133
|
exam-answer-relation-type=${this.examAnswerRelationType}
|
|
131
134
|
@delete=${()=>this._emit("delete")}
|
|
132
135
|
@save=${this._save}
|
|
133
136
|
@edit=${()=>this._emit("edit")}
|
|
134
137
|
@add=${e=>this._emit("add",e.detail)}
|
|
135
138
|
@set-key=${e=>{this._emit("set-key",e.detail)}}
|
|
136
|
-
@on-show-rich-text=${()=>{this._showRichText=!
|
|
139
|
+
@on-show-rich-text=${()=>{this._showRichText=!this._showRichText,this._showRichText||(this._richText="")}}
|
|
137
140
|
></qxs-subject-action>
|
|
138
141
|
`:""}
|
|
139
142
|
</qxs-subject-layout>
|
|
140
|
-
`}};
|
|
143
|
+
`}};c.styles=e`
|
|
141
144
|
:host { display: block; font-family: system-ui, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; font-size: 12px; color: #5a5a5a; }
|
|
142
145
|
*, ::before, ::after { box-sizing: border-box; }
|
|
143
146
|
|
|
@@ -226,5 +229,5 @@ import{css as e,LitElement as t,html as i}from"lit";import{property as s}from"..
|
|
|
226
229
|
.modal-footer button:hover { color: #3D61E3; border-color: #a0cfff; }
|
|
227
230
|
.modal-footer button.primary { background: #3D61E3; border-color: #3D61E3; color: #fff; }
|
|
228
231
|
.modal-footer button.primary:hover { background: #2D4CB8; border-color: #2D4CB8; }
|
|
229
|
-
`,p([s({type:Number,attribute:"order-index"})],
|
|
232
|
+
`,p([s({type:Number,attribute:"order-index"})],c.prototype,"orderIndex",2),p([s({type:String})],c.prototype,"title",2),p([s({type:String,attribute:"custom-id"})],c.prototype,"customId",2),p([s({type:Boolean,attribute:"is-edit"})],c.prototype,"isEdit",2),p([s({type:Boolean,attribute:"is-save"})],c.prototype,"isSave",2),p([s({type:Boolean,attribute:"is-set"})],c.prototype,"isSet",2),p([s({type:Boolean,attribute:"is-key"})],c.prototype,"isKey",2),p([s({type:Boolean,attribute:"show-action"})],c.prototype,"showAction",2),p([s({type:Boolean,attribute:"show-add"})],c.prototype,"showAdd",2),p([s({type:Boolean,attribute:"show-answer-setting"})],c.prototype,"showAnswerSetting",2),p([s({type:Boolean,attribute:"show-analysis"})],c.prototype,"showAnalysis",2),p([s({type:String,attribute:"rich-text-content"})],c.prototype,"richTextContent",2),p([s({type:String})],c.prototype,"analysis",2),p([s({type:Number,attribute:"exam-answer-relation-type"})],c.prototype,"examAnswerRelationType",2),p([s({type:String,attribute:"exam-expand"})],c.prototype,"examExpand",2),p([s({type:Object,attribute:"exam-answer-setting"})],c.prototype,"examAnswerSetting",2),p([s({type:Object})],c.prototype,"uploadImage",2),p([s({type:Array,attribute:"answer-list"})],c.prototype,"answerList",2),p([s({type:String,attribute:"model-value"})],c.prototype,"modelValue",2),p([s({type:Boolean,attribute:"use-model"})],c.prototype,"useModel",2),p([r()],c.prototype,"_answers",2),p([r()],c.prototype,"_title",2),p([r()],c.prototype,"_analysis",2),p([r()],c.prototype,"_isInOrder",2),p([r()],c.prototype,"_isIgnoreCase",2),p([r()],c.prototype,"_keywordCount",2),p([r()],c.prototype,"_correct",2),p([r()],c.prototype,"_showRichText",2),p([r()],c.prototype,"_richText",2),c=p([o("qxs-text-fill")],c);export{c as QxsTextFill};
|
|
230
233
|
//# sourceMappingURL=text-fill.mjs.map
|