@qxs-bns/components 0.0.92 → 0.0.94
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/LICENSE +21 -0
- package/es/answer-container/answer-container.mjs +65 -0
- package/es/answer-container/answer-container.mjs.map +1 -0
- package/es/answer-container/clone.mjs +2 -0
- package/es/answer-container/clone.mjs.map +1 -0
- package/es/answer-container/normalize.mjs +2 -0
- package/es/answer-container/normalize.mjs.map +1 -0
- package/es/answer-container/runtime-blank-fill.mjs +39 -0
- package/es/answer-container/runtime-blank-fill.mjs.map +1 -0
- package/es/answer-container/runtime-choice.mjs +38 -0
- package/es/answer-container/runtime-choice.mjs.map +1 -0
- package/es/answer-container/runtime-question-base.mjs +43 -0
- package/es/answer-container/runtime-question-base.mjs.map +1 -0
- package/es/answer-container/runtime-scale.mjs +36 -0
- package/es/answer-container/runtime-scale.mjs.map +1 -0
- package/es/answer-container/runtime-text-fill.mjs +19 -0
- package/es/answer-container/runtime-text-fill.mjs.map +1 -0
- package/es/answer-container/styles.mjs +468 -0
- package/es/answer-container/styles.mjs.map +1 -0
- package/es/entry-answer-container.mjs +2 -0
- package/es/entry-answer-container.mjs.map +1 -0
- package/es/entry-video-player.mjs +2 -0
- package/es/entry-video-player.mjs.map +1 -0
- package/es/index.mjs +1 -1
- package/es/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.mjs +2 -0
- package/es/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.mjs.map +1 -0
- package/es/video-player.mjs +3 -0
- package/es/video-player.mjs.map +1 -0
- package/es/video-player.theme.mjs +111 -0
- package/es/video-player.theme.mjs.map +1 -0
- package/lib/answer-container/answer-container.cjs +65 -0
- package/lib/answer-container/answer-container.cjs.map +1 -0
- package/lib/answer-container/clone.cjs +2 -0
- package/lib/answer-container/clone.cjs.map +1 -0
- package/lib/answer-container/normalize.cjs +2 -0
- package/lib/answer-container/normalize.cjs.map +1 -0
- package/lib/answer-container/runtime-blank-fill.cjs +39 -0
- package/lib/answer-container/runtime-blank-fill.cjs.map +1 -0
- package/lib/answer-container/runtime-choice.cjs +38 -0
- package/lib/answer-container/runtime-choice.cjs.map +1 -0
- package/lib/answer-container/runtime-question-base.cjs +43 -0
- package/lib/answer-container/runtime-question-base.cjs.map +1 -0
- package/lib/answer-container/runtime-scale.cjs +36 -0
- package/lib/answer-container/runtime-scale.cjs.map +1 -0
- package/lib/answer-container/runtime-text-fill.cjs +19 -0
- package/lib/answer-container/runtime-text-fill.cjs.map +1 -0
- package/lib/answer-container/styles.cjs +468 -0
- package/lib/answer-container/styles.cjs.map +1 -0
- package/lib/entry-answer-container.cjs +2 -0
- package/lib/entry-answer-container.cjs.map +1 -0
- package/lib/entry-video-player.cjs +2 -0
- package/lib/entry-video-player.cjs.map +1 -0
- package/lib/index.cjs +1 -1
- package/lib/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.cjs +2 -0
- package/lib/node_modules/.pnpm/xgplayer@3.0.26_core-js@3.45.0/node_modules/xgplayer/dist/index.min.css.cjs.map +1 -0
- package/lib/video-player.cjs +3 -0
- package/lib/video-player.cjs.map +1 -0
- package/lib/video-player.theme.cjs +111 -0
- package/lib/video-player.theme.cjs.map +1 -0
- package/package.json +14 -2
- package/types/answer-container/answer-container.d.ts +26 -0
- package/types/answer-container/clone.d.ts +1 -0
- package/types/answer-container/index.d.ts +12 -0
- package/types/answer-container/normalize.d.ts +3 -0
- package/types/answer-container/runtime-blank-fill.d.ts +35 -0
- package/types/answer-container/runtime-choice.d.ts +44 -0
- package/types/answer-container/runtime-question-base.d.ts +39 -0
- package/types/answer-container/runtime-scale.d.ts +36 -0
- package/types/answer-container/runtime-text-fill.d.ts +32 -0
- package/types/answer-container/styles.d.ts +1 -0
- package/types/answer-container/types.d.ts +40 -0
- package/types/entry-answer-container.d.ts +2 -0
- package/types/entry-video-player.d.ts +2 -0
- package/types/index.d.ts +2 -0
- package/types/video-player.d.ts +44 -0
- package/types/video-player.theme.d.ts +12 -0
- package/types/video-player.types.d.ts +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 qxs-bns
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import{LitElement as S,html as l}from"lit";import{property as a,state as p}from"lit/decorators.js";import{safeCustomElement as g}from"../base/define.mjs";import{emitSubjectEvent as f}from"../subject/shared-methods.mjs";import{normalizeAnswerContainerList as d,addTitleNumber as c}from"./normalize.mjs";import{answerContainerStyles as R}from"./styles.mjs";var $=Object.defineProperty,b=Object.getOwnPropertyDescriptor,n=(e,s,t,r)=>{for(var i=r>1?void 0:r?b(s,t):s,h=e.length-1,m;h>=0;h--)(m=e[h])&&(i=(r?m(s,t,i):m(i))||i);return r&&i&&$(s,t,i),i};function w(e){return`${e.examId??""}::${e.examIndex??""}`}function u(e){const s=e?.submitAnswer;return s!=null&&String(s).length>0}let o=class extends S{constructor(){super(...arguments),this.list=[],this.disabled=!1,this.type=!0,this.isShowCorrect=!1,this.isShowBg=!1,this.isShowProgress=!1,this.showSingleRowScaleTitle=!1,this.themeName="default",this.beforeChange=()=>!0,this.answerRowRelationExamAnswerRenderer=null,this._list=[],this._draftRowKeys=new Set}createRenderRoot(){return this}willUpdate(e){if(e.has("list")){const s=d(this.list);this._list=s.map(t=>{const r=this._list.find(h=>w(h)===w(t));if(!r)return t;const i=w(t);return this._draftRowKeys.has(i)&&!u(t)&&u(r)?{...r,...t,submitAnswer:r.submitAnswer,submitAnswerObj:r.submitAnswerObj}:(this._draftRowKeys.has(i)&&u(t)&&this._draftRowKeys.delete(i),t)})}}addTitleNumber(e){return c(e)}reset(){this._draftRowKeys.clear(),this._list=d(this._list.map(e=>({...e,submitAnswer:null})))}async onSubmit(){const e=Array.from(this.querySelectorAll("qxs-answer-runtime-choice, qxs-answer-runtime-blank-fill, qxs-answer-runtime-text-fill, qxs-answer-runtime-scale"));return Promise.all(e.map(s=>s.onSubmit()))}_onRowChange(e){this._draftRowKeys.delete(w(e)),this._list=this._list.map(s=>{const t=String(s.examId||"")===String(e.examId||""),r=String(s.examIndex||"")===String(e.examIndex||"");return t||r?{...s,...e}:s}),f(this,"on-change",e)}_onRowDraftChange(e){const s=w(e);this._draftRowKeys.add(s),this._list=this._list.map(t=>{const r=String(t.examId||"")===String(e.examId||""),i=String(t.examIndex||"")===String(e.examIndex||"");return r||i?{...t,...e}:t})}_renderItem(e){const s=e.examTypeEnum||"single";return s==="blank_fill"?l`
|
|
2
|
+
<qxs-answer-runtime-blank-fill
|
|
3
|
+
.item=${e}
|
|
4
|
+
.disabled=${this.disabled}
|
|
5
|
+
.type=${this.type}
|
|
6
|
+
.isShowCorrect=${this.isShowCorrect}
|
|
7
|
+
.isShowBg=${this.isShowBg}
|
|
8
|
+
.isShowProgress=${this.isShowProgress}
|
|
9
|
+
.showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
|
|
10
|
+
.themeName=${this.themeName}
|
|
11
|
+
.beforeChange=${this.beforeChange}
|
|
12
|
+
.answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
|
|
13
|
+
@runtime-input=${t=>this._onRowDraftChange(t.detail)}
|
|
14
|
+
@on-change=${t=>this._onRowChange(t.detail)}
|
|
15
|
+
></qxs-answer-runtime-blank-fill>
|
|
16
|
+
`:s==="text_fill"?l`
|
|
17
|
+
<qxs-answer-runtime-text-fill
|
|
18
|
+
.item=${e}
|
|
19
|
+
.disabled=${this.disabled}
|
|
20
|
+
.type=${this.type}
|
|
21
|
+
.isShowCorrect=${this.isShowCorrect}
|
|
22
|
+
.isShowBg=${this.isShowBg}
|
|
23
|
+
.isShowProgress=${this.isShowProgress}
|
|
24
|
+
.showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
|
|
25
|
+
.themeName=${this.themeName}
|
|
26
|
+
.beforeChange=${this.beforeChange}
|
|
27
|
+
.answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
|
|
28
|
+
@runtime-input=${t=>this._onRowDraftChange(t.detail)}
|
|
29
|
+
@on-change=${t=>this._onRowChange(t.detail)}
|
|
30
|
+
></qxs-answer-runtime-text-fill>
|
|
31
|
+
`:s==="scale"?l`
|
|
32
|
+
<qxs-answer-runtime-scale
|
|
33
|
+
.item=${e}
|
|
34
|
+
.disabled=${this.disabled}
|
|
35
|
+
.type=${this.type}
|
|
36
|
+
.isShowCorrect=${this.isShowCorrect}
|
|
37
|
+
.isShowBg=${this.isShowBg}
|
|
38
|
+
.isShowProgress=${this.isShowProgress}
|
|
39
|
+
.showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
|
|
40
|
+
.themeName=${this.themeName}
|
|
41
|
+
.beforeChange=${this.beforeChange}
|
|
42
|
+
.answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
|
|
43
|
+
@on-change=${t=>this._onRowChange(t.detail)}
|
|
44
|
+
></qxs-answer-runtime-scale>
|
|
45
|
+
`:l`
|
|
46
|
+
<qxs-answer-runtime-choice
|
|
47
|
+
.item=${e}
|
|
48
|
+
.disabled=${this.disabled}
|
|
49
|
+
.type=${this.type}
|
|
50
|
+
.isShowCorrect=${this.isShowCorrect}
|
|
51
|
+
.isShowBg=${this.isShowBg}
|
|
52
|
+
.isShowProgress=${this.isShowProgress}
|
|
53
|
+
.showSingleRowScaleTitle=${this.showSingleRowScaleTitle}
|
|
54
|
+
.themeName=${this.themeName}
|
|
55
|
+
.beforeChange=${this.beforeChange}
|
|
56
|
+
.answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}
|
|
57
|
+
@on-change=${t=>this._onRowChange(t.detail)}
|
|
58
|
+
></qxs-answer-runtime-choice>
|
|
59
|
+
`}render(){return l`
|
|
60
|
+
<style>${R}</style>
|
|
61
|
+
<div class="qxs-answer-container ${this.themeName}">
|
|
62
|
+
${this._list.map(e=>this._renderItem(e))}
|
|
63
|
+
</div>
|
|
64
|
+
`}};n([a({attribute:!1})],o.prototype,"list",2);n([a({type:Boolean})],o.prototype,"disabled",2);n([a({type:Boolean})],o.prototype,"type",2);n([a({type:Boolean,attribute:"is-show-correct"})],o.prototype,"isShowCorrect",2);n([a({type:Boolean,attribute:"is-show-bg"})],o.prototype,"isShowBg",2);n([a({type:Boolean,attribute:"is-show-progress"})],o.prototype,"isShowProgress",2);n([a({type:Boolean,attribute:"show-single-row-scale-title"})],o.prototype,"showSingleRowScaleTitle",2);n([a({type:String,attribute:"theme-name"})],o.prototype,"themeName",2);n([a({attribute:!1})],o.prototype,"beforeChange",2);n([a({attribute:!1})],o.prototype,"answerRowRelationExamAnswerRenderer",2);n([p()],o.prototype,"_list",2);o=n([g("qxs-answer-container")],o);export{o as QxsAnswerContainer};
|
|
65
|
+
//# sourceMappingURL=answer-container.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-container.mjs","sources":["../../../../packages/components/src/answer-container/answer-container.ts"],"sourcesContent":["import { html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { addTitleNumber, normalizeAnswerContainerList } from './normalize'\nimport { answerContainerStyles } from './styles'\nimport type { AnswerRowRelationExamAnswerRenderer, AnswerThemeName, LegacyAnswerContainerItem } from './types'\n\ntype RuntimeElement = HTMLElement & {\n item: LegacyAnswerContainerItem\n type?: boolean\n onSubmit: () => Promise<LegacyAnswerContainerItem>\n reset: () => void\n}\n\nfunction rowKeyOf(item: LegacyAnswerContainerItem) {\n return `${item.examId ?? ''}::${item.examIndex ?? ''}`\n}\n\nfunction hasMeaningfulSubmitAnswer(item: LegacyAnswerContainerItem | undefined) {\n const value = item?.submitAnswer\n return value != null && String(value).length > 0\n}\n\n@safeCustomElement('qxs-answer-container')\nexport class QxsAnswerContainer extends LitElement {\n createRenderRoot() {\n return this\n }\n\n @property({ attribute: false }) list: LegacyAnswerContainerItem[] | LegacyAnswerContainerItem | null = []\n @property({ type: Boolean }) disabled = false\n @property({ type: Boolean }) type = true\n @property({ type: Boolean, attribute: 'is-show-correct' }) isShowCorrect = false\n @property({ type: Boolean, attribute: 'is-show-bg' }) isShowBg = false\n @property({ type: Boolean, attribute: 'is-show-progress' }) isShowProgress = false\n @property({ type: Boolean, attribute: 'show-single-row-scale-title' }) showSingleRowScaleTitle = false\n @property({ type: String, attribute: 'theme-name' }) themeName: AnswerThemeName = 'default'\n @property({ attribute: false }) beforeChange: (row: LegacyAnswerContainerItem, answerItem?: any) => boolean = () => true\n @property({ attribute: false }) answerRowRelationExamAnswerRenderer: AnswerRowRelationExamAnswerRenderer | null = null\n\n @state() private _list: LegacyAnswerContainerItem[] = []\n private _draftRowKeys = new Set<string>()\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('list')) {\n const nextList = normalizeAnswerContainerList(this.list)\n this._list = nextList.map((nextItem) => {\n const currentItem = this._list.find(item => rowKeyOf(item) === rowKeyOf(nextItem))\n if (!currentItem) {\n return nextItem\n }\n\n const rowKey = rowKeyOf(nextItem)\n if (this._draftRowKeys.has(rowKey) && !hasMeaningfulSubmitAnswer(nextItem) && hasMeaningfulSubmitAnswer(currentItem)) {\n return {\n ...currentItem,\n ...nextItem,\n submitAnswer: currentItem.submitAnswer,\n submitAnswerObj: currentItem.submitAnswerObj,\n }\n }\n\n if (this._draftRowKeys.has(rowKey) && hasMeaningfulSubmitAnswer(nextItem)) {\n this._draftRowKeys.delete(rowKey)\n }\n\n return nextItem\n })\n }\n }\n\n addTitleNumber(list: LegacyAnswerContainerItem[]) {\n return addTitleNumber(list)\n }\n\n reset() {\n this._draftRowKeys.clear()\n this._list = normalizeAnswerContainerList(\n this._list.map(item => ({ ...item, submitAnswer: null })),\n )\n }\n\n async onSubmit() {\n const children = Array.from(this.querySelectorAll<RuntimeElement>(\n 'qxs-answer-runtime-choice, qxs-answer-runtime-blank-fill, qxs-answer-runtime-text-fill, qxs-answer-runtime-scale',\n ))\n return Promise.all(children.map(child => child.onSubmit()))\n }\n\n private _onRowChange(changedItem: LegacyAnswerContainerItem) {\n this._draftRowKeys.delete(rowKeyOf(changedItem))\n this._list = this._list.map((item) => {\n const sameExamId = String(item.examId || '') === String(changedItem.examId || '')\n const sameExamIndex = String(item.examIndex || '') === String(changedItem.examIndex || '')\n return sameExamId || sameExamIndex ? { ...item, ...changedItem } : item\n })\n\n emitSubjectEvent(this, 'on-change', changedItem)\n }\n\n private _onRowDraftChange(changedItem: LegacyAnswerContainerItem) {\n const rowKey = rowKeyOf(changedItem)\n this._draftRowKeys.add(rowKey)\n this._list = this._list.map((item) => {\n const sameExamId = String(item.examId || '') === String(changedItem.examId || '')\n const sameExamIndex = String(item.examIndex || '') === String(changedItem.examIndex || '')\n return sameExamId || sameExamIndex ? { ...item, ...changedItem } : item\n })\n }\n\n private _renderItem(item: LegacyAnswerContainerItem) {\n const examTypeEnum = item.examTypeEnum || 'single'\n\n if (examTypeEnum === 'blank_fill') {\n return html`\n <qxs-answer-runtime-blank-fill\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @runtime-input=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowDraftChange(event.detail)}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-blank-fill>\n `\n }\n\n if (examTypeEnum === 'text_fill') {\n return html`\n <qxs-answer-runtime-text-fill\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @runtime-input=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowDraftChange(event.detail)}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-text-fill>\n `\n }\n\n if (examTypeEnum === 'scale') {\n return html`\n <qxs-answer-runtime-scale\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-scale>\n `\n }\n\n return html`\n <qxs-answer-runtime-choice\n .item=${item}\n .disabled=${this.disabled}\n .type=${this.type}\n .isShowCorrect=${this.isShowCorrect}\n .isShowBg=${this.isShowBg}\n .isShowProgress=${this.isShowProgress}\n .showSingleRowScaleTitle=${this.showSingleRowScaleTitle}\n .themeName=${this.themeName}\n .beforeChange=${this.beforeChange}\n .answerRowRelationExamAnswerRenderer=${this.answerRowRelationExamAnswerRenderer}\n @on-change=${(event: CustomEvent<LegacyAnswerContainerItem>) => this._onRowChange(event.detail)}\n ></qxs-answer-runtime-choice>\n `\n }\n\n render() {\n return html`\n <style>${answerContainerStyles}</style>\n <div class=\"qxs-answer-container ${this.themeName}\">\n ${this._list.map(item => this._renderItem(item))}\n </div>\n `\n }\n}\n\nexport function register() {}\n"],"names":["rowKeyOf","item","hasMeaningfulSubmitAnswer","value","QxsAnswerContainer","LitElement","changed","nextList","normalizeAnswerContainerList","nextItem","currentItem","rowKey","list","addTitleNumber","children","child","changedItem","sameExamId","sameExamIndex","emitSubjectEvent","examTypeEnum","html","event","answerContainerStyles","__decorateClass","property","state","safeCustomElement"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(t,r){const n=[];r.set(t,n);for(const o of t)n.push(c(o,r));return n}function i(t,r){const n={};r.set(t,n);for(const o of Reflect.ownKeys(t))Object.getOwnPropertyDescriptor(t,o)?.enumerable&&(n[o]=c(t[o],r));return n}function c(t,r=new WeakMap){return t==null||typeof t!="object"?t:t instanceof Date?new Date(t.getTime()):r.has(t)?r.get(t):Array.isArray(t)?e(t,r):i(t,r)}export{c as cloneAnswerValue};
|
|
2
|
+
//# sourceMappingURL=clone.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone.mjs","sources":["../../../../packages/components/src/answer-container/clone.ts"],"sourcesContent":["function cloneArray(value: unknown[], seen: WeakMap<object, unknown>) {\n const output: unknown[] = []\n seen.set(value, output)\n for (const item of value) {\n output.push(cloneAnswerValue(item, seen))\n }\n return output\n}\n\nfunction cloneObject(value: Record<PropertyKey, unknown>, seen: WeakMap<object, unknown>) {\n const output: Record<PropertyKey, unknown> = {}\n seen.set(value, output)\n\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key)\n if (!descriptor?.enumerable) {\n continue\n }\n output[key] = cloneAnswerValue(value[key], seen)\n }\n\n return output\n}\n\nexport function cloneAnswerValue<T>(value: T, seen = new WeakMap<object, unknown>()): T {\n if (value == null || typeof value !== 'object') {\n return value\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T\n }\n\n if (seen.has(value as object)) {\n return seen.get(value as object) as T\n }\n\n if (Array.isArray(value)) {\n return cloneArray(value, seen) as T\n }\n\n return cloneObject(value as Record<PropertyKey, unknown>, seen) as T\n}\n"],"names":["cloneArray","value","seen","output","item","cloneAnswerValue","cloneObject","key"],"mappings":"AAAA,SAASA,EAAWC,EAAkBC,EAAgC,CACpE,MAAMC,EAAoB,CAAA,EAC1BD,EAAK,IAAID,EAAOE,CAAM,EACtB,UAAWC,KAAQH,EACjBE,EAAO,KAAKE,EAAiBD,EAAMF,CAAI,CAAC,EAE1C,OAAOC,CACT,CAEA,SAASG,EAAYL,EAAqCC,EAAgC,CACxF,MAAMC,EAAuC,CAAA,EAC7CD,EAAK,IAAID,EAAOE,CAAM,EAEtB,UAAWI,KAAO,QAAQ,QAAQN,CAAK,EAClB,OAAO,yBAAyBA,EAAOM,CAAG,GAC5C,aAGjBJ,EAAOI,CAAG,EAAIF,EAAiBJ,EAAMM,CAAG,EAAGL,CAAI,GAGjD,OAAOC,CACT,CAEO,SAASE,EAAoBJ,EAAUC,EAAO,IAAI,QAA+B,CACtF,OAAID,GAAS,MAAQ,OAAOA,GAAU,SAC7BA,EAGLA,aAAiB,KACZ,IAAI,KAAKA,EAAM,SAAS,EAG7BC,EAAK,IAAID,CAAe,EACnBC,EAAK,IAAID,CAAe,EAG7B,MAAM,QAAQA,CAAK,EACdD,EAAWC,EAAOC,CAAI,EAGxBI,EAAYL,EAAuCC,CAAI,CAChE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{cloneAnswerValue as a}from"./clone.mjs";function o(r){return a(r)}function s(r){const n=Number(r??0);return Number.isFinite(n)?n:0}function m(r){let n=0;return r.map(t=>{const e=o(t);return e.examTypeEnum&&(n+=1,e.titleIndex=e.titleIndex||n,e.answers=Array.isArray(e.answers)?e.answers:[]),e})}function c(r){const t=(Array.isArray(r)?r:r?[r]:[]).map(e=>o(e)).sort((e,i)=>s(e.examIndex)-s(i.examIndex));return m(t)}export{m as addTitleNumber,c as normalizeAnswerContainerList};
|
|
2
|
+
//# sourceMappingURL=normalize.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.mjs","sources":["../../../../packages/components/src/answer-container/normalize.ts"],"sourcesContent":["import type { LegacyAnswerContainerItem } from './types'\nimport { cloneAnswerValue } from './clone'\n\nfunction cloneItem<T>(value: T): T {\n return cloneAnswerValue(value)\n}\n\nfunction toNumber(value: unknown) {\n const num = Number(value ?? 0)\n return Number.isFinite(num) ? num : 0\n}\n\nexport function addTitleNumber(list: LegacyAnswerContainerItem[]): LegacyAnswerContainerItem[] {\n let currentTitleIndex = 0\n\n return list.map((item) => {\n const next = cloneItem(item)\n\n if (next.examTypeEnum) {\n currentTitleIndex += 1\n next.titleIndex = next.titleIndex || currentTitleIndex\n next.answers = Array.isArray(next.answers) ? next.answers : []\n }\n\n return next\n })\n}\n\nexport function normalizeAnswerContainerList(\n input: LegacyAnswerContainerItem[] | LegacyAnswerContainerItem | null | undefined,\n): LegacyAnswerContainerItem[] {\n const list = Array.isArray(input)\n ? input\n : input\n ? [input]\n : []\n\n const sorted = list\n .map(item => cloneItem(item))\n .sort((a, b) => toNumber(a.examIndex) - toNumber(b.examIndex))\n\n return addTitleNumber(sorted)\n}\n"],"names":["cloneItem","value","cloneAnswerValue","toNumber","num","addTitleNumber","list","currentTitleIndex","item","next","normalizeAnswerContainerList","input","sorted","a","b"],"mappings":"+CAGA,SAASA,EAAaC,EAAa,CACjC,OAAOC,EAAiBD,CAAK,CAC/B,CAEA,SAASE,EAASF,EAAgB,CAChC,MAAMG,EAAM,OAAOH,GAAS,CAAC,EAC7B,OAAO,OAAO,SAASG,CAAG,EAAIA,EAAM,CACtC,CAEO,SAASC,EAAeC,EAAgE,CAC7F,IAAIC,EAAoB,EAExB,OAAOD,EAAK,IAAKE,GAAS,CACxB,MAAMC,EAAOT,EAAUQ,CAAI,EAE3B,OAAIC,EAAK,eACPF,GAAqB,EACrBE,EAAK,WAAaA,EAAK,YAAcF,EACrCE,EAAK,QAAU,MAAM,QAAQA,EAAK,OAAO,EAAIA,EAAK,QAAU,CAAA,GAGvDA,CACT,CAAC,CACH,CAEO,SAASC,EACdC,EAC6B,CAO7B,MAAMC,GANO,MAAM,QAAQD,CAAK,EAC5BA,EACAA,EACE,CAACA,CAAK,EACN,CAAA,GAGH,OAAYX,EAAUQ,CAAI,CAAC,EAC3B,KAAK,CAACK,EAAGC,IAAMX,EAASU,EAAE,SAAS,EAAIV,EAASW,EAAE,SAAS,CAAC,EAE/D,OAAOT,EAAeO,CAAM,CAC9B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import{html as i}from"lit";import{state as m}from"lit/decorators.js";import{safeCustomElement as _}from"../base/define.mjs";import{emitSubjectEvent as h}from"../subject/shared-methods.mjs";import{AnswerRuntimeElement as c}from"./runtime-question-base.mjs";var p=Object.defineProperty,d=Object.getOwnPropertyDescriptor,o=(t,s,e,n)=>{for(var r=n>1?void 0:n?d(s,e):s,l=t.length-1,a;l>=0;l--)(a=t[l])&&(r=(n?a(s,e,r):a(r))||r);return n&&r&&p(s,e,r),r};const v="<filter></filter>";function w(t,s){return{row:t,message:s}}function f(t){const s=String(t.title||"").match(/<filter><\/filter>/g)?.length||0,e=Array.isArray(t.answers)?t.answers.length:0;return Math.max(s,e,1)}function b(t){return t.split(v)}let u=class extends c{constructor(){super(...arguments),this._values=[]}syncFromItem(){const t=f(this._item),s=String(this._item.submitAnswer||"").split(",");this._values=Array.from({length:t},(e,n)=>s[n]||"")}_setValue(t,s){this.disabled||!this.beforeChange(this._item,this._item)||(this._values=this._values.map((e,n)=>n===t?s:e),h(this,"runtime-input",{...this._item,submitAnswer:this._values.join(",")}))}_renderInput(t){const s=this._values[t]||"";return i`
|
|
2
|
+
<input
|
|
3
|
+
class="input mgn-l10"
|
|
4
|
+
.value=${s}
|
|
5
|
+
aria-label=${`第 ${t+1} 空`}
|
|
6
|
+
?disabled=${this.disabled||!this.type}
|
|
7
|
+
@input=${e=>this._setValue(t,e.target.value)}
|
|
8
|
+
/>
|
|
9
|
+
`}_renderTitleWithMasks(){const t=String(this._item.title||""),s=b(t);return s.length>1?i`
|
|
10
|
+
<span class="qxs-answer-runtime__blank-flow">
|
|
11
|
+
<span class="qxs-answer-runtime__blank-text">${this._item.titleIndex?`${this._item.titleIndex}. `:""}${s[0]||""}</span>
|
|
12
|
+
${s.slice(1).map((n,r)=>i`
|
|
13
|
+
<span class="qxs-answer-runtime__blank-mask">
|
|
14
|
+
<span class="qxs-answer-runtime__blank-mask-index">${r+1}</span>
|
|
15
|
+
</span>
|
|
16
|
+
${n?i`<span class="qxs-answer-runtime__blank-text">${n}</span>`:""}
|
|
17
|
+
`)}
|
|
18
|
+
</span>
|
|
19
|
+
`:null}_renderInputRows(){return i`
|
|
20
|
+
<div class="qxs-answer-runtime__answers">
|
|
21
|
+
${this._values.map((t,s)=>i`
|
|
22
|
+
<div class="question-input-box">
|
|
23
|
+
<div class="placeholder-box">
|
|
24
|
+
<span class="required-span">*</span>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="question-input-box__index">${s+1}.</div>
|
|
27
|
+
${this._renderInput(s)}
|
|
28
|
+
</div>
|
|
29
|
+
`)}
|
|
30
|
+
</div>
|
|
31
|
+
`}_renderReview(){if(!this.disabled||!this.isShowCorrect)return null;const t=this.resultAnswersFromExamResults(),s=String(this._item.analysis||"").trim();return i`
|
|
32
|
+
<div class="qxs-answer-runtime__result">
|
|
33
|
+
${t.length?t.map((e,n)=>i`
|
|
34
|
+
<div class="qxs-answer-runtime__result-line">填空${n+1}参考答案为:${e?.correctAnswer||""}</div>
|
|
35
|
+
`):i`<span class="qxs-answer-runtime__result-line is-success">本题暂无参考答案</span>`}
|
|
36
|
+
${s?i`<div class="qxs-answer-runtime__result-line is-muted">答题解析:${s}</div>`:""}
|
|
37
|
+
</div>
|
|
38
|
+
`}async onSubmit(){if(!this._values.length||this._values.some(s=>!String(s||"").trim()))throw w(this._item,"请填写答案");const t=this._values.join(",");return{...this._item,submitAnswer:t,submitAnswerObj:{intVal:this._item.examId,stringVal:t}}}reset(){this.updateItem(this.cloneItem()),this.syncFromItem()}render(){const t=this._renderTitleWithMasks();return this.renderShell({shellClassName:"qxs-answer-runtime-blank-fill blank_fill",titleContent:this.renderTitleBlock(t||void 0),answerContent:this._renderInputRows(),resultContent:this._renderReview(),footerContent:this.renderCasePracticeFooter({...this._item,submitAnswer:this._values.join(",")})})}};o([m()],u.prototype,"_values",2);u=o([_("qxs-answer-runtime-blank-fill")],u);export{u as QxsAnswerRuntimeBlankFill};
|
|
39
|
+
//# sourceMappingURL=runtime-blank-fill.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-blank-fill.mjs","sources":["../../../../packages/components/src/answer-container/runtime-blank-fill.ts"],"sourcesContent":["import { html } from 'lit'\nimport { state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { AnswerRuntimeElement } from './runtime-question-base'\nimport type { AnswerSubmitError } from './types'\n\nconst FILTER_TOKEN = '<filter></filter>'\n\nfunction toError(row: any, message: string): AnswerSubmitError {\n return { row, message }\n}\n\nfunction blankCountFromItem(item: Record<string, any>) {\n const titleCount = String(item.title || '').match(/<filter><\\/filter>/g)?.length || 0\n const answerCount = Array.isArray(item.answers) ? item.answers.length : 0\n return Math.max(titleCount, answerCount, 1)\n}\n\nfunction splitFilterTitle(title: string) {\n return title.split(FILTER_TOKEN)\n}\n\n@safeCustomElement('qxs-answer-runtime-blank-fill')\nexport class QxsAnswerRuntimeBlankFill extends AnswerRuntimeElement {\n @state() private _values: string[] = []\n\n protected syncFromItem() {\n const count = blankCountFromItem(this._item)\n const current = String(this._item.submitAnswer || '').split(',')\n this._values = Array.from({ length: count }, (_, index) => current[index] || '')\n }\n\n private _setValue(index: number, value: string) {\n if (this.disabled || !this.beforeChange(this._item, this._item)) {\n return\n }\n this._values = this._values.map((current, currentIndex) => currentIndex === index ? value : current)\n emitSubjectEvent(this, 'runtime-input', {\n ...this._item,\n submitAnswer: this._values.join(','),\n })\n }\n\n private _renderInput(index: number) {\n const value = this._values[index] || ''\n return html`\n <input\n class=\"input mgn-l10\"\n .value=${value}\n aria-label=${`第 ${index + 1} 空`}\n ?disabled=${this.disabled || !this.type}\n @input=${(event: Event) => this._setValue(index, (event.target as HTMLInputElement).value)}\n />\n `\n }\n\n private _renderTitleWithMasks() {\n const title = String(this._item.title || '')\n const segments = splitFilterTitle(title)\n const hasFilter = segments.length > 1\n\n if (!hasFilter) {\n return null\n }\n\n return html`\n <span class=\"qxs-answer-runtime__blank-flow\">\n <span class=\"qxs-answer-runtime__blank-text\">${this._item.titleIndex ? `${this._item.titleIndex}. ` : ''}${segments[0] || ''}</span>\n ${segments.slice(1).map((segment, index) => html`\n <span class=\"qxs-answer-runtime__blank-mask\">\n <span class=\"qxs-answer-runtime__blank-mask-index\">${index + 1}</span>\n </span>\n ${segment ? html`<span class=\"qxs-answer-runtime__blank-text\">${segment}</span>` : ''}\n `)}\n </span>\n `\n }\n\n private _renderInputRows() {\n return html`\n <div class=\"qxs-answer-runtime__answers\">\n ${this._values.map((value, index) => html`\n <div class=\"question-input-box\">\n <div class=\"placeholder-box\">\n <span class=\"required-span\">*</span>\n </div>\n <div class=\"question-input-box__index\">${index + 1}.</div>\n ${this._renderInput(index)}\n </div>\n `)}\n </div>\n `\n }\n\n private _renderReview() {\n if (!this.disabled || !this.isShowCorrect) {\n return null\n }\n\n const results = this.resultAnswersFromExamResults()\n const analysis = String(this._item.analysis || '').trim()\n\n return html`\n <div class=\"qxs-answer-runtime__result\">\n ${results.length\n ? results.map((result: any, index: number) => html`\n <div class=\"qxs-answer-runtime__result-line\">填空${index + 1}参考答案为:${result?.correctAnswer || ''}</div>\n `)\n : html`<span class=\"qxs-answer-runtime__result-line is-success\">本题暂无参考答案</span>`}\n ${analysis ? html`<div class=\"qxs-answer-runtime__result-line is-muted\">答题解析:${analysis}</div>` : ''}\n </div>\n `\n }\n\n async onSubmit() {\n if (!this._values.length || this._values.some(item => !String(item || '').trim())) {\n throw toError(this._item, '请填写答案')\n }\n\n const submitAnswer = this._values.join(',')\n return {\n ...this._item,\n submitAnswer,\n submitAnswerObj: {\n intVal: this._item.examId,\n stringVal: submitAnswer,\n },\n }\n }\n\n reset() {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n\n render() {\n const titleWithMasks = this._renderTitleWithMasks()\n\n return this.renderShell({\n shellClassName: 'qxs-answer-runtime-blank-fill blank_fill',\n titleContent: this.renderTitleBlock(titleWithMasks || undefined),\n answerContent: this._renderInputRows(),\n resultContent: this._renderReview(),\n footerContent: this.renderCasePracticeFooter({\n ...this._item,\n submitAnswer: this._values.join(','),\n }),\n })\n }\n}\n\nexport function register() {}\n"],"names":["FILTER_TOKEN","toError","row","message","blankCountFromItem","item","titleCount","answerCount","splitFilterTitle","title","QxsAnswerRuntimeBlankFill","AnswerRuntimeElement","count","current","_","index","value","currentIndex","emitSubjectEvent","html","event","segments","segment","results","analysis","result","submitAnswer","titleWithMasks","__decorateClass","state","safeCustomElement"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import{html as a,nothing as u}from"lit";import{property as p,state as _}from"lit/decorators.js";import{safeCustomElement as w}from"../base/define.mjs";import{emitSubjectEvent as m}from"../subject/shared-methods.mjs";import{AnswerRuntimeElement as f}from"./runtime-question-base.mjs";import{cloneAnswerValue as y}from"./clone.mjs";var x=Object.defineProperty,I=Object.getOwnPropertyDescriptor,l=(t,e,s,r)=>{for(var n=r>1?void 0:r?I(e,s):e,o=t.length-1,i;o>=0;o--)(i=t[o])&&(n=(r?i(e,s,n):i(n))||n);return r&&n&&x(e,s,n),n};function d(t,e){return{row:t,message:e}}let h=class extends f{constructor(){super(...arguments),this.examType="single",this._selectedIds=new Set,this._sortOrder=[]}syncFromItem(){this.examType=this._item.examTypeEnum||"single";const e=String(this._item.submitAnswer||"").split(",").map(s=>s.trim()).filter(Boolean);this._selectedIds=new Set(e),this._sortOrder=this.examType==="sort"?[...e]:[]}_isSelected(t){return this._selectedIds.has(this.answerIdOf(t))}_toggle(t){if(this.disabled||!this.beforeChange(this._item,t))return;const e=this.answerIdOf(t);if(e){if(this.examType==="single"){const s=this._selectedIds.has(e);this._selectedIds=s?new Set:new Set([e])}else if(this.examType==="multiple"){const s=new Set(this._selectedIds);s.has(e)?s.delete(e):s.add(e),this._selectedIds=s}else this._sortOrder.includes(e)?this._sortOrder=this._sortOrder.filter(s=>s!==e):this._sortOrder=[...this._sortOrder,e],this._selectedIds=new Set(this._sortOrder);m(this,"on-change",this._snapshotRow())}}_currentValue(){return this.examType==="sort"?this._sortOrder.join(","):Array.from(this._selectedIds).join(",")}_validate(){const t=this.examType==="sort"?this._sortOrder.length:this._selectedIds.size,e=Number(this._item.leastAnswerCount||0);if(e>0&&t<e){const s=this.examType==="multiple"?"多选题":"排序题";return d(this._item,`${s}至少选${e}项`)}return t<1?d(this._item,this.examType==="sort"?"请先完成答题":"请选择答案"):null}_selectedSummary(){const t=Array.isArray(this._item.answers)?this._item.answers:[];return(this.examType==="sort"?this._sortOrder:Array.from(this._selectedIds)).map(r=>{const n=t.findIndex(o=>this.answerIdOf(o)===r);return n>=0?this.answerLetter(n):""}).filter(Boolean).join("、")}_snapshotAnswers(){return(Array.isArray(this._item.answers)?this._item.answers:[]).map(e=>{const s=this.answerIdOf(e),r=this._sortOrder.indexOf(s)+1;return{...e,isSelect:this._selectedIds.has(s),sortNum:r>0?r:void 0}})}_snapshotRow(){return{...this._item,answers:this._snapshotAnswers(),submitAnswer:this._currentValue()}}_handleRendererChange(t){const e=y(this._snapshotRow()),s=typeof t=="function"?t(e)||e:t||e;this.updateItem(s),this.syncFromItem(),m(this,"on-change",this._snapshotRow())}_correctSummary(){const t=Array.isArray(this._item.answers)?this._item.answers:[],e=this.resultAnswersFromExamResults();return e.length?e.map(s=>{const r=t.findIndex(n=>this.answerIdOf(n)===String(s?.correctAnswer??""));return r>=0?this.answerLetter(r):""}).filter(Boolean).join("、"):t.map((s,r)=>s?.isCorrect?this.answerLetter(r):"").filter(Boolean).join("、")}_renderReview(){if(!this.disabled||!this.isShowCorrect)return null;const t=this._selectedSummary(),e=this._correctSummary(),s=String(this._item.analysis||"").trim();return a`
|
|
2
|
+
<div class="qxs-answer-runtime__result">
|
|
3
|
+
${t?a`<span class="qxs-answer-runtime__result-line">已选答案:${t}</span>`:""}
|
|
4
|
+
${e?a`<span class="qxs-answer-runtime__result-line is-danger">本题参考答案为:${e}</span>`:a`<span class="qxs-answer-runtime__result-line is-success">本题暂无参考答案</span>`}
|
|
5
|
+
${s?a`<div class="qxs-answer-runtime__result-line is-muted">答题解析:${s}</div>`:""}
|
|
6
|
+
</div>
|
|
7
|
+
`}_renderRelationEntry(t){const e=this.answerIdOf(t),s=this._selectedIds.has(e);if(!t?.needRelationExamAnswer||!s)return u;const r=this._snapshotRow(),n=this._snapshotAnswers().find(i=>this.answerIdOf(i)===e)||t,o={answerItem:n,row:r,handleChange:i=>this._handleRendererChange(i)};return this.answerRowRelationExamAnswerRenderer?a`
|
|
8
|
+
<div class="qxs-answer-runtime__relation-entry">
|
|
9
|
+
${this.answerRowRelationExamAnswerRenderer(o)}
|
|
10
|
+
</div>
|
|
11
|
+
`:a`
|
|
12
|
+
<button
|
|
13
|
+
type="button"
|
|
14
|
+
class="qxs-answer-runtime__relation-action"
|
|
15
|
+
@click=${()=>this.emitRelationExamAnswer("open",n,r)}
|
|
16
|
+
>
|
|
17
|
+
查看关联题
|
|
18
|
+
</button>
|
|
19
|
+
`}async onSubmit(){const t=this._validate();if(t)throw t;const e=this._currentValue();return{...this._snapshotRow(),submitAnswer:e,submitAnswerObj:{intVal:this._item.examId,stringVal:e}}}reset(){this.updateItem(this.cloneItem()),this.syncFromItem()}render(){const t=Array.isArray(this._item.answers)?this._item.answers:[],e=this.examType==="single"?"radio":"checkbox";return this.renderShell({shellClassName:`qxs-answer-runtime-choice ${this.examType}`,answerContent:a`
|
|
20
|
+
<div class="qxs-answer-runtime__answers">
|
|
21
|
+
${t.map((s,r)=>{const n=this.answerIdOf(s),o=this.answerLabel(s),i=this._isSelected(s),c=this._sortOrder.indexOf(n)+1;return a`
|
|
22
|
+
<label class="qxs-answer-runtime__choice exam-answer ${this.themeName==="case-practice"?"answer-item":""} ${i?"is-selected":""} ${this.isShowBg||this.themeName==="case-practice"?"has-background bgCol":""}">
|
|
23
|
+
<input
|
|
24
|
+
type=${e}
|
|
25
|
+
name=${String(this._item.examId||this._item.examIndex||"choice")}
|
|
26
|
+
.checked=${i}
|
|
27
|
+
?disabled=${this.disabled}
|
|
28
|
+
@click=${()=>this._toggle(s)}
|
|
29
|
+
/>
|
|
30
|
+
<span>${this.answerLetter(r)}.</span>
|
|
31
|
+
<span>${o}</span>
|
|
32
|
+
${this.examType==="sort"&&c>0?a`<strong class="sort-num">${c}</strong>`:""}
|
|
33
|
+
</label>
|
|
34
|
+
${this._renderRelationEntry(s)}
|
|
35
|
+
`})}
|
|
36
|
+
</div>
|
|
37
|
+
`,resultContent:this._renderReview(),footerContent:this.renderCasePracticeFooter(this._snapshotRow())})}};l([p({type:String,attribute:"exam-type"})],h.prototype,"examType",2);l([_()],h.prototype,"_selectedIds",2);l([_()],h.prototype,"_sortOrder",2);h=l([w("qxs-answer-runtime-choice")],h);export{h as QxsAnswerRuntimeChoice};
|
|
38
|
+
//# sourceMappingURL=runtime-choice.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-choice.mjs","sources":["../../../../packages/components/src/answer-container/runtime-choice.ts"],"sourcesContent":["import { html, nothing } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { AnswerRuntimeElement } from './runtime-question-base'\nimport type { AnswerSubmitError, LegacyExamType } from './types'\nimport { cloneAnswerValue } from './clone'\n\nfunction toError(row: any, message: string): AnswerSubmitError {\n return { row, message }\n}\n\n@safeCustomElement('qxs-answer-runtime-choice')\nexport class QxsAnswerRuntimeChoice extends AnswerRuntimeElement {\n @property({ type: String, attribute: 'exam-type' }) examType: LegacyExamType = 'single'\n\n @state() private _selectedIds = new Set<string>()\n @state() private _sortOrder: string[] = []\n\n protected syncFromItem() {\n this.examType = (this._item.examTypeEnum as LegacyExamType) || 'single'\n const submitAnswer = String(this._item.submitAnswer || '')\n const ids = submitAnswer.split(',').map(item => item.trim()).filter(Boolean)\n this._selectedIds = new Set(ids)\n this._sortOrder = this.examType === 'sort' ? [...ids] : []\n }\n\n private _isSelected(answer: any) {\n return this._selectedIds.has(this.answerIdOf(answer))\n }\n\n private _toggle(answer: any) {\n if (this.disabled || !this.beforeChange(this._item, answer)) {\n return\n }\n\n const id = this.answerIdOf(answer)\n if (!id) {\n return\n }\n\n if (this.examType === 'single') {\n const isSelected = this._selectedIds.has(id)\n this._selectedIds = isSelected ? new Set() : new Set([id])\n }\n else if (this.examType === 'multiple') {\n const next = new Set(this._selectedIds)\n if (next.has(id)) {\n next.delete(id)\n }\n else {\n next.add(id)\n }\n this._selectedIds = next\n }\n else {\n if (this._sortOrder.includes(id)) {\n this._sortOrder = this._sortOrder.filter(currentId => currentId !== id)\n }\n else {\n this._sortOrder = [...this._sortOrder, id]\n }\n this._selectedIds = new Set(this._sortOrder)\n }\n\n emitSubjectEvent(this, 'on-change', this._snapshotRow())\n }\n\n private _currentValue() {\n return this.examType === 'sort'\n ? this._sortOrder.join(',')\n : Array.from(this._selectedIds).join(',')\n }\n\n private _validate() {\n const count = this.examType === 'sort' ? this._sortOrder.length : this._selectedIds.size\n const least = Number(this._item.leastAnswerCount || 0)\n\n if (least > 0 && count < least) {\n const typeCopy = this.examType === 'multiple' ? '多选题' : '排序题'\n return toError(this._item, `${typeCopy}至少选${least}项`)\n }\n\n if (count < 1) {\n return toError(this._item, this.examType === 'sort' ? '请先完成答题' : '请选择答案')\n }\n\n return null\n }\n\n private _selectedSummary() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n const ids = this.examType === 'sort' ? this._sortOrder : Array.from(this._selectedIds)\n const letters = ids\n .map((id) => {\n const index = answers.findIndex((answer: any) => this.answerIdOf(answer) === id)\n return index >= 0 ? this.answerLetter(index) : ''\n })\n .filter(Boolean)\n return letters.join('、')\n }\n\n private _snapshotAnswers() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n return answers.map((answer: any) => {\n const id = this.answerIdOf(answer)\n const sortNum = this._sortOrder.indexOf(id) + 1\n return {\n ...answer,\n isSelect: this._selectedIds.has(id),\n sortNum: sortNum > 0 ? sortNum : undefined,\n }\n })\n }\n\n private _snapshotRow() {\n return {\n ...this._item,\n answers: this._snapshotAnswers(),\n submitAnswer: this._currentValue(),\n }\n }\n\n private _handleRendererChange(\n next?:\n | any\n | ((row: any) => any),\n ) {\n const current = cloneAnswerValue(this._snapshotRow())\n const updated = typeof next === 'function'\n ? next(current) || current\n : next || current\n this.updateItem(updated)\n this.syncFromItem()\n emitSubjectEvent(this, 'on-change', this._snapshotRow())\n }\n\n private _correctSummary() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n const resultAnswers = this.resultAnswersFromExamResults()\n\n if (resultAnswers.length) {\n return resultAnswers\n .map((result: any) => {\n const index = answers.findIndex((answer: any) => this.answerIdOf(answer) === String(result?.correctAnswer ?? ''))\n return index >= 0 ? this.answerLetter(index) : ''\n })\n .filter(Boolean)\n .join('、')\n }\n\n return answers\n .map((answer: any, index: number) => answer?.isCorrect ? this.answerLetter(index) : '')\n .filter(Boolean)\n .join('、')\n }\n\n private _renderReview() {\n if (!this.disabled || !this.isShowCorrect) {\n return null\n }\n\n const selected = this._selectedSummary()\n const correct = this._correctSummary()\n const analysis = String(this._item.analysis || '').trim()\n\n return html`\n <div class=\"qxs-answer-runtime__result\">\n ${selected ? html`<span class=\"qxs-answer-runtime__result-line\">已选答案:${selected}</span>` : ''}\n ${correct\n ? html`<span class=\"qxs-answer-runtime__result-line is-danger\">本题参考答案为:${correct}</span>`\n : html`<span class=\"qxs-answer-runtime__result-line is-success\">本题暂无参考答案</span>`}\n ${analysis ? html`<div class=\"qxs-answer-runtime__result-line is-muted\">答题解析:${analysis}</div>` : ''}\n </div>\n `\n }\n\n private _renderRelationEntry(answer: any) {\n const answerId = this.answerIdOf(answer)\n const isSelected = this._selectedIds.has(answerId)\n\n if (!answer?.needRelationExamAnswer || !isSelected) {\n return nothing\n }\n\n const row = this._snapshotRow()\n const answerItem = this._snapshotAnswers().find((item: any) => this.answerIdOf(item) === answerId) || answer\n const context = {\n answerItem,\n row,\n handleChange: (next?: any) => this._handleRendererChange(next),\n }\n\n if (this.answerRowRelationExamAnswerRenderer) {\n return html`\n <div class=\"qxs-answer-runtime__relation-entry\">\n ${this.answerRowRelationExamAnswerRenderer(context)}\n </div>\n `\n }\n\n return html`\n <button\n type=\"button\"\n class=\"qxs-answer-runtime__relation-action\"\n @click=${() => this.emitRelationExamAnswer('open', answerItem, row)}\n >\n 查看关联题\n </button>\n `\n }\n\n async onSubmit() {\n const error = this._validate()\n if (error) {\n throw error\n }\n\n const submitAnswer = this._currentValue()\n return {\n ...this._snapshotRow(),\n submitAnswer,\n submitAnswerObj: {\n intVal: this._item.examId,\n stringVal: submitAnswer,\n },\n }\n }\n\n reset() {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n\n render() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n const inputType = this.examType === 'single' ? 'radio' : 'checkbox'\n\n return this.renderShell({\n shellClassName: `qxs-answer-runtime-choice ${this.examType}`,\n answerContent: html`\n <div class=\"qxs-answer-runtime__answers\">\n ${answers.map((answer: any, index: number) => {\n const id = this.answerIdOf(answer)\n const label = this.answerLabel(answer)\n const selected = this._isSelected(answer)\n const sortNumber = this._sortOrder.indexOf(id) + 1\n\n return html`\n <label class=\"qxs-answer-runtime__choice exam-answer ${this.themeName === 'case-practice' ? 'answer-item' : ''} ${selected ? 'is-selected' : ''} ${(this.isShowBg || this.themeName === 'case-practice') ? 'has-background bgCol' : ''}\">\n <input\n type=${inputType}\n name=${String(this._item.examId || this._item.examIndex || 'choice')}\n .checked=${selected}\n ?disabled=${this.disabled}\n @click=${() => this._toggle(answer)}\n />\n <span>${this.answerLetter(index)}.</span>\n <span>${label}</span>\n ${this.examType === 'sort' && sortNumber > 0 ? html`<strong class=\"sort-num\">${sortNumber}</strong>` : ''}\n </label>\n ${this._renderRelationEntry(answer)}\n `\n })}\n </div>\n `,\n resultContent: this._renderReview(),\n footerContent: this.renderCasePracticeFooter(this._snapshotRow()),\n })\n }\n}\n\nexport function register() {}\n"],"names":["toError","row","message","QxsAnswerRuntimeChoice","AnswerRuntimeElement","ids","item","answer","id","isSelected","next","currentId","emitSubjectEvent","count","least","typeCopy","answers","index","sortNum","current","cloneAnswerValue","updated","resultAnswers","result","selected","correct","analysis","html","answerId","nothing","answerItem","context","error","submitAnswer","inputType","label","sortNumber","__decorateClass","property","state","safeCustomElement"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import{LitElement as d,nothing as h,html as u}from"lit";import{property as n,state as w}from"lit/decorators.js";import{unsafeHTML as f}from"lit/directives/unsafe-html.js";import{emitSubjectEvent as p}from"../subject/shared-methods.mjs";import{cloneAnswerValue as x}from"./clone.mjs";var y=Object.defineProperty,r=(c,e,t,o)=>{for(var s=void 0,l=c.length-1,m;l>=0;l--)(m=c[l])&&(s=m(e,t,s)||s);return s&&y(e,t,s),s};class i extends d{constructor(){super(...arguments),this.item={},this.disabled=!1,this.type=!0,this.isShowCorrect=!1,this.isShowBg=!1,this.isShowProgress=!1,this.showSingleRowScaleTitle=!1,this.themeName="default",this.beforeChange=()=>!0,this.answerRowRelationExamAnswerRenderer=null,this._item={}}createRenderRoot(){return this}cloneItem(){return x(this.item||{})}answerIdOf(e){return String(e?.examAnswerId??e?.answerId??e?.correctAnswer??"")}answerLabel(e){return e?.title||e?.answer||e?.correctAnswer||""}answerLetter(e){return String.fromCharCode(65+e)}titleText(){return`${this._item.titleIndex?`${this._item.titleIndex}. `:""}${this._item.title||""}`.trim()}resultAnswersFromExamResults(){return Array.isArray(this._item.examAnswerResults)?this._item.examAnswerResults:[]}updateItem(e){this._item=e}emitHandleAction(e,t){p(this,"handleAction",{action:e,row:t})}emitRelationExamAnswer(e,t,o){p(this,"relation-exam-answer",{action:e,answerItem:t,row:o})}renderTitleBlock(e){return u`
|
|
2
|
+
<div class="qxs-answer-runtime__heading">
|
|
3
|
+
${this.isShowProgress&&this._item.examIndex!=null?u`<span class="qxs-answer-runtime__progress">第 ${this._item.examIndex} 题</span>`:h}
|
|
4
|
+
<div class="qxs-answer-runtime__title">${e??this.titleText()}</div>
|
|
5
|
+
</div>
|
|
6
|
+
`}renderShell(e){const{answerContent:t,resultContent:o=null,footerContent:s=null,shellClassName:l="",titleContent:m}=e;return u`
|
|
7
|
+
<div data-answer-runtime-row class="exam-body-box qxs-answer-runtime ${l} ${this.themeName}">
|
|
8
|
+
<div class="exam-content-box">
|
|
9
|
+
<div class="exam-title">
|
|
10
|
+
${m??this.renderTitleBlock()}
|
|
11
|
+
</div>
|
|
12
|
+
<div class="exam-answer-box">
|
|
13
|
+
${t}
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
${o?u`<div class="answer-result-box">${o}</div>`:h}
|
|
17
|
+
${s??h}
|
|
18
|
+
</div>
|
|
19
|
+
`}renderCasePracticeFooter(e){if(!(this.disabled&&this.themeName==="case-practice"))return h;if(e?.isShowDiscussionInfo===!1)return h;const t=e?.answerTruePercent??null,s=t===null||t==="0.00%"?"没有人支持该观点":`有${t}人支持该观点`,l=e?.referenceCommentCount??0,m=(Array.isArray(e?.answers)?e.answers:[]).map(a=>a?.relationType==null||!a?.resultItem?null:{className:a?.resultClass||"",html:a?.relationType===1?a?.resultItem:""}).filter(Boolean);return u`
|
|
20
|
+
<div class="qxs-answer-runtime__footer">
|
|
21
|
+
<div class="qxs-answer-runtime__discussion">
|
|
22
|
+
<span>${s}</span>
|
|
23
|
+
<span>${l}人讨论</span>
|
|
24
|
+
<button
|
|
25
|
+
type="button"
|
|
26
|
+
class="qxs-answer-runtime__discussion-action"
|
|
27
|
+
@click=${()=>this.emitHandleAction("discussion",e)}
|
|
28
|
+
>
|
|
29
|
+
参与讨论
|
|
30
|
+
</button>
|
|
31
|
+
</div>
|
|
32
|
+
${m.length?u`
|
|
33
|
+
<div class="qxs-answer-runtime__answer-relate">
|
|
34
|
+
${m.map(a=>u`
|
|
35
|
+
<div class="qxs-answer-runtime__answer-relate-item ${a.className}">
|
|
36
|
+
${f(a.html)}
|
|
37
|
+
</div>
|
|
38
|
+
`)}
|
|
39
|
+
</div>
|
|
40
|
+
`:h}
|
|
41
|
+
</div>
|
|
42
|
+
`}willUpdate(e){e.has("item")&&(this.updateItem(this.cloneItem()),this.syncFromItem())}}r([n({attribute:!1})],i.prototype,"item");r([n({type:Boolean})],i.prototype,"disabled");r([n({type:Boolean})],i.prototype,"type");r([n({type:Boolean,attribute:"is-show-correct"})],i.prototype,"isShowCorrect");r([n({type:Boolean,attribute:"is-show-bg"})],i.prototype,"isShowBg");r([n({type:Boolean,attribute:"is-show-progress"})],i.prototype,"isShowProgress");r([n({type:Boolean,attribute:"show-single-row-scale-title"})],i.prototype,"showSingleRowScaleTitle");r([n({type:String,attribute:"theme-name"})],i.prototype,"themeName");r([n({attribute:!1})],i.prototype,"beforeChange");r([n({attribute:!1})],i.prototype,"answerRowRelationExamAnswerRenderer");r([w()],i.prototype,"_item");export{i as AnswerRuntimeElement};
|
|
43
|
+
//# sourceMappingURL=runtime-question-base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-question-base.mjs","sources":["../../../../packages/components/src/answer-container/runtime-question-base.ts"],"sourcesContent":["import { html, LitElement, nothing } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport type { AnswerThemeName, LegacyAnswerContainerItem } from './types'\nimport type { AnswerContainerActionDetail, AnswerContainerRelationDetail, AnswerRowRelationExamAnswerRenderer } from './types'\nimport { cloneAnswerValue } from './clone'\n\nexport abstract class AnswerRuntimeElement extends LitElement {\n createRenderRoot() {\n return this\n }\n\n @property({ attribute: false }) item: LegacyAnswerContainerItem = {}\n @property({ type: Boolean }) disabled = false\n @property({ type: Boolean }) type = true\n @property({ type: Boolean, attribute: 'is-show-correct' }) isShowCorrect = false\n @property({ type: Boolean, attribute: 'is-show-bg' }) isShowBg = false\n @property({ type: Boolean, attribute: 'is-show-progress' }) isShowProgress = false\n @property({ type: Boolean, attribute: 'show-single-row-scale-title' }) showSingleRowScaleTitle = false\n @property({ type: String, attribute: 'theme-name' }) themeName: AnswerThemeName = 'default'\n @property({ attribute: false }) beforeChange: (row: LegacyAnswerContainerItem, answerItem?: any) => boolean = () => true\n @property({ attribute: false }) answerRowRelationExamAnswerRenderer: AnswerRowRelationExamAnswerRenderer | null = null\n\n @state() protected _item: LegacyAnswerContainerItem = {}\n\n protected cloneItem() {\n return cloneAnswerValue(this.item || {})\n }\n\n protected answerIdOf(answer: any) {\n return String(answer?.examAnswerId ?? answer?.answerId ?? answer?.correctAnswer ?? '')\n }\n\n protected answerLabel(answer: any) {\n return answer?.title || answer?.answer || answer?.correctAnswer || ''\n }\n\n protected answerLetter(index: number) {\n return String.fromCharCode(65 + index)\n }\n\n protected titleText() {\n const prefix = this._item.titleIndex ? `${this._item.titleIndex}. ` : ''\n return `${prefix}${this._item.title || ''}`.trim()\n }\n\n protected resultAnswersFromExamResults() {\n if (Array.isArray(this._item.examAnswerResults)) {\n return this._item.examAnswerResults\n }\n return []\n }\n\n protected updateItem(next: LegacyAnswerContainerItem) {\n this._item = next\n }\n\n protected emitHandleAction(action: string, row: LegacyAnswerContainerItem) {\n const detail: AnswerContainerActionDetail = { action, row }\n emitSubjectEvent(this, 'handleAction', detail)\n }\n\n protected emitRelationExamAnswer(action: string, answerItem: Record<string, unknown>, row: LegacyAnswerContainerItem) {\n const detail: AnswerContainerRelationDetail = { action, answerItem, row }\n emitSubjectEvent(this, 'relation-exam-answer', detail)\n }\n\n protected renderTitleBlock(content?: unknown) {\n return html`\n <div class=\"qxs-answer-runtime__heading\">\n ${this.isShowProgress && this._item.examIndex != null\n ? html`<span class=\"qxs-answer-runtime__progress\">第 ${this._item.examIndex} 题</span>`\n : nothing}\n <div class=\"qxs-answer-runtime__title\">${content ?? this.titleText()}</div>\n </div>\n `\n }\n\n protected renderShell(options: {\n answerContent: unknown\n resultContent?: unknown | null\n footerContent?: unknown | null\n shellClassName?: string\n titleContent?: unknown\n }) {\n const {\n answerContent,\n resultContent = null,\n footerContent = null,\n shellClassName = '',\n titleContent,\n } = options\n\n return html`\n <div data-answer-runtime-row class=\"exam-body-box qxs-answer-runtime ${shellClassName} ${this.themeName}\">\n <div class=\"exam-content-box\">\n <div class=\"exam-title\">\n ${titleContent ?? this.renderTitleBlock()}\n </div>\n <div class=\"exam-answer-box\">\n ${answerContent}\n </div>\n </div>\n ${resultContent ? html`<div class=\"answer-result-box\">${resultContent}</div>` : nothing}\n ${footerContent ?? nothing}\n </div>\n `\n }\n\n protected renderCasePracticeFooter(row: LegacyAnswerContainerItem) {\n if (!(this.disabled && this.themeName === 'case-practice')) {\n return nothing\n }\n\n if (row?.isShowDiscussionInfo === false) {\n return nothing\n }\n\n const answerTruePercent = row?.answerTruePercent ?? null\n const hasNoSupport = answerTruePercent === null || answerTruePercent === '0.00%'\n const viewpointDescription = hasNoSupport ? '没有人支持该观点' : `有${answerTruePercent}人支持该观点`\n const referenceCommentCount = row?.referenceCommentCount ?? 0\n const answerRelate = (Array.isArray(row?.answers) ? row.answers : [])\n .map((item: any) => {\n if (item?.relationType == null || !item?.resultItem) {\n return null\n }\n\n return {\n className: item?.resultClass || '',\n html: item?.relationType === 1 ? item?.resultItem : '',\n }\n })\n .filter(Boolean) as Array<{ className: string, html: string }>\n\n return html`\n <div class=\"qxs-answer-runtime__footer\">\n <div class=\"qxs-answer-runtime__discussion\">\n <span>${viewpointDescription}</span>\n <span>${referenceCommentCount}人讨论</span>\n <button\n type=\"button\"\n class=\"qxs-answer-runtime__discussion-action\"\n @click=${() => this.emitHandleAction('discussion', row)}\n >\n 参与讨论\n </button>\n </div>\n ${answerRelate.length\n ? html`\n <div class=\"qxs-answer-runtime__answer-relate\">\n ${answerRelate.map((item) => html`\n <div class=\"qxs-answer-runtime__answer-relate-item ${item.className}\">\n ${unsafeHTML(item.html)}\n </div>\n `)}\n </div>\n `\n : nothing}\n </div>\n `\n }\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('item')) {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n }\n\n protected abstract syncFromItem(): void\n\n abstract onSubmit(): Promise<LegacyAnswerContainerItem>\n\n abstract reset(): void\n}\n"],"names":["AnswerRuntimeElement","LitElement","cloneAnswerValue","answer","index","next","action","row","emitSubjectEvent","answerItem","content","html","nothing","options","answerContent","resultContent","footerContent","shellClassName","titleContent","answerTruePercent","viewpointDescription","referenceCommentCount","answerRelate","item","unsafeHTML","changed","__decorateClass","property","state"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import{html as n}from"lit";import{state as h}from"lit/decorators.js";import{safeCustomElement as w}from"../base/define.mjs";import{emitSubjectEvent as u}from"../subject/shared-methods.mjs";import{AnswerRuntimeElement as _}from"./runtime-question-base.mjs";var c=Object.defineProperty,d=Object.getOwnPropertyDescriptor,l=(e,t,s,r)=>{for(var i=r>1?void 0:r?d(t,s):t,a=e.length-1,m;a>=0;a--)(m=e[a])&&(i=(r?m(t,s,i):m(i))||i);return r&&i&&c(t,s,i),i};function p(e,t){return{row:e,message:t}}let o=class extends _{constructor(){super(...arguments),this._rows=[]}syncFromItem(){const e=Array.isArray(this._item.scaleQuestionList)?this._item.scaleQuestionList:[],t=String(this._item.submitAnswer||"").split(",").filter(Boolean);this._rows=e.map((s,r)=>({name:typeof s=="string"?s:s?.name||"",examAnswerId:t[r]||s?.examAnswerId||""}))}_setValue(e,t){this.disabled||!this.beforeChange(this._item,this._rows[e])||(this._rows=this._rows.map((s,r)=>r===e?{...s,examAnswerId:t}:s),u(this,"on-change",{...this._item,submitAnswer:this._rows.map(s=>s.examAnswerId||"").join(",")}))}_renderReview(){if(!this.disabled||!this.isShowCorrect)return null;const e=String(this._item.analysis||"").trim();return n`
|
|
2
|
+
<div class="qxs-answer-runtime__result">
|
|
3
|
+
<span class="qxs-answer-runtime__result-line is-success">本题暂无参考答案</span>
|
|
4
|
+
${e?n`<div class="qxs-answer-runtime__result-line is-muted">答题解析:${e}</div>`:""}
|
|
5
|
+
</div>
|
|
6
|
+
`}_showRowTitleColumn(){if(this.showSingleRowScaleTitle||this._rows.length!==1)return!0;const e=String(this._rows[0]?.name||"").trim(),t=String(this._item?.title||"").trim();return!(e&&t&&e===t)}async onSubmit(){if(this._rows.some(t=>!t.examAnswerId))throw p(this._item,"请先完成答题");const e=this._rows.map(t=>t.examAnswerId||"").join(",");return{...this._item,scaleQuestionList:this._rows.map(t=>({...t})),submitAnswer:e,submitAnswerObj:{intVal:this._item.examId,stringVal:e}}}reset(){this.updateItem(this.cloneItem()),this.syncFromItem()}render(){const e=Array.isArray(this._item.answers)?this._item.answers:[],t=this._showRowTitleColumn();return this.renderShell({shellClassName:"qxs-answer-runtime-scale scale",answerContent:n`
|
|
7
|
+
<div class="table-scroll">
|
|
8
|
+
<table>
|
|
9
|
+
<thead>
|
|
10
|
+
<tr>
|
|
11
|
+
${t?n`<th>问题</th>`:""}
|
|
12
|
+
${e.map(s=>n`<th>${this.answerLabel(s)}</th>`)}
|
|
13
|
+
</tr>
|
|
14
|
+
</thead>
|
|
15
|
+
<tbody>
|
|
16
|
+
${this._rows.map((s,r)=>n`
|
|
17
|
+
<tr>
|
|
18
|
+
${t?n`<td class="qxs-answer-runtime-scale__row-title">${s.name}</td>`:""}
|
|
19
|
+
${e.map(i=>{const a=this.answerIdOf(i),m=`scale-${this._item.examId||"row"}-${r}`;return n`
|
|
20
|
+
<td>
|
|
21
|
+
<input
|
|
22
|
+
type="radio"
|
|
23
|
+
name=${m}
|
|
24
|
+
.checked=${String(s.examAnswerId||"")===a}
|
|
25
|
+
?disabled=${this.disabled}
|
|
26
|
+
@click=${()=>this._setValue(r,a)}
|
|
27
|
+
/>
|
|
28
|
+
</td>
|
|
29
|
+
`})}
|
|
30
|
+
</tr>
|
|
31
|
+
`)}
|
|
32
|
+
</tbody>
|
|
33
|
+
</table>
|
|
34
|
+
</div>
|
|
35
|
+
`,resultContent:this._renderReview(),footerContent:this.renderCasePracticeFooter({...this._item,scaleQuestionList:this._rows.map(s=>({...s})),submitAnswer:this._rows.map(s=>s.examAnswerId||"").join(",")})})}};l([h()],o.prototype,"_rows",2);o=l([w("qxs-answer-runtime-scale")],o);export{o as QxsAnswerRuntimeScale};
|
|
36
|
+
//# sourceMappingURL=runtime-scale.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-scale.mjs","sources":["../../../../packages/components/src/answer-container/runtime-scale.ts"],"sourcesContent":["import { html } from 'lit'\nimport { state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { AnswerRuntimeElement } from './runtime-question-base'\nimport type { AnswerSubmitError } from './types'\n\nfunction toError(row: any, message: string): AnswerSubmitError {\n return { row, message }\n}\n\ntype ScaleQuestionRow = {\n name: string\n examAnswerId?: string | number\n}\n\n@safeCustomElement('qxs-answer-runtime-scale')\nexport class QxsAnswerRuntimeScale extends AnswerRuntimeElement {\n @state() private _rows: ScaleQuestionRow[] = []\n\n protected syncFromItem() {\n const rows = Array.isArray(this._item.scaleQuestionList)\n ? this._item.scaleQuestionList\n : []\n const submit = String(this._item.submitAnswer || '').split(',').filter(Boolean)\n\n this._rows = rows.map((row: any, index) => ({\n name: typeof row === 'string' ? row : row?.name || '',\n examAnswerId: submit[index] || row?.examAnswerId || '',\n }))\n }\n\n private _setValue(rowIndex: number, answerId: string) {\n if (this.disabled || !this.beforeChange(this._item, this._rows[rowIndex])) {\n return\n }\n\n this._rows = this._rows.map((row, index) => index === rowIndex ? { ...row, examAnswerId: answerId } : row)\n emitSubjectEvent(this, 'on-change', {\n ...this._item,\n submitAnswer: this._rows.map(row => row.examAnswerId || '').join(','),\n })\n }\n\n private _renderReview() {\n if (!this.disabled || !this.isShowCorrect) {\n return null\n }\n\n const analysis = String(this._item.analysis || '').trim()\n\n return html`\n <div class=\"qxs-answer-runtime__result\">\n <span class=\"qxs-answer-runtime__result-line is-success\">本题暂无参考答案</span>\n ${analysis ? html`<div class=\"qxs-answer-runtime__result-line is-muted\">答题解析:${analysis}</div>` : ''}\n </div>\n `\n }\n\n private _showRowTitleColumn() {\n if (this.showSingleRowScaleTitle) {\n return true\n }\n\n if (this._rows.length !== 1) {\n return true\n }\n\n const rowName = String(this._rows[0]?.name || '').trim()\n const title = String(this._item?.title || '').trim()\n return !(rowName && title && rowName === title)\n }\n\n async onSubmit() {\n if (this._rows.some(row => !row.examAnswerId)) {\n throw toError(this._item, '请先完成答题')\n }\n\n const submitAnswer = this._rows.map(row => row.examAnswerId || '').join(',')\n return {\n ...this._item,\n scaleQuestionList: this._rows.map(row => ({ ...row })),\n submitAnswer,\n submitAnswerObj: {\n intVal: this._item.examId,\n stringVal: submitAnswer,\n },\n }\n }\n\n reset() {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n\n render() {\n const answers = Array.isArray(this._item.answers) ? this._item.answers : []\n const showRowTitleColumn = this._showRowTitleColumn()\n\n return this.renderShell({\n shellClassName: 'qxs-answer-runtime-scale scale',\n answerContent: html`\n <div class=\"table-scroll\">\n <table>\n <thead>\n <tr>\n ${showRowTitleColumn ? html`<th>问题</th>` : ''}\n ${answers.map((answer: any) => html`<th>${this.answerLabel(answer)}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${this._rows.map((row, rowIndex) => html`\n <tr>\n ${showRowTitleColumn ? html`<td class=\"qxs-answer-runtime-scale__row-title\">${row.name}</td>` : ''}\n ${answers.map((answer: any) => {\n const answerId = this.answerIdOf(answer)\n const name = `scale-${this._item.examId || 'row'}-${rowIndex}`\n return html`\n <td>\n <input\n type=\"radio\"\n name=${name}\n .checked=${String(row.examAnswerId || '') === answerId}\n ?disabled=${this.disabled}\n @click=${() => this._setValue(rowIndex, answerId)}\n />\n </td>\n `\n })}\n </tr>\n `)}\n </tbody>\n </table>\n </div>\n `,\n resultContent: this._renderReview(),\n footerContent: this.renderCasePracticeFooter({\n ...this._item,\n scaleQuestionList: this._rows.map(row => ({ ...row })),\n submitAnswer: this._rows.map(row => row.examAnswerId || '').join(','),\n }),\n })\n }\n}\n\nexport function register() {}\n"],"names":["toError","row","message","QxsAnswerRuntimeScale","AnswerRuntimeElement","rows","submit","index","rowIndex","answerId","emitSubjectEvent","analysis","html","rowName","title","submitAnswer","answers","showRowTitleColumn","answer","name","__decorateClass","state","safeCustomElement"],"mappings":"gcAOA,SAASA,EAAQC,EAAUC,EAAoC,CAC7D,MAAO,CAAE,IAAAD,EAAK,QAAAC,CAAA,CAChB,CAQO,IAAMC,EAAN,cAAoCC,CAAqB,CAAzD,aAAA,CAAA,MAAA,GAAA,SAAA,EACI,KAAQ,MAA4B,CAAA,CAAC,CAEpC,cAAe,CACvB,MAAMC,EAAO,MAAM,QAAQ,KAAK,MAAM,iBAAiB,EACnD,KAAK,MAAM,kBACX,CAAA,EACEC,EAAS,OAAO,KAAK,MAAM,cAAgB,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAE9E,KAAK,MAAQD,EAAK,IAAI,CAACJ,EAAUM,KAAW,CAC1C,KAAM,OAAON,GAAQ,SAAWA,EAAMA,GAAK,MAAQ,GACnD,aAAcK,EAAOC,CAAK,GAAKN,GAAK,cAAgB,EAAA,EACpD,CACJ,CAEQ,UAAUO,EAAkBC,EAAkB,CAChD,KAAK,UAAY,CAAC,KAAK,aAAa,KAAK,MAAO,KAAK,MAAMD,CAAQ,CAAC,IAIxE,KAAK,MAAQ,KAAK,MAAM,IAAI,CAACP,EAAKM,IAAUA,IAAUC,EAAW,CAAE,GAAGP,EAAK,aAAcQ,CAAA,EAAaR,CAAG,EACzGS,EAAiB,KAAM,YAAa,CAClC,GAAG,KAAK,MACR,aAAc,KAAK,MAAM,IAAIT,GAAOA,EAAI,cAAgB,EAAE,EAAE,KAAK,GAAG,CAAA,CACrE,EACH,CAEQ,eAAgB,CACtB,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,cAC1B,OAAO,KAGT,MAAMU,EAAW,OAAO,KAAK,MAAM,UAAY,EAAE,EAAE,KAAA,EAEnD,OAAOC;AAAA;AAAA;AAAA,UAGDD,EAAWC,+DAAkED,CAAQ,SAAW,EAAE;AAAA;AAAA,KAG1G,CAEQ,qBAAsB,CAK5B,GAJI,KAAK,yBAIL,KAAK,MAAM,SAAW,EACxB,MAAO,GAGT,MAAME,EAAU,OAAO,KAAK,MAAM,CAAC,GAAG,MAAQ,EAAE,EAAE,KAAA,EAC5CC,EAAQ,OAAO,KAAK,OAAO,OAAS,EAAE,EAAE,KAAA,EAC9C,MAAO,EAAED,GAAWC,GAASD,IAAYC,EAC3C,CAEA,MAAM,UAAW,CACf,GAAI,KAAK,MAAM,QAAY,CAACb,EAAI,YAAY,EAC1C,MAAMD,EAAQ,KAAK,MAAO,QAAQ,EAGpC,MAAMe,EAAe,KAAK,MAAM,IAAId,GAAOA,EAAI,cAAgB,EAAE,EAAE,KAAK,GAAG,EAC3E,MAAO,CACL,GAAG,KAAK,MACR,kBAAmB,KAAK,MAAM,QAAY,CAAE,GAAGA,GAAM,EACrD,aAAAc,EACA,gBAAiB,CACf,OAAQ,KAAK,MAAM,OACnB,UAAWA,CAAA,CACb,CAEJ,CAEA,OAAQ,CACN,KAAK,WAAW,KAAK,WAAW,EAChC,KAAK,aAAA,CACP,CAEA,QAAS,CACP,MAAMC,EAAU,MAAM,QAAQ,KAAK,MAAM,OAAO,EAAI,KAAK,MAAM,QAAU,CAAA,EACnEC,EAAqB,KAAK,oBAAA,EAEhC,OAAO,KAAK,YAAY,CACtB,eAAgB,iCAChB,cAAeL;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKHK,EAAqBL,eAAoB,EAAE;AAAA,kBAC3CI,EAAQ,IAAKE,GAAgBN,QAAW,KAAK,YAAYM,CAAM,CAAC,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,gBAI1E,KAAK,MAAM,IAAI,CAACjB,EAAKO,IAAaI;AAAA;AAAA,oBAE9BK,EAAqBL,oDAAuDX,EAAI,IAAI,QAAU,EAAE;AAAA,oBAChGe,EAAQ,IAAKE,GAAgB,CAC7B,MAAMT,EAAW,KAAK,WAAWS,CAAM,EACjCC,EAAO,SAAS,KAAK,MAAM,QAAU,KAAK,IAAIX,CAAQ,GAC5D,OAAOI;AAAA;AAAA;AAAA;AAAA,iCAIMO,CAAI;AAAA,qCACA,OAAOlB,EAAI,cAAgB,EAAE,IAAMQ,CAAQ;AAAA,sCAC1C,KAAK,QAAQ;AAAA,mCAChB,IAAM,KAAK,UAAUD,EAAUC,CAAQ,CAAC;AAAA;AAAA;AAAA,qBAIzD,CAAC,CAAC;AAAA;AAAA,eAEL,CAAC;AAAA;AAAA;AAAA;AAAA,QAKV,cAAe,KAAK,cAAA,EACpB,cAAe,KAAK,yBAAyB,CAC3C,GAAG,KAAK,MACR,kBAAmB,KAAK,MAAM,QAAY,CAAE,GAAGR,GAAM,EACrD,aAAc,KAAK,MAAM,IAAIA,GAAOA,EAAI,cAAgB,EAAE,EAAE,KAAK,GAAG,CAAA,CACrE,CAAA,CACF,CACH,CACF,EA7HmBmB,EAAA,CAAhBC,EAAA,CAAM,EADIlB,EACM,UAAA,QAAA,CAAA,EADNA,EAANiB,EAAA,CADNE,EAAkB,0BAA0B,CAAA,EAChCnB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import{html as n}from"lit";import{state as o}from"lit/decorators.js";import{safeCustomElement as h}from"../base/define.mjs";import{emitSubjectEvent as _}from"../subject/shared-methods.mjs";import{AnswerRuntimeElement as v}from"./runtime-question-base.mjs";var c=Object.defineProperty,p=Object.getOwnPropertyDescriptor,m=(e,t,i,s)=>{for(var r=s>1?void 0:s?p(t,i):t,l=e.length-1,a;l>=0;l--)(a=e[l])&&(r=(s?a(t,i,r):a(r))||r);return s&&r&&c(t,i,r),r};function w(e,t){return{row:e,message:t}}let u=class extends v{constructor(){super(...arguments),this._value=""}syncFromItem(){this._value=String(this._item.submitAnswer||"")}_setValue(e){this.disabled||!this.beforeChange(this._item,this._item)||(this._value=e,_(this,"runtime-input",{...this._item,submitAnswer:this._value}))}_renderReview(){if(!this.disabled||!this.isShowCorrect)return null;const e=this.resultAnswersFromExamResults(),t=String(this._item.examExpand||"").trim(),i=e.length?e.map(s=>s?.correctAnswer||"").filter(Boolean):t?[t]:[];return n`
|
|
2
|
+
<div class="qxs-answer-runtime__result">
|
|
3
|
+
${i.length?i.map(s=>n`
|
|
4
|
+
<div class="qxs-answer-runtime__result-line">参考答案为:${s}</div>
|
|
5
|
+
`):n`<span class="qxs-answer-runtime__result-line is-success">本题暂无参考答案</span>`}
|
|
6
|
+
</div>
|
|
7
|
+
`}async onSubmit(){if(!this._value.trim())throw w(this._item,"不能为空");return{...this._item,submitAnswer:this._value,submitAnswerObj:{intVal:this._item.examId,stringVal:this._value}}}reset(){this.updateItem(this.cloneItem()),this.syncFromItem()}render(){return this.renderShell({shellClassName:"qxs-answer-runtime-text-fill text_fill",answerContent:n`
|
|
8
|
+
${this.type?n`
|
|
9
|
+
<textarea
|
|
10
|
+
rows="4"
|
|
11
|
+
class="textarea-box"
|
|
12
|
+
.value=${this._value}
|
|
13
|
+
?disabled=${this.disabled}
|
|
14
|
+
@input=${e=>this._setValue(e.target.value)}
|
|
15
|
+
></textarea>
|
|
16
|
+
<div class="font-num">${this._value.length}</div>
|
|
17
|
+
`:n`<div class="textarea-box qxs-answer-runtime__text-preview">${this._value||"—"}</div>`}
|
|
18
|
+
`,resultContent:this._renderReview(),footerContent:this.renderCasePracticeFooter({...this._item,submitAnswer:this._value})})}};m([o()],u.prototype,"_value",2);u=m([h("qxs-answer-runtime-text-fill")],u);export{u as QxsAnswerRuntimeTextFill};
|
|
19
|
+
//# sourceMappingURL=runtime-text-fill.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-text-fill.mjs","sources":["../../../../packages/components/src/answer-container/runtime-text-fill.ts"],"sourcesContent":["import { html } from 'lit'\nimport { state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { emitSubjectEvent } from '../subject/shared-methods'\nimport { AnswerRuntimeElement } from './runtime-question-base'\nimport type { AnswerSubmitError } from './types'\n\nfunction toError(row: any, message: string): AnswerSubmitError {\n return { row, message }\n}\n\n@safeCustomElement('qxs-answer-runtime-text-fill')\nexport class QxsAnswerRuntimeTextFill extends AnswerRuntimeElement {\n @state() private _value = ''\n\n protected syncFromItem() {\n this._value = String(this._item.submitAnswer || '')\n }\n\n private _setValue(value: string) {\n if (this.disabled || !this.beforeChange(this._item, this._item)) {\n return\n }\n this._value = value\n emitSubjectEvent(this, 'runtime-input', {\n ...this._item,\n submitAnswer: this._value,\n })\n }\n\n private _renderReview() {\n if (!this.disabled || !this.isShowCorrect) {\n return null\n }\n\n const results = this.resultAnswersFromExamResults()\n const fallback = String(this._item.examExpand || '').trim()\n const correctList = results.length\n ? results.map((result: any) => result?.correctAnswer || '').filter(Boolean)\n : fallback\n ? [fallback]\n : []\n\n return html`\n <div class=\"qxs-answer-runtime__result\">\n ${correctList.length\n ? correctList.map((correctAnswer) => html`\n <div class=\"qxs-answer-runtime__result-line\">参考答案为:${correctAnswer}</div>\n `)\n : html`<span class=\"qxs-answer-runtime__result-line is-success\">本题暂无参考答案</span>`}\n </div>\n `\n }\n\n async onSubmit() {\n if (!this._value.trim()) {\n throw toError(this._item, '不能为空')\n }\n\n return {\n ...this._item,\n submitAnswer: this._value,\n submitAnswerObj: {\n intVal: this._item.examId,\n stringVal: this._value,\n },\n }\n }\n\n reset() {\n this.updateItem(this.cloneItem())\n this.syncFromItem()\n }\n\n render() {\n return this.renderShell({\n shellClassName: 'qxs-answer-runtime-text-fill text_fill',\n answerContent: html`\n ${this.type\n ? html`\n <textarea\n rows=\"4\"\n class=\"textarea-box\"\n .value=${this._value}\n ?disabled=${this.disabled}\n @input=${(event: Event) => this._setValue((event.target as HTMLTextAreaElement).value)}\n ></textarea>\n <div class=\"font-num\">${this._value.length}</div>\n `\n : html`<div class=\"textarea-box qxs-answer-runtime__text-preview\">${this._value || '—'}</div>`}\n `,\n resultContent: this._renderReview(),\n footerContent: this.renderCasePracticeFooter({\n ...this._item,\n submitAnswer: this._value,\n }),\n })\n }\n}\n\nexport function register() {}\n"],"names":["toError","row","message","QxsAnswerRuntimeTextFill","AnswerRuntimeElement","value","emitSubjectEvent","results","fallback","correctList","result","html","correctAnswer","event","__decorateClass","state","safeCustomElement"],"mappings":"gcAOA,SAASA,EAAQC,EAAUC,EAAoC,CAC7D,MAAO,CAAE,IAAAD,EAAK,QAAAC,CAAA,CAChB,CAGO,IAAMC,EAAN,cAAuCC,CAAqB,CAA5D,aAAA,CAAA,MAAA,GAAA,SAAA,EACI,KAAQ,OAAS,EAAA,CAEhB,cAAe,CACvB,KAAK,OAAS,OAAO,KAAK,MAAM,cAAgB,EAAE,CACpD,CAEQ,UAAUC,EAAe,CAC3B,KAAK,UAAY,CAAC,KAAK,aAAa,KAAK,MAAO,KAAK,KAAK,IAG9D,KAAK,OAASA,EACdC,EAAiB,KAAM,gBAAiB,CACtC,GAAG,KAAK,MACR,aAAc,KAAK,MAAA,CACpB,EACH,CAEQ,eAAgB,CACtB,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,cAC1B,OAAO,KAGT,MAAMC,EAAU,KAAK,6BAAA,EACfC,EAAW,OAAO,KAAK,MAAM,YAAc,EAAE,EAAE,KAAA,EAC/CC,EAAcF,EAAQ,OACxBA,EAAQ,IAAKG,GAAgBA,GAAQ,eAAiB,EAAE,EAAE,OAAO,OAAO,EACxEF,EACE,CAACA,CAAQ,EACT,CAAA,EAEN,OAAOG;AAAA;AAAA,UAEDF,EAAY,OACVA,EAAY,IAAKG,GAAkBD;AAAA,mEACoBC,CAAa;AAAA,aACnE,EACDD,2EAA8E;AAAA;AAAA,KAGxF,CAEA,MAAM,UAAW,CACf,GAAI,CAAC,KAAK,OAAO,OACf,MAAMX,EAAQ,KAAK,MAAO,MAAM,EAGlC,MAAO,CACL,GAAG,KAAK,MACR,aAAc,KAAK,OACnB,gBAAiB,CACf,OAAQ,KAAK,MAAM,OACnB,UAAW,KAAK,MAAA,CAClB,CAEJ,CAEA,OAAQ,CACN,KAAK,WAAW,KAAK,WAAW,EAChC,KAAK,aAAA,CACP,CAEA,QAAS,CACP,OAAO,KAAK,YAAY,CACtB,eAAgB,yCAChB,cAAeW;AAAA,UACX,KAAK,KACHA;AAAA;AAAA;AAAA;AAAA,yBAIa,KAAK,MAAM;AAAA,4BACR,KAAK,QAAQ;AAAA,yBACfE,GAAiB,KAAK,UAAWA,EAAM,OAA+B,KAAK,CAAC;AAAA;AAAA,sCAEhE,KAAK,OAAO,MAAM;AAAA,cAE5CF,+DAAkE,KAAK,QAAU,GAAG,QAAQ;AAAA,QAElG,cAAe,KAAK,cAAA,EACpB,cAAe,KAAK,yBAAyB,CAC3C,GAAG,KAAK,MACR,aAAc,KAAK,MAAA,CACpB,CAAA,CACF,CACH,CACF,EArFmBG,EAAA,CAAhBC,EAAA,CAAM,EADIZ,EACM,UAAA,SAAA,CAAA,EADNA,EAANW,EAAA,CADNE,EAAkB,8BAA8B,CAAA,EACpCb,CAAA"}
|