@citolab/qti-components 7.4.0 → 7.4.1
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/custom-elements.json +6 -6
- package/dist/chunks/{chunk-6K4ROGDD.js → chunk-4BDOB6KY.js} +12 -11
- package/dist/chunks/chunk-4BDOB6KY.js.map +1 -0
- package/dist/chunks/chunk-4OGJBG35.js +8 -0
- package/dist/chunks/chunk-4OGJBG35.js.map +1 -0
- package/dist/chunks/{chunk-LN74Z5QM.js → chunk-7RW7LCEJ.js} +258 -589
- package/dist/chunks/chunk-7RW7LCEJ.js.map +1 -0
- package/dist/chunks/{chunk-TJ6ZOT7A.js → chunk-APBAIN6D.js} +25 -23
- package/dist/chunks/chunk-APBAIN6D.js.map +1 -0
- package/dist/chunks/chunk-C5RLRG3L.js +10 -0
- package/dist/chunks/chunk-C5RLRG3L.js.map +1 -0
- package/dist/chunks/chunk-CJADUWEC.js +10 -0
- package/dist/chunks/chunk-CJADUWEC.js.map +1 -0
- package/dist/chunks/chunk-DVQQ7I6Y.js +8 -0
- package/dist/chunks/chunk-DVQQ7I6Y.js.map +1 -0
- package/dist/chunks/{chunk-O5N4DCU6.js → chunk-ELDMXTUQ.js} +2 -7
- package/dist/chunks/chunk-ELDMXTUQ.js.map +1 -0
- package/dist/chunks/chunk-ERYHQVOT.js +8 -0
- package/dist/chunks/chunk-ERYHQVOT.js.map +1 -0
- package/dist/chunks/chunk-GAAFN7QF.js +146 -0
- package/dist/chunks/chunk-GAAFN7QF.js.map +1 -0
- package/dist/chunks/chunk-H2JE6IVU.js +15 -0
- package/dist/chunks/chunk-H2JE6IVU.js.map +1 -0
- package/dist/chunks/chunk-H6KHXSIO.js +8 -0
- package/dist/chunks/chunk-H6KHXSIO.js.map +1 -0
- package/dist/chunks/chunk-HFAUM56X.js +208 -0
- package/dist/chunks/chunk-HFAUM56X.js.map +1 -0
- package/dist/chunks/chunk-JQ6HWGRY.js +22 -0
- package/dist/chunks/chunk-JQ6HWGRY.js.map +1 -0
- package/dist/chunks/{chunk-GUDRSXIP.js → chunk-K47QFOQX.js} +6 -20
- package/dist/chunks/chunk-K47QFOQX.js.map +1 -0
- package/dist/chunks/chunk-NJNQOQUU.js +8 -0
- package/dist/chunks/chunk-NJNQOQUU.js.map +1 -0
- package/dist/chunks/chunk-SV4K25ZI.js +19 -0
- package/dist/chunks/chunk-SV4K25ZI.js.map +1 -0
- package/dist/chunks/{chunk-JDY5GL7E.js → chunk-WFUXZ4UT.js} +1 -13
- package/dist/chunks/{chunk-JDY5GL7E.js.map → chunk-WFUXZ4UT.js.map} +1 -1
- package/dist/custom-elements.json +6 -6
- package/dist/{computed-item.context-DpK-sS0T.d.ts → exports/computed-item.context.d.ts} +6 -2
- package/dist/exports/computed-item.context.js +8 -0
- package/dist/exports/computed-item.context.js.map +1 -0
- package/dist/exports/computed.context.d.ts +34 -0
- package/dist/exports/computed.context.js +8 -0
- package/dist/exports/computed.context.js.map +1 -0
- package/dist/{config.context-CmQ9L62n.d.ts → exports/config.context.d.ts} +4 -1
- package/dist/exports/config.context.js +8 -0
- package/dist/exports/config.context.js.map +1 -0
- package/dist/exports/expression-result.d.ts +19 -0
- package/dist/exports/expression-result.js +1 -0
- package/dist/exports/expression-result.js.map +1 -0
- package/dist/exports/interaction.d.ts +46 -0
- package/dist/exports/interaction.interface.d.ts +13 -0
- package/dist/exports/interaction.interface.js +1 -0
- package/dist/exports/interaction.interface.js.map +1 -0
- package/dist/exports/interaction.js +12 -0
- package/dist/exports/interaction.js.map +1 -0
- package/dist/exports/item.context.d.ts +11 -0
- package/dist/exports/item.context.js +8 -0
- package/dist/exports/item.context.js.map +1 -0
- package/dist/exports/qti-assessment-item.context.d.ts +9 -0
- package/dist/exports/qti-assessment-item.context.js +8 -0
- package/dist/exports/qti-assessment-item.context.js.map +1 -0
- package/dist/exports/qti-condition-expression.d.ts +14 -0
- package/dist/exports/qti-condition-expression.js +11 -0
- package/dist/exports/qti-condition-expression.js.map +1 -0
- package/dist/exports/qti-expression.d.ts +23 -0
- package/dist/exports/qti-expression.js +10 -0
- package/dist/exports/qti-expression.js.map +1 -0
- package/dist/exports/qti-test.d.ts +12 -0
- package/dist/exports/qti-test.js +1 -0
- package/dist/exports/qti-test.js.map +1 -0
- package/dist/exports/qti.context.d.ts +14 -0
- package/dist/exports/qti.context.js +8 -0
- package/dist/exports/qti.context.js.map +1 -0
- package/dist/exports/session.context.d.ts +15 -0
- package/dist/exports/session.context.js +10 -0
- package/dist/exports/session.context.js.map +1 -0
- package/dist/exports/test.context.d.ts +16 -0
- package/dist/exports/test.context.js +10 -0
- package/dist/exports/test.context.js.map +1 -0
- package/dist/exports/variables.d.ts +2 -0
- package/dist/exports/variables.js +1 -0
- package/dist/exports/variables.js.map +1 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.js +20 -7
- package/dist/{qti-assessment-item-D77dJ1Ot.d.ts → qti-assessment-item-l-mN3teH.d.ts} +2 -1
- package/dist/qti-components/index.d.ts +14 -76
- package/dist/qti-components/index.js +13 -4
- package/dist/qti-item/index.d.ts +4 -3
- package/dist/qti-item/index.js +6 -3
- package/dist/qti-loader/index.d.ts +3 -2
- package/dist/qti-loader/index.js +2 -1
- package/dist/qti-loader/index.js.map +1 -1
- package/dist/qti-modal-feedback-PKbhO-3w.d.ts +30 -0
- package/dist/qti-test/index.d.ts +16 -129
- package/dist/qti-test/index.js +11 -4
- package/dist/qti-test-BwvOhz_-.d.ts +118 -0
- package/dist/qti-transform-item-C9WtMeDR.d.ts +39 -0
- package/dist/qti-transformers/index.d.ts +2 -38
- package/dist/qti-transformers/index.js +2 -1
- package/dist/{variables-Vgyr6yyW.d.ts → variables-BCkyLoXK.d.ts} +7 -10
- package/package.json +1 -1
- package/dist/chunks/chunk-6K4ROGDD.js.map +0 -1
- package/dist/chunks/chunk-GUDRSXIP.js.map +0 -1
- package/dist/chunks/chunk-LN74Z5QM.js.map +0 -1
- package/dist/chunks/chunk-O5N4DCU6.js.map +0 -1
- package/dist/chunks/chunk-TJ6ZOT7A.js.map +0 -1
- package/dist/test.context-L609DNAz.d.ts +0 -58
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import {
|
|
2
|
+
qtiContext
|
|
3
|
+
} from "./chunk-H6KHXSIO.js";
|
|
4
|
+
import {
|
|
5
|
+
itemContext
|
|
6
|
+
} from "./chunk-NJNQOQUU.js";
|
|
7
|
+
import {
|
|
8
|
+
__decorateClass
|
|
9
|
+
} from "./chunk-H2JE6IVU.js";
|
|
10
|
+
|
|
11
|
+
// src/lib/exports/qti-expression.ts
|
|
12
|
+
import { consume } from "@lit/context";
|
|
13
|
+
import { css, html, LitElement } from "lit";
|
|
14
|
+
import { state } from "lit/decorators.js";
|
|
15
|
+
var QtiExpression = class extends LitElement {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(...arguments);
|
|
18
|
+
this.getVariables = () => (
|
|
19
|
+
// FIXME: if this itself is multiple, this will never enter the qti-multiple switch
|
|
20
|
+
// See this example here: https://github.com/1EdTech/qti-examples/blob/master/qtiv3-examples/packaging/items/Example05-feedbackBlock-adaptive.xml
|
|
21
|
+
Array.from(this.children).map((e) => {
|
|
22
|
+
console.debug("getVariables", e.tagName.toLowerCase());
|
|
23
|
+
switch (e.tagName.toLowerCase()) {
|
|
24
|
+
case "qti-base-value": {
|
|
25
|
+
return {
|
|
26
|
+
baseType: e.getAttribute("base-type"),
|
|
27
|
+
value: e.textContent.trim(),
|
|
28
|
+
cardinality: "single"
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
case "qti-variable": {
|
|
32
|
+
const identifier = e.getAttribute("identifier") || "";
|
|
33
|
+
if (identifier === "QTI_CONTEXT") {
|
|
34
|
+
if (!this.qtiContext?.QTI_CONTEXT) {
|
|
35
|
+
console.warn("QTI_CONTEXT not available");
|
|
36
|
+
return {
|
|
37
|
+
identifier: "QTI_CONTEXT",
|
|
38
|
+
baseType: "record",
|
|
39
|
+
value: this.qtiContext.QTI_CONTEXT,
|
|
40
|
+
cardinality: "record",
|
|
41
|
+
type: "context"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
identifier: "QTI_CONTEXT",
|
|
46
|
+
baseType: "record",
|
|
47
|
+
value: this.qtiContext.QTI_CONTEXT,
|
|
48
|
+
cardinality: "record",
|
|
49
|
+
type: "context"
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const variable = this.context.variables.find((v) => v.identifier === identifier) || null;
|
|
53
|
+
return variable;
|
|
54
|
+
}
|
|
55
|
+
case "qti-multiple": {
|
|
56
|
+
const multiple = e;
|
|
57
|
+
const values = multiple.getResult();
|
|
58
|
+
console.debug("values", values);
|
|
59
|
+
if (values?.length > 0) {
|
|
60
|
+
return {
|
|
61
|
+
identifier: "",
|
|
62
|
+
baseType: values[0].baseType,
|
|
63
|
+
value: values.map((v) => v.value),
|
|
64
|
+
cardinality: "multiple",
|
|
65
|
+
type: "response"
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
case "qti-ordered": {
|
|
71
|
+
const multiple = e;
|
|
72
|
+
const values = multiple.getResult();
|
|
73
|
+
if (values?.length > 0) {
|
|
74
|
+
return {
|
|
75
|
+
identifier: "",
|
|
76
|
+
baseType: values[0].baseType,
|
|
77
|
+
value: values.map((v) => v.value),
|
|
78
|
+
cardinality: "ordered",
|
|
79
|
+
type: "response"
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
case "qti-correct": {
|
|
85
|
+
const identifier = e.getAttribute("identifier") || "";
|
|
86
|
+
const responseVariable = this.context.variables.find((v) => v.identifier === identifier) || null;
|
|
87
|
+
return {
|
|
88
|
+
baseType: responseVariable.baseType,
|
|
89
|
+
value: responseVariable.correctResponse,
|
|
90
|
+
cardinality: responseVariable.cardinality
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
default: {
|
|
94
|
+
try {
|
|
95
|
+
const expression = e;
|
|
96
|
+
const value = expression.getResult();
|
|
97
|
+
return {
|
|
98
|
+
baseType: "integer",
|
|
99
|
+
value: value?.toString() || null,
|
|
100
|
+
cardinality: "single"
|
|
101
|
+
};
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.warn("default not sufficient");
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}).filter((v) => v !== null)
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
static {
|
|
112
|
+
// hide the slot with css
|
|
113
|
+
this.styles = css`
|
|
114
|
+
slot {
|
|
115
|
+
display: none;
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
render() {
|
|
120
|
+
return html`<pre>${JSON.stringify(this.result, null, 2)}</pre>
|
|
121
|
+
<slot></slot>`;
|
|
122
|
+
}
|
|
123
|
+
calculate() {
|
|
124
|
+
this.result = this.getResult();
|
|
125
|
+
return this.result;
|
|
126
|
+
}
|
|
127
|
+
getResult() {
|
|
128
|
+
throw new Error("Not implemented");
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
__decorateClass([
|
|
132
|
+
state()
|
|
133
|
+
], QtiExpression.prototype, "result", 2);
|
|
134
|
+
__decorateClass([
|
|
135
|
+
consume({ context: itemContext, subscribe: true }),
|
|
136
|
+
state()
|
|
137
|
+
], QtiExpression.prototype, "context", 2);
|
|
138
|
+
__decorateClass([
|
|
139
|
+
consume({ context: qtiContext, subscribe: true }),
|
|
140
|
+
state()
|
|
141
|
+
], QtiExpression.prototype, "qtiContext", 2);
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
QtiExpression
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=chunk-GAAFN7QF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/exports/qti-expression.ts"],"sourcesContent":["import { consume } from '@lit/context';\nimport { css, html, LitElement } from 'lit';\nimport { state } from 'lit/decorators.js';\n\nimport { itemContext } from './qti-assessment-item.context';\nimport { qtiContext } from './qti.context';\n\nimport type { QtiContext, QtiContextType } from './qti.context';\nimport type { ResponseVariable, VariableDeclaration } from './variables';\nimport type { ItemContext } from './item.context';\n\nexport interface QtiExpressionBase<T> {\n // get assessmentItem(): QtiAssessmentItem;\n\n // getVariables(): VariableDeclaration<number | string | (number | string)[] | null>[];\n calculate(): Readonly<T>;\n}\n\nexport abstract class QtiExpression<T> extends LitElement implements QtiExpressionBase<T> {\n @state()\n protected result: any;\n\n // hide the slot with css\n static styles = css`\n slot {\n display: none;\n }\n `;\n\n override render() {\n return html`<pre>${JSON.stringify(this.result, null, 2)}</pre>\n <slot></slot>`;\n }\n\n public calculate(): Readonly<T> {\n this.result = this.getResult();\n return this.result;\n }\n\n protected getResult(): Readonly<T> {\n throw new Error('Not implemented');\n }\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n protected context?: ItemContext;\n\n @consume({ context: qtiContext, subscribe: true })\n @state()\n protected qtiContext?: QtiContext;\n\n getVariables = (): (ResponseVariable | VariableDeclaration<QtiContextType>)[] =>\n // FIXME: if this itself is multiple, this will never enter the qti-multiple switch\n // See this example here: https://github.com/1EdTech/qti-examples/blob/master/qtiv3-examples/packaging/items/Example05-feedbackBlock-adaptive.xml\n\n Array.from(this.children)\n .map((e: Element) => {\n console.debug('getVariables', e.tagName.toLowerCase());\n switch (e.tagName.toLowerCase()) {\n case 'qti-base-value': {\n return {\n baseType: e.getAttribute('base-type'),\n value: e.textContent.trim(),\n cardinality: 'single'\n } as ResponseVariable;\n }\n case 'qti-variable': {\n const identifier = e.getAttribute('identifier') || '';\n\n // Special handling for QTI_CONTEXT\n if (identifier === 'QTI_CONTEXT') {\n if (!this.qtiContext?.QTI_CONTEXT) {\n console.warn('QTI_CONTEXT not available');\n return {\n identifier: 'QTI_CONTEXT',\n baseType: 'record',\n value: this.qtiContext.QTI_CONTEXT,\n cardinality: 'record',\n type: 'context'\n } as VariableDeclaration<QtiContextType>;\n }\n return {\n identifier: 'QTI_CONTEXT',\n baseType: 'record',\n value: this.qtiContext.QTI_CONTEXT,\n cardinality: 'record',\n type: 'context'\n } as VariableDeclaration<QtiContextType>;\n }\n\n const variable = this.context.variables.find(v => v.identifier === identifier) || null;\n return variable;\n }\n case 'qti-multiple': {\n const multiple = e as QtiExpression<ResponseVariable[]>;\n\n const values = multiple.getResult();\n console.debug('values', values);\n if (values?.length > 0) {\n return {\n identifier: '',\n baseType: values[0].baseType,\n value: values.map(v => v.value),\n cardinality: 'multiple',\n type: 'response'\n } as ResponseVariable;\n }\n return null;\n }\n case 'qti-ordered': {\n const multiple = e as QtiExpression<ResponseVariable[]>;\n const values = multiple.getResult();\n if (values?.length > 0) {\n return {\n identifier: '',\n baseType: values[0].baseType,\n value: values.map(v => v.value),\n cardinality: 'ordered',\n type: 'response'\n } as ResponseVariable;\n }\n return null;\n }\n case 'qti-correct': {\n const identifier = e.getAttribute('identifier') || '';\n const responseVariable: ResponseVariable =\n this.context.variables.find(v => v.identifier === identifier) || null;\n return {\n baseType: responseVariable.baseType,\n value: responseVariable.correctResponse,\n cardinality: responseVariable.cardinality\n } as ResponseVariable;\n }\n default: {\n // added for use of qti-equal-rounded\n try {\n const expression = e as QtiExpression<number>;\n const value = expression.getResult();\n return {\n baseType: 'integer',\n value: value?.toString() || null,\n cardinality: 'single'\n } as ResponseVariable;\n } catch (error) {\n console.warn('default not sufficient');\n }\n return null;\n }\n }\n })\n .filter(v => v !== null);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
__decorateClass
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=chunk-H2JE6IVU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/exports/qti.context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\nexport type QtiContextType = {\n testIdentifier: string;\n candidateIdentifier: string;\n environmentIdentifier: string;\n [key: string]: string | string[]; // Allow for additional context variables\n};\n\nexport interface QtiContext {\n QTI_CONTEXT: QtiContextType;\n}\n\nexport const qtiContext = createContext<Readonly<QtiContext>>(Symbol('qtiContext'));\n"],"mappings":";AAAA,SAAS,qBAAqB;AAavB,IAAM,aAAa,cAAoC,OAAO,YAAY,CAAC;","names":[]}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import {
|
|
2
|
+
itemContext
|
|
3
|
+
} from "./chunk-NJNQOQUU.js";
|
|
4
|
+
import {
|
|
5
|
+
configContext
|
|
6
|
+
} from "./chunk-ERYHQVOT.js";
|
|
7
|
+
import {
|
|
8
|
+
__decorateClass
|
|
9
|
+
} from "./chunk-H2JE6IVU.js";
|
|
10
|
+
|
|
11
|
+
// src/lib/exports/interaction.ts
|
|
12
|
+
import { property, state } from "lit/decorators.js";
|
|
13
|
+
import { LitElement } from "lit";
|
|
14
|
+
import { consume } from "@lit/context";
|
|
15
|
+
var Correctness = /* @__PURE__ */ ((Correctness2) => {
|
|
16
|
+
Correctness2["Correct"] = "correct";
|
|
17
|
+
Correctness2["PartiallyCorrect"] = "partially-correct";
|
|
18
|
+
Correctness2["Incorrect"] = "incorrect";
|
|
19
|
+
return Correctness2;
|
|
20
|
+
})(Correctness || {});
|
|
21
|
+
var Interaction = class extends LitElement {
|
|
22
|
+
constructor() {
|
|
23
|
+
super();
|
|
24
|
+
this.disabled = false;
|
|
25
|
+
this.readonly = false;
|
|
26
|
+
this._internals = this.attachInternals();
|
|
27
|
+
}
|
|
28
|
+
static {
|
|
29
|
+
this.formAssociated = true;
|
|
30
|
+
}
|
|
31
|
+
get internals() {
|
|
32
|
+
return this._internals;
|
|
33
|
+
}
|
|
34
|
+
get isFullCorrectResponse() {
|
|
35
|
+
return this._isFullCorrectResponse;
|
|
36
|
+
}
|
|
37
|
+
set isFullCorrectResponse(val) {
|
|
38
|
+
this._isFullCorrectResponse = val;
|
|
39
|
+
if (val) {
|
|
40
|
+
this.disabled = true;
|
|
41
|
+
this.setAttribute("response-identifier", this.responseIdentifier + "_cr");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
get correctResponse() {
|
|
45
|
+
return this._correctResponse;
|
|
46
|
+
}
|
|
47
|
+
set correctResponse(val) {
|
|
48
|
+
this._correctResponse = val;
|
|
49
|
+
}
|
|
50
|
+
get correctness() {
|
|
51
|
+
const responseVariable = this.responseVariable;
|
|
52
|
+
if (!responseVariable || responseVariable.correctResponse === null) return null;
|
|
53
|
+
return responseVariable.correctResponse === responseVariable.value ? "correct" /* Correct */ : "incorrect" /* Incorrect */;
|
|
54
|
+
}
|
|
55
|
+
get isInline() {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
get responseVariable() {
|
|
59
|
+
const responseVariables = this._context.variables.filter((v) => v.type === "response");
|
|
60
|
+
const responseIdentifier = this.getAttribute("response-identifier");
|
|
61
|
+
return responseVariables.find((v) => v.identifier === responseIdentifier);
|
|
62
|
+
}
|
|
63
|
+
toggleCorrectResponse(show) {
|
|
64
|
+
const correctResponseMode = this?.configContext?.correctResponseMode || "internal";
|
|
65
|
+
if (correctResponseMode === "full") {
|
|
66
|
+
this.toggleFullCorrectResponse(show);
|
|
67
|
+
} else {
|
|
68
|
+
this.toggleInternalCorrectResponse(show);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async toggleFullCorrectResponse(show) {
|
|
72
|
+
const nextSibling = this.nextSibling;
|
|
73
|
+
const nextSiblingIsFullCorrectResponse = nextSibling instanceof HTMLDivElement && nextSibling?.classList.contains("full-correct-response");
|
|
74
|
+
const responseVariable = this.responseVariable;
|
|
75
|
+
if (!responseVariable) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (!show || this.correctness === "correct" /* Correct */) {
|
|
79
|
+
if (!nextSiblingIsFullCorrectResponse) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.parentElement?.removeChild(nextSibling);
|
|
83
|
+
}
|
|
84
|
+
if (nextSiblingIsFullCorrectResponse) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (this.correctness === "correct" /* Correct */) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const clone = this.cloneNode(true);
|
|
91
|
+
const containerDiv = document.createElement("div");
|
|
92
|
+
containerDiv.classList.add("full-correct-response");
|
|
93
|
+
if (this.isInline) {
|
|
94
|
+
containerDiv.classList.add("full-correct-response-inline");
|
|
95
|
+
} else {
|
|
96
|
+
containerDiv.classList.add("full-correct-response-block");
|
|
97
|
+
}
|
|
98
|
+
containerDiv.role = "full-correct-response";
|
|
99
|
+
containerDiv.appendChild(clone);
|
|
100
|
+
clone.isFullCorrectResponse = true;
|
|
101
|
+
this.parentElement?.insertBefore(containerDiv, this.nextSibling);
|
|
102
|
+
await clone.updateComplete;
|
|
103
|
+
clone.response = Array.isArray(responseVariable.correctResponse) ? [...responseVariable.correctResponse] : responseVariable.correctResponse;
|
|
104
|
+
}
|
|
105
|
+
toggleInternalCorrectResponse(show) {
|
|
106
|
+
const responseVariable = this.responseVariable;
|
|
107
|
+
this.correctResponse = show ? responseVariable?.correctResponse : responseVariable?.cardinality === "single" ? "" : [];
|
|
108
|
+
}
|
|
109
|
+
toggleCandidateCorrection(show) {
|
|
110
|
+
const responseVariable = this.responseVariable;
|
|
111
|
+
if (!responseVariable) return;
|
|
112
|
+
this._internals.states.delete("candidate-correct");
|
|
113
|
+
this._internals.states.delete("candidate-partially-correct");
|
|
114
|
+
this._internals.states.delete("candidate-incorrect");
|
|
115
|
+
if (!show) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (this.correctness === "correct" /* Correct */) {
|
|
119
|
+
this._internals.states.add("candidate-correct");
|
|
120
|
+
}
|
|
121
|
+
if (this.correctness === "partially-correct" /* PartiallyCorrect */) {
|
|
122
|
+
this._internals.states.add("candidate-partially-correct");
|
|
123
|
+
}
|
|
124
|
+
if (this.correctness === "incorrect" /* Incorrect */) {
|
|
125
|
+
this._internals.states.add("candidate-incorrect");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
get value() {
|
|
129
|
+
return JSON.stringify(this.response);
|
|
130
|
+
}
|
|
131
|
+
set value(val) {
|
|
132
|
+
this.response = val ? JSON.parse(val) : null;
|
|
133
|
+
}
|
|
134
|
+
reportValidity() {
|
|
135
|
+
return this._internals.reportValidity();
|
|
136
|
+
}
|
|
137
|
+
reset() {
|
|
138
|
+
this.response = null;
|
|
139
|
+
}
|
|
140
|
+
// attributeChangedCallback(name: string, _old: string | null, value: string | null): void {
|
|
141
|
+
// super.attributeChangedCallback(name, _old, value);
|
|
142
|
+
// // changing attributes in lit is not a thing, they are defined in the QTI XML and will never change
|
|
143
|
+
// // except in storybook where we can change the value of the attribute
|
|
144
|
+
// // this can make the internal state out of sync with the attribute
|
|
145
|
+
// // so we reset the value to null to force the internal state to be reset
|
|
146
|
+
// const attributeNamesToExclude = ['style', 'class'];
|
|
147
|
+
// if (!attributeNamesToExclude.includes(name)) {
|
|
148
|
+
// this.reset();
|
|
149
|
+
// }
|
|
150
|
+
// }
|
|
151
|
+
connectedCallback() {
|
|
152
|
+
super.connectedCallback();
|
|
153
|
+
if (this.isFullCorrectResponse) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
this.dispatchEvent(
|
|
157
|
+
new CustomEvent("qti-register-interaction", {
|
|
158
|
+
bubbles: true,
|
|
159
|
+
composed: true,
|
|
160
|
+
cancelable: false,
|
|
161
|
+
detail: {
|
|
162
|
+
interactionElement: this,
|
|
163
|
+
responseIdentifier: this.responseIdentifier
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
saveResponse(value) {
|
|
169
|
+
this.dispatchEvent(
|
|
170
|
+
new CustomEvent("qti-interaction-response", {
|
|
171
|
+
bubbles: true,
|
|
172
|
+
composed: true,
|
|
173
|
+
cancelable: false,
|
|
174
|
+
detail: {
|
|
175
|
+
responseIdentifier: this.responseIdentifier,
|
|
176
|
+
response: Array.isArray(value) ? [...value] : value
|
|
177
|
+
}
|
|
178
|
+
})
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
__decorateClass([
|
|
183
|
+
consume({ context: itemContext, subscribe: true })
|
|
184
|
+
], Interaction.prototype, "_context", 2);
|
|
185
|
+
__decorateClass([
|
|
186
|
+
consume({ context: configContext, subscribe: true })
|
|
187
|
+
], Interaction.prototype, "configContext", 2);
|
|
188
|
+
__decorateClass([
|
|
189
|
+
property({ type: String, attribute: "response-identifier" })
|
|
190
|
+
], Interaction.prototype, "responseIdentifier", 2);
|
|
191
|
+
__decorateClass([
|
|
192
|
+
property({ reflect: true, type: Boolean })
|
|
193
|
+
], Interaction.prototype, "disabled", 2);
|
|
194
|
+
__decorateClass([
|
|
195
|
+
property({ reflect: true, type: Boolean })
|
|
196
|
+
], Interaction.prototype, "readonly", 2);
|
|
197
|
+
__decorateClass([
|
|
198
|
+
state()
|
|
199
|
+
], Interaction.prototype, "_isFullCorrectResponse", 2);
|
|
200
|
+
__decorateClass([
|
|
201
|
+
state()
|
|
202
|
+
], Interaction.prototype, "_correctResponse", 2);
|
|
203
|
+
|
|
204
|
+
export {
|
|
205
|
+
Correctness,
|
|
206
|
+
Interaction
|
|
207
|
+
};
|
|
208
|
+
//# sourceMappingURL=chunk-HFAUM56X.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/exports/interaction.ts"],"sourcesContent":["import { property, state } from 'lit/decorators.js';\nimport { LitElement } from 'lit';\nimport { consume } from '@lit/context';\n\nimport { configContext } from './config.context.ts';\nimport { itemContext } from './qti-assessment-item.context.ts';\n\nimport type { ConfigContext } from './config.context.ts';\nimport type { ResponseVariable } from './variables';\nimport type { IInteraction } from './interaction.interface';\nimport type { ItemContext } from './item.context.ts';\n\nexport enum Correctness {\n Correct = 'correct',\n PartiallyCorrect = 'partially-correct',\n Incorrect = 'incorrect'\n}\n\nexport abstract class Interaction extends LitElement implements IInteraction {\n @consume({ context: itemContext, subscribe: true })\n private _context: ItemContext;\n\n @consume({ context: configContext, subscribe: true })\n protected configContext: ConfigContext;\n\n static formAssociated = true;\n protected _internals: ElementInternals;\n\n get internals(): ElementInternals {\n return this._internals;\n }\n\n @property({ type: String, attribute: 'response-identifier' }) responseIdentifier;\n\n @property({ reflect: true, type: Boolean }) disabled = false;\n\n @property({ reflect: true, type: Boolean }) readonly = false;\n\n @state()\n protected _isFullCorrectResponse: boolean;\n\n get isFullCorrectResponse(): Readonly<boolean> {\n return this._isFullCorrectResponse;\n }\n\n set isFullCorrectResponse(val: Readonly<boolean>) {\n this._isFullCorrectResponse = val as boolean;\n if (val) {\n this.disabled = true;\n this.setAttribute('response-identifier', this.responseIdentifier + '_cr');\n }\n }\n\n /* PK: Correct response */\n @state()\n protected _correctResponse: string | string[];\n\n get correctResponse(): Readonly<string | string[]> {\n return this._correctResponse;\n }\n\n set correctResponse(val: Readonly<string | string[]>) {\n this._correctResponse = val as string | string[];\n }\n\n get correctness(): Readonly<Correctness | null> {\n const responseVariable = this.responseVariable;\n if (!responseVariable || responseVariable.correctResponse === null) return null;\n\n return responseVariable.correctResponse === responseVariable.value ? Correctness.Correct : Correctness.Incorrect;\n }\n\n get isInline(): boolean {\n return false;\n }\n\n get responseVariable(): ResponseVariable | undefined {\n // Get all response variables\n const responseVariables = this._context.variables.filter(v => v.type === 'response') as ResponseVariable[];\n\n // Get the response identifier for this interaction\n const responseIdentifier = this.getAttribute('response-identifier');\n\n // Return the matching response variable for this interaction\n return responseVariables.find(v => v.identifier === responseIdentifier);\n }\n\n public toggleCorrectResponse(show: boolean): void {\n const correctResponseMode = this?.configContext?.correctResponseMode || 'internal';\n\n if (correctResponseMode === 'full') {\n this.toggleFullCorrectResponse(show);\n } else {\n this.toggleInternalCorrectResponse(show);\n }\n }\n\n protected async toggleFullCorrectResponse(show: boolean): Promise<void> {\n const nextSibling = this.nextSibling;\n const nextSiblingIsFullCorrectResponse =\n nextSibling instanceof HTMLDivElement && nextSibling?.classList.contains('full-correct-response');\n const responseVariable = this.responseVariable;\n\n if (!responseVariable) {\n return;\n }\n\n if (!show || this.correctness === Correctness.Correct) {\n // Don't show with the correct answer responded\n if (!nextSiblingIsFullCorrectResponse) {\n return;\n }\n // Remove cloned interaction\n this.parentElement?.removeChild(nextSibling);\n }\n\n if (nextSiblingIsFullCorrectResponse) {\n return; // Already exists\n }\n\n if (this.correctness === Correctness.Correct) {\n return;\n }\n\n // Add a clone of interaction with the correct response\n const clone = this.cloneNode(true) as Interaction;\n\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('full-correct-response');\n if (this.isInline) {\n containerDiv.classList.add('full-correct-response-inline');\n } else {\n containerDiv.classList.add('full-correct-response-block');\n }\n containerDiv.role = 'full-correct-response';\n containerDiv.appendChild(clone);\n\n clone.isFullCorrectResponse = true;\n\n this.parentElement?.insertBefore(containerDiv, this.nextSibling);\n await clone.updateComplete;\n\n clone.response = Array.isArray(responseVariable.correctResponse)\n ? ([...responseVariable.correctResponse] as string[])\n : (responseVariable.correctResponse as string);\n }\n\n protected toggleInternalCorrectResponse(show: boolean): void {\n const responseVariable = this.responseVariable;\n\n this.correctResponse = show\n ? responseVariable?.correctResponse\n : responseVariable?.cardinality === 'single'\n ? ''\n : [];\n }\n\n public toggleCandidateCorrection(show: boolean): void {\n const responseVariable = this.responseVariable;\n if (!responseVariable) return;\n\n this._internals.states.delete('candidate-correct');\n this._internals.states.delete('candidate-partially-correct');\n this._internals.states.delete('candidate-incorrect');\n\n if (!show) {\n return;\n }\n\n if (this.correctness === Correctness.Correct) {\n this._internals.states.add('candidate-correct');\n }\n if (this.correctness === Correctness.PartiallyCorrect) {\n this._internals.states.add('candidate-partially-correct');\n }\n if (this.correctness === Correctness.Incorrect) {\n this._internals.states.add('candidate-incorrect');\n }\n }\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n }\n\n abstract validate(): boolean;\n\n get value(): string | null {\n return JSON.stringify(this.response);\n }\n\n set value(val: string | null) {\n this.response = val ? JSON.parse(val) : null;\n }\n\n abstract get response(): string | string[] | null;\n abstract set response(val: string | string[] | null);\n\n public reportValidity(): boolean {\n return this._internals.reportValidity();\n }\n\n public reset(): void {\n this.response = null;\n }\n\n // attributeChangedCallback(name: string, _old: string | null, value: string | null): void {\n // super.attributeChangedCallback(name, _old, value);\n // // changing attributes in lit is not a thing, they are defined in the QTI XML and will never change\n // // except in storybook where we can change the value of the attribute\n // // this can make the internal state out of sync with the attribute\n // // so we reset the value to null to force the internal state to be reset\n // const attributeNamesToExclude = ['style', 'class'];\n // if (!attributeNamesToExclude.includes(name)) {\n // this.reset();\n // }\n // }\n\n public override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.isFullCorrectResponse) {\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('qti-register-interaction', {\n bubbles: true,\n composed: true,\n cancelable: false,\n detail: {\n interactionElement: this,\n responseIdentifier: this.responseIdentifier\n }\n })\n );\n }\n\n public saveResponse(value: string | string[]): void {\n this.dispatchEvent(\n new CustomEvent('qti-interaction-response', {\n bubbles: true,\n composed: true,\n cancelable: false,\n detail: {\n responseIdentifier: this.responseIdentifier,\n response: Array.isArray(value) ? [...value] : value\n }\n })\n );\n }\n}\n"],"mappings":"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","names":["Correctness"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// src/lib/exports/item.context.ts
|
|
2
|
+
var itemContextVariables = [
|
|
3
|
+
{
|
|
4
|
+
identifier: "completionStatus",
|
|
5
|
+
cardinality: "single",
|
|
6
|
+
baseType: "string",
|
|
7
|
+
value: "unknown",
|
|
8
|
+
type: "outcome"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
identifier: "numAttempts",
|
|
12
|
+
cardinality: "single",
|
|
13
|
+
baseType: "integer",
|
|
14
|
+
value: "0",
|
|
15
|
+
type: "response"
|
|
16
|
+
}
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
itemContextVariables
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=chunk-JQ6HWGRY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/exports/item.context.ts"],"sourcesContent":["import type { VariableDeclaration } from './variables';\n\nexport interface ItemContext {\n identifier?: string;\n href?: string;\n variables?: ReadonlyArray<VariableDeclaration<string | string[] | null>>;\n}\n\nexport const itemContextVariables = [\n {\n identifier: 'completionStatus',\n cardinality: 'single',\n baseType: 'string',\n value: 'unknown',\n type: 'outcome'\n },\n {\n identifier: 'numAttempts',\n cardinality: 'single',\n baseType: 'integer',\n value: '0',\n type: 'response'\n }\n] as VariableDeclaration<string | string[]>[];\n"],"mappings":";AAQO,IAAM,uBAAuB;AAAA,EAClC;AAAA,IACE,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;","names":[]}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
itemContext
|
|
3
|
+
} from "./chunk-NJNQOQUU.js";
|
|
1
4
|
import {
|
|
2
5
|
__decorateClass
|
|
3
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-H2JE6IVU.js";
|
|
4
7
|
|
|
5
8
|
// src/lib/qti-components/qti-feedback/qti-modal-feedback/qti-modal-feedback.ts
|
|
6
9
|
import { css, html } from "lit";
|
|
@@ -34,10 +37,6 @@ function removeDoubleSlashes(str) {
|
|
|
34
37
|
return singleForwardSlashes;
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
// src/lib/exports/qti-assessment-item.context.ts
|
|
38
|
-
import { createContext } from "@lit/context";
|
|
39
|
-
var itemContext = createContext(Symbol("item"));
|
|
40
|
-
|
|
41
40
|
// src/lib/qti-components/qti-feedback/qti-feedback.ts
|
|
42
41
|
var QtiFeedback = class extends LitElement {
|
|
43
42
|
connectedCallback() {
|
|
@@ -167,23 +166,10 @@ QtiModalFeedback = __decorateClass([
|
|
|
167
166
|
customElement("qti-modal-feedback")
|
|
168
167
|
], QtiModalFeedback);
|
|
169
168
|
|
|
170
|
-
// src/lib/exports/test.context.ts
|
|
171
|
-
import { createContext as createContext2 } from "@lit/context";
|
|
172
|
-
var INITIAL_TEST_CONTEXT = { items: [], testOutcomeVariables: [] };
|
|
173
|
-
var testContext = createContext2(Symbol("testContext"));
|
|
174
|
-
|
|
175
|
-
// src/lib/exports/qti.context.ts
|
|
176
|
-
import { createContext as createContext3 } from "@lit/context";
|
|
177
|
-
var qtiContext = createContext3(Symbol("qtiContext"));
|
|
178
|
-
|
|
179
169
|
export {
|
|
180
|
-
itemContext,
|
|
181
170
|
convertNumberToUniversalFormat,
|
|
182
171
|
removeDoubleSlashes,
|
|
183
172
|
QtiFeedback,
|
|
184
|
-
QtiModalFeedback
|
|
185
|
-
qtiContext,
|
|
186
|
-
INITIAL_TEST_CONTEXT,
|
|
187
|
-
testContext
|
|
173
|
+
QtiModalFeedback
|
|
188
174
|
};
|
|
189
|
-
//# sourceMappingURL=chunk-
|
|
175
|
+
//# sourceMappingURL=chunk-K47QFOQX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/qti-components/qti-feedback/qti-modal-feedback/qti-modal-feedback.ts","../../src/lib/qti-components/qti-feedback/qti-feedback.ts","../../src/lib/qti-components/internal/utils.ts"],"sourcesContent":["import { css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { QtiFeedback } from '../qti-feedback';\n\n@customElement('qti-modal-feedback')\nexport class QtiModalFeedback extends QtiFeedback {\n static override styles = css`\n .qti-dialog {\n background: var(--qti-bg);\n border: var(--qti-border-thickness) var(--qti-border-style) var(--qti-border-color);\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1000;\n width: auto;\n max-width: 90%;\n }\n\n .button {\n border-radius: var(--qti-border-radius);\n padding: var(--qti-padding-vertical) var(--qti-padding-horizontal);\n background-color: var(--qti-bg-active);\n border: var(--qti-border-active);\n cursor: pointer;\n position: relative;\n display: inline-block;\n }\n\n .button:hover {\n background-color: var(--qti-hover-bg);\n }\n\n .button:disabled {\n background-color: var(--qti-disabled-bg);\n color: var(--qti-disabled-color);\n cursor: not-allowed;\n }\n\n .button:focus {\n outline: var(--qti-focus-border-width) solid var(--qti-focus-color);\n }\n `;\n\n override render() {\n return html`\n <dialog class=\"qti-dialog\" part=\"feedback\" ?open=\"${this.showStatus === 'on'}\">\n <slot></slot>\n <div style=\"margin-top: var(--qti-gap-size); text-align: center;\">\n <button class=\"button close-button\" @click=\"${this.closeFeedback}\">Close</button>\n </div>\n </dialog>\n `;\n }\n\n openFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && !dialog.open) {\n dialog.showModal();\n }\n }\n\n closeFeedback() {\n const dialog = this.shadowRoot?.querySelector('dialog') as HTMLDialogElement | null;\n if (dialog && dialog.open) {\n dialog.close();\n this.showStatus = 'off';\n }\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n if (this.showStatus === 'on') {\n this.openFeedback();\n }\n }\n\n protected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n if (changedProperties.has('showStatus')) {\n if (this.showStatus === 'on') {\n this.openFeedback();\n } else {\n this.closeFeedback();\n }\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-modal-feedback': QtiModalFeedback;\n }\n}\n","import { consume } from '@lit/context';\nimport { LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { IsNullOrUndefined } from '../internal/utils';\nimport { itemContext } from '../../exports/qti-assessment-item.context';\n\nimport type { ItemContext } from '../../exports/item.context';\n\nexport abstract class QtiFeedback extends LitElement {\n @property({ type: String, attribute: 'show-hide' })\n protected showHide: string;\n\n @property({ type: String, attribute: 'outcome-identifier' })\n public outcomeIdentifier: string;\n\n @property({ type: String })\n protected identifier: string;\n\n @property({ type: String, attribute: false })\n public showStatus: string;\n\n @consume({ context: itemContext, subscribe: true })\n @state()\n private _context?: ItemContext;\n\n public override connectedCallback() {\n super.connectedCallback();\n this.dispatchEvent(\n new CustomEvent<QtiFeedback>('qti-register-feedback', {\n bubbles: true,\n composed: true,\n detail: this\n })\n );\n }\n\n public checkShowFeedback(outcomeIdentifier: string) {\n const outcomeVariable = this._context.variables.find(v => v.identifier === outcomeIdentifier) || null;\n if (this.outcomeIdentifier !== outcomeIdentifier || !outcomeVariable) return;\n let isFound = false;\n if (Array.isArray(outcomeVariable.value)) {\n isFound = outcomeVariable.value.includes(this.identifier);\n } else {\n isFound =\n (!IsNullOrUndefined(this.identifier) &&\n !IsNullOrUndefined(outcomeVariable?.value) &&\n this.identifier === outcomeVariable.value) ||\n false;\n }\n\n this.showFeedback(isFound);\n }\n\n private showFeedback(value: boolean) {\n this.showStatus = (value && this.showHide === 'show') || (!value && this.showHide === 'hide') ? 'on' : 'off';\n }\n}\n","export const decimalSeparator = () => {\n return new Intl.NumberFormat().format(0.1).replace(/\\d/g, '');\n};\n\nexport const convertNumberToUniversalFormat = (number: number | string) => {\n // check if type is string\n if (typeof number === 'string') {\n return number;\n }\n const dSep = decimalSeparator();\n if (dSep === '.') {\n return number.toLocaleString();\n } else {\n return number.toString().replace('.', '').replace(dSep, '.');\n }\n};\n\nexport function IsNullOrUndefined(value: unknown) {\n return value === null || value === undefined;\n}\n\nexport function removeDoubleSlashes(str: string) {\n const singleForwardSlashes = str\n .replace(/([^:]\\/)\\/+/g, '$1')\n .replace(/\\/\\//g, '/')\n .replace('http:/', 'http://')\n .replace('https:/', 'https://');\n return singleForwardSlashes;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/exports/qti-assessment-item.context.ts"],"sourcesContent":["import { createContext } from '@lit/context';\n\nimport type { ItemContext } from './item.context';\n\nexport const itemContext = createContext<ItemContext>(Symbol('item'));\n"],"mappings":";AAAA,SAAS,qBAAqB;AAIvB,IAAM,cAAc,cAA2B,OAAO,MAAM,CAAC;","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
QtiExpression
|
|
3
|
+
} from "./chunk-GAAFN7QF.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/exports/qti-condition-expression.ts
|
|
6
|
+
var QtiConditionExpression = class extends QtiExpression {
|
|
7
|
+
calculate() {
|
|
8
|
+
this.result = this.getResult();
|
|
9
|
+
return this.result;
|
|
10
|
+
}
|
|
11
|
+
getResult() {
|
|
12
|
+
throw new Error("Not implemented");
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
QtiConditionExpression
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=chunk-SV4K25ZI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/exports/qti-condition-expression.ts"],"sourcesContent":["import { QtiExpression } from './qti-expression';\n\nexport abstract class QtiConditionExpression extends QtiExpression<boolean> {\n public calculate(): Readonly<boolean> {\n this.result = this.getResult();\n return this.result;\n }\n\n public getResult(): Readonly<boolean> {\n throw new Error('Not implemented');\n }\n}\n"],"mappings":";;;;;AAEO,IAAe,yBAAf,cAA8C,cAAuB;AAAA,EACnE,YAA+B;AACpC,SAAK,SAAS,KAAK,UAAU;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,YAA+B;AACpC,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;","names":[]}
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
-
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
-
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
-
if (decorator = decorators[i])
|
|
7
|
-
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
-
if (kind && result) __defProp(target, key, result);
|
|
9
|
-
return result;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
1
|
// src/lib/qti-transformers/qti-transformers.ts
|
|
13
2
|
var xml = String.raw;
|
|
14
3
|
var xmlToHTML = xml`<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
|
@@ -506,9 +495,8 @@ var qtiTransformTest = () => {
|
|
|
506
495
|
};
|
|
507
496
|
|
|
508
497
|
export {
|
|
509
|
-
__decorateClass,
|
|
510
498
|
qtiTransformItem,
|
|
511
499
|
qtiTransformManifest,
|
|
512
500
|
qtiTransformTest
|
|
513
501
|
};
|
|
514
|
-
//# sourceMappingURL=chunk-
|
|
502
|
+
//# sourceMappingURL=chunk-WFUXZ4UT.js.map
|