@qxs-bns/components-wc 0.0.30 → 0.0.32
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/editor/blocksuite-editor.mjs +166 -357
- package/es/editor/blocksuite-editor.mjs.map +1 -1
- package/es/editor/toolbar.mjs +2 -0
- package/es/editor/toolbar.mjs.map +1 -0
- package/es/subject/action.mjs +7 -8
- package/es/subject/action.mjs.map +1 -1
- package/es/subject/blank-fill.mjs +243 -132
- package/es/subject/blank-fill.mjs.map +1 -1
- package/es/subject/layout.mjs +5 -5
- package/es/subject/layout.mjs.map +1 -1
- package/es/subject/page-end.mjs +1 -1
- package/es/subject/page-end.mjs.map +1 -1
- package/es/subject/scale.mjs +165 -126
- package/es/subject/scale.mjs.map +1 -1
- package/es/subject/shared-methods.mjs +2 -0
- package/es/subject/shared-methods.mjs.map +1 -0
- package/es/subject/shared-styles.mjs +75 -0
- package/es/subject/shared-styles.mjs.map +1 -0
- package/es/subject/single.mjs +243 -187
- package/es/subject/single.mjs.map +1 -1
- package/es/subject/sortable.mjs +7 -7
- package/es/subject/sortable.mjs.map +1 -1
- package/es/subject/text-fill.mjs +273 -138
- package/es/subject/text-fill.mjs.map +1 -1
- package/lib/editor/blocksuite-editor.cjs +166 -357
- package/lib/editor/blocksuite-editor.cjs.map +1 -1
- package/lib/editor/toolbar.cjs +2 -0
- package/lib/editor/toolbar.cjs.map +1 -0
- package/lib/subject/action.cjs +33 -34
- package/lib/subject/action.cjs.map +1 -1
- package/lib/subject/blank-fill.cjs +247 -136
- package/lib/subject/blank-fill.cjs.map +1 -1
- package/lib/subject/layout.cjs +3 -3
- package/lib/subject/layout.cjs.map +1 -1
- package/lib/subject/page-end.cjs +2 -2
- package/lib/subject/page-end.cjs.map +1 -1
- package/lib/subject/scale.cjs +165 -126
- package/lib/subject/scale.cjs.map +1 -1
- package/lib/subject/shared-methods.cjs +2 -0
- package/lib/subject/shared-methods.cjs.map +1 -0
- package/lib/subject/shared-styles.cjs +75 -0
- package/lib/subject/shared-styles.cjs.map +1 -0
- package/lib/subject/single.cjs +243 -187
- package/lib/subject/single.cjs.map +1 -1
- package/lib/subject/sortable.cjs +1 -1
- package/lib/subject/sortable.cjs.map +1 -1
- package/lib/subject/text-fill.cjs +273 -138
- package/lib/subject/text-fill.cjs.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const t=["format","heading","align","code","link","image","list","blockquote","table"],e=[...t],r=e.filter(t=>"table"!==t),i=new Set(t);exports.DEFAULT_EDITOR_TOOLBAR=e,exports.EDITOR_TOOLBAR_ITEMS=t,exports.SUB_TEXT_EDITOR_TOOLBAR=r,exports.parseEditorToolbarItems=function(t){return Array.isArray(t)?t.filter(t=>i.has(t)):"string"!=typeof t?[...e]:t.split(/[\s,|]+/).map(t=>t.trim()).filter(Boolean).filter(t=>i.has(t))};
|
|
2
|
+
//# sourceMappingURL=toolbar.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolbar.cjs","sources":["../../../../packages/components-wc/src/editor/toolbar.ts"],"sourcesContent":["export const EDITOR_TOOLBAR_ITEMS = [\n 'format',\n 'heading',\n 'align',\n 'code',\n 'link',\n 'image',\n 'list',\n 'blockquote',\n 'table',\n] as const\n\nexport type EditorToolbarItem = (typeof EDITOR_TOOLBAR_ITEMS)[number]\n\nexport const DEFAULT_EDITOR_TOOLBAR: EditorToolbarItem[] = [...EDITOR_TOOLBAR_ITEMS]\n\nexport const SUB_TEXT_EDITOR_TOOLBAR: EditorToolbarItem[] = DEFAULT_EDITOR_TOOLBAR.filter(\n item => item !== 'table',\n)\n\nconst EDITOR_TOOLBAR_ITEM_SET = new Set<string>(EDITOR_TOOLBAR_ITEMS)\n\nexport function parseEditorToolbarItems(\n value: string | readonly string[] | null | undefined,\n): EditorToolbarItem[] {\n if (Array.isArray(value)) {\n return value.filter((item): item is EditorToolbarItem => EDITOR_TOOLBAR_ITEM_SET.has(item))\n }\n\n if (typeof value !== 'string') {\n return [...DEFAULT_EDITOR_TOOLBAR]\n }\n\n const tokens = value\n .split(/[\\s,|]+/)\n .map(token => token.trim())\n .filter(Boolean)\n\n return tokens.filter((item): item is EditorToolbarItem => EDITOR_TOOLBAR_ITEM_SET.has(item))\n}\n"],"names":["EDITOR_TOOLBAR_ITEMS","DEFAULT_EDITOR_TOOLBAR","SUB_TEXT_EDITOR_TOOLBAR","filter","item","EDITOR_TOOLBAR_ITEM_SET","Set","value","Array","isArray","has","split","map","token","trim","Boolean"],"mappings":"aAAO,MAAMA,EAAuB,CAClC,SACA,UACA,QACA,OACA,OACA,QACA,OACA,aACA,SAKWC,EAA8C,IAAID,GAElDE,EAA+CD,EAAuBE,UAChE,UAATC,GAGJC,EAA0B,IAAIC,IAAYN,qIAEzC,SACLO,GAEA,OAAIC,MAAMC,QAAQF,GACTA,EAAMJ,OAAQC,GAAoCC,EAAwBK,IAAIN,IAGlE,iBAAVG,EACF,IAAIN,GAGEM,EACZI,MAAM,WACNC,IAAIC,GAASA,EAAMC,QACnBX,OAAOY,SAEIZ,OAAQC,GAAoCC,EAAwBK,IAAIN,GACxF"}
|
package/lib/subject/action.cjs
CHANGED
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var t=require("lit"),e=require("lit/decorators.js"),o=require("../base/define.cjs"),s=require("./shared-styles.cjs"),i=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=(t,e,o,s)=>{for(var r,a=s>1?void 0:s?n(e,o):e,l=t.length-1;l>=0;l--)(r=t[l])&&(a=(s?r(e,o,a):r(a))||a);return s&&a&&i(e,o,a),a};const a=[{value:2,label:"必须全部都是支持选项,方可下一步"},{value:1,label:"无需判断是否是支持选项"},{value:3,label:"包含全部支持选项,即可下一步"}],l=[{type:"single",label:"单选题"},{type:"multiple",label:"多选题"},{type:"blank_fill",label:"填空题"},{type:"text_fill",label:"问答题"},{type:"scale",label:"量表题"},{type:"sort",label:"排序题"},{type:"page_end",label:"分页符"}];exports.QxsSubjectAction=class extends t.LitElement{constructor(){super(...arguments),this["is-edit"]=!1,this["is-set"]=!1,this["is-key"]=!1,this["answer-check-type"]=1,this["show-other-option"]=!1,this["show-answer-setting"]=!1,this["show-key"]=!1,this["show-rich-text"]=!1,this["hide-add-rich-text"]=!1,this["show-delete-action"]=!0,this["show-save-action"]=!0,this["page-end"]=!1,this["show-move"]=!1,this["show-add"]=!0,this["show-jump"]=!1,this["exam-answer-relation-type"]=0,this._modalOpen=!1,this._currentCheckType=1,this._addMenuOpen=!1,this._handleDocumentClick=t=>{const e=t.composedPath(),o=this.shadowRoot?.querySelector(".add-menu-wrap");o&&!e.includes(o)&&(this._addMenuOpen=!1)}}connectedCallback(){super.connectedCallback(),document.addEventListener("click",this._handleDocumentClick)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("click",this._handleDocumentClick)}updated(t){t.has("answer-check-type")&&(this._currentCheckType=this["answer-check-type"])}_emit(t,e){this.dispatchEvent(new CustomEvent(t,{bubbles:!0,composed:!0,detail:e??null}))}get _answerText(){return a.find(t=>t.value===this["answer-check-type"])?.label??""}get _showAnswerSetting(){return this["show-other-option"]||this["show-answer-setting"]}get _showKey(){return this["show-other-option"]||this["show-key"]}_renderEditMode(){return t.html`
|
|
2
2
|
<div class="left">
|
|
3
3
|
<span class="inline-actions">
|
|
4
|
-
${this["show-add"]?
|
|
4
|
+
${this["show-add"]?t.html`
|
|
5
5
|
<span class="add-menu-wrap">
|
|
6
6
|
<span class="link-btn" @click=${()=>{this._addMenuOpen=!this._addMenuOpen}}>在此题后加入新题</span>
|
|
7
7
|
${this._renderAddMenu()}
|
|
8
8
|
</span>
|
|
9
9
|
`:""}
|
|
10
|
-
${this["hide-add-rich-text"]?"":
|
|
10
|
+
${this["hide-add-rich-text"]?"":t.html`
|
|
11
11
|
<span class="link-btn" @click=${()=>this._emit("on-show-rich-text")}>
|
|
12
12
|
${this["show-rich-text"]?"删除题目描述(图文)":"+添加题目描述(图文)"}
|
|
13
13
|
</span>
|
|
14
14
|
`}
|
|
15
|
-
${this["show-jump"]?
|
|
15
|
+
${this["show-jump"]?t.html`
|
|
16
16
|
<span class="link-btn" @click=${()=>this._emit("jump")}>${this["is-set"]?"编辑跳题逻辑":"设置跳题逻辑"}</span>
|
|
17
17
|
`:""}
|
|
18
|
-
${this._showAnswerSetting?
|
|
18
|
+
${this._showAnswerSetting?t.html`
|
|
19
19
|
<span class="link-btn" @click=${()=>{this._modalOpen=!0}}>答题设置</span>
|
|
20
20
|
`:""}
|
|
21
|
-
${this._showKey?
|
|
21
|
+
${this._showKey?t.html`
|
|
22
22
|
<label class="checkbox-label">
|
|
23
|
-
<input type="checkbox" .checked=${this["is-key"]} @change=${
|
|
23
|
+
<input type="checkbox" .checked=${this["is-key"]} @change=${t=>this._emit("set-key",{value:t.target.checked})} />
|
|
24
24
|
核心题
|
|
25
25
|
</label>
|
|
26
26
|
`:""}
|
|
27
27
|
</span>
|
|
28
28
|
</div>
|
|
29
29
|
<div class="right">
|
|
30
|
-
${this["show-delete-action"]?
|
|
31
|
-
${this["show-save-action"]?
|
|
30
|
+
${this["show-delete-action"]?t.html`<button class="text-btn text-btn--danger btn-margin" @click=${()=>this._emit("delete")}>删除</button>`:""}
|
|
31
|
+
${this["show-save-action"]?t.html`<button class="text-btn text-btn--primary" @click=${()=>this._emit("save")}>完成编辑</button>`:""}
|
|
32
32
|
</div>
|
|
33
|
-
`}_renderViewMode(){return
|
|
33
|
+
`}_renderViewMode(){return t.html`
|
|
34
34
|
<div class="left">
|
|
35
35
|
<span class="inline-actions">
|
|
36
|
-
${this._showKey?
|
|
36
|
+
${this._showKey?t.html`
|
|
37
37
|
<label class="checkbox-label disabled">
|
|
38
38
|
<input type="checkbox" disabled .checked=${this["is-key"]} /> 核心题
|
|
39
39
|
</label>
|
|
40
40
|
`:""}
|
|
41
|
-
${this._showAnswerSetting?
|
|
41
|
+
${this._showAnswerSetting?t.html`
|
|
42
42
|
<span class="answer-text">${this._answerText}</span>
|
|
43
43
|
`:""}
|
|
44
|
-
${this["show-add"]?
|
|
44
|
+
${this["show-add"]?t.html`
|
|
45
45
|
<span class="add-menu-wrap">
|
|
46
46
|
<span class="link-btn" @click=${()=>{this._addMenuOpen=!this._addMenuOpen}}>在此题后加入新题</span>
|
|
47
47
|
${this._renderAddMenu()}
|
|
48
48
|
</span>
|
|
49
49
|
`:""}
|
|
50
|
-
${this["show-jump"]?
|
|
50
|
+
${this["show-jump"]?t.html`
|
|
51
51
|
<span class="link-btn" @click=${()=>this._emit("jump")}>${this["is-set"]?"编辑跳题逻辑":"设置跳题逻辑"}</span>
|
|
52
52
|
`:""}
|
|
53
53
|
</span>
|
|
54
54
|
</div>
|
|
55
55
|
<div class="right">
|
|
56
|
-
${!this["is-set"]&&this["show-move"]?
|
|
56
|
+
${!this["is-set"]&&this["show-move"]?t.html`
|
|
57
57
|
<button class="text-btn text-btn--default" @click=${()=>this._emit("move","up")}>上移</button>
|
|
58
58
|
<button class="text-btn text-btn--default btn-margin" @click=${()=>this._emit("move","down")}>下移</button>
|
|
59
59
|
`:""}
|
|
60
|
-
${!this["is-set"]&&this["show-delete-action"]?
|
|
61
|
-
${this["page-end"]||this["is-set"]?"":
|
|
60
|
+
${!this["is-set"]&&this["show-delete-action"]?t.html`<button class="text-btn text-btn--danger btn-margin" @click=${()=>this._emit("delete")}>删除</button>`:""}
|
|
61
|
+
${this["page-end"]||this["is-set"]?"":t.html`
|
|
62
62
|
<button class="text-btn text-btn--default" @click=${()=>this._emit("edit")}>编辑</button>
|
|
63
63
|
`}
|
|
64
64
|
</div>
|
|
65
|
-
`}_renderModal(){return this._modalOpen?
|
|
65
|
+
`}_renderModal(){return this._modalOpen?t.html`
|
|
66
66
|
<div class="modal-backdrop" @click=${()=>{this._modalOpen=!1}}>
|
|
67
|
-
<div class="modal" @click=${
|
|
67
|
+
<div class="modal" @click=${t=>t.stopPropagation()}>
|
|
68
68
|
<div class="modal-header">
|
|
69
69
|
<span class="modal-title">答题设置</span>
|
|
70
70
|
<button class="modal-close" @click=${()=>{this._modalOpen=!1}}>✕</button>
|
|
71
71
|
</div>
|
|
72
72
|
<div class="modal-body">
|
|
73
|
-
${
|
|
73
|
+
${a.map(e=>t.html`
|
|
74
74
|
<label class="radio-item">
|
|
75
|
-
<input type="radio" name="answer-check-type" .value=${String(
|
|
76
|
-
.checked=${this._currentCheckType===
|
|
77
|
-
@change=${()=>{this._currentCheckType=
|
|
78
|
-
${
|
|
75
|
+
<input type="radio" name="answer-check-type" .value=${String(e.value)}
|
|
76
|
+
.checked=${this._currentCheckType===e.value}
|
|
77
|
+
@change=${()=>{this._currentCheckType=e.value}} />
|
|
78
|
+
${e.label}
|
|
79
79
|
</label>
|
|
80
80
|
`)}
|
|
81
81
|
</div>
|
|
@@ -85,23 +85,22 @@
|
|
|
85
85
|
</div>
|
|
86
86
|
</div>
|
|
87
87
|
</div>
|
|
88
|
-
`:""}_renderAddMenu(){return this._addMenuOpen?
|
|
88
|
+
`:""}_renderAddMenu(){return this._addMenuOpen?t.html`
|
|
89
89
|
<div class="add-menu">
|
|
90
|
-
${
|
|
91
|
-
<button class="add-item" @click=${()=>{this._addMenuOpen=!1,this._emit("add",
|
|
90
|
+
${l.map(e=>t.html`
|
|
91
|
+
<button class="add-item" @click=${()=>{this._addMenuOpen=!1,this._emit("add",e.type)}}>${e.label}</button>
|
|
92
92
|
`)}
|
|
93
93
|
</div>
|
|
94
|
-
`:""}render(){return
|
|
94
|
+
`:""}render(){return t.html`
|
|
95
95
|
<div class="action ${this["is-edit"]?"active":""}">
|
|
96
96
|
${this["is-edit"]?this._renderEditMode():this._renderViewMode()}
|
|
97
|
-
${this["is-set"]?
|
|
97
|
+
${this["is-set"]?t.html`<div class="has-set">*此题设置了跳题逻辑</div>`:""}
|
|
98
98
|
</div>
|
|
99
99
|
${this._renderModal()}
|
|
100
|
-
`}},exports.QxsSubjectAction.styles=
|
|
101
|
-
:host { display: block; font-family:
|
|
102
|
-
*, ::before, ::after { box-sizing: border-box; }
|
|
100
|
+
`}},exports.QxsSubjectAction.styles=[s.subjectControlResetStyles,t.css`
|
|
101
|
+
:host { display: block; font-family: inherit; font-size: 12px; }
|
|
103
102
|
|
|
104
|
-
.action { display: flex; justify-content: space-between; align-items: center; padding: 10px
|
|
103
|
+
.action { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; flex-wrap: wrap; gap: 8px; }
|
|
105
104
|
.action.active { background: transparent; }
|
|
106
105
|
.left { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
|
|
107
106
|
.right { display: flex; align-items: center; gap: 4px; }
|
|
@@ -168,5 +167,5 @@
|
|
|
168
167
|
background: #fff; color: #606266; font-size: 12px; cursor: pointer; transition: all .2s;
|
|
169
168
|
}
|
|
170
169
|
.add-item:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }
|
|
171
|
-
|
|
170
|
+
`],r([e.property({type:Boolean,attribute:"is-edit"})],exports.QxsSubjectAction.prototype,"is-edit",2),r([e.property({type:Boolean,attribute:"is-set"})],exports.QxsSubjectAction.prototype,"is-set",2),r([e.property({type:Boolean,attribute:"is-key"})],exports.QxsSubjectAction.prototype,"is-key",2),r([e.property({type:Number,attribute:"answer-check-type"})],exports.QxsSubjectAction.prototype,"answer-check-type",2),r([e.property({type:Boolean,attribute:"show-other-option"})],exports.QxsSubjectAction.prototype,"show-other-option",2),r([e.property({type:Boolean,attribute:"show-answer-setting"})],exports.QxsSubjectAction.prototype,"show-answer-setting",2),r([e.property({type:Boolean,attribute:"show-key"})],exports.QxsSubjectAction.prototype,"show-key",2),r([e.property({type:Boolean,attribute:"show-rich-text"})],exports.QxsSubjectAction.prototype,"show-rich-text",2),r([e.property({type:Boolean,attribute:"hide-add-rich-text"})],exports.QxsSubjectAction.prototype,"hide-add-rich-text",2),r([e.property({type:Boolean,attribute:"show-delete-action"})],exports.QxsSubjectAction.prototype,"show-delete-action",2),r([e.property({type:Boolean,attribute:"show-save-action"})],exports.QxsSubjectAction.prototype,"show-save-action",2),r([e.property({type:Boolean,attribute:"page-end"})],exports.QxsSubjectAction.prototype,"page-end",2),r([e.property({type:Boolean,attribute:"show-move"})],exports.QxsSubjectAction.prototype,"show-move",2),r([e.property({type:Boolean,attribute:"show-add"})],exports.QxsSubjectAction.prototype,"show-add",2),r([e.property({type:Boolean,attribute:"show-jump"})],exports.QxsSubjectAction.prototype,"show-jump",2),r([e.property({type:Number,attribute:"exam-answer-relation-type"})],exports.QxsSubjectAction.prototype,"exam-answer-relation-type",2),r([e.state()],exports.QxsSubjectAction.prototype,"_modalOpen",2),r([e.state()],exports.QxsSubjectAction.prototype,"_currentCheckType",2),r([e.state()],exports.QxsSubjectAction.prototype,"_addMenuOpen",2),exports.QxsSubjectAction=r([o.safeCustomElement("qxs-subject-action")],exports.QxsSubjectAction);
|
|
172
171
|
//# sourceMappingURL=action.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.cjs","sources":["../../../../packages/components-wc/src/subject/action.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\n\nconst answerTextList = [\n { value: 2, label: '必须全部都是支持选项,方可下一步' },\n { value: 1, label: '无需判断是否是支持选项' },\n { value: 3, label: '包含全部支持选项,即可下一步' },\n]\n\nconst addSubjectOptions = [\n { type: 'single', label: '单选题' },\n { type: 'multiple', label: '多选题' },\n { type: 'blank_fill', label: '填空题' },\n { type: 'text_fill', label: '问答题' },\n { type: 'scale', label: '量表题' },\n { type: 'sort', label: '排序题' },\n { type: 'page_end', label: '分页符' },\n]\n\n@safeCustomElement('qxs-subject-action')\nexport class QxsSubjectAction 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; }\n *, ::before, ::after { box-sizing: border-box; }\n\n .action { display: flex; justify-content: space-between; align-items: center; padding: 10px 12px; flex-wrap: wrap; gap: 8px; }\n .action.active { background: transparent; }\n .left { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .right { display: flex; align-items: center; gap: 4px; }\n\n .action-icon {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; font-size: 18px; color: #303133;\n cursor: pointer; border-radius: 6px; border: 1px solid #dcdfe6;\n background: #fff; transition: all 0.2s;\n }\n .action-icon:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n .action-icon--danger:hover { color: #f56c6c; border-color: #f56c6c; background: #fef0f0; }\n .action-icon:disabled { color: #c0c4cc; cursor: not-allowed; opacity: 0.6; }\n\n .text-btn {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 6px 12px; font-size: 12px; border-radius: 3px;\n cursor: pointer; border: 1px solid; transition: all 0.2s;\n }\n .text-btn--primary { background: #3D61E3; border-color: #3D61E3; color: #fff; }\n .text-btn--primary:hover { background: #2D4CB8; border-color: #2D4CB8; }\n .text-btn--default { background: #fff; border-color: #dcdfe6; color: #606266; }\n .text-btn--default:hover { color: #3D61E3; border-color: #a0cfff; }\n .text-btn--danger { background: #f56c6c; border-color: #f56c6c; color: #fff; }\n .text-btn--danger:hover { background: #e05252; border-color: #e05252; }\n\n .link-btn { background: none; border: none; color: #3D61E3; cursor: pointer; font-size: 12px; }\n .link-btn:hover { color: #2D4CB8; }\n\n .checkbox-label { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; color: #606266; user-select: none; font-size: 12px; }\n .checkbox-label.disabled { cursor: not-allowed; opacity: 0.6; }\n .has-set { display: flex; align-items: center; font-size: 12px; color: #bbb; }\n .answer-text { font-size: 11px; color: #909399; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n\n .btn-margin { margin-right: 10px; }\n\n .modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.5); z-index: 2000; display: flex; align-items: center; justify-content: center; }\n .modal { background: #fff; border-radius: 4px; min-width: 360px; max-width: 460px; box-shadow: 0 12px 32px rgba(0,0,0,.1); }\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: 16px; cursor: pointer; color: #909399; padding: 0; line-height: 1; }\n .modal-close:hover { color: #3D61E3; }\n .modal-body { padding: 20px; }\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 .radio-item { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; cursor: pointer; font-size: 13px; color: #606266; }\n .radio-item:last-child { margin-bottom: 0; }\n\n .inline-actions { display: inline-flex; align-items: center; gap: 12px; flex-wrap: wrap; }\n .add-menu-wrap { position: relative; display: inline-flex; }\n .add-menu {\n position: absolute; top: calc(100% + 6px); left: 0; z-index: 50;\n display: grid; grid-template-columns: repeat(2, minmax(84px, 1fr)); gap: 8px;\n min-width: 196px; padding: 10px; background: #fff; border: 1px solid #e4e7ed;\n border-radius: 6px; box-shadow: 0 8px 20px rgba(0,0,0,.12);\n }\n .add-item {\n display: inline-flex; align-items: center; justify-content: center;\n min-height: 30px; padding: 0 10px; border: 1px solid #dcdfe6; border-radius: 4px;\n background: #fff; color: #606266; font-size: 12px; cursor: pointer; transition: all .2s;\n }\n .add-item:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n `\n\n @property({ type: Boolean, attribute: 'is-edit' }) 'is-edit' = false\n @property({ type: Boolean, attribute: 'is-set' }) 'is-set' = false\n @property({ type: Boolean, attribute: 'is-key' }) 'is-key' = false\n @property({ type: Number, attribute: 'answer-check-type' }) 'answer-check-type' = 1\n @property({ type: Boolean, attribute: 'show-other-option' }) 'show-other-option' = false\n @property({ type: Boolean, attribute: 'show-answer-setting' }) 'show-answer-setting' = false\n @property({ type: Boolean, attribute: 'show-key' }) 'show-key' = false\n @property({ type: Boolean, attribute: 'show-rich-text' }) 'show-rich-text' = false\n @property({ type: Boolean, attribute: 'hide-add-rich-text' }) 'hide-add-rich-text' = false\n @property({ type: Boolean, attribute: 'show-delete-action' }) 'show-delete-action' = true\n @property({ type: Boolean, attribute: 'show-save-action' }) 'show-save-action' = true\n @property({ type: Boolean, attribute: 'page-end' }) 'page-end' = false\n @property({ type: Boolean, attribute: 'show-move' }) 'show-move' = false\n @property({ type: Boolean, attribute: 'show-add' }) 'show-add' = true\n @property({ type: Boolean, attribute: 'show-jump' }) 'show-jump' = false\n @property({ type: Number, attribute: 'exam-answer-relation-type' }) 'exam-answer-relation-type' = 0\n\n @state() private _modalOpen = false\n @state() private _currentCheckType = 1\n @state() private _addMenuOpen = false\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener('click', this._handleDocumentClick)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleDocumentClick)\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('answer-check-type')) {\n this._currentCheckType = this['answer-check-type']\n }\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const path = e.composedPath()\n const wrap = this.shadowRoot?.querySelector('.add-menu-wrap')\n if (wrap && !path.includes(wrap)) {\n this._addMenuOpen = false\n }\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 get _answerText() {\n return answerTextList.find(i => i.value === this['answer-check-type'])?.label ?? ''\n }\n\n private get _showAnswerSetting() {\n return this['show-other-option'] || this['show-answer-setting']\n }\n\n private get _showKey() {\n return this['show-other-option'] || this['show-key']\n }\n\n private _renderEditMode() {\n return html`\n <div class=\"left\">\n <span class=\"inline-actions\">\n ${this['show-add']\n ? html`\n <span class=\"add-menu-wrap\">\n <span class=\"link-btn\" @click=${() => { this._addMenuOpen = !this._addMenuOpen }}>在此题后加入新题</span>\n ${this._renderAddMenu()}\n </span>\n `\n : ''}\n ${!this['hide-add-rich-text']\n ? html`\n <span class=\"link-btn\" @click=${() => this._emit('on-show-rich-text')}>\n ${this['show-rich-text'] ? '删除题目描述(图文)' : '+添加题目描述(图文)'}\n </span>\n `\n : ''}\n ${this['show-jump']\n ? html`\n <span class=\"link-btn\" @click=${() => this._emit('jump')}>${this['is-set'] ? '编辑跳题逻辑' : '设置跳题逻辑'}</span>\n `\n : ''}\n ${this._showAnswerSetting\n ? html`\n <span class=\"link-btn\" @click=${() => { this._modalOpen = true }}>答题设置</span>\n `\n : ''}\n ${this._showKey\n ? html`\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" .checked=${this['is-key']} @change=${(e: Event) => this._emit('set-key', { value: (e.target as HTMLInputElement).checked })} />\n 核心题\n </label>\n `\n : ''}\n </span>\n </div>\n <div class=\"right\">\n ${this['show-delete-action']\n ? html`<button class=\"text-btn text-btn--danger btn-margin\" @click=${() => this._emit('delete')}>删除</button>`\n : ''}\n ${this['show-save-action']\n ? html`<button class=\"text-btn text-btn--primary\" @click=${() => this._emit('save')}>完成编辑</button>`\n : ''}\n </div>\n `\n }\n\n private _renderViewMode() {\n return html`\n <div class=\"left\">\n <span class=\"inline-actions\">\n ${this._showKey\n ? html`\n <label class=\"checkbox-label disabled\">\n <input type=\"checkbox\" disabled .checked=${this['is-key']} /> 核心题\n </label>\n `\n : ''}\n ${this._showAnswerSetting\n ? html`\n <span class=\"answer-text\">${this._answerText}</span>\n `\n : ''}\n ${this['show-add']\n ? html`\n <span class=\"add-menu-wrap\">\n <span class=\"link-btn\" @click=${() => { this._addMenuOpen = !this._addMenuOpen }}>在此题后加入新题</span>\n ${this._renderAddMenu()}\n </span>\n `\n : ''}\n ${this['show-jump']\n ? html`\n <span class=\"link-btn\" @click=${() => this._emit('jump')}>${this['is-set'] ? '编辑跳题逻辑' : '设置跳题逻辑'}</span>\n `\n : ''}\n </span>\n </div>\n <div class=\"right\">\n ${!this['is-set'] && this['show-move']\n ? html`\n <button class=\"text-btn text-btn--default\" @click=${() => this._emit('move', 'up')}>上移</button>\n <button class=\"text-btn text-btn--default btn-margin\" @click=${() => this._emit('move', 'down')}>下移</button>\n `\n : ''}\n ${!this['is-set'] && this['show-delete-action']\n ? html`<button class=\"text-btn text-btn--danger btn-margin\" @click=${() => this._emit('delete')}>删除</button>`\n : ''}\n ${!this['page-end'] && !this['is-set']\n ? html`\n <button class=\"text-btn text-btn--default\" @click=${() => this._emit('edit')}>编辑</button>\n `\n : ''}\n </div>\n `\n }\n\n private _renderModal() {\n if (!this._modalOpen) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => { this._modalOpen = 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._modalOpen = false }}>✕</button>\n </div>\n <div class=\"modal-body\">\n ${answerTextList.map(item => html`\n <label class=\"radio-item\">\n <input type=\"radio\" name=\"answer-check-type\" .value=${String(item.value)}\n .checked=${this._currentCheckType === item.value}\n @change=${() => { this._currentCheckType = item.value }} />\n ${item.label}\n </label>\n `)}\n </div>\n <div class=\"modal-footer\">\n <button @click=${() => { this._modalOpen = false }}>取消</button>\n <button class=\"primary\" @click=${() => {\n this._emit('set-answer-setting', { value: this._currentCheckType })\n this._modalOpen = false\n }}>保存</button>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderAddMenu() {\n if (!this._addMenuOpen) { return '' }\n return html`\n <div class=\"add-menu\">\n ${addSubjectOptions.map(item => html`\n <button class=\"add-item\" @click=${() => {\n this._addMenuOpen = false\n this._emit('add', item.type)\n }}>${item.label}</button>\n `)}\n </div>\n `\n }\n\n render() {\n return html`\n <div class=\"action ${this['is-edit'] ? 'active' : ''}\">\n ${this['is-edit'] ? this._renderEditMode() : this._renderViewMode()}\n ${this['is-set'] ? html`<div class=\"has-set\">*此题设置了跳题逻辑</div>` : ''}\n </div>\n ${this._renderModal()}\n `\n }\n}\n\nexport function register() {}\n"],"names":["answerTextList","value","label","addSubjectOptions","type","QxsSubjectAction","LitElement","constructor","super","arguments","this","_modalOpen","_currentCheckType","_addMenuOpen","_handleDocumentClick","e","path","composedPath","wrap","shadowRoot","querySelector","includes","connectedCallback","document","addEventListener","disconnectedCallback","removeEventListener","updated","changed","has","_emit","name","detail","dispatchEvent","CustomEvent","bubbles","composed","_answerText","find","i","_showAnswerSetting","_showKey","_renderEditMode","html","_renderAddMenu","target","checked","_renderViewMode","_renderModal","stopPropagation","map","item","String","render","styles","css","__decorateClass","property","Boolean","attribute","prototype","Number","state","safeCustomElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.cjs","sources":["../../../../packages/components-wc/src/subject/action.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { safeCustomElement } from '../base/define'\nimport { subjectControlResetStyles } from './shared-styles'\n\nconst answerTextList = [\n { value: 2, label: '必须全部都是支持选项,方可下一步' },\n { value: 1, label: '无需判断是否是支持选项' },\n { value: 3, label: '包含全部支持选项,即可下一步' },\n]\n\nconst addSubjectOptions = [\n { type: 'single', label: '单选题' },\n { type: 'multiple', label: '多选题' },\n { type: 'blank_fill', label: '填空题' },\n { type: 'text_fill', label: '问答题' },\n { type: 'scale', label: '量表题' },\n { type: 'sort', label: '排序题' },\n { type: 'page_end', label: '分页符' },\n]\n\n@safeCustomElement('qxs-subject-action')\nexport class QxsSubjectAction extends LitElement {\n static styles = [subjectControlResetStyles, css`\n :host { display: block; font-family: inherit; font-size: 12px; }\n\n .action { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; flex-wrap: wrap; gap: 8px; }\n .action.active { background: transparent; }\n .left { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .right { display: flex; align-items: center; gap: 4px; }\n\n .action-icon {\n display: inline-flex; align-items: center; justify-content: center;\n width: 32px; height: 32px; font-size: 18px; color: #303133;\n cursor: pointer; border-radius: 6px; border: 1px solid #dcdfe6;\n background: #fff; transition: all 0.2s;\n }\n .action-icon:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n .action-icon--danger:hover { color: #f56c6c; border-color: #f56c6c; background: #fef0f0; }\n .action-icon:disabled { color: #c0c4cc; cursor: not-allowed; opacity: 0.6; }\n\n .text-btn {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 6px 12px; font-size: 12px; border-radius: 3px;\n cursor: pointer; border: 1px solid; transition: all 0.2s;\n }\n .text-btn--primary { background: #3D61E3; border-color: #3D61E3; color: #fff; }\n .text-btn--primary:hover { background: #2D4CB8; border-color: #2D4CB8; }\n .text-btn--default { background: #fff; border-color: #dcdfe6; color: #606266; }\n .text-btn--default:hover { color: #3D61E3; border-color: #a0cfff; }\n .text-btn--danger { background: #f56c6c; border-color: #f56c6c; color: #fff; }\n .text-btn--danger:hover { background: #e05252; border-color: #e05252; }\n\n .link-btn { background: none; border: none; color: #3D61E3; cursor: pointer; font-size: 12px; }\n .link-btn:hover { color: #2D4CB8; }\n\n .checkbox-label { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; color: #606266; user-select: none; font-size: 12px; }\n .checkbox-label.disabled { cursor: not-allowed; opacity: 0.6; }\n .has-set { display: flex; align-items: center; font-size: 12px; color: #bbb; }\n .answer-text { font-size: 11px; color: #909399; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n\n .btn-margin { margin-right: 10px; }\n\n .modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.5); z-index: 2000; display: flex; align-items: center; justify-content: center; }\n .modal { background: #fff; border-radius: 4px; min-width: 360px; max-width: 460px; box-shadow: 0 12px 32px rgba(0,0,0,.1); }\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: 16px; cursor: pointer; color: #909399; padding: 0; line-height: 1; }\n .modal-close:hover { color: #3D61E3; }\n .modal-body { padding: 20px; }\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 .radio-item { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; cursor: pointer; font-size: 13px; color: #606266; }\n .radio-item:last-child { margin-bottom: 0; }\n\n .inline-actions { display: inline-flex; align-items: center; gap: 12px; flex-wrap: wrap; }\n .add-menu-wrap { position: relative; display: inline-flex; }\n .add-menu {\n position: absolute; top: calc(100% + 6px); left: 0; z-index: 50;\n display: grid; grid-template-columns: repeat(2, minmax(84px, 1fr)); gap: 8px;\n min-width: 196px; padding: 10px; background: #fff; border: 1px solid #e4e7ed;\n border-radius: 6px; box-shadow: 0 8px 20px rgba(0,0,0,.12);\n }\n .add-item {\n display: inline-flex; align-items: center; justify-content: center;\n min-height: 30px; padding: 0 10px; border: 1px solid #dcdfe6; border-radius: 4px;\n background: #fff; color: #606266; font-size: 12px; cursor: pointer; transition: all .2s;\n }\n .add-item:hover { color: #3D61E3; border-color: #3D61E3; background: #ecf5ff; }\n `]\n\n @property({ type: Boolean, attribute: 'is-edit' }) 'is-edit' = false\n @property({ type: Boolean, attribute: 'is-set' }) 'is-set' = false\n @property({ type: Boolean, attribute: 'is-key' }) 'is-key' = false\n @property({ type: Number, attribute: 'answer-check-type' }) 'answer-check-type' = 1\n @property({ type: Boolean, attribute: 'show-other-option' }) 'show-other-option' = false\n @property({ type: Boolean, attribute: 'show-answer-setting' }) 'show-answer-setting' = false\n @property({ type: Boolean, attribute: 'show-key' }) 'show-key' = false\n @property({ type: Boolean, attribute: 'show-rich-text' }) 'show-rich-text' = false\n @property({ type: Boolean, attribute: 'hide-add-rich-text' }) 'hide-add-rich-text' = false\n @property({ type: Boolean, attribute: 'show-delete-action' }) 'show-delete-action' = true\n @property({ type: Boolean, attribute: 'show-save-action' }) 'show-save-action' = true\n @property({ type: Boolean, attribute: 'page-end' }) 'page-end' = false\n @property({ type: Boolean, attribute: 'show-move' }) 'show-move' = false\n @property({ type: Boolean, attribute: 'show-add' }) 'show-add' = true\n @property({ type: Boolean, attribute: 'show-jump' }) 'show-jump' = false\n @property({ type: Number, attribute: 'exam-answer-relation-type' }) 'exam-answer-relation-type' = 0\n\n @state() private _modalOpen = false\n @state() private _currentCheckType = 1\n @state() private _addMenuOpen = false\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener('click', this._handleDocumentClick)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n document.removeEventListener('click', this._handleDocumentClick)\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('answer-check-type')) {\n this._currentCheckType = this['answer-check-type']\n }\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const path = e.composedPath()\n const wrap = this.shadowRoot?.querySelector('.add-menu-wrap')\n if (wrap && !path.includes(wrap)) {\n this._addMenuOpen = false\n }\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 get _answerText() {\n return answerTextList.find(i => i.value === this['answer-check-type'])?.label ?? ''\n }\n\n private get _showAnswerSetting() {\n return this['show-other-option'] || this['show-answer-setting']\n }\n\n private get _showKey() {\n return this['show-other-option'] || this['show-key']\n }\n\n private _renderEditMode() {\n return html`\n <div class=\"left\">\n <span class=\"inline-actions\">\n ${this['show-add']\n ? html`\n <span class=\"add-menu-wrap\">\n <span class=\"link-btn\" @click=${() => { this._addMenuOpen = !this._addMenuOpen }}>在此题后加入新题</span>\n ${this._renderAddMenu()}\n </span>\n `\n : ''}\n ${!this['hide-add-rich-text']\n ? html`\n <span class=\"link-btn\" @click=${() => this._emit('on-show-rich-text')}>\n ${this['show-rich-text'] ? '删除题目描述(图文)' : '+添加题目描述(图文)'}\n </span>\n `\n : ''}\n ${this['show-jump']\n ? html`\n <span class=\"link-btn\" @click=${() => this._emit('jump')}>${this['is-set'] ? '编辑跳题逻辑' : '设置跳题逻辑'}</span>\n `\n : ''}\n ${this._showAnswerSetting\n ? html`\n <span class=\"link-btn\" @click=${() => { this._modalOpen = true }}>答题设置</span>\n `\n : ''}\n ${this._showKey\n ? html`\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" .checked=${this['is-key']} @change=${(e: Event) => this._emit('set-key', { value: (e.target as HTMLInputElement).checked })} />\n 核心题\n </label>\n `\n : ''}\n </span>\n </div>\n <div class=\"right\">\n ${this['show-delete-action']\n ? html`<button class=\"text-btn text-btn--danger btn-margin\" @click=${() => this._emit('delete')}>删除</button>`\n : ''}\n ${this['show-save-action']\n ? html`<button class=\"text-btn text-btn--primary\" @click=${() => this._emit('save')}>完成编辑</button>`\n : ''}\n </div>\n `\n }\n\n private _renderViewMode() {\n return html`\n <div class=\"left\">\n <span class=\"inline-actions\">\n ${this._showKey\n ? html`\n <label class=\"checkbox-label disabled\">\n <input type=\"checkbox\" disabled .checked=${this['is-key']} /> 核心题\n </label>\n `\n : ''}\n ${this._showAnswerSetting\n ? html`\n <span class=\"answer-text\">${this._answerText}</span>\n `\n : ''}\n ${this['show-add']\n ? html`\n <span class=\"add-menu-wrap\">\n <span class=\"link-btn\" @click=${() => { this._addMenuOpen = !this._addMenuOpen }}>在此题后加入新题</span>\n ${this._renderAddMenu()}\n </span>\n `\n : ''}\n ${this['show-jump']\n ? html`\n <span class=\"link-btn\" @click=${() => this._emit('jump')}>${this['is-set'] ? '编辑跳题逻辑' : '设置跳题逻辑'}</span>\n `\n : ''}\n </span>\n </div>\n <div class=\"right\">\n ${!this['is-set'] && this['show-move']\n ? html`\n <button class=\"text-btn text-btn--default\" @click=${() => this._emit('move', 'up')}>上移</button>\n <button class=\"text-btn text-btn--default btn-margin\" @click=${() => this._emit('move', 'down')}>下移</button>\n `\n : ''}\n ${!this['is-set'] && this['show-delete-action']\n ? html`<button class=\"text-btn text-btn--danger btn-margin\" @click=${() => this._emit('delete')}>删除</button>`\n : ''}\n ${!this['page-end'] && !this['is-set']\n ? html`\n <button class=\"text-btn text-btn--default\" @click=${() => this._emit('edit')}>编辑</button>\n `\n : ''}\n </div>\n `\n }\n\n private _renderModal() {\n if (!this._modalOpen) { return '' }\n return html`\n <div class=\"modal-backdrop\" @click=${() => { this._modalOpen = 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._modalOpen = false }}>✕</button>\n </div>\n <div class=\"modal-body\">\n ${answerTextList.map(item => html`\n <label class=\"radio-item\">\n <input type=\"radio\" name=\"answer-check-type\" .value=${String(item.value)}\n .checked=${this._currentCheckType === item.value}\n @change=${() => { this._currentCheckType = item.value }} />\n ${item.label}\n </label>\n `)}\n </div>\n <div class=\"modal-footer\">\n <button @click=${() => { this._modalOpen = false }}>取消</button>\n <button class=\"primary\" @click=${() => {\n this._emit('set-answer-setting', { value: this._currentCheckType })\n this._modalOpen = false\n }}>保存</button>\n </div>\n </div>\n </div>\n `\n }\n\n private _renderAddMenu() {\n if (!this._addMenuOpen) { return '' }\n return html`\n <div class=\"add-menu\">\n ${addSubjectOptions.map(item => html`\n <button class=\"add-item\" @click=${() => {\n this._addMenuOpen = false\n this._emit('add', item.type)\n }}>${item.label}</button>\n `)}\n </div>\n `\n }\n\n render() {\n return html`\n <div class=\"action ${this['is-edit'] ? 'active' : ''}\">\n ${this['is-edit'] ? this._renderEditMode() : this._renderViewMode()}\n ${this['is-set'] ? html`<div class=\"has-set\">*此题设置了跳题逻辑</div>` : ''}\n </div>\n ${this._renderModal()}\n `\n }\n}\n\nexport function register() {}\n"],"names":["answerTextList","value","label","addSubjectOptions","type","QxsSubjectAction","LitElement","constructor","super","arguments","this","_modalOpen","_currentCheckType","_addMenuOpen","_handleDocumentClick","e","path","composedPath","wrap","shadowRoot","querySelector","includes","connectedCallback","document","addEventListener","disconnectedCallback","removeEventListener","updated","changed","has","_emit","name","detail","dispatchEvent","CustomEvent","bubbles","composed","_answerText","find","i","_showAnswerSetting","_showKey","_renderEditMode","html","_renderAddMenu","target","checked","_renderViewMode","_renderModal","stopPropagation","map","item","String","render","styles","subjectControlResetStyles","css","__decorateClass","property","Boolean","attribute","prototype","Number","state","safeCustomElement"],"mappings":"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"}
|