@citolab/qti-components 7.3.20 → 7.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/cdn/chunks/chunk-2BSPQRNR.js +6 -0
  2. package/cdn/chunks/chunk-2IJBTWWT.js +2 -0
  3. package/cdn/chunks/chunk-3BPUHYAN.js +1 -0
  4. package/cdn/chunks/chunk-3CVBBZDT.js +17 -0
  5. package/cdn/chunks/chunk-3IBGLVHA.js +1 -0
  6. package/cdn/chunks/chunk-4AGE7DVK.js +48 -0
  7. package/cdn/chunks/chunk-4DXCBZFR.js +3698 -0
  8. package/cdn/chunks/chunk-4FBS7ODL.js +6 -0
  9. package/cdn/chunks/chunk-4IWCVQQJ.js +8 -0
  10. package/cdn/chunks/chunk-522JFYKC.js +6 -0
  11. package/cdn/chunks/chunk-5L5JXKEA.js +1 -0
  12. package/cdn/chunks/chunk-5TEGKCEI.js +48 -0
  13. package/cdn/chunks/chunk-5WLHU3FH.js +8 -0
  14. package/cdn/chunks/chunk-6ELXCFB2.js +1 -0
  15. package/cdn/chunks/chunk-6Q3S6QYF.js +1471 -0
  16. package/cdn/chunks/chunk-6SGFGN34.js +8 -0
  17. package/cdn/chunks/chunk-6XVY32RS.js +1 -0
  18. package/cdn/chunks/chunk-6ZE2IMSJ.js +1471 -0
  19. package/cdn/chunks/chunk-73RDXCTO.js +1 -0
  20. package/cdn/chunks/chunk-73YTM4JU.js +8 -0
  21. package/cdn/chunks/chunk-A57EJSRU.js +1 -0
  22. package/cdn/chunks/chunk-AAZIKH5Z.js +3650 -0
  23. package/cdn/chunks/chunk-AMJIIPBQ.js +48 -0
  24. package/cdn/chunks/chunk-BGFVQO5N.js +8 -0
  25. package/cdn/chunks/chunk-BRXZ5HLX.js +8 -0
  26. package/cdn/chunks/chunk-BSBPPIVO.js +5 -0
  27. package/cdn/chunks/chunk-BURSTFDF.js +2 -0
  28. package/cdn/chunks/chunk-C7AO3IVZ.js +48 -0
  29. package/cdn/chunks/chunk-CTNAGYH7.js +1 -0
  30. package/cdn/chunks/chunk-DESMFZJW.js +5 -0
  31. package/cdn/chunks/chunk-DNBBQ7LY.js +1 -0
  32. package/cdn/chunks/chunk-DP5FVJRS.js +21 -0
  33. package/cdn/chunks/chunk-E46BCOOW.js +1 -0
  34. package/cdn/chunks/chunk-EGFC4XQG.js +5 -0
  35. package/cdn/chunks/chunk-EQ4LUVQK.js +8 -0
  36. package/cdn/chunks/chunk-EXVHRHST.js +8 -0
  37. package/cdn/chunks/chunk-FC7HXYUV.js +8 -0
  38. package/cdn/chunks/chunk-FEJUVLN4.js +6 -0
  39. package/cdn/chunks/chunk-FLQBFTRW.js +37 -0
  40. package/cdn/chunks/chunk-FUGKKQ6E.js +1 -0
  41. package/cdn/chunks/chunk-FWFPMNDO.js +5 -0
  42. package/cdn/chunks/chunk-FYXNIYGH.js +1 -0
  43. package/cdn/chunks/chunk-GFO3YUEH.js +1 -0
  44. package/cdn/chunks/chunk-HAE5ZHID.js +1 -0
  45. package/cdn/chunks/chunk-HCXHHI6V.js +18 -0
  46. package/cdn/chunks/chunk-HDMF4QZO.js +48 -0
  47. package/cdn/chunks/chunk-HKUIQBCM.js +1 -0
  48. package/cdn/chunks/chunk-HKWYQB5Z.js +37 -0
  49. package/cdn/chunks/chunk-HO6JOQX4.js +25 -0
  50. package/cdn/chunks/chunk-HTH5YCZO.js +8 -0
  51. package/cdn/chunks/chunk-IHVTWACH.js +8 -0
  52. package/cdn/chunks/chunk-ILEDSBLL.js +8 -0
  53. package/cdn/chunks/chunk-IYZLVTNL.js +5 -0
  54. package/cdn/chunks/chunk-J5P2GBPV.js +1 -0
  55. package/cdn/chunks/chunk-KASON6Y7.js +17 -0
  56. package/cdn/chunks/chunk-KKQK6WIG.js +1 -0
  57. package/cdn/chunks/chunk-LBMZYOKF.js +8 -0
  58. package/cdn/chunks/chunk-LC7KE332.js +1 -0
  59. package/cdn/chunks/chunk-LIUOA3YV.js +1 -0
  60. package/cdn/chunks/chunk-LO4MJ72X.js +8 -0
  61. package/cdn/chunks/chunk-LRGALTZX.js +1 -0
  62. package/cdn/chunks/chunk-LRIOWAOJ.js +8 -0
  63. package/cdn/chunks/chunk-LVKOQVTZ.js +17 -0
  64. package/cdn/chunks/chunk-M4VO4BD3.js +1471 -0
  65. package/cdn/chunks/chunk-M53CKFQE.js +5 -0
  66. package/cdn/chunks/chunk-MD33BNWM.js +1 -0
  67. package/cdn/chunks/chunk-MLEUGPRW.js +8 -0
  68. package/cdn/chunks/chunk-MM76ZODZ.js +8 -0
  69. package/cdn/chunks/chunk-MQVMYZ75.js +1 -0
  70. package/cdn/chunks/chunk-MRQ46JRY.js +8 -0
  71. package/cdn/chunks/chunk-MSOBQUON.js +10 -0
  72. package/cdn/chunks/chunk-NDMZ2RAB.js +48 -0
  73. package/cdn/chunks/chunk-NJP4VZB3.js +8 -0
  74. package/cdn/chunks/chunk-NO3TZB6T.js +5 -0
  75. package/cdn/chunks/chunk-NRY6IJSD.js +5 -0
  76. package/cdn/chunks/chunk-O4RAJ3LM.js +25 -0
  77. package/cdn/chunks/chunk-OEZI5WCY.js +18 -0
  78. package/cdn/chunks/chunk-OR67S36X.js +5 -0
  79. package/cdn/chunks/chunk-OSLUHYFD.js +8 -0
  80. package/cdn/chunks/chunk-P6L4B5GC.js +1 -0
  81. package/cdn/chunks/chunk-PF74FX32.js +1 -0
  82. package/cdn/chunks/chunk-PFCJVHJ3.js +10 -0
  83. package/cdn/chunks/chunk-PP62N3C4.js +8 -0
  84. package/cdn/chunks/chunk-PQLJWD6V.js +21 -0
  85. package/cdn/chunks/chunk-PTQFS3S5.js +2 -0
  86. package/cdn/chunks/chunk-PU7OABT3.js +1 -0
  87. package/cdn/chunks/chunk-Q2CKZUYX.js +1 -0
  88. package/cdn/chunks/chunk-QEFO63QX.js +8 -0
  89. package/cdn/chunks/chunk-QIZBL4QP.js +1 -0
  90. package/cdn/chunks/chunk-RGNFAPWY.js +2 -0
  91. package/cdn/chunks/chunk-RHEBGA4B.js +1 -0
  92. package/cdn/chunks/chunk-S5QDLZ6J.js +1 -0
  93. package/cdn/chunks/chunk-SBWSYKE5.js +5 -0
  94. package/cdn/chunks/chunk-SXRIA7VB.js +8 -0
  95. package/cdn/chunks/chunk-SYTQX5DA.js +1 -0
  96. package/cdn/chunks/chunk-TLK5RNXE.js +1 -0
  97. package/cdn/chunks/chunk-TR7WXOQR.js +1 -0
  98. package/cdn/chunks/chunk-UMDZKG6K.js +1 -0
  99. package/cdn/chunks/chunk-UNK5GKOK.js +5 -0
  100. package/cdn/chunks/chunk-V2AJKKRF.js +1470 -0
  101. package/cdn/chunks/chunk-VEG7LKS3.js +48 -0
  102. package/cdn/chunks/chunk-VQ2JX2OE.js +5 -0
  103. package/cdn/chunks/chunk-W73FT5JE.js +48 -0
  104. package/cdn/chunks/chunk-W7O6UFTQ.js +5 -0
  105. package/cdn/chunks/chunk-WCCTDLQ4.js +8 -0
  106. package/cdn/chunks/chunk-WV5B4HNF.js +1471 -0
  107. package/cdn/chunks/chunk-WWMMW7RJ.js +1 -0
  108. package/cdn/chunks/chunk-X3JAXGAZ.js +8 -0
  109. package/cdn/chunks/chunk-XJWUPDZ4.js +10 -0
  110. package/cdn/chunks/chunk-XMKJLLUL.js +1 -0
  111. package/cdn/chunks/chunk-XMS6AFBV.js +5 -0
  112. package/cdn/chunks/chunk-XSVPZFGN.js +1 -0
  113. package/cdn/chunks/chunk-Y2P4IF3E.js +1 -0
  114. package/cdn/chunks/chunk-YCBNF5QU.js +17 -0
  115. package/cdn/chunks/chunk-YEGYR7SL.js +5 -0
  116. package/cdn/chunks/chunk-YHLQ2JQ2.js +1 -0
  117. package/cdn/chunks/chunk-ZO5G6CHW.js +1470 -0
  118. package/cdn/chunks/chunk-ZPCQH3EY.js +10 -0
  119. package/cdn/chunks/chunk-ZUQ72RIQ.js +8 -0
  120. package/cdn/chunks/chunk-ZZNCHSYH.js +5 -0
  121. package/cdn/exports/computed-item.context.js +1 -1
  122. package/cdn/exports/computed.context.js +1 -1
  123. package/cdn/exports/config.context.js +1 -1
  124. package/cdn/exports/interaction.js +1 -1
  125. package/cdn/exports/qti-assessment-item.context.js +1 -1
  126. package/cdn/exports/qti-condition-expression.js +1 -1
  127. package/cdn/exports/qti-expression.js +1 -1
  128. package/cdn/exports/qti.context.js +1 -1
  129. package/cdn/exports/session.context.js +1 -1
  130. package/cdn/exports/test.context.js +1 -1
  131. package/cdn/index.global.js +1 -1
  132. package/cdn/index.js +1 -1
  133. package/cdn/qti-components/index.js +1 -1
  134. package/cdn/qti-item/components/item-container.js +1 -1
  135. package/cdn/qti-item/components/item-correct-response-mode.js +1 -1
  136. package/cdn/qti-item/components/item-show-candidate-correction.js +1 -1
  137. package/cdn/qti-item/components/item-show-correct-response.js +1 -1
  138. package/cdn/qti-item/components/print-item-variables.js +1 -1
  139. package/cdn/qti-item/components/styles.js +1 -1
  140. package/cdn/qti-item/core/index.js +1 -1
  141. package/cdn/qti-test/components/index.js +1 -1
  142. package/cdn/qti-test/components/styles.js +1 -1
  143. package/cdn/qti-test/components/test-check-item.js +1 -1
  144. package/cdn/qti-test/components/test-container.js +1 -1
  145. package/cdn/qti-test/components/test-end-attempt.js +1 -1
  146. package/cdn/qti-test/components/test-item-link.js +1 -1
  147. package/cdn/qti-test/components/test-navigation.js +1 -1
  148. package/cdn/qti-test/components/test-next.js +1 -1
  149. package/cdn/qti-test/components/test-paging-buttons-stamp.js +1 -1
  150. package/cdn/qti-test/components/test-prev.js +1 -1
  151. package/cdn/qti-test/components/test-print-context.js +1 -1
  152. package/cdn/qti-test/components/test-print-item-variables.js +1 -1
  153. package/cdn/qti-test/components/test-scoring-buttons.js +1 -1
  154. package/cdn/qti-test/components/test-scoring-feedback.js +1 -1
  155. package/cdn/qti-test/components/test-section-buttons-stamp.js +1 -1
  156. package/cdn/qti-test/components/test-section-link.js +1 -1
  157. package/cdn/qti-test/components/test-show-correct-response.js +1 -1
  158. package/cdn/qti-test/components/test-stamp.js +1 -1
  159. package/cdn/qti-test/components/test-view-toggle.js +1 -1
  160. package/cdn/qti-test/components/test-view.js +1 -1
  161. package/cdn/qti-test/core/index.js +1 -1
  162. package/dist/chunks/chunk-3JJM4BKK.js +367 -0
  163. package/dist/chunks/chunk-3JJM4BKK.js.map +1 -0
  164. package/dist/chunks/chunk-3LX4O663.js +3688 -0
  165. package/dist/chunks/chunk-3LX4O663.js.map +1 -0
  166. package/dist/chunks/chunk-4PG2PZHY.js +8924 -0
  167. package/dist/chunks/chunk-4PG2PZHY.js.map +1 -0
  168. package/dist/chunks/chunk-55C6NAK5.js +142 -0
  169. package/dist/chunks/chunk-55C6NAK5.js.map +1 -0
  170. package/dist/chunks/chunk-5P64MALP.js +3640 -0
  171. package/dist/chunks/chunk-5P64MALP.js.map +1 -0
  172. package/dist/chunks/chunk-65YQSKWV.js +94 -0
  173. package/dist/chunks/chunk-65YQSKWV.js.map +1 -0
  174. package/dist/chunks/chunk-ARBFS6D6.js +8924 -0
  175. package/dist/chunks/chunk-ARBFS6D6.js.map +1 -0
  176. package/dist/chunks/chunk-EB3ZESWL.js +367 -0
  177. package/dist/chunks/chunk-EB3ZESWL.js.map +1 -0
  178. package/dist/chunks/chunk-ERYHQVOT.js +8 -0
  179. package/dist/chunks/chunk-ERYHQVOT.js.map +1 -0
  180. package/dist/chunks/chunk-FL72PF4D.js +19 -0
  181. package/dist/chunks/chunk-FL72PF4D.js.map +1 -0
  182. package/dist/chunks/chunk-HFAUM56X.js +208 -0
  183. package/dist/chunks/chunk-HFAUM56X.js.map +1 -0
  184. package/dist/chunks/chunk-JOASLKRQ.js +914 -0
  185. package/dist/chunks/chunk-JOASLKRQ.js.map +1 -0
  186. package/dist/chunks/chunk-K4QJBUIX.js +367 -0
  187. package/dist/chunks/chunk-K4QJBUIX.js.map +1 -0
  188. package/dist/chunks/chunk-KYN4AAHS.js +8839 -0
  189. package/dist/chunks/chunk-KYN4AAHS.js.map +1 -0
  190. package/dist/chunks/chunk-MLRMRXGZ.js +367 -0
  191. package/dist/chunks/chunk-MLRMRXGZ.js.map +1 -0
  192. package/dist/chunks/chunk-MOIHNOX3.js +94 -0
  193. package/dist/chunks/chunk-MOIHNOX3.js.map +1 -0
  194. package/dist/chunks/chunk-P2PRB5IZ.js +94 -0
  195. package/dist/chunks/chunk-P2PRB5IZ.js.map +1 -0
  196. package/dist/chunks/chunk-PF5X3SZR.js +94 -0
  197. package/dist/chunks/chunk-PF5X3SZR.js.map +1 -0
  198. package/dist/chunks/chunk-QCB6P7DH.js +146 -0
  199. package/dist/chunks/chunk-QCB6P7DH.js.map +1 -0
  200. package/dist/chunks/chunk-QU7KR7VX.js +367 -0
  201. package/dist/chunks/chunk-QU7KR7VX.js.map +1 -0
  202. package/dist/chunks/chunk-RTSIFU3A.js +8924 -0
  203. package/dist/chunks/chunk-RTSIFU3A.js.map +1 -0
  204. package/dist/chunks/chunk-SZ3DDAJ7.js +142 -0
  205. package/dist/chunks/chunk-SZ3DDAJ7.js.map +1 -0
  206. package/dist/chunks/chunk-SZTQ6IWR.js +8835 -0
  207. package/dist/chunks/chunk-SZTQ6IWR.js.map +1 -0
  208. package/dist/chunks/chunk-UUM4KYBV.js +914 -0
  209. package/dist/chunks/chunk-UUM4KYBV.js.map +1 -0
  210. package/dist/chunks/chunk-V4L4ONOK.js +914 -0
  211. package/dist/chunks/chunk-V4L4ONOK.js.map +1 -0
  212. package/dist/chunks/chunk-V7ACRMW7.js +914 -0
  213. package/dist/chunks/chunk-V7ACRMW7.js.map +1 -0
  214. package/dist/chunks/chunk-WEKBCXNI.js +8839 -0
  215. package/dist/chunks/chunk-WEKBCXNI.js.map +1 -0
  216. package/dist/chunks/chunk-WN6TJQI2.js +103 -0
  217. package/dist/chunks/chunk-WN6TJQI2.js.map +1 -0
  218. package/dist/chunks/chunk-XM2JOPVU.js +914 -0
  219. package/dist/chunks/chunk-XM2JOPVU.js.map +1 -0
  220. package/dist/chunks/chunk-ZZIDNW4D.js +914 -0
  221. package/dist/chunks/chunk-ZZIDNW4D.js.map +1 -0
  222. package/dist/exports/computed-item.context.d.ts +2 -1
  223. package/dist/exports/computed.context.d.ts +3 -2
  224. package/dist/exports/config.context.d.ts +1 -0
  225. package/dist/exports/config.context.js +1 -1
  226. package/dist/exports/interaction.d.ts +2 -1
  227. package/dist/exports/interaction.js +5 -2
  228. package/dist/exports/item.context.d.ts +2 -1
  229. package/dist/exports/qti-assessment-item.context.d.ts +2 -1
  230. package/dist/exports/qti-condition-expression.d.ts +2 -1
  231. package/dist/exports/qti-condition-expression.js +3 -3
  232. package/dist/exports/qti-expression.d.ts +2 -1
  233. package/dist/exports/qti-expression.js +2 -2
  234. package/dist/exports/qti-test.d.ts +3 -2
  235. package/dist/exports/session.context.d.ts +3 -2
  236. package/dist/exports/test.context.d.ts +2 -1
  237. package/dist/exports/variables.d.ts +2 -1
  238. package/dist/index.d.ts +4 -4
  239. package/dist/index.js +12 -12
  240. package/dist/item.css +66 -6
  241. package/dist/qti-components/index.d.ts +16 -5
  242. package/dist/qti-components/index.js +6 -6
  243. package/dist/qti-components-jsx.d.ts +29 -18
  244. package/dist/qti-item/components/item-container.js +2 -2
  245. package/dist/qti-item/components/item-correct-response-mode.js +1 -1
  246. package/dist/qti-item/components/item-show-candidate-correction.d.ts +2 -1
  247. package/dist/qti-item/components/item-show-correct-response.d.ts +2 -1
  248. package/dist/qti-item/components/print-item-variables.d.ts +2 -1
  249. package/dist/qti-item/core/index.d.ts +1 -1
  250. package/dist/qti-item/core/index.js +4 -4
  251. package/dist/qti-loader/index.d.ts +2 -1
  252. package/dist/qti-response-declaration-BKOw2_Pl.d.ts +1378 -0
  253. package/dist/qti-response-declaration-DKr08ANy.d.ts +1397 -0
  254. package/dist/qti-response-declaration-Dz6D30cF.d.ts +1397 -0
  255. package/dist/qti-response-declaration-d_tAAEFq.d.ts +1378 -0
  256. package/dist/qti-test/components/index.d.ts +3 -3
  257. package/dist/qti-test/components/index.js +4 -4
  258. package/dist/qti-test/components/test-container.js +2 -2
  259. package/dist/qti-test/components/test-navigation.d.ts +2 -2
  260. package/dist/qti-test/components/test-navigation.js +2 -2
  261. package/dist/qti-test/components/test-next.d.ts +3 -2
  262. package/dist/qti-test/components/test-prev.d.ts +3 -2
  263. package/dist/qti-test/components/test-print-context.d.ts +3 -2
  264. package/dist/qti-test/components/test-print-item-variables.d.ts +3 -2
  265. package/dist/qti-test/components/test-scoring-buttons.d.ts +3 -2
  266. package/dist/qti-test/components/test-scoring-feedback.d.ts +3 -2
  267. package/dist/qti-test/components/test-show-correct-response.d.ts +3 -2
  268. package/dist/qti-test/core/index.d.ts +4 -3
  269. package/dist/qti-test/core/index.js +7 -7
  270. package/dist/qti-test-feedback-Bskvq3FE.d.ts +91 -0
  271. package/dist/qti-test-feedback-CZsbp6z4.d.ts +91 -0
  272. package/dist/qti-test-feedback-dSr4W5Ft.d.ts +91 -0
  273. package/dist/qti-test-feedback-jBGxkr5n.d.ts +91 -0
  274. package/dist/vscode.html-custom-data.json +3 -2
  275. package/package.json +1 -1
@@ -0,0 +1,367 @@
1
+ import {
2
+ qtiContext
3
+ } from "./chunk-H6KHXSIO.js";
4
+ import {
5
+ sessionContext
6
+ } from "./chunk-22IRJWWY.js";
7
+ import {
8
+ testContext
9
+ } from "./chunk-CJADUWEC.js";
10
+ import {
11
+ computedContext
12
+ } from "./chunk-AZIKAG7K.js";
13
+ import {
14
+ configContext
15
+ } from "./chunk-NRKCQIQS.js";
16
+ import {
17
+ __decorateClass
18
+ } from "./chunk-H2JE6IVU.js";
19
+
20
+ // src/lib/qti-test/components/test-navigation.ts
21
+ import { consume, provide } from "@lit/context";
22
+ import { html, LitElement } from "lit";
23
+ import { customElement, property, state } from "lit/decorators.js";
24
+ var TestNavigation = class extends LitElement {
25
+ constructor() {
26
+ super();
27
+ this.identifier = void 0;
28
+ this.initContext = [];
29
+ this.qtiContext = {
30
+ QTI_CONTEXT: {
31
+ testIdentifier: "",
32
+ candidateIdentifier: "",
33
+ environmentIdentifier: "default"
34
+ }
35
+ };
36
+ this.configContext = {};
37
+ this.autoScoreItems = false;
38
+ this.addEventListener("qti-assessment-test-connected", this._handleTestConnected.bind(this));
39
+ this.addEventListener("qti-assessment-item-connected", this._handleItemConnected.bind(this));
40
+ this.addEventListener("qti-interaction-changed", this._handleInteractionChanged.bind(this));
41
+ this.addEventListener("test-end-attempt", this._handleTestEndAttempt.bind(this));
42
+ this.addEventListener("test-show-correct-response", this._handleTestShowCorrectResponse.bind(this));
43
+ this.addEventListener("test-show-candidate-correction", this._handleTestShowCandidateCorrection.bind(this));
44
+ this.addEventListener("test-update-outcome-variable", this._handleTestUpdateOutcomeVariable.bind(this));
45
+ }
46
+ /**
47
+ * Handles the 'test-end-attempt' event.
48
+ * @private
49
+ * @listens TestNavigation#test-end-attempt
50
+ * @param {CustomEvent} event - The custom event object.
51
+ */
52
+ _handleTestEndAttempt(_event) {
53
+ const qtiItemEl = this._testElement.querySelector(
54
+ `qti-assessment-item-ref[identifier="${this._sessionContext.navItemRefId}"]`
55
+ );
56
+ const qtiAssessmentItemEl = qtiItemEl.assessmentItem;
57
+ const reportValidityAfterScoring = this.configContext?.reportValidityAfterScoring === true ? true : false;
58
+ qtiAssessmentItemEl.processResponse(true, reportValidityAfterScoring);
59
+ }
60
+ // protected createRenderRoot(): HTMLElement | DocumentFragment {
61
+ // return this;
62
+ // }
63
+ // myTemplate: TemplateFunction;
64
+ // connectedCallback(): void {
65
+ // super.connectedCallback();
66
+ // const templateElement = this.querySelector<HTMLTemplateElement>('template');
67
+ // if (!templateElement) {
68
+ // this.myTemplate = null;
69
+ // return;
70
+ // }
71
+ // this.myTemplate = prepareTemplate(templateElement);
72
+ // }
73
+ /**
74
+ * Handles the 'test-show-correct-response' event.
75
+ * @private
76
+ * @listens TestNavigation#test-show-correct-response
77
+ * @param {CustomEvent} event - The custom event object.
78
+ */
79
+ _handleTestShowCorrectResponse(event) {
80
+ const qtiItemEl = this._testElement.querySelector(
81
+ `qti-assessment-item-ref[identifier="${this._sessionContext.navItemRefId}"]`
82
+ );
83
+ const qtiAssessmentItemEl = qtiItemEl.assessmentItem;
84
+ if (!qtiAssessmentItemEl) return;
85
+ qtiAssessmentItemEl.showCorrectResponse(event.detail);
86
+ }
87
+ /**
88
+ * Handles the 'test-show-candidate-correction' event.
89
+ * @private
90
+ * @listens TestNavigation#test-show-candidate-correction
91
+ * @param {CustomEvent} event - The custom event object.
92
+ */
93
+ _handleTestShowCandidateCorrection(event) {
94
+ const qtiItemEl = this._testElement.querySelector(
95
+ `qti-assessment-item-ref[identifier="${this._sessionContext.navItemRefId}"]`
96
+ );
97
+ const qtiAssessmentItemEl = qtiItemEl.assessmentItem;
98
+ qtiAssessmentItemEl.showCandidateCorrection(event.detail);
99
+ }
100
+ _handleTestUpdateOutcomeVariable(event) {
101
+ const qtiItemEl = this._testElement.querySelector(
102
+ `qti-assessment-item-ref[identifier="${event.detail.assessmentItemRefId}"]`
103
+ );
104
+ const qtiAssessmentItemEl = qtiItemEl.assessmentItem;
105
+ qtiAssessmentItemEl.setOutcomeVariable(event.detail.outcomeVariableId, event.detail.value);
106
+ }
107
+ _handleInteractionChanged(_event) {
108
+ if (this.autoScoreItems) {
109
+ const assessmentItem = _event.composedPath()[0].closest("qti-assessment-item");
110
+ const scoreOutcomeIdentifier = assessmentItem.variables.find((v) => v.identifier === "SCORE");
111
+ if (scoreOutcomeIdentifier && scoreOutcomeIdentifier.externalScored === null && assessmentItem.adaptive === "false") {
112
+ const reportValidityAfterScoring = this.configContext?.reportValidityAfterScoring === true ? true : false;
113
+ assessmentItem.processResponse(true, reportValidityAfterScoring);
114
+ }
115
+ }
116
+ }
117
+ render() {
118
+ return html`<slot></slot>`;
119
+ }
120
+ /* PK: on test connected we can build the computed context */
121
+ _handleTestConnected(event) {
122
+ this._testElement = event.detail;
123
+ if (!this.qtiContext.QTI_CONTEXT?.testIdentifier) {
124
+ const currentContext = this.qtiContext.QTI_CONTEXT || {
125
+ testIdentifier: "",
126
+ candidateIdentifier: "not set",
127
+ environmentIdentifier: "default"
128
+ };
129
+ this.qtiContext = {
130
+ QTI_CONTEXT: {
131
+ ...currentContext,
132
+ testIdentifier: this._testElement.identifier,
133
+ environmentIdentifier: currentContext.environmentIdentifier || "default"
134
+ }
135
+ };
136
+ }
137
+ const contextDeclarations = this._testElement.querySelectorAll('qti-context-declaration[identifier="QTI_CONTEXT"]');
138
+ contextDeclarations.forEach((declaration) => {
139
+ const defaultValues = this._extractDefaultValues(declaration);
140
+ if (Object.keys(defaultValues).length > 0) {
141
+ this.qtiContext = {
142
+ QTI_CONTEXT: {
143
+ ...defaultValues,
144
+ // Default values first
145
+ ...this.qtiContext.QTI_CONTEXT
146
+ // Runtime values override defaults
147
+ }
148
+ };
149
+ }
150
+ });
151
+ const testPartElements = Array.from(this._testElement?.querySelectorAll(`qti-test-part`) || []);
152
+ this.computedContext = {
153
+ identifier: this._testElement.identifier,
154
+ title: this._testElement.title,
155
+ view: this._sessionContext?.view,
156
+ testParts: testPartElements.map((testPart) => {
157
+ const sectionElements = [...testPart.querySelectorAll(`qti-assessment-section`)];
158
+ return {
159
+ active: false,
160
+ identifier: testPart.identifier,
161
+ navigationMode: testPart.navigationMode,
162
+ submissionMode: testPart.submissionMode,
163
+ sections: sectionElements.map((section) => {
164
+ const itemElements = [...section.querySelectorAll(`qti-assessment-item-ref`)];
165
+ return {
166
+ active: false,
167
+ identifier: section.identifier,
168
+ title: section.title,
169
+ items: itemElements.map((item) => ({
170
+ ...this.initContext?.find((i) => i.identifier === item.identifier),
171
+ active: false,
172
+ identifier: item.identifier,
173
+ categories: item.category ? item.category?.split(" ") : [],
174
+ href: item.href,
175
+ variables: []
176
+ }))
177
+ };
178
+ })
179
+ };
180
+ })
181
+ };
182
+ }
183
+ /**
184
+ * Extract default values from a qti-context-declaration element
185
+ */
186
+ _extractDefaultValues(declaration) {
187
+ const defaultValues = {};
188
+ const defaultValueElement = declaration.querySelector("qti-default-value");
189
+ if (!defaultValueElement) {
190
+ return defaultValues;
191
+ }
192
+ const valueElements = defaultValueElement.querySelectorAll("qti-value[field-identifier]");
193
+ valueElements.forEach((valueElement) => {
194
+ const fieldIdentifier = valueElement.getAttribute("field-identifier");
195
+ const baseType = valueElement.getAttribute("base-type") || "string";
196
+ const textContent = valueElement.textContent?.trim() || "";
197
+ if (fieldIdentifier) {
198
+ let value = textContent;
199
+ switch (baseType) {
200
+ case "integer":
201
+ value = parseInt(textContent, 10);
202
+ break;
203
+ case "float":
204
+ case "duration":
205
+ value = parseFloat(textContent);
206
+ break;
207
+ case "boolean":
208
+ value = textContent.toLowerCase() === "true";
209
+ break;
210
+ case "string":
211
+ default:
212
+ value = textContent;
213
+ break;
214
+ }
215
+ defaultValues[fieldIdentifier] = value;
216
+ }
217
+ });
218
+ return defaultValues;
219
+ }
220
+ /* PK: on item connected we can add item only properties in the xml */
221
+ _handleItemConnected(event) {
222
+ const itemElement = event.detail;
223
+ this.computedContext = {
224
+ ...this.computedContext,
225
+ testParts: this.computedContext.testParts.map((testPart) => {
226
+ return {
227
+ ...testPart,
228
+ sections: testPart.sections.map((section) => {
229
+ return {
230
+ ...section,
231
+ items: section.items.map((item) => {
232
+ if (item.identifier !== itemElement.parentElement.getAttribute("identifier")) {
233
+ return item;
234
+ }
235
+ const scoreOutcome = itemElement.querySelector(
236
+ "qti-outcome-declaration[identifier='SCORE']"
237
+ );
238
+ const externalScored = scoreOutcome?.getAttribute("externalScored");
239
+ const responseDeclarations = itemElement.querySelectorAll("qti-response-declaration");
240
+ const containsCorrectResponse = Array.from(responseDeclarations).some(
241
+ (r) => r.querySelector("qti-correct-response")
242
+ );
243
+ const containsMapping = Array.from(responseDeclarations).some((r) => {
244
+ const mapping = r.querySelector("qti-mapping");
245
+ const areaMapping = r.querySelector("qti-area-mapping");
246
+ return mapping?.querySelector("qti-map-entry") || areaMapping?.querySelector("qti-area-map-entry");
247
+ });
248
+ const hasCorrectResponse = containsCorrectResponse || containsMapping;
249
+ const hasResponseProcessing = itemElement.querySelector("qti-response-processing") ? true : false;
250
+ return {
251
+ ...item,
252
+ assessmentItemIdentifier: itemElement.getAttribute("identifier"),
253
+ label: itemElement.getAttribute("label"),
254
+ title: itemElement.title,
255
+ externalScored,
256
+ adaptive: itemElement.adaptive == "true" || false,
257
+ timeDependent: itemElement.timeDependent == "true" || false,
258
+ variables: itemElement.variables,
259
+ hasCorrectResponse,
260
+ hasResponseProcessing
261
+ };
262
+ })
263
+ };
264
+ })
265
+ };
266
+ })
267
+ };
268
+ }
269
+ /* PK: on every change of the candidate we will recomputed the computedContext */
270
+ willUpdate(_changedProperties) {
271
+ if (!this.computedContext) return;
272
+ let itemIndex = 1;
273
+ this.computedContext = {
274
+ ...this.computedContext,
275
+ view: this._sessionContext?.view,
276
+ testParts: this.computedContext.testParts.map((testPart) => {
277
+ return {
278
+ ...testPart,
279
+ active: this._sessionContext?.navPartId === testPart.identifier || false,
280
+ sections: testPart.sections.map((section) => {
281
+ return {
282
+ ...section,
283
+ active: this._sessionContext?.navSectionId === section.identifier || false,
284
+ completed: section.items.every(
285
+ (item) => this._testContext.items.find((i) => i.identifier === item.identifier)?.variables.find((v) => v.identifier === "completionStatus").value === "completed"
286
+ ),
287
+ items: section.items.map((item) => {
288
+ const itemContext = this._testContext?.items.find((i) => i.identifier === item.identifier);
289
+ const computedItem = {
290
+ ...item,
291
+ ...itemContext,
292
+ ...this.initContext?.find((i) => i.identifier === item.identifier)
293
+ };
294
+ const rawscore = computedItem.variables?.find((vr) => vr.identifier == "SCORE")?.value;
295
+ const score = rawscore === void 0 || rawscore === null ? null : parseFloat(rawscore?.toString());
296
+ const completionStatus = computedItem.variables?.find((v) => v.identifier === "completionStatus")?.value;
297
+ const response = computedItem.variables?.find((v) => v.identifier === "RESPONSE")?.value || "";
298
+ const numAttempts = computedItem.variables?.find((v) => v.identifier === "numAttempts")?.value || 0;
299
+ const active = this._sessionContext?.navItemRefId === computedItem.identifier || false;
300
+ const index = item.categories.includes(this.configContext?.infoItemCategory) ? null : itemIndex++;
301
+ const rawMaxScore = item.variables?.find((vr) => vr.identifier == "MAXSCORE")?.value;
302
+ const maxScore = rawMaxScore === void 0 || rawMaxScore === null ? null : parseFloat(rawMaxScore?.toString());
303
+ return {
304
+ ...computedItem,
305
+ completionStatus,
306
+ numAttempts,
307
+ score,
308
+ response,
309
+ index,
310
+ // type,
311
+ active,
312
+ // correct,
313
+ maxScore
314
+ // incorrect,
315
+ // completed
316
+ };
317
+ })
318
+ };
319
+ })
320
+ };
321
+ })
322
+ };
323
+ this.dispatchEvent(
324
+ new CustomEvent("qti-computed-context-updated", {
325
+ detail: this.computedContext,
326
+ bubbles: true
327
+ })
328
+ );
329
+ }
330
+ };
331
+ __decorateClass([
332
+ property({ type: String })
333
+ ], TestNavigation.prototype, "identifier", 2);
334
+ __decorateClass([
335
+ state()
336
+ ], TestNavigation.prototype, "initContext", 2);
337
+ __decorateClass([
338
+ state(),
339
+ provide({ context: qtiContext })
340
+ ], TestNavigation.prototype, "qtiContext", 2);
341
+ __decorateClass([
342
+ state(),
343
+ provide({ context: configContext })
344
+ ], TestNavigation.prototype, "configContext", 2);
345
+ __decorateClass([
346
+ state(),
347
+ consume({ context: testContext, subscribe: true })
348
+ ], TestNavigation.prototype, "_testContext", 2);
349
+ __decorateClass([
350
+ state(),
351
+ consume({ context: sessionContext, subscribe: true })
352
+ ], TestNavigation.prototype, "_sessionContext", 2);
353
+ __decorateClass([
354
+ state(),
355
+ provide({ context: computedContext })
356
+ ], TestNavigation.prototype, "computedContext", 2);
357
+ __decorateClass([
358
+ property({ type: Boolean, attribute: "auto-score-items" })
359
+ ], TestNavigation.prototype, "autoScoreItems", 2);
360
+ TestNavigation = __decorateClass([
361
+ customElement("test-navigation")
362
+ ], TestNavigation);
363
+
364
+ export {
365
+ TestNavigation
366
+ };
367
+ //# sourceMappingURL=chunk-MLRMRXGZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-navigation.ts"],"sourcesContent":["import { consume, provide } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { computedContext } from '../../exports/computed.context';\nimport { configContext } from '../../exports/config.context';\nimport { testContext } from '../../exports/test.context';\nimport { sessionContext } from '../../exports/session.context';\nimport { qtiContext } from '../../exports/qti.context';\n\nimport type { QtiContext } from '../../exports/qti.context';\nimport type { QtiAssessmentItem } from '../../qti-components';\nimport type { OutcomeVariable } from '../../exports/variables';\nimport type { ComputedContext } from '../../exports/computed.context';\nimport type { PropertyValues } from 'lit';\nimport type { QtiAssessmentItemRef, QtiAssessmentSection, QtiAssessmentTest, QtiTestPart } from '../core';\nimport type { ConfigContext } from '../../exports/config.context';\nimport type { SessionContext } from '../../exports/session.context';\nimport type { TestContext } from '../../exports/test.context';\n\ntype CustomEventMap = {\n 'test-end-attempt': CustomEvent;\n 'test-show-correct-response': CustomEvent<{ value: boolean }>;\n};\n\ndeclare global {\n interface GlobalEventHandlersEventMap extends CustomEventMap {}\n}\n\n@customElement('test-navigation')\nexport class TestNavigation extends LitElement {\n @property({ type: String }) identifier = undefined;\n\n @state()\n public initContext: { identifier: string; [key: string]: any }[] = [];\n\n @state()\n @provide({ context: qtiContext })\n public qtiContext: QtiContext = {\n QTI_CONTEXT: {\n testIdentifier: '',\n candidateIdentifier: '',\n environmentIdentifier: 'default'\n }\n };\n\n @state()\n @provide({ context: configContext })\n public configContext: ConfigContext = {};\n\n @state()\n @consume({ context: testContext, subscribe: true })\n protected _testContext?: TestContext;\n\n @state()\n @consume({ context: sessionContext, subscribe: true })\n protected _sessionContext?: SessionContext;\n\n @state()\n @provide({ context: computedContext })\n protected computedContext: ComputedContext;\n\n @property({ type: Boolean, attribute: 'auto-score-items' }) autoScoreItems = false;\n\n // @state()\n // private stampContext: {\n // view?: View;\n // test?: unknown;\n // activeTestpart?: unknown;\n // activeSection?: unknown;\n // activeItem?: unknown;\n // } = {\n // view: 'candidate',\n // activeItem: {},\n // activeSection: {\n // items: []\n // },\n // activeTestpart: {\n // items: []\n // },\n // test: {}\n // };\n // @property({ type: Boolean, reflect: true }) public debug = false;\n\n private _testElement: QtiAssessmentTest;\n\n constructor() {\n super();\n this.addEventListener('qti-assessment-test-connected', this._handleTestConnected.bind(this));\n this.addEventListener('qti-assessment-item-connected', this._handleItemConnected.bind(this));\n\n this.addEventListener('qti-interaction-changed', this._handleInteractionChanged.bind(this));\n\n this.addEventListener('test-end-attempt', this._handleTestEndAttempt.bind(this));\n this.addEventListener('test-show-correct-response', this._handleTestShowCorrectResponse.bind(this));\n this.addEventListener('test-show-candidate-correction', this._handleTestShowCandidateCorrection.bind(this));\n this.addEventListener('test-update-outcome-variable', this._handleTestUpdateOutcomeVariable.bind(this));\n }\n\n /**\n * Handles the 'test-end-attempt' event.\n * @private\n * @listens TestNavigation#test-end-attempt\n * @param {CustomEvent} event - The custom event object.\n */\n private _handleTestEndAttempt(_event: CustomEvent) {\n const qtiItemEl = this._testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${this._sessionContext.navItemRefId}\"]`\n );\n const qtiAssessmentItemEl = qtiItemEl.assessmentItem;\n const reportValidityAfterScoring = this.configContext?.reportValidityAfterScoring === true ? true : false;\n qtiAssessmentItemEl.processResponse(true, reportValidityAfterScoring);\n }\n\n // protected createRenderRoot(): HTMLElement | DocumentFragment {\n // return this;\n // }\n\n // myTemplate: TemplateFunction;\n\n // connectedCallback(): void {\n // super.connectedCallback();\n // const templateElement = this.querySelector<HTMLTemplateElement>('template');\n // if (!templateElement) {\n // this.myTemplate = null;\n // return;\n // }\n // this.myTemplate = prepareTemplate(templateElement);\n // }\n\n /**\n * Handles the 'test-show-correct-response' event.\n * @private\n * @listens TestNavigation#test-show-correct-response\n * @param {CustomEvent} event - The custom event object.\n */\n private _handleTestShowCorrectResponse(event: CustomEvent) {\n const qtiItemEl = this._testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${this._sessionContext.navItemRefId}\"]`\n );\n const qtiAssessmentItemEl = qtiItemEl.assessmentItem;\n if (!qtiAssessmentItemEl) return;\n qtiAssessmentItemEl.showCorrectResponse(event.detail);\n }\n\n /**\n * Handles the 'test-show-candidate-correction' event.\n * @private\n * @listens TestNavigation#test-show-candidate-correction\n * @param {CustomEvent} event - The custom event object.\n */\n private _handleTestShowCandidateCorrection(event: CustomEvent) {\n const qtiItemEl = this._testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${this._sessionContext.navItemRefId}\"]`\n );\n const qtiAssessmentItemEl = qtiItemEl.assessmentItem;\n qtiAssessmentItemEl.showCandidateCorrection(event.detail);\n }\n\n private _handleTestUpdateOutcomeVariable(event: CustomEvent) {\n const qtiItemEl = this._testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${event.detail.assessmentItemRefId}\"]`\n );\n const qtiAssessmentItemEl = qtiItemEl.assessmentItem;\n qtiAssessmentItemEl.setOutcomeVariable(event.detail.outcomeVariableId, event.detail.value);\n }\n\n private _handleInteractionChanged(_event: CustomEvent) {\n if (this.autoScoreItems) {\n const assessmentItem = (_event.composedPath()[0] as HTMLElement).closest('qti-assessment-item');\n const scoreOutcomeIdentifier = assessmentItem.variables.find(v => v.identifier === 'SCORE') as OutcomeVariable;\n if (\n scoreOutcomeIdentifier &&\n scoreOutcomeIdentifier.externalScored === null &&\n assessmentItem.adaptive === 'false'\n ) {\n const reportValidityAfterScoring = this.configContext?.reportValidityAfterScoring === true ? true : false;\n assessmentItem.processResponse(true, reportValidityAfterScoring);\n }\n }\n }\n\n render() {\n // return this.myTemplate ? this.myTemplate(this.stampContext) : nothing;\n return html`<slot></slot>`;\n }\n\n /* PK: on test connected we can build the computed context */\n private _handleTestConnected(event: CustomEvent) {\n this._testElement = event.detail as QtiAssessmentTest;\n // Set the testIdentifier in qtiContext if not already set\n if (!this.qtiContext.QTI_CONTEXT?.testIdentifier) {\n const currentContext = this.qtiContext.QTI_CONTEXT || {\n testIdentifier: '',\n candidateIdentifier: 'not set',\n environmentIdentifier: 'default'\n };\n this.qtiContext = {\n QTI_CONTEXT: {\n ...currentContext,\n testIdentifier: this._testElement.identifier,\n environmentIdentifier: currentContext.environmentIdentifier || 'default'\n }\n };\n }\n\n // Process qti-context-declaration elements to get default values\n const contextDeclarations = this._testElement.querySelectorAll('qti-context-declaration[identifier=\"QTI_CONTEXT\"]');\n\n contextDeclarations.forEach(declaration => {\n const defaultValues = this._extractDefaultValues(declaration);\n if (Object.keys(defaultValues).length > 0) {\n // Merge default values with current context, but don't override existing runtime values\n this.qtiContext = {\n QTI_CONTEXT: {\n ...defaultValues, // Default values first\n ...this.qtiContext.QTI_CONTEXT // Runtime values override defaults\n }\n };\n }\n });\n\n const testPartElements = Array.from(this._testElement?.querySelectorAll<QtiTestPart>(`qti-test-part`) || []);\n this.computedContext = {\n identifier: this._testElement.identifier,\n title: this._testElement.title,\n view: this._sessionContext?.view,\n testParts: testPartElements.map(testPart => {\n const sectionElements = [...testPart.querySelectorAll<QtiAssessmentSection>(`qti-assessment-section`)];\n return {\n active: false,\n identifier: testPart.identifier,\n navigationMode: testPart.navigationMode,\n submissionMode: testPart.submissionMode,\n sections: sectionElements.map(section => {\n const itemElements = [...section.querySelectorAll<QtiAssessmentItemRef>(`qti-assessment-item-ref`)];\n return {\n active: false,\n identifier: section.identifier,\n title: section.title,\n items: itemElements.map(item => ({\n ...this.initContext?.find(i => i.identifier === item.identifier),\n active: false,\n identifier: item.identifier,\n categories: item.category ? item.category?.split(' ') : [],\n href: item.href,\n variables: [],\n }))\n };\n })\n };\n })\n };\n }\n\n /**\n * Extract default values from a qti-context-declaration element\n */\n private _extractDefaultValues(declaration: Element): Record<string, any> {\n const defaultValues: Record<string, any> = {};\n\n const defaultValueElement = declaration.querySelector('qti-default-value');\n if (!defaultValueElement) {\n return defaultValues;\n }\n\n const valueElements = defaultValueElement.querySelectorAll('qti-value[field-identifier]');\n valueElements.forEach(valueElement => {\n const fieldIdentifier = valueElement.getAttribute('field-identifier');\n const baseType = valueElement.getAttribute('base-type') || 'string';\n const textContent = valueElement.textContent?.trim() || '';\n\n if (fieldIdentifier) {\n // Convert value based on base-type\n let value: any = textContent;\n switch (baseType) {\n case 'integer':\n value = parseInt(textContent, 10);\n break;\n case 'float':\n case 'duration':\n value = parseFloat(textContent);\n break;\n case 'boolean':\n value = textContent.toLowerCase() === 'true';\n break;\n case 'string':\n default:\n value = textContent;\n break;\n }\n\n defaultValues[fieldIdentifier] = value;\n }\n });\n\n return defaultValues;\n }\n\n /* PK: on item connected we can add item only properties in the xml */\n private _handleItemConnected(event: CustomEvent) {\n const itemElement = event.detail as QtiAssessmentItem;\n\n this.computedContext = {\n ...this.computedContext,\n testParts: this.computedContext.testParts.map(testPart => {\n return {\n ...testPart,\n sections: testPart.sections.map(section => {\n return {\n ...section,\n items: section.items.map(item => {\n if (item.identifier !== itemElement.parentElement.getAttribute('identifier')) {\n return item;\n }\n\n const scoreOutcome = itemElement.querySelector<HTMLElement>(\n \"qti-outcome-declaration[identifier='SCORE']\"\n );\n // const scoreOutcome = item.variables.find(vr => vr.identifier == 'SCORE') as OutcomeVariable;\n const externalScored = scoreOutcome?.getAttribute('externalScored');\n\n const responseDeclarations = itemElement.querySelectorAll<HTMLElement>('qti-response-declaration');\n const containsCorrectResponse = Array.from(responseDeclarations).some(r =>\n r.querySelector('qti-correct-response')\n );\n // check if every responseDeclaration has a correctResponse\n const containsMapping = Array.from(responseDeclarations).some(r => {\n const mapping = r.querySelector('qti-mapping');\n const areaMapping = r.querySelector('qti-area-mapping');\n return mapping?.querySelector('qti-map-entry') || areaMapping?.querySelector('qti-area-map-entry');\n });\n\n const hasCorrectResponse = containsCorrectResponse || containsMapping;\n\n const hasResponseProcessing = itemElement.querySelector('qti-response-processing') ? true : false;\n\n return {\n ...item,\n assessmentItemIdentifier: itemElement.getAttribute('identifier'),\n label: itemElement.getAttribute('label'),\n title: itemElement.title,\n externalScored,\n adaptive: itemElement.adaptive == 'true' || false,\n timeDependent: itemElement.timeDependent == 'true' || false,\n variables: itemElement.variables,\n hasCorrectResponse,\n hasResponseProcessing\n };\n })\n };\n })\n };\n })\n };\n }\n\n /* PK: on every change of the candidate we will recomputed the computedContext */\n protected willUpdate(_changedProperties: PropertyValues): void {\n if (!this.computedContext) return;\n\n let itemIndex = 1;\n this.computedContext = {\n ...this.computedContext,\n view: this._sessionContext?.view,\n testParts: this.computedContext.testParts.map(testPart => {\n return {\n ...testPart,\n active: this._sessionContext?.navPartId === testPart.identifier || false,\n sections: testPart.sections.map(section => {\n return {\n ...section,\n active: this._sessionContext?.navSectionId === section.identifier || false,\n completed: section.items.every(\n item =>\n this._testContext.items\n .find(i => i.identifier === item.identifier)\n ?.variables.find(v => v.identifier === 'completionStatus').value === 'completed'\n ),\n\n items: section.items.map(item => {\n const itemContext = this._testContext?.items.find(i => i.identifier === item.identifier);\n const computedItem = {\n ...item,\n ...itemContext,\n ...this.initContext?.find(i => i.identifier === item.identifier)\n };\n\n const rawscore = computedItem.variables?.find(vr => vr.identifier == 'SCORE')?.value;\n\n const score = rawscore === undefined || rawscore === null ? null : parseFloat(rawscore?.toString());\n\n const completionStatus = computedItem.variables?.find(v => v.identifier === 'completionStatus')\n ?.value as string;\n\n const response = computedItem.variables?.find(v => v.identifier === 'RESPONSE')?.value || '';\n const numAttempts = computedItem.variables?.find(v => v.identifier === 'numAttempts')?.value || 0;\n\n const active = this._sessionContext?.navItemRefId === computedItem.identifier || false;\n\n // Computed and opiniated\n // const type = item.categories.includes(this.configContext?.infoItemCategory) ? 'info' : 'regular';\n // const correct = (type == 'regular' && score !== undefined && !isNaN(score) && score > 0) || false;\n // const incorrect = (type == 'regular' && score !== undefined && !isNaN(score) && score <= 0) || false;\n // const completed = completionStatus === 'completed';\n\n const index = item.categories.includes(this.configContext?.infoItemCategory) ? null : itemIndex++;\n const rawMaxScore = item.variables?.find(vr => vr.identifier == 'MAXSCORE')?.value;\n const maxScore =\n rawMaxScore === undefined || rawMaxScore === null ? null : parseFloat(rawMaxScore?.toString());\n\n return {\n ...computedItem,\n completionStatus,\n numAttempts,\n score,\n response,\n index,\n // type,\n active,\n // correct,\n maxScore\n // incorrect,\n // completed\n };\n })\n };\n })\n };\n })\n };\n\n // const activeTestPart = this.computedContext.testParts.find(testPart => testPart.active);\n // const activeSection = activeTestPart?.sections.find(section => section.active);\n // const activeItem = activeSection?.items.find(item => item.active);\n // const { variables, ...augmentedItem } = activeItem || {};\n\n // if (!activeTestPart || !activeSection || !activeItem) {\n // this.stampContext = null;\n // return;\n // }\n\n // const augmentedTestPart = {\n // ...activeTestPart,\n // items: activeTestPart.sections.flatMap(section => section.items.map(({ variables, ...rest }) => rest)),\n // sections: activeTestPart.sections.map(section => ({\n // ...section,\n // items: section.items.map(({ variables, ...rest }) => rest)\n // }))\n // };\n\n // const augmentedSection = { ...activeSection, items: activeSection.items.map(({ variables, ...rest }) => rest) };\n // const { testParts, ...activeTest } = this.computedContext;\n\n // this.stampContext = {\n // view: this.computedContext.view,\n // activeItem: augmentedItem,\n // activeSection: augmentedSection,\n // activeTestpart: augmentedTestPart,\n // test: activeTest\n // };\n\n this.dispatchEvent(\n new CustomEvent('qti-computed-context-updated', {\n detail: this.computedContext,\n bubbles: true\n })\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,94 @@
1
+ import {
2
+ item_default
3
+ } from "./chunk-5P64MALP.js";
4
+ import {
5
+ watch
6
+ } from "./chunk-ELDMXTUQ.js";
7
+ import {
8
+ qtiTransformTest
9
+ } from "./chunk-WFUXZ4UT.js";
10
+ import {
11
+ __decorateClass
12
+ } from "./chunk-H2JE6IVU.js";
13
+
14
+ // src/lib/qti-test/components/test-container.ts
15
+ import { LitElement, html } from "lit";
16
+ import { customElement, property, state } from "lit/decorators.js";
17
+ import { until } from "lit/directives/until.js";
18
+ var TestContainer = class extends LitElement {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.testURL = null;
22
+ this.testDoc = null;
23
+ this.testXML = null;
24
+ /** Template content if provided */
25
+ this.templateContent = null;
26
+ }
27
+ async handleTestURLChange() {
28
+ if (!this.testURL) return;
29
+ try {
30
+ const api = await qtiTransformTest().load(this.testURL);
31
+ this.testDoc = api.htmlDoc();
32
+ } catch (error) {
33
+ console.error("Error loading or parsing XML:", error);
34
+ }
35
+ }
36
+ handleTestXMLChange() {
37
+ if (!this.testXML) return;
38
+ try {
39
+ this.testDoc = qtiTransformTest().parse(this.testXML).htmlDoc();
40
+ } catch (error) {
41
+ console.error("Error parsing XML:", error);
42
+ }
43
+ }
44
+ async connectedCallback() {
45
+ super.connectedCallback();
46
+ this.initializeTemplateContent();
47
+ this.applyStyles();
48
+ if (this.testURL) {
49
+ this.handleTestURLChange();
50
+ }
51
+ if (this.testXML) {
52
+ this.handleTestXMLChange();
53
+ }
54
+ }
55
+ initializeTemplateContent() {
56
+ const template = this.querySelector("template");
57
+ this.templateContent = template ? template.content : html``;
58
+ }
59
+ applyStyles() {
60
+ const sheet = new CSSStyleSheet();
61
+ sheet.replaceSync(item_default);
62
+ this.shadowRoot.adoptedStyleSheets = [sheet];
63
+ }
64
+ render() {
65
+ return html`
66
+ ${this.templateContent}
67
+ <slot></slot>
68
+ ${until(this.testDoc, html`<span>Loading...</span>`)}
69
+ `;
70
+ }
71
+ };
72
+ __decorateClass([
73
+ property({ type: String, attribute: "test-url" })
74
+ ], TestContainer.prototype, "testURL", 2);
75
+ __decorateClass([
76
+ state()
77
+ ], TestContainer.prototype, "testDoc", 2);
78
+ __decorateClass([
79
+ state()
80
+ ], TestContainer.prototype, "testXML", 2);
81
+ __decorateClass([
82
+ watch("testURL", { waitUntilFirstUpdate: true })
83
+ ], TestContainer.prototype, "handleTestURLChange", 1);
84
+ __decorateClass([
85
+ watch("testXML", { waitUntilFirstUpdate: true })
86
+ ], TestContainer.prototype, "handleTestXMLChange", 1);
87
+ TestContainer = __decorateClass([
88
+ customElement("test-container")
89
+ ], TestContainer);
90
+
91
+ export {
92
+ TestContainer
93
+ };
94
+ //# sourceMappingURL=chunk-MOIHNOX3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-container.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { until } from 'lit/directives/until.js';\n\nimport { watch } from '../../decorators/watch';\nimport itemCss from '../../../item.css?inline';\nimport { qtiTransformTest } from '../../qti-transformers';\n\n/**\n * `<test-container>` is a custom element designed for hosting the qti-assessment-item.\n * The `qti-assessment-test` will be placed inside the shadow DOM of this element.\n * The element loads the test from the provided URL and renders it inside the shadow DOM.\n *\n * ```html\n * <qti-test>\n * <test-navigation>\n * <test-container class=\"m-4 bg-white\" test-url=\"./path/to/assessmenttest.xml\"></test-container>\n * </test-navigation>\n * </qti-test>\n * ```\n */\n@customElement('test-container')\nexport class TestContainer extends LitElement {\n /** URL of the item to load */\n @property({ type: String, attribute: 'test-url' })\n testURL: string = null;\n\n /** A parsed HTML document */\n @state()\n testDoc: DocumentFragment = null;\n\n /** The raw XML string */\n @state()\n testXML: string = null;\n\n /** Template content if provided */\n private templateContent = null;\n\n @watch('testURL', { waitUntilFirstUpdate: true })\n protected async handleTestURLChange() {\n if (!this.testURL) return;\n try {\n const api = await qtiTransformTest().load(this.testURL);\n this.testDoc = api.htmlDoc();\n } catch (error) {\n console.error('Error loading or parsing XML:', error);\n }\n }\n\n @watch('testXML', { waitUntilFirstUpdate: true })\n protected handleTestXMLChange() {\n if (!this.testXML) return;\n try {\n this.testDoc = qtiTransformTest().parse(this.testXML).htmlDoc();\n } catch (error) {\n console.error('Error parsing XML:', error);\n }\n }\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n this.initializeTemplateContent();\n this.applyStyles();\n if (this.testURL) {\n this.handleTestURLChange();\n }\n if (this.testXML) {\n this.handleTestXMLChange();\n }\n }\n\n private initializeTemplateContent() {\n const template = this.querySelector('template') as HTMLTemplateElement;\n this.templateContent = template ? template.content : html``;\n }\n\n private applyStyles() {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(itemCss);\n this.shadowRoot.adoptedStyleSheets = [sheet];\n }\n\n render() {\n return html`\n ${this.templateContent}\n <slot></slot>\n ${until(this.testDoc, html`<span>Loading...</span>`)}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-container': TestContainer;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,YAAY,YAAY;AACjC,SAAS,eAAe,UAAU,aAAa;AAC/C,SAAS,aAAa;AAoBf,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAAvC;AAAA;AAGL,mBAAkB;AAIlB,mBAA4B;AAI5B,mBAAkB;AAGlB;AAAA,SAAQ,kBAAkB;AAAA;AAAA,EAG1B,MAAgB,sBAAsB;AACpC,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI;AACF,YAAM,MAAM,MAAM,iBAAiB,EAAE,KAAK,KAAK,OAAO;AACtD,WAAK,UAAU,IAAI,QAAQ;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AAAA,IACtD;AAAA,EACF;AAAA,EAGU,sBAAsB;AAC9B,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI;AACF,WAAK,UAAU,iBAAiB,EAAE,MAAM,KAAK,OAAO,EAAE,QAAQ;AAAA,IAChE,SAAS,OAAO;AACd,cAAQ,MAAM,sBAAsB,KAAK;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,oBAAmC;AACvC,UAAM,kBAAkB;AACxB,SAAK,0BAA0B;AAC/B,SAAK,YAAY;AACjB,QAAI,KAAK,SAAS;AAChB,WAAK,oBAAoB;AAAA,IAC3B;AACA,QAAI,KAAK,SAAS;AAChB,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,4BAA4B;AAClC,UAAM,WAAW,KAAK,cAAc,UAAU;AAC9C,SAAK,kBAAkB,WAAW,SAAS,UAAU;AAAA,EACvD;AAAA,EAEQ,cAAc;AACpB,UAAM,QAAQ,IAAI,cAAc;AAChC,UAAM,YAAY,YAAO;AACzB,SAAK,WAAW,qBAAqB,CAAC,KAAK;AAAA,EAC7C;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,QACH,KAAK,eAAe;AAAA;AAAA,QAEpB,MAAM,KAAK,SAAS,6BAA6B,CAAC;AAAA;AAAA,EAExD;AACF;AAhEE;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,WAAW,CAAC;AAAA,GAFtC,cAGX;AAIA;AAAA,EADC,MAAM;AAAA,GANI,cAOX;AAIA;AAAA,EADC,MAAM;AAAA,GAVI,cAWX;AAMgB;AAAA,EADf,MAAM,WAAW,EAAE,sBAAsB,KAAK,CAAC;AAAA,GAhBrC,cAiBK;AAWN;AAAA,EADT,MAAM,WAAW,EAAE,sBAAsB,KAAK,CAAC;AAAA,GA3BrC,cA4BD;AA5BC,gBAAN;AAAA,EADN,cAAc,gBAAgB;AAAA,GAClB;","names":[]}
@@ -0,0 +1,94 @@
1
+ import {
2
+ item_default
3
+ } from "./chunk-3LX4O663.js";
4
+ import {
5
+ watch
6
+ } from "./chunk-ELDMXTUQ.js";
7
+ import {
8
+ qtiTransformTest
9
+ } from "./chunk-WFUXZ4UT.js";
10
+ import {
11
+ __decorateClass
12
+ } from "./chunk-H2JE6IVU.js";
13
+
14
+ // src/lib/qti-test/components/test-container.ts
15
+ import { LitElement, html } from "lit";
16
+ import { customElement, property, state } from "lit/decorators.js";
17
+ import { until } from "lit/directives/until.js";
18
+ var TestContainer = class extends LitElement {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.testURL = null;
22
+ this.testDoc = null;
23
+ this.testXML = null;
24
+ /** Template content if provided */
25
+ this.templateContent = null;
26
+ }
27
+ async handleTestURLChange() {
28
+ if (!this.testURL) return;
29
+ try {
30
+ const api = await qtiTransformTest().load(this.testURL);
31
+ this.testDoc = api.htmlDoc();
32
+ } catch (error) {
33
+ console.error("Error loading or parsing XML:", error);
34
+ }
35
+ }
36
+ handleTestXMLChange() {
37
+ if (!this.testXML) return;
38
+ try {
39
+ this.testDoc = qtiTransformTest().parse(this.testXML).htmlDoc();
40
+ } catch (error) {
41
+ console.error("Error parsing XML:", error);
42
+ }
43
+ }
44
+ async connectedCallback() {
45
+ super.connectedCallback();
46
+ this.initializeTemplateContent();
47
+ this.applyStyles();
48
+ if (this.testURL) {
49
+ this.handleTestURLChange();
50
+ }
51
+ if (this.testXML) {
52
+ this.handleTestXMLChange();
53
+ }
54
+ }
55
+ initializeTemplateContent() {
56
+ const template = this.querySelector("template");
57
+ this.templateContent = template ? template.content : html``;
58
+ }
59
+ applyStyles() {
60
+ const sheet = new CSSStyleSheet();
61
+ sheet.replaceSync(item_default);
62
+ this.shadowRoot.adoptedStyleSheets = [sheet];
63
+ }
64
+ render() {
65
+ return html`
66
+ ${this.templateContent}
67
+ <slot></slot>
68
+ ${until(this.testDoc, html`<span>Loading...</span>`)}
69
+ `;
70
+ }
71
+ };
72
+ __decorateClass([
73
+ property({ type: String, attribute: "test-url" })
74
+ ], TestContainer.prototype, "testURL", 2);
75
+ __decorateClass([
76
+ state()
77
+ ], TestContainer.prototype, "testDoc", 2);
78
+ __decorateClass([
79
+ state()
80
+ ], TestContainer.prototype, "testXML", 2);
81
+ __decorateClass([
82
+ watch("testURL", { waitUntilFirstUpdate: true })
83
+ ], TestContainer.prototype, "handleTestURLChange", 1);
84
+ __decorateClass([
85
+ watch("testXML", { waitUntilFirstUpdate: true })
86
+ ], TestContainer.prototype, "handleTestXMLChange", 1);
87
+ TestContainer = __decorateClass([
88
+ customElement("test-container")
89
+ ], TestContainer);
90
+
91
+ export {
92
+ TestContainer
93
+ };
94
+ //# sourceMappingURL=chunk-P2PRB5IZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-container.ts"],"sourcesContent":["import { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { until } from 'lit/directives/until.js';\n\nimport { watch } from '../../decorators/watch';\nimport itemCss from '../../../item.css?inline';\nimport { qtiTransformTest } from '../../qti-transformers';\n\n/**\n * `<test-container>` is a custom element designed for hosting the qti-assessment-item.\n * The `qti-assessment-test` will be placed inside the shadow DOM of this element.\n * The element loads the test from the provided URL and renders it inside the shadow DOM.\n *\n * ```html\n * <qti-test>\n * <test-navigation>\n * <test-container class=\"m-4 bg-white\" test-url=\"./path/to/assessmenttest.xml\"></test-container>\n * </test-navigation>\n * </qti-test>\n * ```\n */\n@customElement('test-container')\nexport class TestContainer extends LitElement {\n /** URL of the item to load */\n @property({ type: String, attribute: 'test-url' })\n testURL: string = null;\n\n /** A parsed HTML document */\n @state()\n testDoc: DocumentFragment = null;\n\n /** The raw XML string */\n @state()\n testXML: string = null;\n\n /** Template content if provided */\n private templateContent = null;\n\n @watch('testURL', { waitUntilFirstUpdate: true })\n protected async handleTestURLChange() {\n if (!this.testURL) return;\n try {\n const api = await qtiTransformTest().load(this.testURL);\n this.testDoc = api.htmlDoc();\n } catch (error) {\n console.error('Error loading or parsing XML:', error);\n }\n }\n\n @watch('testXML', { waitUntilFirstUpdate: true })\n protected handleTestXMLChange() {\n if (!this.testXML) return;\n try {\n this.testDoc = qtiTransformTest().parse(this.testXML).htmlDoc();\n } catch (error) {\n console.error('Error parsing XML:', error);\n }\n }\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n this.initializeTemplateContent();\n this.applyStyles();\n if (this.testURL) {\n this.handleTestURLChange();\n }\n if (this.testXML) {\n this.handleTestXMLChange();\n }\n }\n\n private initializeTemplateContent() {\n const template = this.querySelector('template') as HTMLTemplateElement;\n this.templateContent = template ? template.content : html``;\n }\n\n private applyStyles() {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(itemCss);\n this.shadowRoot.adoptedStyleSheets = [sheet];\n }\n\n render() {\n return html`\n ${this.templateContent}\n <slot></slot>\n ${until(this.testDoc, html`<span>Loading...</span>`)}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-container': TestContainer;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,YAAY,YAAY;AACjC,SAAS,eAAe,UAAU,aAAa;AAC/C,SAAS,aAAa;AAoBf,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAAvC;AAAA;AAGL,mBAAkB;AAIlB,mBAA4B;AAI5B,mBAAkB;AAGlB;AAAA,SAAQ,kBAAkB;AAAA;AAAA,EAG1B,MAAgB,sBAAsB;AACpC,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI;AACF,YAAM,MAAM,MAAM,iBAAiB,EAAE,KAAK,KAAK,OAAO;AACtD,WAAK,UAAU,IAAI,QAAQ;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AAAA,IACtD;AAAA,EACF;AAAA,EAGU,sBAAsB;AAC9B,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI;AACF,WAAK,UAAU,iBAAiB,EAAE,MAAM,KAAK,OAAO,EAAE,QAAQ;AAAA,IAChE,SAAS,OAAO;AACd,cAAQ,MAAM,sBAAsB,KAAK;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,oBAAmC;AACvC,UAAM,kBAAkB;AACxB,SAAK,0BAA0B;AAC/B,SAAK,YAAY;AACjB,QAAI,KAAK,SAAS;AAChB,WAAK,oBAAoB;AAAA,IAC3B;AACA,QAAI,KAAK,SAAS;AAChB,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,4BAA4B;AAClC,UAAM,WAAW,KAAK,cAAc,UAAU;AAC9C,SAAK,kBAAkB,WAAW,SAAS,UAAU;AAAA,EACvD;AAAA,EAEQ,cAAc;AACpB,UAAM,QAAQ,IAAI,cAAc;AAChC,UAAM,YAAY,YAAO;AACzB,SAAK,WAAW,qBAAqB,CAAC,KAAK;AAAA,EAC7C;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,QACH,KAAK,eAAe;AAAA;AAAA,QAEpB,MAAM,KAAK,SAAS,6BAA6B,CAAC;AAAA;AAAA,EAExD;AACF;AAhEE;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,WAAW,CAAC;AAAA,GAFtC,cAGX;AAIA;AAAA,EADC,MAAM;AAAA,GANI,cAOX;AAIA;AAAA,EADC,MAAM;AAAA,GAVI,cAWX;AAMgB;AAAA,EADf,MAAM,WAAW,EAAE,sBAAsB,KAAK,CAAC;AAAA,GAhBrC,cAiBK;AAWN;AAAA,EADT,MAAM,WAAW,EAAE,sBAAsB,KAAK,CAAC;AAAA,GA3BrC,cA4BD;AA5BC,gBAAN;AAAA,EADN,cAAc,gBAAgB;AAAA,GAClB;","names":[]}